From 046fff2aff485c550e55125bb059e001e39a6730 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Sun, 4 Oct 2009 07:57:15 +0000 Subject: Fix broken Endpoint/Pipe stream templates. Simplify AudioOutput demos, to reduce the number of cycles needed to process each incomming sample. --- Demos/Device/ClassDriver/AudioOutput/AudioOutput.c | 27 +++++++---------- Demos/Device/LowLevel/AudioOutput/AudioOutput.c | 35 +++++++++------------- .../USB/LowLevel/Template/Template_Endpoint_RW.c | 2 +- .../USB/LowLevel/Template/Template_Pipe_RW.c | 2 +- 4 files changed, 26 insertions(+), 40 deletions(-) diff --git a/Demos/Device/ClassDriver/AudioOutput/AudioOutput.c b/Demos/Device/ClassDriver/AudioOutput/AudioOutput.c index a73f1c96e..a95e43fd5 100644 --- a/Demos/Device/ClassDriver/AudioOutput/AudioOutput.c +++ b/Demos/Device/ClassDriver/AudioOutput/AudioOutput.c @@ -95,27 +95,20 @@ void ProcessNextSample(void) /* Clear the sample reload timer */ TIFR0 |= (1 << OCF0A); - /* Retrieve the signed 16-bit left and right audio samples */ - int16_t LeftSample_16Bit = Audio_Device_ReadSample16(&Speaker_Audio_Interface); - int16_t RightSample_16Bit = Audio_Device_ReadSample16(&Speaker_Audio_Interface); - - /* 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); + /* 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); /* 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); - /* Get absolute value of mixed sample value */ - uint8_t MixedSample_8Bit_Abs = abs(MixedSample_8Bit); - #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; @@ -124,13 +117,13 @@ void ProcessNextSample(void) uint8_t LEDMask = LEDS_NO_LEDS; /* Turn on LEDs as the sample amplitude increases */ - if (MixedSample_8Bit_Abs > 16) + if (MixedSample_8Bit > 16) LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4); - else if (MixedSample_8Bit_Abs > 8) + else if (MixedSample_8Bit > 8) LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3); - else if (MixedSample_8Bit_Abs > 4) + else if (MixedSample_8Bit > 4) LEDMask = (LEDS_LED1 | LEDS_LED2); - else if (MixedSample_8Bit_Abs > 2) + else if (MixedSample_8Bit > 2) LEDMask = (LEDS_LED1); LEDs_SetAllLEDs(LEDMask); diff --git a/Demos/Device/LowLevel/AudioOutput/AudioOutput.c b/Demos/Device/LowLevel/AudioOutput/AudioOutput.c index dd880b437..28e57c48c 100644 --- a/Demos/Device/LowLevel/AudioOutput/AudioOutput.c +++ b/Demos/Device/LowLevel/AudioOutput/AudioOutput.c @@ -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,23 +209,13 @@ 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); - - /* 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); - - /* Get absolute value of mixed sample value */ - uint8_t MixedSample_8Bit_Abs = abs(MixedSample_8Bit); - #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; @@ -231,15 +224,15 @@ void USB_Audio_Task(void) uint8_t LEDMask = LEDS_NO_LEDS; /* Turn on LEDs as the sample amplitude increases */ - if (MixedSample_8Bit_Abs > 16) + if (MixedSample_8Bit > 16) LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4); - else if (MixedSample_8Bit_Abs > 8) + else if (MixedSample_8Bit > 8) LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3); - else if (MixedSample_8Bit_Abs > 4) + else if (MixedSample_8Bit > 4) LEDMask = (LEDS_LED1 | LEDS_LED2); - else if (MixedSample_8Bit_Abs > 2) + else if (MixedSample_8Bit > 2) LEDMask = (LEDS_LED1); - + LEDs_SetAllLEDs(LEDMask); } } diff --git a/LUFA/Drivers/USB/LowLevel/Template/Template_Endpoint_RW.c b/LUFA/Drivers/USB/LowLevel/Template/Template_Endpoint_RW.c index 731c5f8ff..b75344025 100644 --- a/LUFA/Drivers/USB/LowLevel/Template/Template_Endpoint_RW.c +++ b/LUFA/Drivers/USB/LowLevel/Template/Template_Endpoint_RW.c @@ -1,4 +1,4 @@ -uint8_t TEMPLATE_FUNC_NAME (void* Buffer, uint16_t Length _CALLBACK_PARAM) +uint8_t TEMPLATE_FUNC_NAME (void* Buffer, uint16_t Length __CALLBACK_PARAM) { uint8_t* DataStream = (uint8_t*)(Buffer + TEMPLATE_BUFFER_OFFSET(Length)); uint8_t ErrorCode; diff --git a/LUFA/Drivers/USB/LowLevel/Template/Template_Pipe_RW.c b/LUFA/Drivers/USB/LowLevel/Template/Template_Pipe_RW.c index 4250d613b..3e09ac00b 100644 --- a/LUFA/Drivers/USB/LowLevel/Template/Template_Pipe_RW.c +++ b/LUFA/Drivers/USB/LowLevel/Template/Template_Pipe_RW.c @@ -1,4 +1,4 @@ -uint8_t TEMPLATE_FUNC_NAME (void* Buffer, uint16_t Length _CALLBACK_PARAM) +uint8_t TEMPLATE_FUNC_NAME (void* Buffer, uint16_t Length __CALLBACK_PARAM) { uint8_t* DataStream = (uint8_t*)(Buffer + TEMPLATE_BUFFER_OFFSET(Length)); uint8_t ErrorCode; -- cgit v1.2.3