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