aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Demos/Device/ClassDriver/AudioInput/AudioInput.c2
-rw-r--r--Demos/Device/ClassDriver/AudioInput/Descriptors.c4
-rw-r--r--Demos/Device/ClassDriver/AudioOutput/AudioOutput.c2
-rw-r--r--Demos/Device/ClassDriver/AudioOutput/Descriptors.c4
-rw-r--r--Demos/Device/LowLevel/AudioInput/AudioInput.c56
-rw-r--r--Demos/Device/LowLevel/AudioInput/Descriptors.c11
-rw-r--r--Demos/Device/LowLevel/AudioInput/Descriptors.h5
-rw-r--r--Demos/Device/LowLevel/AudioOutput/AudioOutput.c56
-rw-r--r--Demos/Device/LowLevel/AudioOutput/Descriptors.c10
-rw-r--r--Demos/Device/LowLevel/AudioOutput/Descriptors.h5
-rw-r--r--LUFA/ManPages/ChangeLog.txt6
-rw-r--r--LUFA/ManPages/VIDAndPIDValues.txt4
12 files changed, 138 insertions, 27 deletions
diff --git a/Demos/Device/ClassDriver/AudioInput/AudioInput.c b/Demos/Device/ClassDriver/AudioInput/AudioInput.c
index 58a3668e8..1acf20de8 100644
--- a/Demos/Device/ClassDriver/AudioInput/AudioInput.c
+++ b/Demos/Device/ClassDriver/AudioInput/AudioInput.c
@@ -52,7 +52,7 @@ USB_ClassInfo_Audio_Device_t Microphone_Audio_Interface =
};
/** Current audio sampling frequency of the streaming audio endpoint. */
-uint32_t CurrentAudioSampleFrequency = 48000;
+static uint32_t CurrentAudioSampleFrequency = 48000;
/** Main program entry point. This routine contains the overall program flow, including initial
diff --git a/Demos/Device/ClassDriver/AudioInput/Descriptors.c b/Demos/Device/ClassDriver/AudioInput/Descriptors.c
index 6fffd05d4..0d1f0e03e 100644
--- a/Demos/Device/ClassDriver/AudioInput/Descriptors.c
+++ b/Demos/Device/ClassDriver/AudioInput/Descriptors.c
@@ -54,8 +54,8 @@ const USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
.Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE,
.VendorID = 0x03EB,
- .ProductID = 0x206B,
- .ReleaseNumber = VERSION_BCD(00.01),
+ .ProductID = 0x2047,
+ .ReleaseNumber = VERSION_BCD(00.02),
.ManufacturerStrIndex = 0x01,
.ProductStrIndex = 0x02,
diff --git a/Demos/Device/ClassDriver/AudioOutput/AudioOutput.c b/Demos/Device/ClassDriver/AudioOutput/AudioOutput.c
index 43267b2a7..77727f05e 100644
--- a/Demos/Device/ClassDriver/AudioOutput/AudioOutput.c
+++ b/Demos/Device/ClassDriver/AudioOutput/AudioOutput.c
@@ -52,7 +52,7 @@ USB_ClassInfo_Audio_Device_t Speaker_Audio_Interface =
};
/** Current audio sampling frequency of the streaming audio endpoint. */
-uint32_t CurrentAudioSampleFrequency = 48000;
+static uint32_t CurrentAudioSampleFrequency = 48000;
/** Main program entry point. This routine contains the overall program flow, including initial
diff --git a/Demos/Device/ClassDriver/AudioOutput/Descriptors.c b/Demos/Device/ClassDriver/AudioOutput/Descriptors.c
index 5bb0e9f11..606d80b2b 100644
--- a/Demos/Device/ClassDriver/AudioOutput/Descriptors.c
+++ b/Demos/Device/ClassDriver/AudioOutput/Descriptors.c
@@ -54,8 +54,8 @@ const USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
.Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE,
.VendorID = 0x03EB,
- .ProductID = 0x206C,
- .ReleaseNumber = VERSION_BCD(00.01),
+ .ProductID = 0x2046,
+ .ReleaseNumber = VERSION_BCD(00.02),
.ManufacturerStrIndex = 0x01,
.ProductStrIndex = 0x02,
diff --git a/Demos/Device/LowLevel/AudioInput/AudioInput.c b/Demos/Device/LowLevel/AudioInput/AudioInput.c
index f62fcbec5..d79167660 100644
--- a/Demos/Device/LowLevel/AudioInput/AudioInput.c
+++ b/Demos/Device/LowLevel/AudioInput/AudioInput.c
@@ -39,6 +39,9 @@
/** Flag to indicate if the streaming audio alternative interface has been selected by the host. */
static bool StreamingAudioInterfaceSelected = false;
+/** Current audio sampling frequency of the streaming audio endpoint. */
+static uint32_t CurrentAudioSampleFrequency = 48000;
+
/** Main program entry point. This routine contains the overall program flow, including initial
* setup of all components and the main program loop.
@@ -87,7 +90,7 @@ void EVENT_USB_Device_Connect(void)
/* Sample reload timer initialization */
TIMSK0 = (1 << OCIE0A);
- OCR0A = ((F_CPU / 8 / AUDIO_SAMPLE_FREQUENCY) - 1);
+ OCR0A = ((F_CPU / 8 / CurrentAudioSampleFrequency) - 1);
TCCR0A = (1 << WGM01); // CTC mode
TCCR0B = (1 << CS01); // Fcpu/8 speed
}
@@ -152,6 +155,57 @@ void EVENT_USB_Device_ControlRequest(void)
Endpoint_ClearSETUP();
Endpoint_ClearStatusStage();
}
+
+ break;
+ case AUDIO_REQ_SetCurrent:
+ if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT))
+ {
+ /* Extract out the relevant request information to get the target Endpoint index and control being set */
+ uint8_t EndpointIndex = (uint8_t)USB_ControlRequest.wIndex;
+ uint8_t EndpointControl = (USB_ControlRequest.wValue >> 8);
+
+ /* Only handle SET CURRENT requests to the audio endpoint's sample frequency property */
+ if ((EndpointIndex == AUDIO_STREAM_EPNUM) && (EndpointControl == AUDIO_EPCONTROL_SamplingFreq))
+ {
+ uint8_t SampleRate[3];
+
+ Endpoint_ClearSETUP();
+ Endpoint_Read_Control_Stream_LE(SampleRate, sizeof(SampleRate));
+ Endpoint_ClearOUT();
+
+ /* Set the new sampling frequency to the value given by the host */
+ CurrentAudioSampleFrequency = (((uint32_t)SampleRate[2] << 16) | ((uint32_t)SampleRate[1] << 8) | (uint32_t)SampleRate[0]);
+
+ /* Adjust sample reload timer to the new frequency */
+ OCR0A = ((F_CPU / 8 / CurrentAudioSampleFrequency) - 1);
+ }
+ }
+
+ break;
+ case AUDIO_REQ_GetCurrent:
+ if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT))
+ {
+ /* Extract out the relevant request information to get the target Endpoint index and control being retrieved */
+ uint8_t EndpointIndex = (uint8_t)USB_ControlRequest.wIndex;
+ uint8_t EndpointControl = (USB_ControlRequest.wValue >> 8);
+
+ /* Only handle GET CURRENT requests to the audio endpoint's sample frequency property */
+ if ((EndpointIndex == AUDIO_STREAM_EPNUM) && (EndpointControl == AUDIO_EPCONTROL_SamplingFreq))
+ {
+ uint8_t SampleRate[3];
+
+ /* Convert the sampling rate value into the 24-bit format the host expects for the property */
+ SampleRate[2] = (CurrentAudioSampleFrequency >> 16);
+ SampleRate[1] = (CurrentAudioSampleFrequency >> 8);
+ SampleRate[0] = (CurrentAudioSampleFrequency & 0xFF);
+
+ Endpoint_ClearSETUP();
+ Endpoint_Write_Control_Stream_LE(SampleRate, sizeof(SampleRate));
+ Endpoint_ClearOUT();
+ }
+ }
+
+ break;
}
}
diff --git a/Demos/Device/LowLevel/AudioInput/Descriptors.c b/Demos/Device/LowLevel/AudioInput/Descriptors.c
index 8a63d7736..10959074a 100644
--- a/Demos/Device/LowLevel/AudioInput/Descriptors.c
+++ b/Demos/Device/LowLevel/AudioInput/Descriptors.c
@@ -55,7 +55,7 @@ const USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
.VendorID = 0x03EB,
.ProductID = 0x2047,
- .ReleaseNumber = VERSION_BCD(00.01),
+ .ReleaseNumber = VERSION_BCD(00.02),
.ManufacturerStrIndex = 0x01,
.ProductStrIndex = 0x02,
@@ -201,12 +201,17 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
.SubFrameSize = 0x02,
.BitResolution = 16,
- .TotalDiscreteSampleRates = 1,
+
+ .TotalDiscreteSampleRates = (sizeof(ConfigurationDescriptor.Audio_AudioFormatSampleRates) / sizeof(USB_Audio_SampleFreq_t)),
},
.Audio_AudioFormatSampleRates =
{
- AUDIO_SAMPLE_FREQ(AUDIO_SAMPLE_FREQUENCY)
+ AUDIO_SAMPLE_FREQ(8000),
+ AUDIO_SAMPLE_FREQ(11025),
+ AUDIO_SAMPLE_FREQ(22050),
+ AUDIO_SAMPLE_FREQ(44100),
+ AUDIO_SAMPLE_FREQ(48000),
},
.Audio_StreamEndpoint =
diff --git a/Demos/Device/LowLevel/AudioInput/Descriptors.h b/Demos/Device/LowLevel/AudioInput/Descriptors.h
index 82dbd517f..05d1fee36 100644
--- a/Demos/Device/LowLevel/AudioInput/Descriptors.h
+++ b/Demos/Device/LowLevel/AudioInput/Descriptors.h
@@ -51,9 +51,6 @@
*/
#define AUDIO_STREAM_EPSIZE ENDPOINT_MAX_SIZE(AUDIO_STREAM_EPNUM)
- /** Sample frequency of the data being transmitted through the streaming endpoint. */
- #define AUDIO_SAMPLE_FREQUENCY 48000
-
/* Type Defines: */
/** Type define for the device configuration descriptor structure. This must be defined in the
* application code, as the configuration descriptor contains several sub-descriptors which
@@ -70,7 +67,7 @@
USB_Descriptor_Interface_t Audio_StreamInterface_Alt1;
USB_Audio_Descriptor_Interface_AS_t Audio_StreamInterface_SPC;
USB_Audio_Descriptor_Format_t Audio_AudioFormat;
- USB_Audio_SampleFreq_t Audio_AudioFormatSampleRates[1];
+ USB_Audio_SampleFreq_t Audio_AudioFormatSampleRates[5];
USB_Audio_Descriptor_StreamEndpoint_Std_t Audio_StreamEndpoint;
USB_Audio_Descriptor_StreamEndpoint_Spc_t Audio_StreamEndpoint_SPC;
} USB_Descriptor_Configuration_t;
diff --git a/Demos/Device/LowLevel/AudioOutput/AudioOutput.c b/Demos/Device/LowLevel/AudioOutput/AudioOutput.c
index 22cfac4d9..c5d936300 100644
--- a/Demos/Device/LowLevel/AudioOutput/AudioOutput.c
+++ b/Demos/Device/LowLevel/AudioOutput/AudioOutput.c
@@ -39,6 +39,9 @@
/** Flag to indicate if the streaming audio alternative interface has been selected by the host. */
static bool StreamingAudioInterfaceSelected = false;
+/** Current audio sampling frequency of the streaming audio endpoint. */
+static uint32_t CurrentAudioSampleFrequency = 48000;
+
/** Main program entry point. This routine contains the overall program flow, including initial
* setup of all components and the main program loop.
@@ -81,7 +84,7 @@ void EVENT_USB_Device_Connect(void)
/* Sample reload timer initialization */
TIMSK0 = (1 << OCIE0A);
- OCR0A = ((F_CPU / 8 / AUDIO_SAMPLE_FREQUENCY) - 1);
+ OCR0A = ((F_CPU / 8 / CurrentAudioSampleFrequency) - 1);
TCCR0A = (1 << WGM01); // CTC mode
TCCR0B = (1 << CS01); // Fcpu/8 speed
@@ -178,6 +181,57 @@ void EVENT_USB_Device_ControlRequest(void)
Endpoint_ClearSETUP();
Endpoint_ClearStatusStage();
}
+
+ break;
+ case AUDIO_REQ_SetCurrent:
+ if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT))
+ {
+ /* Extract out the relevant request information to get the target Endpoint index and control being set */
+ uint8_t EndpointIndex = (uint8_t)USB_ControlRequest.wIndex;
+ uint8_t EndpointControl = (USB_ControlRequest.wValue >> 8);
+
+ /* Only handle SET CURRENT requests to the audio endpoint's sample frequency property */
+ if ((EndpointIndex == AUDIO_STREAM_EPNUM) && (EndpointControl == AUDIO_EPCONTROL_SamplingFreq))
+ {
+ uint8_t SampleRate[3];
+
+ Endpoint_ClearSETUP();
+ Endpoint_Read_Control_Stream_LE(SampleRate, sizeof(SampleRate));
+ Endpoint_ClearOUT();
+
+ /* Set the new sampling frequency to the value given by the host */
+ CurrentAudioSampleFrequency = (((uint32_t)SampleRate[2] << 16) | ((uint32_t)SampleRate[1] << 8) | (uint32_t)SampleRate[0]);
+
+ /* Adjust sample reload timer to the new frequency */
+ OCR0A = ((F_CPU / 8 / CurrentAudioSampleFrequency) - 1);
+ }
+ }
+
+ break;
+ case AUDIO_REQ_GetCurrent:
+ if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT))
+ {
+ /* Extract out the relevant request information to get the target Endpoint index and control being retrieved */
+ uint8_t EndpointIndex = (uint8_t)USB_ControlRequest.wIndex;
+ uint8_t EndpointControl = (USB_ControlRequest.wValue >> 8);
+
+ /* Only handle GET CURRENT requests to the audio endpoint's sample frequency property */
+ if ((EndpointIndex == AUDIO_STREAM_EPNUM) && (EndpointControl == AUDIO_EPCONTROL_SamplingFreq))
+ {
+ uint8_t SampleRate[3];
+
+ /* Convert the sampling rate value into the 24-bit format the host expects for the property */
+ SampleRate[2] = (CurrentAudioSampleFrequency >> 16);
+ SampleRate[1] = (CurrentAudioSampleFrequency >> 8);
+ SampleRate[0] = (CurrentAudioSampleFrequency & 0xFF);
+
+ Endpoint_ClearSETUP();
+ Endpoint_Write_Control_Stream_LE(SampleRate, sizeof(SampleRate));
+ Endpoint_ClearOUT();
+ }
+ }
+
+ break;
}
}
diff --git a/Demos/Device/LowLevel/AudioOutput/Descriptors.c b/Demos/Device/LowLevel/AudioOutput/Descriptors.c
index 59e3af1dd..a86eee75c 100644
--- a/Demos/Device/LowLevel/AudioOutput/Descriptors.c
+++ b/Demos/Device/LowLevel/AudioOutput/Descriptors.c
@@ -55,7 +55,7 @@ const USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
.VendorID = 0x03EB,
.ProductID = 0x2046,
- .ReleaseNumber = VERSION_BCD(00.01),
+ .ReleaseNumber = VERSION_BCD(00.02),
.ManufacturerStrIndex = 0x01,
.ProductStrIndex = 0x02,
@@ -202,12 +202,16 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
.SubFrameSize = 0x02,
.BitResolution = 16,
- .TotalDiscreteSampleRates = 1,
+ .TotalDiscreteSampleRates = (sizeof(ConfigurationDescriptor.Audio_AudioFormatSampleRates) / sizeof(USB_Audio_SampleFreq_t)),
},
.Audio_AudioFormatSampleRates =
{
- AUDIO_SAMPLE_FREQ(AUDIO_SAMPLE_FREQUENCY)
+ AUDIO_SAMPLE_FREQ(8000),
+ AUDIO_SAMPLE_FREQ(11025),
+ AUDIO_SAMPLE_FREQ(22050),
+ AUDIO_SAMPLE_FREQ(44100),
+ AUDIO_SAMPLE_FREQ(48000),
},
.Audio_StreamEndpoint =
diff --git a/Demos/Device/LowLevel/AudioOutput/Descriptors.h b/Demos/Device/LowLevel/AudioOutput/Descriptors.h
index b4b8db6a4..ca5c87386 100644
--- a/Demos/Device/LowLevel/AudioOutput/Descriptors.h
+++ b/Demos/Device/LowLevel/AudioOutput/Descriptors.h
@@ -51,9 +51,6 @@
*/
#define AUDIO_STREAM_EPSIZE ENDPOINT_MAX_SIZE(AUDIO_STREAM_EPNUM)
- /** Sample frequency of the data being transmitted through the streaming endpoint. */
- #define AUDIO_SAMPLE_FREQUENCY 48000
-
/* Type Defines: */
/** Type define for the device configuration descriptor structure. This must be defined in the
* application code, as the configuration descriptor contains several sub-descriptors which
@@ -70,7 +67,7 @@
USB_Descriptor_Interface_t Audio_StreamInterface_Alt1;
USB_Audio_Descriptor_Interface_AS_t Audio_StreamInterface_SPC;
USB_Audio_Descriptor_Format_t Audio_AudioFormat;
- USB_Audio_SampleFreq_t Audio_AudioFormatSampleRates[1];
+ USB_Audio_SampleFreq_t Audio_AudioFormatSampleRates[5];
USB_Audio_Descriptor_StreamEndpoint_Std_t Audio_StreamEndpoint;
USB_Audio_Descriptor_StreamEndpoint_Spc_t Audio_StreamEndpoint_SPC;
} USB_Descriptor_Configuration_t;
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index 886be5c56..d2d3c5d0d 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -29,7 +29,7 @@
* the supported audio sampling rates, to allow for multiple audio interfaces with different numbers of supported rates and/or
* continuous sample rates
* - Library Applications:
- * - Modified the Class Driver AudioInput and AudioOutput demos to support multiple sample rates
+ * - Modified the Low Level and Class Driver AudioInput and AudioOutput demos to support multiple sample rates
*
* <b>Fixed:</b>
* - Core:
@@ -1016,7 +1016,7 @@
* - Library license changed from LGPLv3 to MIT license
*
*
- * \section Sec_ChangeLog151 Version 1.5.1 - Released 31st July, 2008
+ * \section Sec_ChangeLog151 Version 1.5.1 - Released 7th July, 2008
*
* - Changed host demos to enable the host function task on the firing of the USB_DeviceEnumerationComplete event
* rather than the USB_DeviceAttached event
@@ -1095,7 +1095,7 @@
* - Added USE_NONSTANDARD_DESCRIPTOR_NAMES token to switch back to the non-standard descriptor element names
*
*
- * \section Sec_ChangeLog141 Version 1.4.1 - Released 5 May, 2008
+ * \section Sec_ChangeLog141 Version 1.4.1 - Released 19 May, 2008
*
* - Enhanced KeyboardWithParser demo, now prints out pressed alphanumeric characters like the standard demo
* - Fixed MassStorage demo, read/writes using non mode-10 commands now work correctly
diff --git a/LUFA/ManPages/VIDAndPIDValues.txt b/LUFA/ManPages/VIDAndPIDValues.txt
index d05334d9a..17d9e1782 100644
--- a/LUFA/ManPages/VIDAndPIDValues.txt
+++ b/LUFA/ManPages/VIDAndPIDValues.txt
@@ -361,7 +361,7 @@
* 0x206B
* </td>
* <td>
- * Class Driver Audio Input Demo (Multiple Sample Rates)
+ * <i>Currently Unallocated</i>
* </td>
* </tr>
*
@@ -373,7 +373,7 @@
* 0x206C
* </td>
* <td>
- * Class Driver Audio Output Demo (Multiple Sample Rates)
+ * <i>Currently Unallocated</i>
* </td>
* </tr>
*