]>
Commit | Line | Data |
---|---|---|
5fd54ace | 1 | // SPDX-License-Identifier: GPL-2.0+ |
eb9fecb9 RB |
2 | /* |
3 | * u_audio.h -- interface to USB gadget "ALSA sound card" utilities | |
4 | * | |
5 | * Copyright (C) 2016 | |
6 | * Author: Ruslan Bilovol <ruslan.bilovol@gmail.com> | |
7 | * | |
8 | * This program is free software; you can redistribute it and/or modify | |
9 | * it under the terms of the GNU General Public License as published by | |
10 | * the Free Software Foundation; either version 2 of the License, or | |
11 | * (at your option) any later version. | |
12 | * | |
13 | * This program is distributed in the hope that it will be useful, | |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | * GNU General Public License for more details. | |
17 | * | |
18 | */ | |
19 | ||
20 | #ifndef __U_AUDIO_H | |
21 | #define __U_AUDIO_H | |
22 | ||
23 | #include <linux/usb/composite.h> | |
24 | ||
25 | struct uac_params { | |
26 | /* playback */ | |
27 | int p_chmask; /* channel mask */ | |
28 | int p_srate; /* rate in Hz */ | |
29 | int p_ssize; /* sample size */ | |
30 | ||
31 | /* capture */ | |
32 | int c_chmask; /* channel mask */ | |
33 | int c_srate; /* rate in Hz */ | |
34 | int c_ssize; /* sample size */ | |
35 | ||
36 | int req_number; /* number of preallocated requests */ | |
37 | }; | |
38 | ||
39 | struct g_audio { | |
40 | struct usb_function func; | |
41 | struct usb_gadget *gadget; | |
42 | ||
43 | struct usb_ep *in_ep; | |
44 | struct usb_ep *out_ep; | |
45 | ||
46 | /* Max packet size for all in_ep possible speeds */ | |
47 | unsigned int in_ep_maxpsize; | |
48 | /* Max packet size for all out_ep possible speeds */ | |
49 | unsigned int out_ep_maxpsize; | |
50 | ||
51 | /* The ALSA Sound Card it represents on the USB-Client side */ | |
52 | struct snd_uac_chip *uac; | |
53 | ||
54 | struct uac_params params; | |
55 | }; | |
56 | ||
57 | static inline struct g_audio *func_to_g_audio(struct usb_function *f) | |
58 | { | |
59 | return container_of(f, struct g_audio, func); | |
60 | } | |
61 | ||
62 | static inline uint num_channels(uint chanmask) | |
63 | { | |
64 | uint num = 0; | |
65 | ||
66 | while (chanmask) { | |
67 | num += (chanmask & 1); | |
68 | chanmask >>= 1; | |
69 | } | |
70 | ||
71 | return num; | |
72 | } | |
73 | ||
74 | /* | |
75 | * g_audio_setup - initialize one virtual ALSA sound card | |
76 | * @g_audio: struct with filled params, in_ep_maxpsize, out_ep_maxpsize | |
77 | * @pcm_name: the id string for a PCM instance of this sound card | |
78 | * @card_name: name of this soundcard | |
79 | * | |
80 | * This sets up the single virtual ALSA sound card that may be exported by a | |
81 | * gadget driver using this framework. | |
82 | * | |
83 | * Context: may sleep | |
84 | * | |
85 | * Returns zero on success, or a negative error on failure. | |
86 | */ | |
87 | int g_audio_setup(struct g_audio *g_audio, const char *pcm_name, | |
88 | const char *card_name); | |
89 | void g_audio_cleanup(struct g_audio *g_audio); | |
90 | ||
91 | int u_audio_start_capture(struct g_audio *g_audio); | |
92 | void u_audio_stop_capture(struct g_audio *g_audio); | |
93 | int u_audio_start_playback(struct g_audio *g_audio); | |
94 | void u_audio_stop_playback(struct g_audio *g_audio); | |
95 | ||
96 | #endif /* __U_AUDIO_H */ |