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