X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/0ec2b55a7c9bc616ad8c78e75410dd27bae1b8b6..c4ebddd27ab964e55f4c7a1ae098f3f2c8ef47a6:/Demos/Host/ClassDriver/AudioOutputHost/AudioOutputHost.c diff --git a/Demos/Host/ClassDriver/AudioOutputHost/AudioOutputHost.c b/Demos/Host/ClassDriver/AudioOutputHost/AudioOutputHost.c index b4a7a3b2b..5f00568f5 100644 --- a/Demos/Host/ClassDriver/AudioOutputHost/AudioOutputHost.c +++ b/Demos/Host/ClassDriver/AudioOutputHost/AudioOutputHost.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2011. + Copyright (C) Dean Camera, 2012. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2012 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 @@ -44,7 +44,10 @@ USB_ClassInfo_Audio_Host_t Speaker_Audio_Interface = { .Config = { - .DataOUTPipeNumber = 1, + .DataOUTPipe = + { + .Address = (PIPE_DIR_OUT | 2), + }, }, }; @@ -63,74 +66,6 @@ int main(void) for (;;) { - switch (USB_HostState) - { - case HOST_STATE_Addressed: - LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); - - uint16_t ConfigDescriptorSize; - uint8_t ConfigDescriptorData[512]; - - if (USB_Host_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData, - sizeof(ConfigDescriptorData)) != HOST_GETCONFIG_Successful) - { - puts_P(PSTR("Error Retrieving Configuration Descriptor.\r\n")); - LEDs_SetAllLEDs(LEDMASK_USB_ERROR); - USB_HostState = HOST_STATE_WaitForDeviceRemoval; - break; - } - - if (Audio_Host_ConfigurePipes(&Speaker_Audio_Interface, - ConfigDescriptorSize, ConfigDescriptorData) != AUDIO_ENUMERROR_NoError) - { - puts_P(PSTR("Attached Device Not a Valid Audio Output Device.\r\n")); - LEDs_SetAllLEDs(LEDMASK_USB_ERROR); - USB_HostState = HOST_STATE_WaitForDeviceRemoval; - break; - } - - if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful) - { - puts_P(PSTR("Error Setting Device Configuration.\r\n")); - LEDs_SetAllLEDs(LEDMASK_USB_ERROR); - USB_HostState = HOST_STATE_WaitForDeviceRemoval; - break; - } - - if (Audio_Host_StartStopStreaming(&Speaker_Audio_Interface, true) != HOST_SENDCONTROL_Successful) - { - puts_P(PSTR("Error Enabling Audio Stream.\r\n")); - LEDs_SetAllLEDs(LEDMASK_USB_ERROR); - USB_HostState = HOST_STATE_WaitForDeviceRemoval; - break; - } - - USB_Audio_SampleFreq_t SampleRate = AUDIO_SAMPLE_FREQ(48000); - if (Audio_Host_GetSetEndpointProperty(&Speaker_Audio_Interface, Speaker_Audio_Interface.Config.DataOUTPipeNumber, - AUDIO_REQ_SetCurrent, AUDIO_EPCONTROL_SamplingFreq, - sizeof(SampleRate), &SampleRate) != HOST_SENDCONTROL_Successful) - { - puts_P(PSTR("Error Setting Audio Sampling Frequency.\r\n")); - LEDs_SetAllLEDs(LEDMASK_USB_ERROR); - USB_HostState = HOST_STATE_WaitForDeviceRemoval; - break; - } - - /* Sample reload timer initialization */ - TIMSK0 = (1 << OCIE0A); - OCR0A = ((F_CPU / 8 / 48000) - 1); - TCCR0A = (1 << WGM01); // CTC mode - TCCR0B = (1 << CS01); // Fcpu/8 speed - - puts_P(PSTR("Audio Device Enumerated.\r\n")); - LEDs_SetAllLEDs(LEDMASK_USB_READY); - USB_HostState = HOST_STATE_Configured; - break; - case HOST_STATE_Configured: - /* Do nothing - audio stream is handled by the timer interrupt routine */ - break; - } - Audio_Host_USBTask(&Speaker_Audio_Interface); USB_USBTask(); } @@ -149,11 +84,11 @@ ISR(TIMER0_COMPA_vect, ISR_BLOCK) #if defined(USE_TEST_TONE) static uint8_t SquareWaveSampleCount; static int16_t CurrentWaveValue; - + /* In test tone mode, generate a square wave at 1/256 of the sample rate */ if (SquareWaveSampleCount++ == 0xFF) CurrentWaveValue ^= 0x8000; - + /* Only generate audio if the board button is being pressed */ AudioSample = (Buttons_GetStatus() & BUTTONS_BUTTON1) ? CurrentWaveValue : 0; #else @@ -165,11 +100,11 @@ ISR(TIMER0_COMPA_vect, ISR_BLOCK) AudioSample -= (SAMPLE_MAX_RANGE / 2); #endif #endif - - Audio_Host_WriteSample16(&Speaker_Audio_Interface, AudioSample); + + Audio_Host_WriteSample16(&Speaker_Audio_Interface, AudioSample); Audio_Host_WriteSample16(&Speaker_Audio_Interface, AudioSample); } - + Pipe_SelectPipe(PrevPipe); } @@ -193,6 +128,9 @@ void SetupHardware(void) /* Create a stdio stream for the serial port for stdin and stdout */ Serial_CreateStream(NULL); + + /* Start the ADC conversion in free running mode */ + ADC_StartReading(ADC_REFERENCE_AVCC | ADC_RIGHT_ADJUSTED | ADC_GET_CHANNEL_MASK(MIC_IN_ADC_CHANNEL)); } /** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and @@ -218,6 +156,60 @@ void EVENT_USB_Host_DeviceUnattached(void) */ void EVENT_USB_Host_DeviceEnumerationComplete(void) { + LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); + + uint16_t ConfigDescriptorSize; + uint8_t ConfigDescriptorData[512]; + + if (USB_Host_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData, + sizeof(ConfigDescriptorData)) != HOST_GETCONFIG_Successful) + { + puts_P(PSTR("Error Retrieving Configuration Descriptor.\r\n")); + LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + return; + } + + if (Audio_Host_ConfigurePipes(&Speaker_Audio_Interface, + ConfigDescriptorSize, ConfigDescriptorData) != AUDIO_ENUMERROR_NoError) + { + puts_P(PSTR("Attached Device Not a Valid Audio Output Device.\r\n")); + LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + return; + } + + if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful) + { + puts_P(PSTR("Error Setting Device Configuration.\r\n")); + LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + return; + } + + if (Audio_Host_StartStopStreaming(&Speaker_Audio_Interface, true) != HOST_SENDCONTROL_Successful) + { + puts_P(PSTR("Error Enabling Audio Stream.\r\n")); + LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + USB_Host_SetDeviceConfiguration(0); + return; + } + + USB_Audio_SampleFreq_t SampleRate = AUDIO_SAMPLE_FREQ(48000); + if (Audio_Host_GetSetEndpointProperty(&Speaker_Audio_Interface, Speaker_Audio_Interface.Config.DataOUTPipe.Address, + AUDIO_REQ_SetCurrent, AUDIO_EPCONTROL_SamplingFreq, + sizeof(SampleRate), &SampleRate) != HOST_SENDCONTROL_Successful) + { + puts_P(PSTR("Error Setting Audio Sampling Frequency.\r\n")); + LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + USB_Host_SetDeviceConfiguration(0); + return; + } + + /* Sample reload timer initialization */ + TIMSK0 = (1 << OCIE0A); + OCR0A = ((F_CPU / 8 / 48000) - 1); + TCCR0A = (1 << WGM01); // CTC mode + TCCR0B = (1 << CS01); // Fcpu/8 speed + + puts_P(PSTR("Audio Device Enumerated.\r\n")); LEDs_SetAllLEDs(LEDMASK_USB_READY); }