2 * \file include/use-case.h
3 * \brief use case interface for the ALSA driver
4 * \author Liam Girdwood <lrg@slimlogic.co.uk>
5 * \author Stefan Schmidt <stefan@slimlogic.co.uk>
6 * \author Jaroslav Kysela <perex@perex.cz>
7 * \author Justin Xu <justinx@slimlogic.co.uk>
12 * This library is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU Lesser General Public License as
14 * published by the Free Software Foundation; either version 2.1 of
15 * the License, or (at your option) any later version.
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU Lesser General Public License for more details.
22 * You should have received a copy of the GNU Lesser General Public
23 * License along with this library; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 * Copyright (C) 2008-2010 SlimLogic Ltd
27 * Copyright (C) 2010 Wolfson Microelectronics PLC
28 * Copyright (C) 2010 Texas Instruments Inc.
30 * Support for the verb/device/modifier core logic and API,
31 * command line tool and file parser was kindly sponsored by
32 * Texas Instruments Inc.
33 * Support for multiple active modifiers and devices,
34 * transition sequences, multiple client access and user defined use
35 * cases was kindly sponsored by Wolfson Microelectronics PLC.
38 #ifndef __ALSA_USE_CASE_H
39 #define __ALSA_USE_CASE_H
46 * \defgroup ucm Use Case Interface
47 * The ALSA Use Case manager interface.
48 * See \ref Usecase page for more details.
52 /*! \page Usecase ALSA Use Case Interface
54 * The use case manager works by configuring the sound card ALSA kcontrols to
55 * change the hardware digital and analog audio routing to match the requested
56 * device use case. The use case manager kcontrol configurations are stored in
57 * easy to modify text files.
59 * An audio use case can be defined by a verb and device parameter. The verb
60 * describes the use case action i.e. a phone call, listening to music, recording
61 * a conversation etc. The device describes the physical audio capture and playback
62 * hardware i.e. headphones, phone handset, bluetooth headset, etc.
64 * It's intended clients will mostly only need to set the use case verb and
65 * device for each system use case change (as the verb and device parameters
66 * cover most audio use cases).
68 * However there are times when a use case has to be modified at runtime. e.g.
70 * + Incoming phone call when the device is playing music
71 * + Recording sections of a phone call
72 * + Playing tones during a call.
74 * In order to allow asynchronous runtime use case adaptations, we have a third
75 * optional modifier parameter that can be used to further configure
76 * the use case during live audio runtime.
78 * This interface allows clients to :-
80 * + Query the supported use case verbs, devices and modifiers for the machine.
81 * + Set and Get use case verbs, devices and modifiers for the machine.
82 * + Get the ALSA PCM playback and capture device PCMs for use case verb,
83 * use case device and modifier.
84 * + Get the TQ parameter for each use case verb, use case device and
86 * + Get the ALSA master playback and capture volume/switch kcontrols
94 * The use case verb is the main device audio action. e.g. the "HiFi" use
95 * case verb will configure the audio hardware for HiFi Music playback
98 #define SND_USE_CASE_VERB_INACTIVE "Inactive" /**< Inactive Verb */
99 #define SND_USE_CASE_VERB_HIFI "HiFi" /**< HiFi Verb */
100 #define SND_USE_CASE_VERB_HIFI_LOW_POWER "HiFi Low Power" /**< HiFi Low Power Verb */
101 #define SND_USE_CASE_VERB_VOICE "Voice" /**< Voice Verb */
102 #define SND_USE_CASE_VERB_VOICE_LOW_POWER "Voice Low Power" /**< Voice Low Power Verb */
103 #define SND_USE_CASE_VERB_VOICECALL "Voice Call" /**< Voice Call Verb */
104 #define SND_USE_CASE_VERB_IP_VOICECALL "Voice Call IP" /**< Voice Call IP Verb */
105 #define SND_USE_CASE_VERB_ANALOG_RADIO "FM Analog Radio" /**< FM Analog Radio Verb */
106 #define SND_USE_CASE_VERB_DIGITAL_RADIO "FM Digital Radio" /**< FM Digital Radio Verb */
107 /* add new verbs to end of list */
113 * Physical system devices the render and capture audio. Devices can be OR'ed
114 * together to support audio on simultaneous devices.
116 #define SND_USE_CASE_DEV_NONE "None" /**< None Device */
117 #define SND_USE_CASE_DEV_SPEAKER "Speaker" /**< Speaker Device */
118 #define SND_USE_CASE_DEV_LINE "Line" /**< Line Device */
119 #define SND_USE_CASE_DEV_HEADPHONES "Headphones" /**< Headphones Device */
120 #define SND_USE_CASE_DEV_HEADSET "Headset" /**< Headset Device */
121 #define SND_USE_CASE_DEV_HANDSET "Handset" /**< Handset Device */
122 #define SND_USE_CASE_DEV_BLUETOOTH "Bluetooth" /**< Bluetooth Device */
123 #define SND_USE_CASE_DEV_EARPIECE "Earpiece" /**< Earpiece Device */
124 #define SND_USE_CASE_DEV_SPDIF "SPDIF" /**< SPDIF Device */
125 #define SND_USE_CASE_DEV_HDMI "HDMI" /**< HDMI Device */
126 /* add new devices to end of list */
130 * Use Case Modifiers.
132 * The use case modifier allows runtime configuration changes to deal with
133 * asynchronous events.
135 * e.g. to record a voice call :-
136 * 1. Set verb to SND_USE_CASE_VERB_VOICECALL (for voice call)
137 * 2. Set modifier SND_USE_CASE_MOD_CAPTURE_VOICE when capture required.
138 * 3. Call snd_use_case_get("CapturePCM") to get ALSA source PCM name
139 * with captured voice pcm data.
141 * e.g. to play a ring tone when listenin to MP3 Music :-
142 * 1. Set verb to SND_USE_CASE_VERB_HIFI (for MP3 playback)
143 * 2. Set modifier to SND_USE_CASE_MOD_PLAY_TONE when incoming call happens.
144 * 3. Call snd_use_case_get("PlaybackPCM") to get ALSA PCM sink name for
147 #define SND_USE_CASE_MOD_CAPTURE_VOICE "Capture Voice" /**< Capture Voice Modifier */
148 #define SND_USE_CASE_MOD_CAPTURE_MUSIC "Capture Music" /**< Capture Music Modifier */
149 #define SND_USE_CASE_MOD_PLAY_MUSIC "Play Music" /**< Play Music Modifier */
150 #define SND_USE_CASE_MOD_PLAY_VOICE "Play Voice" /**< Play Voice Modifier */
151 #define SND_USE_CASE_MOD_PLAY_TONE "Play Tone" /**< Play Tone Modifier */
152 #define SND_USE_CASE_MOD_ECHO_REF "Echo Reference" /**< Echo Reference Modifier */
153 /* add new modifiers to end of list */
159 * The interface allows clients to determine the audio TQ required for each
160 * use case verb and modifier. It's intended as an optional hint to the
161 * audio driver in order to lower power consumption.
164 #define SND_USE_CASE_TQ_MUSIC "Music" /**< Music Tone Quality */
165 #define SND_USE_CASE_TQ_VOICE "Voice" /**< Voice Tone Quality */
166 #define SND_USE_CASE_TQ_TONES "Tones" /**< Tones Tone Quality */
168 /** use case container */
169 typedef struct snd_use_case_mgr snd_use_case_mgr_t;
172 * \brief Create an identifier
173 * \param fmt Format (sprintf like)
174 * \param ... Optional arguments for sprintf like format
175 * \return Allocated string identifier or NULL on error
177 char *snd_use_case_identifier(const char *fmt, ...);
180 * \brief Free a string list
181 * \param list The string list to free
182 * \param items Count of strings
183 * \return Zero if success, otherwise a negative error code
185 int snd_use_case_free_list(const char *list[], int items);
188 * \brief Obtain a list of entries
189 * \param uc_mgr Use case manager (may be NULL - card list)
190 * \param identifier (may be NULL - card list)
191 * \param list Returned allocated list
192 * \return Number of list entries if success, otherwise a negative error code
194 * Defined identifiers:
195 * - NULL - get card list
196 * (in pair cardname+comment)
197 * - _verbs - get verb list
198 * (in pair verb+comment)
199 * - _devices[/{verb}] - get list of supported devices
200 * (in pair device+comment)
201 * - _modifiers[/{verb}] - get list of supported modifiers
202 * (in pair modifier+comment)
203 * - TQ[/{verb}] - get list of TQ identifiers
204 * - _enadevs - get list of enabled devices
205 * - _enamods - get list of enabled modifiers
207 * - _supporteddevs/{modifier}|{device}[/{verb}] - list of supported devices
208 * - _conflictingdevs/{modifier}|{device}[/{verb}] - list of conflicting devices
210 * Note that at most one of the supported/conflicting devs lists has
211 * any entries, and when neither is present, all devices are supported.
214 int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
215 const char *identifier,
216 const char **list[]);
220 * \brief Get current - string
221 * \param uc_mgr Use case manager
223 * \param value Value pointer
224 * \return Zero if success, otherwise a negative error code
226 * Note: The returned string is dynamically allocated, use free() to
227 * deallocate this string. (Yes, the value parameter shouldn't be marked as
228 * "const", but it's too late to fix it, sorry about that.)
231 * - NULL - return current card
232 * - _verb - return current verb
234 * - [=]{NAME}[/[{modifier}|{/device}][/{verb}]]
235 * - value identifier {NAME}
236 * - Search starts at given modifier or device if any,
238 * - Search starts at given verb if any,
240 * - Searches modifier/device, then verb, then defaults
241 * - Specify a leading "=" to search only the exact
242 * device/modifier/verb specified, and not search
243 * through each object in turn.
245 * - "PlaybackPCM/Play Music"
246 * - "CapturePCM/SPDIF"
247 * - From ValueDefaults only:
249 * - From current active verb:
251 * - From verb "Verb":
253 * - From "Modifier" in current active verb:
254 * "=Variable/Modifier/"
255 * - From "Modifier" in "Verb":
256 * "=Variable/Modifier/Verb"
258 * Recommended names for values:
262 * - full PCM playback device name
263 * - PlaybackPCMIsDummy
264 * - Valid values: "yes" and "no". If set to "yes", the PCM named by the
265 * PlaybackPCM value is a dummy device, meaning that opening it enables
266 * an audio path in the hardware, but writing to the PCM device has no
269 * - full PCM capture device name
270 * - CapturePCMIsDummy
271 * - Valid values: "yes" and "no". If set to "yes", the PCM named by the
272 * CapturePCM value is a dummy device, meaning that opening it enables
273 * an audio path in the hardware, but reading from the PCM device has no
276 * - playback device sample rate
278 * - playback device channel count
280 * - playback control device name
282 * - playback control volume ID string
284 * - playback control switch ID string
286 * - capture device sample rate
288 * - capture device channel count
290 * - capture control device name
292 * - capture control volume ID string
294 * - capture control switch ID string
296 * - name of playback mixer
298 * - mixer playback ID
300 * - name of capture mixer
303 * - JackControl, JackDev, JackHWMute
304 * - Jack information for a device. The jack status can be reported via
305 * a kcontrol and/or via an input device. **JackControl** is the
306 * kcontrol name of the jack, and **JackDev** is the input device id of
307 * the jack (if the full input device path is /dev/input/by-id/foo, the
308 * JackDev value should be "foo"). UCM configuration files should
309 * contain both JackControl and JackDev when possible, because
310 * applications are likely to support only one or the other.
312 * If **JackHWMute** is set, it indicates that when the jack is plugged
313 * in, the hardware automatically mutes some other device(s). The
314 * JackHWMute value is a space-separated list of device names (this
315 * isn't compatible with device names with spaces in them, so don't use
316 * such device names!). Note that JackHWMute should be used only when
317 * the hardware enforces the automatic muting. If the hardware doesn't
318 * enforce any muting, it may still be tempting to set JackHWMute to
319 * trick upper software layers to e.g. automatically mute speakers when
320 * headphones are plugged in, but that's application policy
321 * configuration that doesn't belong to UCM configuration files.
323 int snd_use_case_get(snd_use_case_mgr_t *uc_mgr,
324 const char *identifier,
328 * \brief Get current - integer
329 * \param uc_mgr Use case manager
331 * \param value result
332 * \return Zero if success, otherwise a negative error code
335 * - _devstatus/{device} - return status for given device
336 * - _modstatus/{modifier} - return status for given modifier
338 int snd_use_case_geti(snd_use_case_mgr_t *uc_mgr,
339 const char *identifier,
344 * \param uc_mgr Use case manager
347 * \return Zero if success, otherwise a negative error code
350 * - _verb - set current verb = value
351 * - _enadev - enable given device = value
352 * - _disdev - disable given device = value
353 * - _swdev/{old_device} - new_device = value
354 * - disable old_device and then enable new_device
355 * - if old_device is not enabled just return
356 * - check transmit sequence firstly
357 * - _enamod - enable given modifier = value
358 * - _dismod - disable given modifier = value
359 * - _swmod/{old_modifier} - new_modifier = value
360 * - disable old_modifier and then enable new_modifier
361 * - if old_modifier is not enabled just return
362 * - check transmit sequence firstly
364 int snd_use_case_set(snd_use_case_mgr_t *uc_mgr,
365 const char *identifier,
369 * \brief Open and initialise use case core for sound card
370 * \param uc_mgr Returned use case manager pointer
371 * \param card_name Sound card name.
372 * \return zero if success, otherwise a negative error code
374 int snd_use_case_mgr_open(snd_use_case_mgr_t **uc_mgr, const char *card_name);
378 * \brief Reload and re-parse use case configuration files for sound card.
379 * \param uc_mgr Use case manager
380 * \return zero if success, otherwise a negative error code
382 int snd_use_case_mgr_reload(snd_use_case_mgr_t *uc_mgr);
385 * \brief Close use case manager
386 * \param uc_mgr Use case manager
387 * \return zero if success, otherwise a negative error code
389 int snd_use_case_mgr_close(snd_use_case_mgr_t *uc_mgr);
392 * \brief Reset use case manager verb, device, modifier to deafult settings.
393 * \param uc_mgr Use case manager
394 * \return zero if success, otherwise a negative error code
396 int snd_use_case_mgr_reset(snd_use_case_mgr_t *uc_mgr);
403 * \brief Obtain a list of cards
404 * \param list Returned allocated list
405 * \return Number of list entries if success, otherwise a negative error code
407 static __inline__ int snd_use_case_card_list(const char **list[])
409 return snd_use_case_get_list(NULL, NULL, list);
413 * \brief Obtain a list of verbs
414 * \param uc_mgr Use case manager
415 * \param list Returned list of verbs
416 * \return Number of list entries if success, otherwise a negative error code
418 static __inline__ int snd_use_case_verb_list(snd_use_case_mgr_t *uc_mgr,
421 return snd_use_case_get_list(uc_mgr, "_verbs", list);
432 #endif /* __ALSA_USE_CASE_H */