X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/3472af91a5c167cf243335fa32b5284a4a796e39..a4ebf4e92061bf1eec9224e64bc823ca7bedada4:/Demos/Device/LowLevel/AudioOutput/AudioOutput.c diff --git a/Demos/Device/LowLevel/AudioOutput/AudioOutput.c b/Demos/Device/LowLevel/AudioOutput/AudioOutput.c index c814c8ce5..5dcb5c576 100644 --- a/Demos/Device/LowLevel/AudioOutput/AudioOutput.c +++ b/Demos/Device/LowLevel/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 @@ -30,7 +30,7 @@ /** \file * - * Main source file for the Audio Output demo. This file contains the main tasks of the demo and + * Main source file for the AudioOutput demo. This file contains the main tasks of the demo and * is responsible for the initial application hardware configuration. */ @@ -73,15 +73,15 @@ void SetupHardware(void) /** Event handler for the USB_Connect event. This indicates that the device is enumerating via the status LEDs, and * configures the sample update and PWM timers. */ -void EVENT_USB_Connect(void) +void EVENT_USB_Device_Connect(void) { /* Indicate USB enumerating */ 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 */ @@ -105,7 +105,7 @@ void EVENT_USB_Connect(void) /** Event handler for the USB_Disconnect event. This indicates that the device is no longer connected to a host via * the status LEDs, disables the sample update and PWM output timers and stops the USB and Audio management tasks. */ -void EVENT_USB_Disconnect(void) +void EVENT_USB_Device_Disconnect(void) { /* Stop the timers */ TCCR0B = 0; @@ -134,7 +134,7 @@ void EVENT_USB_Disconnect(void) /** Event handler for the USB_ConfigurationChanged event. This is fired when the host set the current configuration * of the USB device after enumeration - the device endpoints are configured. */ -void EVENT_USB_ConfigurationChanged(void) +void EVENT_USB_Device_ConfigurationChanged(void) { /* Indicate USB connected and ready */ LEDs_SetAllLEDs(LEDMASK_USB_READY); @@ -148,11 +148,11 @@ void EVENT_USB_ConfigurationChanged(void) } } -/** Event handler for the USB_UnhandledControlPacket event. This is used to catch standard and class specific +/** Event handler for the USB_UnhandledControlRequest event. This is used to catch standard and class specific * control requests that are not handled internally by the USB library (including the Audio class-specific * requests) so that they can be handled appropriately for the application. */ -void EVENT_USB_UnhandledControlPacket(void) +void EVENT_USB_Device_UnhandledControlRequest(void) { /* Process General and Audio specific control requests */ switch (USB_ControlRequest.bRequest) @@ -195,9 +195,12 @@ void USB_Audio_Task(void) /* Clear the sample reload timer */ TIFR0 |= (1 << OCF0A); - /* Retrieve the signed 16-bit left and right audio samples */ - int16_t LeftSample_16Bit = (int16_t)Endpoint_Read_Word_LE(); - int16_t RightSample_16Bit = (int16_t)Endpoint_Read_Word_LE(); + /* Retrieve the signed 16-bit left and right audio samples, convert to 8-bit */ + int8_t LeftSample_8Bit = ((int16_t)Endpoint_Read_Word_LE() >> 8); + int8_t RightSample_8Bit = ((int16_t)Endpoint_Read_Word_LE() >> 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); /* Check to see if the bank is now empty */ if (!(Endpoint_IsReadWriteAllowed())) @@ -206,44 +209,30 @@ void USB_Audio_Task(void) Endpoint_ClearOUT(); } - /* 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); - -#if !defined(AUDIO_OUT_STEREO) - /* 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); -#endif - #if defined(AUDIO_OUT_MONO) /* Load the sample into the PWM timer channel */ - OCR3A = ((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 */ - OCR3A = ((uint8_t)LeftSample_8Bit ^ (1 << 7)); - OCR3B = ((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 +#endif + uint8_t LEDMask = LEDS_NO_LEDS; - /* Make mixed sample value positive (absolute) */ - MixedSample_8Bit = abs(MixedSample_8Bit); - - 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; - - 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 } }