X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/b9b03aadb219d06fbad9d110e508db93e45461af..03ee87b35abdb8b92e8b55ec040fa943f9a6786c:/Demos/Device/ClassDriver/AudioOutput/AudioOutput.c diff --git a/Demos/Device/ClassDriver/AudioOutput/AudioOutput.c b/Demos/Device/ClassDriver/AudioOutput/AudioOutput.c index 8c3bf6188..be3eb42c9 100644 --- a/Demos/Device/ClassDriver/AudioOutput/AudioOutput.c +++ b/Demos/Device/ClassDriver/AudioOutput/AudioOutput.c @@ -1,21 +1,21 @@ /* LUFA Library - Copyright (C) Dean Camera, 2009. + Copyright (C) Dean Camera, 2010. dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ /* - Copyright 2009 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, and distribute this software - and its documentation for any purpose and without fee is hereby - granted, provided that the above copyright notice appear in all - copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -40,12 +40,15 @@ * passed to all Audio Class driver functions, so that multiple instances of the same class * within a device can be differentiated from one another. */ -USB_ClassInfo_Audio_t Speaker_Audio_Interface = +USB_ClassInfo_Audio_Device_t Speaker_Audio_Interface = { - .StreamingInterfaceNumber = 1, + .Config = + { + .StreamingInterfaceNumber = 1, - .DataOUTEndpointNumber = AUDIO_STREAM_EPNUM, - .DataOUTEndpointSize = AUDIO_STREAM_EPSIZE, + .DataOUTEndpointNumber = AUDIO_STREAM_EPNUM, + .DataOUTEndpointSize = AUDIO_STREAM_EPSIZE, + }, }; /** Main program entry point. This routine contains the overall program flow, including initial @@ -59,10 +62,9 @@ int main(void) for (;;) { - if (Speaker_Audio_Interface.InterfaceEnabled) - ProcessNextSample(); + ProcessNextSample(); - USB_Audio_USBTask(&Speaker_Audio_Interface); + Audio_Device_USBTask(&Speaker_Audio_Interface); USB_USBTask(); } } @@ -87,64 +89,56 @@ void SetupHardware(void) */ void ProcessNextSample(void) { - if ((TIFR0 & (1 << OCF0A)) && USB_Audio_IsSampleReceived(&Speaker_Audio_Interface)) + /* Check if the sample reload timer period has elapsed, and that the USB bus is ready for a new sample */ + if ((TIFR0 & (1 << OCF0A)) && Audio_Device_IsSampleReceived(&Speaker_Audio_Interface)) { /* Clear the sample reload timer */ TIFR0 |= (1 << OCF0A); - /* Retrieve the signed 16-bit left and right audio samples */ - int16_t LeftSample_16Bit = (int16_t)USB_Audio_ReadSample16(); - int16_t RightSample_16Bit = (int16_t)USB_Audio_ReadSample16(); + /* Retrieve the signed 16-bit left and right audio samples, convert to 8-bit */ + int8_t LeftSample_8Bit = (Audio_Device_ReadSample16(&Speaker_Audio_Interface) >> 8); + int8_t RightSample_8Bit = (Audio_Device_ReadSample16(&Speaker_Audio_Interface) >> 8); - /* Massage signed 16-bit left and right audio samples into signed 8-bit */ - int8_t LeftSample_8Bit = (LeftSample_16Bit >> 8); - int8_t RightSample_8Bit = (RightSample_16Bit >> 8); - /* Mix the two channels together to produce a mono, 8-bit sample */ int8_t MixedSample_8Bit = (((int16_t)LeftSample_8Bit + (int16_t)RightSample_8Bit) >> 1); #if defined(AUDIO_OUT_MONO) /* Load the sample into the PWM timer channel */ - OCRxA = ((uint8_t)MixedSample_8Bit ^ (1 << 7)); + OCR3A = (MixedSample_8Bit ^ (1 << 7)); #elif defined(AUDIO_OUT_STEREO) /* Load the dual 8-bit samples into the PWM timer channels */ - OCRxA = ((uint8_t)LeftSample_8Bit ^ (1 << 7)); - OCRxB = ((uint8_t)RightSample_8Bit ^ (1 << 7)); + OCR3A = (LeftSample_8Bit ^ (1 << 7)); + OCR3B = (RightSample_8Bit ^ (1 << 7)); #elif defined(AUDIO_OUT_PORTC) + /* Load the 8-bit mixed sample into PORTC */ PORTC = MixedSample_8Bit; -#else - uint8_t LEDMask = LEDS_NO_LEDS; - - /* Make mixed sample value positive (absolute) */ - if (MixedSample_8Bit < 0) - MixedSample_8Bit = -MixedSample_8Bit; +#endif - if (MixedSample_8Bit > ((128 / 8) * 1)) - LEDMask |= LEDS_LED1; - - if (MixedSample_8Bit > ((128 / 8) * 2)) - LEDMask |= LEDS_LED2; - - if (MixedSample_8Bit > ((128 / 8) * 3)) - LEDMask |= LEDS_LED3; + uint8_t LEDMask = LEDS_NO_LEDS; - if (MixedSample_8Bit > ((128 / 8) * 4)) - LEDMask |= LEDS_LED4; + /* Turn on LEDs as the sample amplitude increases */ + if (MixedSample_8Bit > 16) + LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4); + else if (MixedSample_8Bit > 8) + LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3); + else if (MixedSample_8Bit > 4) + LEDMask = (LEDS_LED1 | LEDS_LED2); + else if (MixedSample_8Bit > 2) + LEDMask = (LEDS_LED1); LEDs_SetAllLEDs(LEDMask); -#endif } } /** Event handler for the library USB Connection event. */ -void EVENT_USB_Connect(void) +void EVENT_USB_Device_Connect(void) { LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); /* Sample reload timer initialization */ - OCR0A = (F_CPU / AUDIO_SAMPLE_FREQUENCY) - 1; + OCR0A = (F_CPU / 8 / AUDIO_SAMPLE_FREQUENCY) - 1; TCCR0A = (1 << WGM01); // CTC mode - TCCR0B = (1 << CS00); // Fcpu speed + TCCR0B = (1 << CS01); // Fcpu/8 speed #if defined(AUDIO_OUT_MONO) /* Set speaker as output */ @@ -159,14 +153,14 @@ void EVENT_USB_Connect(void) #if (defined(AUDIO_OUT_MONO) || defined(AUDIO_OUT_STEREO)) /* PWM speaker timer initialization */ - TCCRxA = ((1 << WGMx0) | (1 << COMxA1) | (1 << COMxA0) - | (1 << COMxB1) | (1 << COMxB0)); // Set on match, clear on TOP - TCCRxB = ((1 << WGMx2) | (1 << CSx0)); // Fast 8-Bit PWM, Fcpu speed -#endif + TCCR3A = ((1 << WGM30) | (1 << COM3A1) | (1 << COM3A0) + | (1 << COM3B1) | (1 << COM3B0)); // Set on match, clear on TOP + TCCR3B = ((1 << WGM32) | (1 << CS30)); // Fast 8-Bit PWM, Fcpu speed +#endif } /** Event handler for the library USB Disconnection event. */ -void EVENT_USB_Disconnect(void) +void EVENT_USB_Device_Disconnect(void) { LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); @@ -175,8 +169,8 @@ void EVENT_USB_Disconnect(void) #if (defined(AUDIO_OUT_MONO) || defined(AUDIO_OUT_STEREO)) /* Stop the PWM generation timer */ - TCCRxB = 0; -#endif + TCCR3B = 0; +#endif #if defined(AUDIO_OUT_MONO) /* Set speaker as input to reduce current draw */ @@ -191,16 +185,16 @@ void EVENT_USB_Disconnect(void) } /** Event handler for the library USB Configuration Changed event. */ -void EVENT_USB_ConfigurationChanged(void) +void EVENT_USB_Device_ConfigurationChanged(void) { LEDs_SetAllLEDs(LEDMASK_USB_READY); - if (!(USB_Audio_ConfigureEndpoints(&Speaker_Audio_Interface))) + if (!(Audio_Device_ConfigureEndpoints(&Speaker_Audio_Interface))) LEDs_SetAllLEDs(LEDMASK_USB_ERROR); } -/** Event handler for the library USB Unhandled Control Packet event. */ -void EVENT_USB_UnhandledControlPacket(void) +/** Event handler for the library USB Unhandled Control Request event. */ +void EVENT_USB_Device_UnhandledControlRequest(void) { - USB_Audio_ProcessControlPacket(&Speaker_Audio_Interface); + Audio_Device_ProcessControlRequest(&Speaker_Audio_Interface); }