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 _USB_AUDIO_DEVICE_H_ 8#define _USB_AUDIO_DEVICE_H_ 9 10 11#include "Driver.h" 12#include "USB_audio_spec.h" 13#include "AudioControlInterface.h" 14#include "AudioStreamingInterface.h" 15#include "Stream.h" 16 17// typedef VectorMap<uint32, _AudioControl*> AudioControlsMap; 18// typedef VectorMap<uint32, _AudioControl*>::Iterator AudioControlsIterator; 19 20typedef Vector<Stream*> AudioStreamsVector; 21typedef Vector<Stream*>::Iterator AudioStreamsIterator; 22 23 24class FeatureUnit; 25 26class Device { 27 friend class FeatureUnit; 28 friend class Stream; 29public: 30 Device(usb_device device); 31 virtual ~Device(); 32 33 status_t InitCheck() { return fStatus; }; 34 35 status_t Open(uint32 flags); 36 bool IsOpen() { return fOpen; }; 37 38 status_t Close(); 39 status_t Free(); 40 41 status_t Read(uint8 *buffer, size_t *numBytes); 42 status_t Write(const uint8 *buffer, size_t *numBytes); 43 status_t Control(uint32 op, void *buffer, size_t length); 44 45 void Removed(); 46 bool IsRemoved() { return fRemoved; }; 47 48 status_t CompareAndReattach(usb_device device); 49virtual status_t SetupDevice(bool deviceReplugged); 50// uint16 SpecReleaseNumber(); 51 52// _AudioControl* FindAudioControl(uint8 ID); 53 usb_device USBDevice() { return fDevice; } 54 55 AudioControlInterface& AudioControl() { return fAudioControl; } 56 57private: 58static void _ReadCallback(void *cookie, int32 status, 59 void *data, uint32 actualLength); 60static void _WriteCallback(void *cookie, int32 status, 61 void *data, uint32 actualLength); 62static void _NotifyCallback(void *cookie, int32 status, 63 void *data, uint32 actualLength); 64 65 status_t _SetupEndpoints(); 66// void ParseAudioControlInterface(usb_device device, 67// size_t interface, usb_interface_info *Interface); 68// void ParseAudioStreamingInterface(usb_device device, 69// size_t interface, usb_interface_list *List); 70 71protected: 72virtual status_t StartDevice() { return B_OK; } 73virtual status_t StopDevice(); 74 75 void TraceMultiDescription(multi_description *Description, 76 Vector<multi_channel_info>& Channels); 77 void TraceListMixControls(multi_mix_control_info *Info); 78 // state tracking 79 status_t fStatus; 80 bool fOpen; 81 bool fRemoved; 82 vint32 fInsideNotify; 83 usb_device fDevice; 84 uint16 fVendorID; 85 uint16 fProductID; 86const char * fDescription; 87 bool fNonBlocking; 88 89 AudioControlInterface fAudioControl; 90/* 91 AudioControlHeader* fAudioControlHeader; 92 // map to store all controls and lookup by control ID 93 AudioControlsMap fAudioControls; 94 // map to store output terminal and lookup them by source ID 95 AudioControlsMap fOutputTerminals; 96 // map to store output terminal and lookup them by control ID 97 AudioControlsMap fInputTerminals; 98*/ 99 // vector of audio streams 100 AudioStreamsVector fStreams; 101 102protected: 103 status_t _MultiGetDescription(multi_description *Description); 104 status_t _MultiGetEnabledChannels(multi_channel_enable *Enable); 105 status_t _MultiSetEnabledChannels(multi_channel_enable *Enable); 106 status_t _MultiGetBuffers(multi_buffer_list* List); 107 status_t _MultiGetGlobalFormat(multi_format_info *Format); 108 status_t _MultiSetGlobalFormat(multi_format_info *Format); 109 status_t _MultiGetMix(multi_mix_value_info *Info); 110 status_t _MultiSetMix(multi_mix_value_info *Info); 111 status_t _MultiListMixControls(multi_mix_control_info* Info); 112 status_t _MultiBufferExchange(multi_buffer_info* Info); 113 status_t _MultiBufferForceStop(); 114 115 // interface and device infos 116// uint16 fFrameSize; 117 118 // pipes for notifications and data io 119 usb_pipe fControlEndpoint; 120 usb_pipe fInStreamEndpoint; 121 usb_pipe fOutStreamEndpoint; 122 123 // data stores for async usb transfers 124 uint32 fActualLengthRead; 125 uint32 fActualLengthWrite; 126 int32 fStatusRead; 127 int32 fStatusWrite; 128 sem_id fNotifyReadSem; 129 sem_id fNotifyWriteSem; 130 131 uint8 * fNotifyBuffer; 132 uint32 fNotifyBufferLength; 133 134 sem_id fBuffersReadySem; 135}; 136 137 138#endif // _USB_AUDIO_DEVICE_H_ 139 140