Copyright (C) Dean Camera, 2010.
dean [at] fourwalledcubicle [dot] com
- www.fourwalledcubicle.com
+ www.lufa-lib.org
*/
/*
for (;;)
{
- USB_Audio_Task();
USB_USBTask();
}
}
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
/* Sample reload timer initialization */
- OCR0A = (F_CPU / 8 / AUDIO_SAMPLE_FREQUENCY) - 1;
+ TIMSK0 = (1 << OCIE0A);
+ OCR0A = ((F_CPU / 8 / AUDIO_SAMPLE_FREQUENCY) - 1);
TCCR0A = (1 << WGM01); // CTC mode
TCCR0B = (1 << CS01); // Fcpu/8 speed
}
LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);
}
-/** 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.
+/** Event handler for the USB_ControlRequest event. This is used to catch and process control requests sent to
+ * the device from the USB host before passing along unhandled control requests to the library for processing
+ * internally.
*/
-void EVENT_USB_Device_UnhandledControlRequest(void)
+void EVENT_USB_Device_ControlRequest(void)
{
/* Process General and Audio specific control requests */
switch (USB_ControlRequest.bRequest)
}
}
-/** Task to manage the Audio interface, reading in ADC samples from the microphone, and them to the host. */
-void USB_Audio_Task(void)
+/** ISR to handle the reloading of the data endpoint with the next sample. */
+ISR(TIMER0_COMPA_vect, ISR_BLOCK)
{
- /* Device must be connected and configured for the task to run */
- if (USB_DeviceState != DEVICE_STATE_Configured)
- return;
-
- /* Check to see if the streaming interface is selected, if not the host is not receiving audio */
- if (!(StreamingAudioInterfaceSelected))
- return;
+ uint8_t PrevEndpoint = Endpoint_GetCurrentEndpoint();
/* Select the audio stream endpoint */
Endpoint_SelectEndpoint(AUDIO_STREAM_EPNUM);
- /* Check if the current endpoint can be written to and that the next sample should be stored */
- if (Endpoint_IsINReady() && (TIFR0 & (1 << OCF0A)))
+ /* Check if the current endpoint can be written to and that the audio interface is enabled */
+ if (Endpoint_IsINReady() && StreamingAudioInterfaceSelected)
{
- /* Clear the sample reload timer */
- TIFR0 |= (1 << OCF0A);
-
int16_t AudioSample;
#if defined(USE_TEST_TONE)
Endpoint_ClearIN();
}
}
+
+ Endpoint_SelectEndpoint(PrevEndpoint);
}