aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/usb
diff options
context:
space:
mode:
authorDaniel Mack <daniel@caiaq.de>2010-03-11 15:13:24 -0500
committerTakashi Iwai <tiwai@suse.de>2010-03-12 06:21:12 -0500
commit99fc86450c439039d2ef88d06b222fd51a779176 (patch)
treede18f564ac09bc36f40b4ea4f88ab71c48ce290c /include/linux/usb
parentf0b5e634ff25e02a64676022ee13284a9c810879 (diff)
ALSA: usb-mixer: parse descriptors with structs
Introduce a number of new structs for mixer, selector, feature and processing units and some static inline helpers to access fields which have dynamic offsets. Use them in mixer.c to parse the descriptors. This is necessary for the upcoming audio v2 parsers. Signed-off-by: Daniel Mack <daniel@caiaq.de> Cc: Clemens Ladisch <clemens@ladisch.de> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'include/linux/usb')
-rw-r--r--include/linux/usb/audio.h129
1 files changed, 119 insertions, 10 deletions
diff --git a/include/linux/usb/audio.h b/include/linux/usb/audio.h
index cdad728543ae..bc78a83d0f48 100644
--- a/include/linux/usb/audio.h
+++ b/include/linux/usb/audio.h
@@ -181,6 +181,125 @@ struct uac_feature_unit_descriptor_##ch { \
181 __u8 iFeature; \ 181 __u8 iFeature; \
182} __attribute__ ((packed)) 182} __attribute__ ((packed))
183 183
184/* 4.3.2.3 Mixer Unit Descriptor */
185struct uac_mixer_unit_descriptor {
186 __u8 bLength;
187 __u8 bDescriptorType;
188 __u8 bDescriptorSubtype;
189 __u8 bUnitID;
190 __u8 bNrInPins;
191 __u8 baSourceID[];
192} __attribute__ ((packed));
193
194static inline __u8 uac_mixer_unit_bNrChannels(struct uac_mixer_unit_descriptor *desc)
195{
196 return desc->baSourceID[desc->bNrInPins];
197}
198
199static inline __u16 uac_mixer_unit_wChannelConfig(struct uac_mixer_unit_descriptor *desc)
200{
201 return (desc->baSourceID[desc->bNrInPins + 2] << 8) |
202 desc->baSourceID[desc->bNrInPins + 1];
203}
204
205static inline __u8 uac_mixer_unit_iChannelNames(struct uac_mixer_unit_descriptor *desc)
206{
207 return desc->baSourceID[desc->bNrInPins + 3];
208}
209
210static inline __u8 *uac_mixer_unit_bmControls(struct uac_mixer_unit_descriptor *desc)
211{
212 return &desc->baSourceID[desc->bNrInPins + 4];
213}
214
215static inline __u8 uac_mixer_unit_iMixer(struct uac_mixer_unit_descriptor *desc)
216{
217 __u8 *raw = (__u8 *) desc;
218 return raw[desc->bLength - 1];
219}
220
221/* 4.3.2.4 Selector Unit Descriptor */
222struct uac_selector_unit_descriptor {
223 __u8 bLength;
224 __u8 bDescriptorType;
225 __u8 bDescriptorSubtype;
226 __u8 bUintID;
227 __u8 bNrInPins;
228 __u8 baSourceID[];
229} __attribute__ ((packed));
230
231static inline __u8 uac_selector_unit_iSelector(struct uac_selector_unit_descriptor *desc)
232{
233 __u8 *raw = (__u8 *) desc;
234 return raw[desc->bLength - 1];
235}
236
237/* 4.3.2.5 Feature Unit Descriptor */
238struct uac_feature_unit_descriptor {
239 __u8 bLength;
240 __u8 bDescriptorType;
241 __u8 bDescriptorSubtype;
242 __u8 bUnitID;
243 __u8 bSourceID;
244 __u8 bControlSize;
245 __u8 bmaControls[0]; /* variable length */
246} __attribute__((packed));
247
248static inline __u8 uac_feature_unit_iFeature(struct uac_feature_unit_descriptor *desc)
249{
250 __u8 *raw = (__u8 *) desc;
251 return raw[desc->bLength - 1];
252}
253
254/* 4.3.2.6 Processing Unit Descriptors */
255struct uac_processing_unit_descriptor {
256 __u8 bLength;
257 __u8 bDescriptorType;
258 __u8 bDescriptorSubtype;
259 __u8 bUnitID;
260 __u16 wProcessType;
261 __u8 bNrInPins;
262 __u8 baSourceID[];
263} __attribute__ ((packed));
264
265static inline __u8 uac_processing_unit_bNrChannels(struct uac_processing_unit_descriptor *desc)
266{
267 return desc->baSourceID[desc->bNrInPins];
268}
269
270static inline __u16 uac_processing_unit_wChannelConfig(struct uac_processing_unit_descriptor *desc)
271{
272 return (desc->baSourceID[desc->bNrInPins + 2] << 8) |
273 desc->baSourceID[desc->bNrInPins + 1];
274}
275
276static inline __u8 uac_processing_unit_iChannelNames(struct uac_processing_unit_descriptor *desc)
277{
278 return desc->baSourceID[desc->bNrInPins + 3];
279}
280
281static inline __u8 uac_processing_unit_bControlSize(struct uac_processing_unit_descriptor *desc)
282{
283 return desc->baSourceID[desc->bNrInPins + 4];
284}
285
286static inline __u8 *uac_processing_unit_bmControls(struct uac_processing_unit_descriptor *desc)
287{
288 return &desc->baSourceID[desc->bNrInPins + 5];
289}
290
291static inline __u8 uac_processing_unit_iProcessing(struct uac_processing_unit_descriptor *desc)
292{
293 __u8 control_size = uac_processing_unit_bControlSize(desc);
294 return desc->baSourceID[desc->bNrInPins + control_size];
295}
296
297static inline __u8 *uac_processing_unit_specific(struct uac_processing_unit_descriptor *desc)
298{
299 __u8 control_size = uac_processing_unit_bControlSize(desc);
300 return &desc->baSourceID[desc->bNrInPins + control_size + 1];
301}
302
184/* 4.5.2 Class-Specific AS Interface Descriptor */ 303/* 4.5.2 Class-Specific AS Interface Descriptor */
185struct uac_as_header_descriptor_v1 { 304struct uac_as_header_descriptor_v1 {
186 __u8 bLength; /* in bytes: 7 */ 305 __u8 bLength; /* in bytes: 7 */
@@ -315,16 +434,6 @@ struct uac_iso_endpoint_descriptor {
315 434
316/* A.10.2 Feature Unit Control Selectors */ 435/* A.10.2 Feature Unit Control Selectors */
317 436
318struct uac_feature_unit_descriptor {
319 __u8 bLength;
320 __u8 bDescriptorType;
321 __u8 bDescriptorSubtype;
322 __u8 bUnitID;
323 __u8 bSourceID;
324 __u8 bControlSize;
325 __u8 controls[0]; /* variable length */
326} __attribute__((packed));
327
328#define UAC_FU_CONTROL_UNDEFINED 0x00 437#define UAC_FU_CONTROL_UNDEFINED 0x00
329#define UAC_MUTE_CONTROL 0x01 438#define UAC_MUTE_CONTROL 0x01
330#define UAC_VOLUME_CONTROL 0x02 439#define UAC_VOLUME_CONTROL 0x02