/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the disclaimer below. * * Atmel's name may not be used to endorse or promote products derived from * this software without specific prior written permission. * * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** * \file * * \section Purpose * * Definition of a USB Audio Speaker Driver with two playback channels. * * \section Usage * * -# Enable and setup USB related pins (see pio & board.h). * -# Configure the USB Audio Speaker driver using AUDDSpeakerDriver_Initialize * -# To get %audio stream frames from host, use AUDDSpeakerDriver_Read */ #ifndef AUDDSPEAKERDRIVER_H #define AUDDSPEAKERDRIVER_H /** \addtogroup usbd_audio_speaker *@{ */ /*---------------------------------------------------------------------------- * Headers *----------------------------------------------------------------------------*/ #include #include #include #include #include #include #include /*---------------------------------------------------------------------------- * Definitions *----------------------------------------------------------------------------*/ /** \addtogroup usbd_audio_ch USB Device Audio Speaker Channel Numbers * @{ * This page lists codes for USB Audio Speaker channel numbers. * * \par Playback channel numbers * - \ref AUDDSpeakerDriver_MASTERCHANNEL * - \ref AUDDSpeakerDriver_LEFTCHANNEL * - \ref AUDDSpeakerDriver_RIGHTCHANNEL * * \par Record channel number * - \ref AUDDSpeakerDriver_RECCHANNEL */ /** Master channel of playback. */ #define AUDDSpeakerDriver_MASTERCHANNEL 0 /** Front left channel of playback. */ #define AUDDSpeakerDriver_LEFTCHANNEL 1 /** Front right channel of playback. */ #define AUDDSpeakerDriver_RIGHTCHANNEL 2 /** Channel of record. */ #define AUDDSpeakerDriver_RECCHANNEL 0 /** Max Number of channels in audio stream (excluding master). */ #define AUDDSpeakerDriver_NUMCHANNELS 2 /** @}*/ /** \addtogroup usbd_audio_speaker_if USB Device Audio Speaker Interface IDs * @{ * This page lists the interface numbers for USB Audio Speaker device. * - \ref AUDDSpeakerDriverDescriptors_CONTROL * - \ref AUDDSpeakerDriverDescriptors_STREAMING * Total number of integrated interfaces * - \ref AUDDSpeakerDriver_NUMINTERFACES */ /** Audio control interface ID. */ #define AUDDSpeakerDriverDescriptors_CONTROL 0 /** Audio streaming interface ID (OUT, for playback). */ #define AUDDSpeakerDriverDescriptors_STREAMING 1 /** Audio speaker total number of interfaces */ #define AUDDSpeakerDriver_NUMINTERFACES 2 /** @}*/ /** \addtogroup usbd_audio_entity USB Device Audio Speaker Entity IDs * @{ * This page lists the entity IDs for USB Audio Speaker device. * - \ref AUDDSpeakerDriverDescriptors_INPUTTERMINAL * - \ref AUDDSpeakerDriverDescriptors_OUTPUTTERMINAL * - \ref AUDDSpeakerDriverDescriptors_FEATUREUNIT */ /** Playback input terminal ID. */ #define AUDDSpeakerDriverDescriptors_INPUTTERMINAL AUDD_ID_SpeakerIT /** Playback output terminal ID. */ #define AUDDSpeakerDriverDescriptors_OUTPUTTERMINAL AUDD_ID_SpeakerOT /** Playback feature unit ID. */ #define AUDDSpeakerDriverDescriptors_FEATUREUNIT AUDD_ID_SpeakerFU /** @}*/ /*---------------------------------------------------------------------------- * Types *----------------------------------------------------------------------------*/ #ifdef __ICCARM__ /* IAR*/ #pragma pack(1) /* IAR*/ #define __attribute__(...) /* IAR*/ #endif /* IAR*/ /** * \typedef AUDHeaderDescriptor1 * \brief Header descriptor with 1 interface. */ typedef struct _AUDHeaderDescriptor1 { /** Header descriptor. */ AUDHeaderDescriptor header; /** Id of the first grouped interface - Speaker. */ uint8_t bInterface0; } __attribute__ ((packed)) AUDHeaderDescriptor1; /* GCC*/ /** * \typedef AUDFeatureUnitDescriptor3 * \brief Feature unit descriptor with 3 channel controls * (master, right, left). */ typedef struct _AUDFeatureUnitDescriptor3 { /** Feature unit descriptor. */ AUDFeatureUnitDescriptor feature; /** Available controls for each channel. */ uint8_t bmaControls[3]; /** Index of a string descriptor for the feature unit. */ uint8_t iFeature; } __attribute__ ((packed)) AUDFeatureUnitDescriptor3; /* GCC */ /** * \typedef AUDDSpeakerDriverAudioControlDescriptors * \brief List of descriptors for detailling the audio control interface of a * device using a USB audio speaker driver. */ typedef struct _AUDDSpeakerDriverAudioControlDescriptors { /** Header descriptor (with one slave interface). */ AUDHeaderDescriptor1 header; /** Input terminal descriptor. */ AUDInputTerminalDescriptor input; /** Output terminal descriptor. */ AUDOutputTerminalDescriptor output; /** Feature unit descriptor. */ AUDFeatureUnitDescriptor3 feature; } __attribute__ ((packed)) AUDDSpeakerDriverAudioControlDescriptors; /* GCC*/ /** * \typedef AUDFormatTypeOneDescriptor1 * \brief Format type I descriptor with one discrete sampling frequency. */ typedef struct _AUDFormatTypeOneDescriptor1 { /** Format type I descriptor. */ AUDFormatTypeOneDescriptor formatType; /** Sampling frequency in Hz. */ uint8_t tSamFreq[3]; } __attribute__ ((packed)) AUDFormatTypeOneDescriptor1; /* GCC*/ /** * \typedef AUDDSpeakerDriverConfigurationDescriptors * \brief Holds a list of descriptors returned as part of the configuration of * a USB audio speaker device. */ typedef struct _AUDDSpeakerDriverConfigurationDescriptors { /** Standard configuration. */ USBConfigurationDescriptor configuration; /** Audio control interface. */ USBInterfaceDescriptor control; /** Descriptors for the audio control interface. */ AUDDSpeakerDriverAudioControlDescriptors controlDescriptors; /* - AUDIO OUT */ /** Streaming out interface descriptor (with no endpoint, required). */ USBInterfaceDescriptor streamingOutNoIsochronous; /** Streaming out interface descriptor. */ USBInterfaceDescriptor streamingOut; /** Audio class descriptor for the streaming out interface. */ AUDStreamingInterfaceDescriptor streamingOutClass; /** Stream format descriptor. */ AUDFormatTypeOneDescriptor1 streamingOutFormatType; /** Streaming out endpoint descriptor. */ AUDEndpointDescriptor streamingOutEndpoint; /** Audio class descriptor for the streaming out endpoint. */ AUDDataEndpointDescriptor streamingOutDataEndpoint; } __attribute__ ((packed)) AUDDSpeakerDriverConfigurationDescriptors; /* GCC */ #ifdef __ICCARM__ /* IAR */ #pragma pack() /* IAR */ #endif /* IAR */ /*---------------------------------------------------------------------------- * Exported functions *----------------------------------------------------------------------------*/ extern void AUDDSpeakerDriver_Initialize( const USBDDriverDescriptors *pDescriptors); extern void AUDDSpeakerDriver_ConfigurationChangeHandler(uint8_t cfgnum); extern void AUDDSpeakerDriver_InterfaceSettingChangedHandler( uint8_t interface, uint8_t setting); extern void AUDDSpeakerDriver_RequestHandler(const USBGenericRequest *request); extern uint8_t AUDDSpeakerDriver_Read(void *buffer, uint32_t length, TransferCallback callback, void *argument); extern void AUDDSpeakerDriver_MuteChanged(uint8_t channel,uint8_t muted); extern void AUDDSpeakerDriver_StreamSettingChanged(uint8_t newSetting); /**@}*/ #endif /*#ifndef AUDDSPEAKERDRIVER_H */