diff --git a/Demos/Device/ClassDriver/AudioInput/AudioInput.c b/Demos/Device/ClassDriver/AudioInput/AudioInput.c index 58a3668e84..1acf20de80 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 6fffd05d4d..0d1f0e03e3 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 43267b2a7a..77727f05e4 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 5bb0e9f116..606d80b2ba 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 f62fcbec55..d791676607 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 8a63d77361..10959074a7 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 82dbd517f0..05d1fee36a 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 22cfac4d9f..c5d9363001 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 59e3af1dd6..a86eee75cb 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 b4b8db6a4a..ca5c873866 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 886be5c563..d2d3c5d0da 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 * * Fixed: * - 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 d05334d9a0..17d9e1782d 100644 --- a/LUFA/ManPages/VIDAndPIDValues.txt +++ b/LUFA/ManPages/VIDAndPIDValues.txt @@ -361,7 +361,7 @@ * 0x206B * * - * Class Driver Audio Input Demo (Multiple Sample Rates) + * Currently Unallocated * * * @@ -373,7 +373,7 @@ * 0x206C * * - * Class Driver Audio Output Demo (Multiple Sample Rates) + * Currently Unallocated * * *