xref: /haiku/src/add-ons/kernel/drivers/audio/usb/Stream.h (revision b99d228dce7734c21d57876a57258d2662f3ce53)
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