1/*
2 *	Driver for USB Audio Device Class devices.
3 *	Copyright (c) 2009-13 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 <USB3.h>
12#include <util/VectorMap.h>
13
14#include "AudioControlInterface.h"
15
16
17class ASInterfaceDescriptor {
18public:
19							ASInterfaceDescriptor(
20								usb_audio_streaming_interface_descriptor*
21								Descriptor);
22							~ASInterfaceDescriptor();
23
24// protected:
25			uint8			fTerminalLink;
26			uint8			fDelay;
27			uint16			fFormatTag;
28};
29
30
31class ASEndpointDescriptor {
32public:
33							ASEndpointDescriptor(
34								usb_endpoint_descriptor* Endpoint,
35								usb_audio_streaming_endpoint_descriptor*
36								Descriptor);
37							~ASEndpointDescriptor();
38
39// protected:
40			uint8			fCSAttributes;
41			uint8			fLockDelayUnits;
42			uint16			fLockDelay;
43			uint16			fMaxPacketSize;
44			uint8			fEndpointAddress;
45			uint8			fEndpointAttributes;
46};
47
48
49class _ASFormatDescriptor {
50public:
51							_ASFormatDescriptor(
52								usb_audio_format_descriptor* Descriptor);
53	virtual					~_ASFormatDescriptor();
54
55// protected:
56			uint8			fFormatType;
57	static	uint32			GetSamFreq(const usb_audio_sampling_freq& freq);
58	static	usb_audio_sampling_freq	GetSamFreq(uint32 rate);
59};
60
61
62class TypeIFormatDescriptor : public _ASFormatDescriptor {
63public:
64							TypeIFormatDescriptor(
65								usb_audio_format_descriptor* Descriptor);
66	virtual					~TypeIFormatDescriptor();
67
68			status_t		Init(usb_audio_format_descriptor* Descriptor);
69
70// protected:
71			uint8			fNumChannels;
72			uint8			fSubframeSize;
73			uint8			fBitResolution;
74			uint8			fSampleFrequencyType;
75			Vector<uint32>	fSampleFrequencies;
76};
77
78
79class TypeIIFormatDescriptor : public _ASFormatDescriptor {
80public:
81							TypeIIFormatDescriptor(
82								usb_audio_format_descriptor* Descriptor);
83	virtual					~TypeIIFormatDescriptor();
84
85// protected:
86			uint16			fMaxBitRate;
87			uint16			fSamplesPerFrame;
88			uint8			fSampleFrequencyType;
89			Vector<uint32>	fSampleFrequencies;
90};
91
92
93class TypeIIIFormatDescriptor : public TypeIFormatDescriptor {
94public:
95							TypeIIIFormatDescriptor(
96								usb_audio_format_descriptor* Descriptor);
97	virtual					~TypeIIIFormatDescriptor();
98
99// protected:
100};
101
102
103class AudioStreamAlternate {
104public:
105									AudioStreamAlternate(size_t alternate,
106										ASInterfaceDescriptor* interface,
107										ASEndpointDescriptor* endpoint,
108										_ASFormatDescriptor* format);
109									~AudioStreamAlternate();
110
111			ASInterfaceDescriptor*	Interface()	{ return fInterface; }
112			ASEndpointDescriptor*	Endpoint()	{ return fEndpoint;	 }
113			_ASFormatDescriptor*	Format()	{ return fFormat;	 }
114
115			status_t				SetSamplingRate(uint32 newRate);
116			status_t				SetSamplingRateById(uint32 newId);
117			uint32					GetSamplingRate() { return fSamplingRate; }
118			uint32					GetSamplingRateId(uint32 rate);
119			uint32					GetSamplingRateIds();
120			uint32					GetFormatId();
121			status_t				SetFormatId(uint32 newFormatId);
122			uint32					SamplingRateFromId(uint32 id);
123
124protected:
125
126			size_t					fAlternate;
127			ASInterfaceDescriptor*	fInterface;
128			ASEndpointDescriptor*	fEndpoint;
129			_ASFormatDescriptor*	fFormat;
130			uint32					fSamplingRate;
131};
132
133
134class AudioStreamingInterface {
135public:
136								AudioStreamingInterface(
137									AudioControlInterface*	controlInterface,
138									size_t interface, usb_interface_list* List);
139								~AudioStreamingInterface();
140
141	//		status_t			InitCheck() { return fStatus; }
142			uint8				TerminalLink();
143			bool				IsInput() { return fIsInput; }
144
145			AudioChannelCluster* ChannelCluster();
146
147			void				GetFormatsAndRates(
148									multi_description* Description);
149protected:
150			size_t				fInterface;
151			AudioControlInterface*	fControlInterface;
152
153	//		status_t			fStatus;
154			bool				fIsInput;
155		// alternates of the streams
156			Vector<AudioStreamAlternate*>	fAlternates;
157			size_t				fActiveAlternate;
158};
159
160
161#endif // _AUDIO_STREAMING_INTERFACE_H_
162
163