1/* 2 * Driver for USB Audio Device Class devices. 3 * Copyright (c) 2009,10,12 S.Zharski <imker@gmx.li> 4 * Distributed under the terms of the MIT license. 5 * 6 */ 7#ifndef _AUDIO_STREAMING_INTERFACE_H_ 8#define _AUDIO_STREAMING_INTERFACE_H_ 9 10 11#include "Driver.h" 12#include "AudioControlInterface.h" 13 14#include <util/VectorMap.h> 15#include "USB_audio_spec.h" 16 17 18// 19// Audio Streaming Interface information entities 20// 21// 22class ASInterfaceDescriptor /*: public _AudioFunctionEntity*/ { 23public: 24 ASInterfaceDescriptor(/*Device* device, size_t interface,*/ 25 usb_as_interface_descriptor_r1* Descriptor); 26 ~ASInterfaceDescriptor(); 27 28// protected: 29 uint8 fTerminalLink; 30 uint8 fDelay; 31 uint16 fFormatTag; 32}; 33 34 35class ASEndpointDescriptor /*: public _AudioFunctionEntity*/ { 36public: 37 ASEndpointDescriptor( 38 usb_endpoint_descriptor* Endpoint, 39 usb_as_cs_endpoint_descriptor* Descriptor); 40 ~ASEndpointDescriptor(); 41 42// protected: 43 uint8 fAttributes; 44 uint8 fLockDelayUnits; 45 uint16 fLockDelay; 46 uint16 fMaxPacketSize; 47 uint8 fEndpointAddress; 48}; 49 50 51class _ASFormatDescriptor /*: public _AudioFunctionEntity*/ { 52public: 53 _ASFormatDescriptor( 54 usb_type_I_format_descriptor* Descriptor); 55 virtual ~_ASFormatDescriptor(); 56 57// protected: 58 uint8 fFormatType; 59 uint32 GetSamFreq(uint8* freq); 60}; 61 62 63class TypeIFormatDescriptor : public _ASFormatDescriptor { 64public: 65 TypeIFormatDescriptor(/*Device* device, size_t interface,*/ 66 usb_type_I_format_descriptor* Descriptor); 67 virtual ~TypeIFormatDescriptor(); 68 69 status_t Init(usb_type_I_format_descriptor* Descriptor); 70 71// protected: 72 uint8 fNumChannels; 73 uint8 fSubframeSize; 74 uint8 fBitResolution; 75 uint8 fSampleFrequencyType; 76 Vector<uint32> fSampleFrequencies; 77}; 78 79 80class TypeIIFormatDescriptor : public _ASFormatDescriptor { 81public: 82 TypeIIFormatDescriptor(/*Device* device, size_t interface,*/ 83 usb_type_II_format_descriptor* Descriptor); 84 virtual ~TypeIIFormatDescriptor(); 85 86// protected: 87 uint16 fMaxBitRate; 88 uint16 fSamplesPerFrame; 89 uint8 fSampleFrequencyType; 90 Vector<uint32> fSampleFrequencies; 91}; 92 93 94class TypeIIIFormatDescriptor : public TypeIFormatDescriptor { 95public: 96 TypeIIIFormatDescriptor(/*Device* device, size_t interface, */ 97 usb_type_III_format_descriptor* Descriptor); 98 virtual ~TypeIIIFormatDescriptor(); 99 100// protected: 101}; 102 103 104class AudioStreamAlternate { 105public: 106 AudioStreamAlternate(size_t alternate, 107 ASInterfaceDescriptor* interface, 108 ASEndpointDescriptor* endpoint, 109 _ASFormatDescriptor* format); 110 ~AudioStreamAlternate(); 111 112 ASInterfaceDescriptor* Interface() { return fInterface; } 113 ASEndpointDescriptor* Endpoint() { return fEndpoint; } 114 _ASFormatDescriptor* Format() { return fFormat; } 115 116protected: 117 size_t fAlternate; 118 ASInterfaceDescriptor* fInterface; 119 ASEndpointDescriptor* fEndpoint; 120 _ASFormatDescriptor* fFormat; 121}; 122 123 124typedef Vector<AudioStreamAlternate*> StreamAlternatesVector; 125typedef Vector<AudioStreamAlternate*>::Iterator StreamAlternatesIterator; 126 127 128class AudioStreamingInterface { 129public: 130 AudioStreamingInterface( 131 AudioControlInterface* controlInterface, 132 size_t interface, usb_interface_list *List); 133 ~AudioStreamingInterface(); 134 135 // status_t InitCheck() { return fStatus; } 136 uint8 TerminalLink(); 137 bool IsInput() { return fIsInput; } 138 139 AudioChannelCluster* ChannelCluster(); 140 141 void GetFormatsAndRates(multi_description *Description); 142 143protected: 144 size_t fInterface; 145 AudioControlInterface* fControlInterface; 146 147 // status_t fStatus; 148 bool fIsInput; 149 // alternates of the streams 150 StreamAlternatesVector fAlternates; 151 size_t fActiveAlternate; 152}; 153 154 155#endif // _AUDIO_STREAMING_INTERFACE_H_ 156 157