Changed Audio Class driver sample read/write functions to be inline, to reduce the number of cycles needed to transfer samples to and from the device (allowing more time for processing and output).

Fixed ClassDriver AudioOutput demo not selecting an audio output mode.
pull/1469/head
Dean Camera 15 years ago
parent 3ebfb998ec
commit 433399b05d

@ -123,17 +123,15 @@ void ProcessNextSample(void)
uint8_t LEDMask = LEDS_NO_LEDS; uint8_t LEDMask = LEDS_NO_LEDS;
if (MixedSample_8Bit_Abs > 2) /* Turn on LEDs as the sample amplitude increases */
LEDMask |= LEDS_LED1;
if (MixedSample_8Bit_Abs > 4)
LEDMask |= LEDS_LED2;
if (MixedSample_8Bit_Abs > 8)
LEDMask |= LEDS_LED3;
if (MixedSample_8Bit_Abs > 16) if (MixedSample_8Bit_Abs > 16)
LEDMask |= LEDS_LED4; LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4);
else if (MixedSample_8Bit_Abs > 8)
LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3);
else if (MixedSample_8Bit_Abs > 4)
LEDMask = (LEDS_LED1 | LEDS_LED2);
else if (MixedSample_8Bit_Abs > 2)
LEDMask = (LEDS_LED1);
LEDs_SetAllLEDs(LEDMask); LEDs_SetAllLEDs(LEDMask);
} }

@ -184,6 +184,7 @@ CSTANDARD = -std=gnu99
# Place -D or -U options here for C sources # Place -D or -U options here for C sources
CDEFS = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD) $(LUFA_OPTS) CDEFS = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD) $(LUFA_OPTS)
CDEFS += -DAUDIO_OUT_STEREO
# Place -D or -U options here for ASM sources # Place -D or -U options here for ASM sources

@ -230,17 +230,15 @@ void USB_Audio_Task(void)
uint8_t LEDMask = LEDS_NO_LEDS; uint8_t LEDMask = LEDS_NO_LEDS;
if (MixedSample_8Bit_Abs > 2) /* Turn on LEDs as the sample amplitude increases */
LEDMask |= LEDS_LED1;
if (MixedSample_8Bit_Abs > 4)
LEDMask |= LEDS_LED2;
if (MixedSample_8Bit_Abs > 8)
LEDMask |= LEDS_LED3;
if (MixedSample_8Bit_Abs > 16) if (MixedSample_8Bit_Abs > 16)
LEDMask |= LEDS_LED4; LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4);
else if (MixedSample_8Bit_Abs > 8)
LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3);
else if (MixedSample_8Bit_Abs > 4)
LEDMask = (LEDS_LED1 | LEDS_LED2);
else if (MixedSample_8Bit_Abs > 2)
LEDMask = (LEDS_LED1);
LEDs_SetAllLEDs(LEDMask); LEDs_SetAllLEDs(LEDMask);
} }

File diff suppressed because one or more lines are too long

@ -89,7 +89,7 @@
#elif (BOARD == BOARD_ATAVRUSBRF01) #elif (BOARD == BOARD_ATAVRUSBRF01)
#include "ATAVRUSBRF01/LEDs.h" #include "ATAVRUSBRF01/LEDs.h"
#elif (BOARD == BOARD_XPLAIN) #elif (BOARD == BOARD_XPLAIN)
#include "XPLAIN/LEDs.h #include "XPLAIN/LEDs.h"
#elif (BOARD == BOARD_BUMBLEB) #elif (BOARD == BOARD_BUMBLEB)
#include "BUMBLEB/LEDs.h" #include "BUMBLEB/LEDs.h"
#elif (BOARD == BOARD_USER) #elif (BOARD == BOARD_USER)

@ -89,67 +89,6 @@ void Audio_Device_USBTask(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo
} }
int8_t Audio_Device_ReadSample8(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo)
{
int8_t Sample;
Sample = Endpoint_Read_Byte();
if (!(Endpoint_BytesInEndpoint()))
Endpoint_ClearOUT();
return Sample;
}
int16_t Audio_Device_ReadSample16(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo)
{
int16_t Sample;
Sample = (int16_t)Endpoint_Read_Word_LE();
if (!(Endpoint_BytesInEndpoint()))
Endpoint_ClearOUT();
return Sample;
}
int32_t Audio_Device_ReadSample24(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo)
{
int32_t Sample;
Sample = (((uint32_t)Endpoint_Read_Byte() << 16) | Endpoint_Read_Word_LE());
if (!(Endpoint_BytesInEndpoint()))
Endpoint_ClearOUT();
return Sample;
}
void Audio_Device_WriteSample8(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, const int8_t Sample)
{
Endpoint_Write_Byte(Sample);
if (Endpoint_BytesInEndpoint() == AudioInterfaceInfo->Config.DataINEndpointSize)
Endpoint_ClearIN();
}
void Audio_Device_WriteSample16(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, const int16_t Sample)
{
Endpoint_Write_Word_LE(Sample);
if (Endpoint_BytesInEndpoint() == AudioInterfaceInfo->Config.DataINEndpointSize)
Endpoint_ClearIN();
}
void Audio_Device_WriteSample24(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, const int32_t Sample)
{
Endpoint_Write_Byte(Sample >> 16);
Endpoint_Write_Word_LE(Sample);
if (Endpoint_BytesInEndpoint() == AudioInterfaceInfo->Config.DataINEndpointSize)
Endpoint_ClearIN();
}
bool Audio_Device_IsSampleReceived(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) bool Audio_Device_IsSampleReceived(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo)
{ {
if ((USB_DeviceState != DEVICE_STATE_Configured) || !(AudioInterfaceInfo->State.InterfaceEnabled)) if ((USB_DeviceState != DEVICE_STATE_Configured) || !(AudioInterfaceInfo->State.InterfaceEnabled))

@ -120,6 +120,25 @@
*/ */
void Audio_Device_USBTask(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); void Audio_Device_USBTask(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
/** Determines if the given audio interface is ready for a sample to be read from it, and selects the streaming
* OUT endpoint ready for reading.
*
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state.
*
* \return Boolean true if the given Audio interface has a sample to be read, false otherwise
*/
bool Audio_Device_IsSampleReceived(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo);
/** Determines if the given audio interface is ready to accept the next sample to be written to it, and selects
* the streaming IN endpoint ready for writing.
*
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state.
*
* \return Boolean true if the given Audio interface is ready to accept the next sample, false otherwise
*/
bool Audio_Device_IsReadyForNextSample(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo);
/* Inline Functions: */
/** Reads the next 8-bit audio sample from the current audio interface. /** Reads the next 8-bit audio sample from the current audio interface.
* *
* \note This should be preceeded immediately by a call to the USB_Audio_IsSampleReceived() function to ensure that * \note This should be preceeded immediately by a call to the USB_Audio_IsSampleReceived() function to ensure that
@ -129,7 +148,18 @@
* *
* \return Signed 8-bit audio sample from the audio interface * \return Signed 8-bit audio sample from the audio interface
*/ */
int8_t Audio_Device_ReadSample8(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); static inline int8_t Audio_Device_ReadSample8(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) ATTR_ALWAYS_INLINE;
static inline int8_t Audio_Device_ReadSample8(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo)
{
int8_t Sample;
Sample = Endpoint_Read_Byte();
if (!(Endpoint_BytesInEndpoint()))
Endpoint_ClearOUT();
return Sample;
}
/** Reads the next 16-bit audio sample from the current audio interface. /** Reads the next 16-bit audio sample from the current audio interface.
* *
@ -140,7 +170,18 @@
* *
* \return Signed 16-bit audio sample from the audio interface * \return Signed 16-bit audio sample from the audio interface
*/ */
int16_t Audio_Device_ReadSample16(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); static inline int16_t Audio_Device_ReadSample16(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) ATTR_ALWAYS_INLINE;
static inline int16_t Audio_Device_ReadSample16(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo)
{
int16_t Sample;
Sample = (int16_t)Endpoint_Read_Word_LE();
if (!(Endpoint_BytesInEndpoint()))
Endpoint_ClearOUT();
return Sample;
}
/** Reads the next 24-bit audio sample from the current audio interface. /** Reads the next 24-bit audio sample from the current audio interface.
* *
@ -150,7 +191,18 @@
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state.
* \return Signed 24-bit audio sample from the audio interface * \return Signed 24-bit audio sample from the audio interface
*/ */
int32_t Audio_Device_ReadSample24(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); static inline int32_t Audio_Device_ReadSample24(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) ATTR_ALWAYS_INLINE;
static inline int32_t Audio_Device_ReadSample24(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo)
{
int32_t Sample;
Sample = (((uint32_t)Endpoint_Read_Byte() << 16) | Endpoint_Read_Word_LE());
if (!(Endpoint_BytesInEndpoint()))
Endpoint_ClearOUT();
return Sample;
}
/** Writes the next 8-bit audio sample to the current audio interface. /** Writes the next 8-bit audio sample to the current audio interface.
* *
@ -160,7 +212,16 @@
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state.
* \param[in] Sample Signed 8-bit audio sample * \param[in] Sample Signed 8-bit audio sample
*/ */
void Audio_Device_WriteSample8(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, const int8_t Sample) ATTR_NON_NULL_PTR_ARG(1); static inline void Audio_Device_WriteSample8(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo,
const int8_t Sample) ATTR_ALWAYS_INLINE;
static inline void Audio_Device_WriteSample8(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo,
const int8_t Sample)
{
Endpoint_Write_Byte(Sample);
if (Endpoint_BytesInEndpoint() == AudioInterfaceInfo->Config.DataINEndpointSize)
Endpoint_ClearIN();
}
/** Writes the next 16-bit audio sample to the current audio interface. /** Writes the next 16-bit audio sample to the current audio interface.
* *
@ -170,7 +231,16 @@
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state.
* \param[in] Sample Signed 16-bit audio sample * \param[in] Sample Signed 16-bit audio sample
*/ */
void Audio_Device_WriteSample16(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, const int16_t Sample) ATTR_NON_NULL_PTR_ARG(1); static inline void Audio_Device_WriteSample16(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo,
const int16_t Sample) ATTR_ALWAYS_INLINE;
static inline void Audio_Device_WriteSample16(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo,
const int16_t Sample)
{
Endpoint_Write_Word_LE(Sample);
if (Endpoint_BytesInEndpoint() == AudioInterfaceInfo->Config.DataINEndpointSize)
Endpoint_ClearIN();
}
/** Writes the next 24-bit audio sample to the current audio interface. /** Writes the next 24-bit audio sample to the current audio interface.
* *
@ -180,23 +250,17 @@
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state.
* \param[in] Sample Signed 24-bit audio sample * \param[in] Sample Signed 24-bit audio sample
*/ */
void Audio_Device_WriteSample24(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, const int32_t Sample) ATTR_NON_NULL_PTR_ARG(1); static inline void Audio_Device_WriteSample24(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo,
const int32_t Sample) ATTR_ALWAYS_INLINE;
/** Determines if the given audio interface is ready for a sample to be read from it. static inline void Audio_Device_WriteSample24(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo,
* const int32_t Sample)
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. {
* Endpoint_Write_Byte(Sample >> 16);
* \return Boolean true if the given Audio interface has a sample to be read, false otherwise Endpoint_Write_Word_LE(Sample);
*/
bool Audio_Device_IsSampleReceived(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
/** Determines if the given audio interface is ready to accept the next sample to be written to it. if (Endpoint_BytesInEndpoint() == AudioInterfaceInfo->Config.DataINEndpointSize)
* Endpoint_ClearIN();
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. }
*
* \return Boolean true if the given Audio interface is ready to accept the next sample, false otherwise
*/
bool Audio_Device_IsReadyForNextSample(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
/* Disable C linkage for C++ Compilers: */ /* Disable C linkage for C++ Compilers: */
#if defined(__cplusplus) #if defined(__cplusplus)

@ -216,7 +216,8 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID
case (TYPE_MAIN | TAG_MAIN_INPUT): case (TYPE_MAIN | TAG_MAIN_INPUT):
case (TYPE_MAIN | TAG_MAIN_OUTPUT): case (TYPE_MAIN | TAG_MAIN_OUTPUT):
case (TYPE_MAIN | TAG_MAIN_FEATURE): case (TYPE_MAIN | TAG_MAIN_FEATURE):
for (uint8_t ReportItemNum = 0; ReportItemNum < CurrStateTable->ReportCount; ReportItemNum++) uint8_t Count = CurrStateTable->ReportCount;
for (uint8_t ReportItemNum = 0; ReportItemNum < Count; ReportItemNum++)
{ {
HID_ReportItem_t NewReportItem; HID_ReportItem_t NewReportItem;

@ -17,6 +17,8 @@
* - Removed mostly useless "TestApp" demo, as it was mainly useful only for checking for sytax errors in the library * - Removed mostly useless "TestApp" demo, as it was mainly useful only for checking for sytax errors in the library
* - MIDI device demos now receive MIDI events from the host and display note ON messages via the board LEDs * - MIDI device demos now receive MIDI events from the host and display note ON messages via the board LEDs
* - Cleanups to the Device mode Mass Storage demo applications' SCSI routines * - Cleanups to the Device mode Mass Storage demo applications' SCSI routines
* - Changed Audio Class driver sample read/write functions to be inline, to reduce the number of cycles needed to transfer
* samples to and from the device (allowing more time for processing and output)
* *
* <b>Fixed:</b> * <b>Fixed:</b>
* - Fixed PrinterHost demo returning invalid Device ID data when the attached device does not have a * - Fixed PrinterHost demo returning invalid Device ID data when the attached device does not have a
@ -24,6 +26,7 @@
* - Changed LUFA_VERSION_INTEGER define to use BCD values, to make comparisons eaiser * - Changed LUFA_VERSION_INTEGER define to use BCD values, to make comparisons eaiser
* - Fixed issue in the HID Host class driver's HID_Host_SendReportByID() routine using the incorrect mode (control/pipe) * - Fixed issue in the HID Host class driver's HID_Host_SendReportByID() routine using the incorrect mode (control/pipe)
* to send report to the attached device * to send report to the attached device
* - Fixed ClassDriver AudioOutput demo not selecting an audio output mode
* *
* \section Sec_ChangeLog090924 Version 090924 * \section Sec_ChangeLog090924 Version 090924
* *

@ -40,6 +40,7 @@
* - NES Controller USB modification: http://projects.peterpolidoro.net/video/NESUSB.htm * - NES Controller USB modification: http://projects.peterpolidoro.net/video/NESUSB.htm
* - Reprap with LUFA, a LUFA powered 3D printer: http://code.google.com/p/at90usb1287-code-for-arduino-and-eclipse/ * - Reprap with LUFA, a LUFA powered 3D printer: http://code.google.com/p/at90usb1287-code-for-arduino-and-eclipse/
* - SEGA Megadrive/Genesis Development Cartridge: http://www.makestuff.eu/wordpress/?page_id=398 * - SEGA Megadrive/Genesis Development Cartridge: http://www.makestuff.eu/wordpress/?page_id=398
* - SEGA Megadrive/Super Nintendo Cartridge Reader: http://www.snega2usb.com
* - Stripe Snoop, a Magnetic Card reader: http://www.ossguy.com/ss_usb/ * - Stripe Snoop, a Magnetic Card reader: http://www.ossguy.com/ss_usb/
* - USB Interface for Playstation Portable Devices: http://forums.ps2dev.org/viewtopic.php?t=11001 * - USB Interface for Playstation Portable Devices: http://forums.ps2dev.org/viewtopic.php?t=11001
* - Userial, a USB to Serial converter with SPI, I2C and other protocols: http://www.tty1.net/userial/ * - Userial, a USB to Serial converter with SPI, I2C and other protocols: http://www.tty1.net/userial/

Loading…
Cancel
Save