1a69892caSSiarzhuk Zharski /* 2a69892caSSiarzhuk Zharski * Driver for USB Audio Device Class devices. 3a69892caSSiarzhuk Zharski * Copyright (c) 2009-13 S.Zharski <imker@gmx.li> 4a69892caSSiarzhuk Zharski * Distributed under the terms of the MIT license. 5a69892caSSiarzhuk Zharski * 6a69892caSSiarzhuk Zharski */ 7a69892caSSiarzhuk Zharski #ifndef _USB_AUDIO_STREAM_H_ 8a69892caSSiarzhuk Zharski #define _USB_AUDIO_STREAM_H_ 9a69892caSSiarzhuk Zharski 10a69892caSSiarzhuk Zharski 11a69892caSSiarzhuk Zharski #include "AudioStreamingInterface.h" 12a69892caSSiarzhuk Zharski 13a69892caSSiarzhuk Zharski 14a69892caSSiarzhuk Zharski class Device; 15a69892caSSiarzhuk Zharski 16a69892caSSiarzhuk Zharski class Stream : public AudioStreamingInterface { 17a69892caSSiarzhuk Zharski friend class Device; 18a69892caSSiarzhuk Zharski public: 19a69892caSSiarzhuk Zharski Stream(Device* device, size_t interface, 20a69892caSSiarzhuk Zharski usb_interface_list* List); 21a69892caSSiarzhuk Zharski ~Stream(); 22a69892caSSiarzhuk Zharski 23a69892caSSiarzhuk Zharski status_t Init(); 24a69892caSSiarzhuk Zharski status_t InitCheck() { return fStatus; } 25a69892caSSiarzhuk Zharski 26a69892caSSiarzhuk Zharski status_t Start(); 27a69892caSSiarzhuk Zharski status_t Stop(); 28a69892caSSiarzhuk Zharski bool IsRunning() { return fIsRunning; } 29a69892caSSiarzhuk Zharski void OnRemove(); 30a69892caSSiarzhuk Zharski 31a69892caSSiarzhuk Zharski status_t GetBuffers(multi_buffer_list* List); 32a69892caSSiarzhuk Zharski 33a69892caSSiarzhuk Zharski status_t OnSetConfiguration(usb_device device, 34a69892caSSiarzhuk Zharski const usb_configuration_info* config); 35a69892caSSiarzhuk Zharski 36a69892caSSiarzhuk Zharski bool ExchangeBuffer(multi_buffer_info* Info); 37a69892caSSiarzhuk Zharski status_t GetEnabledChannels(uint32& offset, 38a69892caSSiarzhuk Zharski multi_channel_enable* Enable); 39a69892caSSiarzhuk Zharski status_t SetEnabledChannels(uint32& offset, 40a69892caSSiarzhuk Zharski multi_channel_enable* Enable); 41a69892caSSiarzhuk Zharski status_t GetGlobalFormat(multi_format_info* Format); 42a69892caSSiarzhuk Zharski status_t SetGlobalFormat(multi_format_info* Format); 43a69892caSSiarzhuk Zharski 44a69892caSSiarzhuk Zharski protected: 45a69892caSSiarzhuk Zharski Device* fDevice; 46a69892caSSiarzhuk Zharski status_t fStatus; 47a69892caSSiarzhuk Zharski 48a69892caSSiarzhuk Zharski uint8 fTerminalID; 49a69892caSSiarzhuk Zharski usb_pipe fStreamEndpoint; 5034352671SAugustin Cavalier 51a69892caSSiarzhuk Zharski bool fIsRunning; 527b2bc835SAugustin Cavalier area_id fArea, fKernelArea; 53a69892caSSiarzhuk Zharski size_t fAreaSize; 54a69892caSSiarzhuk Zharski usb_iso_packet_descriptor* fDescriptors; 55a69892caSSiarzhuk Zharski size_t fDescriptorsCount; 567b2bc835SAugustin Cavalier uint8* fBuffers; 577b2bc835SAugustin Cavalier uint8* fKernelBuffers; 58a69892caSSiarzhuk Zharski size_t fCurrentBuffer; 59a69892caSSiarzhuk Zharski size_t fSamplesCount; 6034352671SAugustin Cavalier 61*b99d228dSAugustin Cavalier bigtime_t fRealTime; 6234352671SAugustin Cavalier uint32 fStartingFrame; 63a69892caSSiarzhuk Zharski int32 fProcessedBuffers; 64a69892caSSiarzhuk Zharski int32 fInsideNotify; 65a69892caSSiarzhuk Zharski 66a69892caSSiarzhuk Zharski private: 67a69892caSSiarzhuk Zharski status_t _ChooseAlternate(); 68a69892caSSiarzhuk Zharski status_t _SetupBuffers(); 69a69892caSSiarzhuk Zharski status_t _QueueNextTransfer(size_t buffer, bool start); 70222b10cbSSiarzhuk Zharski static void _TransferCallback(void* cookie, status_t status, 71222b10cbSSiarzhuk Zharski void* data, size_t actualLength); 72a69892caSSiarzhuk Zharski void _DumpDescriptors(); 73a69892caSSiarzhuk Zharski }; 74a69892caSSiarzhuk Zharski 75a69892caSSiarzhuk Zharski 76a69892caSSiarzhuk Zharski #endif // _USB_AUDIO_STREAM_H_ 77a69892caSSiarzhuk Zharski 78