1d5ac70f0Sopenharmony_ci/**
2d5ac70f0Sopenharmony_ci * \file include/use-case.h
3d5ac70f0Sopenharmony_ci * \brief use case interface for the ALSA driver
4d5ac70f0Sopenharmony_ci * \author Liam Girdwood <lrg@slimlogic.co.uk>
5d5ac70f0Sopenharmony_ci * \author Stefan Schmidt <stefan@slimlogic.co.uk>
6d5ac70f0Sopenharmony_ci * \author Jaroslav Kysela <perex@perex.cz>
7d5ac70f0Sopenharmony_ci * \author Justin Xu <justinx@slimlogic.co.uk>
8d5ac70f0Sopenharmony_ci * \date 2008-2010
9d5ac70f0Sopenharmony_ci */
10d5ac70f0Sopenharmony_ci/*
11d5ac70f0Sopenharmony_ci *
12d5ac70f0Sopenharmony_ci *  This library is free software; you can redistribute it and/or modify
13d5ac70f0Sopenharmony_ci *  it under the terms of the GNU Lesser General Public License as
14d5ac70f0Sopenharmony_ci *  published by the Free Software Foundation; either version 2.1 of
15d5ac70f0Sopenharmony_ci *  the License, or (at your option) any later version.
16d5ac70f0Sopenharmony_ci *
17d5ac70f0Sopenharmony_ci *  This program is distributed in the hope that it will be useful,
18d5ac70f0Sopenharmony_ci *  but WITHOUT ANY WARRANTY; without even the implied warranty of
19d5ac70f0Sopenharmony_ci *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20d5ac70f0Sopenharmony_ci *  GNU Lesser General Public License for more details.
21d5ac70f0Sopenharmony_ci *
22d5ac70f0Sopenharmony_ci *  You should have received a copy of the GNU Lesser General Public
23d5ac70f0Sopenharmony_ci *  License along with this library; if not, write to the Free Software
24d5ac70f0Sopenharmony_ci *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
25d5ac70f0Sopenharmony_ci *
26d5ac70f0Sopenharmony_ci *  Copyright (C) 2008-2010 SlimLogic Ltd
27d5ac70f0Sopenharmony_ci *  Copyright (C) 2010 Wolfson Microelectronics PLC
28d5ac70f0Sopenharmony_ci *  Copyright (C) 2010 Texas Instruments Inc.
29d5ac70f0Sopenharmony_ci *
30d5ac70f0Sopenharmony_ci *  Support for the verb/device/modifier core logic and API,
31d5ac70f0Sopenharmony_ci *  command line tool and file parser was kindly sponsored by
32d5ac70f0Sopenharmony_ci *  Texas Instruments Inc.
33d5ac70f0Sopenharmony_ci *  Support for multiple active modifiers and devices,
34d5ac70f0Sopenharmony_ci *  transition sequences, multiple client access and user defined use
35d5ac70f0Sopenharmony_ci *  cases was kindly sponsored by Wolfson Microelectronics PLC.
36d5ac70f0Sopenharmony_ci */
37d5ac70f0Sopenharmony_ci
38d5ac70f0Sopenharmony_ci#ifndef __ALSA_USE_CASE_H
39d5ac70f0Sopenharmony_ci#define __ALSA_USE_CASE_H
40d5ac70f0Sopenharmony_ci
41d5ac70f0Sopenharmony_ci#ifdef __cplusplus
42d5ac70f0Sopenharmony_ciextern "C" {
43d5ac70f0Sopenharmony_ci#endif
44d5ac70f0Sopenharmony_ci
45d5ac70f0Sopenharmony_ci#include <alsa/asoundlib.h>
46d5ac70f0Sopenharmony_ci
47d5ac70f0Sopenharmony_ci/**
48d5ac70f0Sopenharmony_ci *  \defgroup ucm Use Case Interface
49d5ac70f0Sopenharmony_ci *  The ALSA Use Case manager interface.
50d5ac70f0Sopenharmony_ci *  See \ref Usecase page for more details.
51d5ac70f0Sopenharmony_ci *  \{
52d5ac70f0Sopenharmony_ci */
53d5ac70f0Sopenharmony_ci
54d5ac70f0Sopenharmony_ci/*! \page Usecase ALSA Use Case Interface
55d5ac70f0Sopenharmony_ci *
56d5ac70f0Sopenharmony_ci * The use case manager works by configuring the sound card ALSA kcontrols to
57d5ac70f0Sopenharmony_ci * change the hardware digital and analog audio routing to match the requested
58d5ac70f0Sopenharmony_ci * device use case. The use case manager kcontrol configurations are stored in
59d5ac70f0Sopenharmony_ci * easy to modify text files.
60d5ac70f0Sopenharmony_ci *
61d5ac70f0Sopenharmony_ci * An audio use case can be defined by a verb and device parameter. The verb
62d5ac70f0Sopenharmony_ci * describes the use case action i.e. a phone call, listening to music, recording
63d5ac70f0Sopenharmony_ci * a conversation etc. The device describes the physical audio capture and playback
64d5ac70f0Sopenharmony_ci * hardware i.e. headphones, phone handset, bluetooth headset, etc.
65d5ac70f0Sopenharmony_ci *
66d5ac70f0Sopenharmony_ci * It's intended clients will mostly only need to set the use case verb and
67d5ac70f0Sopenharmony_ci * device for each system use case change (as the verb and device parameters
68d5ac70f0Sopenharmony_ci * cover most audio use cases).
69d5ac70f0Sopenharmony_ci *
70d5ac70f0Sopenharmony_ci * However there are times when a use case has to be modified at runtime. e.g.
71d5ac70f0Sopenharmony_ci *
72d5ac70f0Sopenharmony_ci *  + Incoming phone call when the device is playing music
73d5ac70f0Sopenharmony_ci *  + Recording sections of a phone call
74d5ac70f0Sopenharmony_ci *  + Playing tones during a call.
75d5ac70f0Sopenharmony_ci *
76d5ac70f0Sopenharmony_ci * In order to allow asynchronous runtime use case adaptations, we have a third
77d5ac70f0Sopenharmony_ci * optional modifier parameter that can be used to further configure
78d5ac70f0Sopenharmony_ci * the use case during live audio runtime.
79d5ac70f0Sopenharmony_ci *
80d5ac70f0Sopenharmony_ci * This interface allows clients to :-
81d5ac70f0Sopenharmony_ci *
82d5ac70f0Sopenharmony_ci *  + Query the supported use case verbs, devices and modifiers for the machine.
83d5ac70f0Sopenharmony_ci *  + Set and Get use case verbs, devices and modifiers for the machine.
84d5ac70f0Sopenharmony_ci *  + Get the ALSA PCM playback and capture device PCMs for use case verb,
85d5ac70f0Sopenharmony_ci *     use case device and modifier.
86d5ac70f0Sopenharmony_ci *  + Get the TQ parameter for each use case verb, use case device and
87d5ac70f0Sopenharmony_ci *     modifier.
88d5ac70f0Sopenharmony_ci *  + Get the ALSA master playback and capture volume/switch kcontrols
89d5ac70f0Sopenharmony_ci *     or mixer elements for each use case.
90d5ac70f0Sopenharmony_ci */
91d5ac70f0Sopenharmony_ci
92d5ac70f0Sopenharmony_ci
93d5ac70f0Sopenharmony_ci/*
94d5ac70f0Sopenharmony_ci * Use Case Verb.
95d5ac70f0Sopenharmony_ci *
96d5ac70f0Sopenharmony_ci * The use case verb is the main device audio action. e.g. the "HiFi" use
97d5ac70f0Sopenharmony_ci * case verb will configure the audio hardware for HiFi Music playback
98d5ac70f0Sopenharmony_ci * and capture.
99d5ac70f0Sopenharmony_ci */
100d5ac70f0Sopenharmony_ci#define SND_USE_CASE_VERB_INACTIVE		"Inactive"		/**< Inactive Verb */
101d5ac70f0Sopenharmony_ci#define SND_USE_CASE_VERB_HIFI			"HiFi"			/**< HiFi Verb */
102d5ac70f0Sopenharmony_ci#define SND_USE_CASE_VERB_HIFI_LOW_POWER	"HiFi Low Power"	/**< HiFi Low Power Verb */
103d5ac70f0Sopenharmony_ci#define SND_USE_CASE_VERB_VOICE			"Voice"			/**< Voice Verb */
104d5ac70f0Sopenharmony_ci#define SND_USE_CASE_VERB_VOICE_LOW_POWER	"Voice Low Power"	/**< Voice Low Power Verb */
105d5ac70f0Sopenharmony_ci#define SND_USE_CASE_VERB_VOICECALL		"Voice Call"		/**< Voice Call Verb */
106d5ac70f0Sopenharmony_ci#define SND_USE_CASE_VERB_IP_VOICECALL		"Voice Call IP"		/**< Voice Call IP Verb */
107d5ac70f0Sopenharmony_ci#define SND_USE_CASE_VERB_ANALOG_RADIO		"FM Analog Radio"	/**< FM Analog Radio Verb */
108d5ac70f0Sopenharmony_ci#define SND_USE_CASE_VERB_DIGITAL_RADIO		"FM Digital Radio"	/**< FM Digital Radio Verb */
109d5ac70f0Sopenharmony_ci/* add new verbs to end of list */
110d5ac70f0Sopenharmony_ci
111d5ac70f0Sopenharmony_ci
112d5ac70f0Sopenharmony_ci/*
113d5ac70f0Sopenharmony_ci * Use Case Device.
114d5ac70f0Sopenharmony_ci *
115d5ac70f0Sopenharmony_ci * Physical system devices the render and capture audio. Devices can be OR'ed
116d5ac70f0Sopenharmony_ci * together to support audio on simultaneous devices.
117d5ac70f0Sopenharmony_ci *
118d5ac70f0Sopenharmony_ci * If multiple devices with the same name exists, the number suffixes should
119d5ac70f0Sopenharmony_ci * be added to these names like HDMI1,HDMI2,HDMI3 etc. No number gaps are
120d5ac70f0Sopenharmony_ci * allowed. The names with numbers must be continuous. It is allowed to put
121d5ac70f0Sopenharmony_ci * a whitespace between name and index (like 'Line 1') for the better
122d5ac70f0Sopenharmony_ci * readability. The device names 'Line 1' and 'Line1' are equal for
123d5ac70f0Sopenharmony_ci * this purpose.
124d5ac70f0Sopenharmony_ci *
125d5ac70f0Sopenharmony_ci * If EnableSequence/DisableSequence controls independent paths in the hardware
126d5ac70f0Sopenharmony_ci * it is also recommended to split playback and capture UCM devices and use
127d5ac70f0Sopenharmony_ci * the number suffixes. Example use case: Use the integrated microphone
128d5ac70f0Sopenharmony_ci * in the laptop instead the microphone in headphones.
129d5ac70f0Sopenharmony_ci *
130d5ac70f0Sopenharmony_ci * The preference of the devices is determined by the priority value.
131d5ac70f0Sopenharmony_ci */
132d5ac70f0Sopenharmony_ci#define SND_USE_CASE_DEV_NONE		"None"		/**< None Device */
133d5ac70f0Sopenharmony_ci#define SND_USE_CASE_DEV_SPEAKER	"Speaker"	/**< Speaker Device */
134d5ac70f0Sopenharmony_ci#define SND_USE_CASE_DEV_LINE		"Line"		/**< Line Device */
135d5ac70f0Sopenharmony_ci#define SND_USE_CASE_DEV_MIC            "Mic"           /**< Microphone Device */
136d5ac70f0Sopenharmony_ci#define SND_USE_CASE_DEV_HEADPHONES	"Headphones"	/**< Headphones Device */
137d5ac70f0Sopenharmony_ci#define SND_USE_CASE_DEV_HEADSET	"Headset"	/**< Headset Device */
138d5ac70f0Sopenharmony_ci#define SND_USE_CASE_DEV_HANDSET	"Handset"	/**< Handset Device */
139d5ac70f0Sopenharmony_ci#define SND_USE_CASE_DEV_BLUETOOTH	"Bluetooth"	/**< Bluetooth Device */
140d5ac70f0Sopenharmony_ci#define SND_USE_CASE_DEV_EARPIECE	"Earpiece"	/**< Earpiece Device */
141d5ac70f0Sopenharmony_ci#define SND_USE_CASE_DEV_SPDIF		"SPDIF"		/**< SPDIF Device */
142d5ac70f0Sopenharmony_ci#define SND_USE_CASE_DEV_HDMI		"HDMI"		/**< HDMI Device */
143d5ac70f0Sopenharmony_ci#define SND_USE_CASE_DEV_USB		"USB"		/**< USB Device (multifunctional) */
144d5ac70f0Sopenharmony_ci#define SND_USE_CASE_DEV_DIRECT		"Direct"	/**< Direct Device (no channel remapping), (e.g. ProAudio usage) */
145d5ac70f0Sopenharmony_ci/* add new devices to end of list */
146d5ac70f0Sopenharmony_ci
147d5ac70f0Sopenharmony_ci
148d5ac70f0Sopenharmony_ci/*
149d5ac70f0Sopenharmony_ci * Use Case Modifiers.
150d5ac70f0Sopenharmony_ci *
151d5ac70f0Sopenharmony_ci * The use case modifier allows runtime configuration changes to deal with
152d5ac70f0Sopenharmony_ci * asynchronous events.
153d5ac70f0Sopenharmony_ci *
154d5ac70f0Sopenharmony_ci * If multiple modifiers with the same name exists, the number suffixes should
155d5ac70f0Sopenharmony_ci * be added to these names like 'Echo Reference 1','Echo Reference 2' etc.
156d5ac70f0Sopenharmony_ci * No number gaps are allowed. The names with numbers must be continuous.
157d5ac70f0Sopenharmony_ci * It is allowed to put a whitespace between name and index for the better
158d5ac70f0Sopenharmony_ci * readability. The modifier names 'Something 1' and 'Something1' are equal
159d5ac70f0Sopenharmony_ci * for this purpose.
160d5ac70f0Sopenharmony_ci *
161d5ac70f0Sopenharmony_ci * e.g. to record a voice call :-
162d5ac70f0Sopenharmony_ci *  1. Set verb to SND_USE_CASE_VERB_VOICECALL (for voice call)
163d5ac70f0Sopenharmony_ci *  2. Set modifier SND_USE_CASE_MOD_CAPTURE_VOICE when capture required.
164d5ac70f0Sopenharmony_ci *  3. Call snd_use_case_get("CapturePCM") to get ALSA source PCM name
165d5ac70f0Sopenharmony_ci *     with captured voice pcm data.
166d5ac70f0Sopenharmony_ci *
167d5ac70f0Sopenharmony_ci * e.g. to play a ring tone when listenin to MP3 Music :-
168d5ac70f0Sopenharmony_ci *  1. Set verb to SND_USE_CASE_VERB_HIFI (for MP3 playback)
169d5ac70f0Sopenharmony_ci *  2. Set modifier to SND_USE_CASE_MOD_PLAY_TONE when incoming call happens.
170d5ac70f0Sopenharmony_ci *  3. Call snd_use_case_get("PlaybackPCM") to get ALSA PCM sink name for
171d5ac70f0Sopenharmony_ci *     ringtone pcm data.
172d5ac70f0Sopenharmony_ci */
173d5ac70f0Sopenharmony_ci#define SND_USE_CASE_MOD_CAPTURE_VOICE		"Capture Voice"		/**< Capture Voice Modifier */
174d5ac70f0Sopenharmony_ci#define SND_USE_CASE_MOD_CAPTURE_MUSIC		"Capture Music"		/**< Capture Music Modifier */
175d5ac70f0Sopenharmony_ci#define SND_USE_CASE_MOD_PLAY_MUSIC		"Play Music"		/**< Play Music Modifier */
176d5ac70f0Sopenharmony_ci#define SND_USE_CASE_MOD_PLAY_VOICE		"Play Voice"		/**< Play Voice Modifier */
177d5ac70f0Sopenharmony_ci#define SND_USE_CASE_MOD_PLAY_TONE		"Play Tone"		/**< Play Tone Modifier */
178d5ac70f0Sopenharmony_ci#define SND_USE_CASE_MOD_ECHO_REF		"Echo Reference"	/**< Echo Reference Modifier */
179d5ac70f0Sopenharmony_ci/* add new modifiers to end of list */
180d5ac70f0Sopenharmony_ci
181d5ac70f0Sopenharmony_ci
182d5ac70f0Sopenharmony_ci/**
183d5ac70f0Sopenharmony_ci * TQ - Tone Quality
184d5ac70f0Sopenharmony_ci *
185d5ac70f0Sopenharmony_ci * The interface allows clients to determine the audio TQ required for each
186d5ac70f0Sopenharmony_ci * use case verb and modifier. It's intended as an optional hint to the
187d5ac70f0Sopenharmony_ci * audio driver in order to lower power consumption.
188d5ac70f0Sopenharmony_ci *
189d5ac70f0Sopenharmony_ci */
190d5ac70f0Sopenharmony_ci#define SND_USE_CASE_TQ_MUSIC		"Music"		/**< Music Tone Quality */
191d5ac70f0Sopenharmony_ci#define SND_USE_CASE_TQ_VOICE		"Voice"		/**< Voice Tone Quality */
192d5ac70f0Sopenharmony_ci#define SND_USE_CASE_TQ_TONES		"Tones"		/**< Tones Tone Quality */
193d5ac70f0Sopenharmony_ci
194d5ac70f0Sopenharmony_ci/** use case container */
195d5ac70f0Sopenharmony_citypedef struct snd_use_case_mgr snd_use_case_mgr_t;
196d5ac70f0Sopenharmony_ci
197d5ac70f0Sopenharmony_ci/**
198d5ac70f0Sopenharmony_ci * \brief Create an identifier
199d5ac70f0Sopenharmony_ci * \param fmt Format (sprintf like)
200d5ac70f0Sopenharmony_ci * \param ... Optional arguments for sprintf like format
201d5ac70f0Sopenharmony_ci * \return Allocated string identifier or NULL on error
202d5ac70f0Sopenharmony_ci */
203d5ac70f0Sopenharmony_cichar *snd_use_case_identifier(const char *fmt, ...);
204d5ac70f0Sopenharmony_ci
205d5ac70f0Sopenharmony_ci/**
206d5ac70f0Sopenharmony_ci * \brief Free a string list
207d5ac70f0Sopenharmony_ci * \param list The string list to free
208d5ac70f0Sopenharmony_ci * \param items Count of strings
209d5ac70f0Sopenharmony_ci * \return Zero if success, otherwise a negative error code
210d5ac70f0Sopenharmony_ci */
211d5ac70f0Sopenharmony_ciint snd_use_case_free_list(const char *list[], int items);
212d5ac70f0Sopenharmony_ci
213d5ac70f0Sopenharmony_ci/**
214d5ac70f0Sopenharmony_ci * \brief Obtain a list of entries
215d5ac70f0Sopenharmony_ci * \param uc_mgr Use case manager (may be NULL - card list)
216d5ac70f0Sopenharmony_ci * \param identifier (may be NULL - card list)
217d5ac70f0Sopenharmony_ci * \param list Returned allocated list
218d5ac70f0Sopenharmony_ci * \return Number of list entries if success, otherwise a negative error code
219d5ac70f0Sopenharmony_ci *
220d5ac70f0Sopenharmony_ci * Defined identifiers:
221d5ac70f0Sopenharmony_ci *   - NULL			- get card list
222d5ac70f0Sopenharmony_ci *				 (in pair cardname+comment)
223d5ac70f0Sopenharmony_ci *   - _verbs			- get verb list
224d5ac70f0Sopenharmony_ci *				  (in pair verb+comment)
225d5ac70f0Sopenharmony_ci *   - _devices[/{verb}]	- get list of supported devices
226d5ac70f0Sopenharmony_ci *				  (in pair device+comment)
227d5ac70f0Sopenharmony_ci *   - _modifiers[/{verb}]	- get list of supported modifiers
228d5ac70f0Sopenharmony_ci *				  (in pair modifier+comment)
229d5ac70f0Sopenharmony_ci *   - TQ[/{verb}]		- get list of TQ identifiers
230d5ac70f0Sopenharmony_ci *   - _enadevs			- get list of enabled devices
231d5ac70f0Sopenharmony_ci *   - _enamods			- get list of enabled modifiers
232d5ac70f0Sopenharmony_ci *
233d5ac70f0Sopenharmony_ci *   - _identifiers/{modifier}|{device}[/{verb}]     - list of value identifiers
234d5ac70f0Sopenharmony_ci *   - _supporteddevs/{modifier}|{device}[/{verb}]   - list of supported devices
235d5ac70f0Sopenharmony_ci *   - _conflictingdevs/{modifier}|{device}[/{verb}] - list of conflicting devices
236d5ac70f0Sopenharmony_ci *
237d5ac70f0Sopenharmony_ci *   Note that at most one of the supported/conflicting devs lists has
238d5ac70f0Sopenharmony_ci *   any entries, and when neither is present, all devices are supported.
239d5ac70f0Sopenharmony_ci *
240d5ac70f0Sopenharmony_ci */
241d5ac70f0Sopenharmony_ciint snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
242d5ac70f0Sopenharmony_ci                          const char *identifier,
243d5ac70f0Sopenharmony_ci                          const char **list[]);
244d5ac70f0Sopenharmony_ci
245d5ac70f0Sopenharmony_ci
246d5ac70f0Sopenharmony_ci/**
247d5ac70f0Sopenharmony_ci * \brief Get current - string
248d5ac70f0Sopenharmony_ci * \param uc_mgr Use case manager
249d5ac70f0Sopenharmony_ci * \param identifier
250d5ac70f0Sopenharmony_ci * \param value Value pointer
251d5ac70f0Sopenharmony_ci * \return Zero if success, otherwise a negative error code
252d5ac70f0Sopenharmony_ci *
253d5ac70f0Sopenharmony_ci * Note: The returned string is dynamically allocated, use free() to
254d5ac70f0Sopenharmony_ci * deallocate this string. (Yes, the value parameter shouldn't be marked as
255d5ac70f0Sopenharmony_ci * "const", but it's too late to fix it, sorry about that.)
256d5ac70f0Sopenharmony_ci *
257d5ac70f0Sopenharmony_ci * Known identifiers:
258d5ac70f0Sopenharmony_ci *   - NULL 		- return current card
259d5ac70f0Sopenharmony_ci *   - _verb		- return current verb
260d5ac70f0Sopenharmony_ci *   - _file		- return configuration file loaded for current card
261d5ac70f0Sopenharmony_ci *   - _alibcfg		- return private alsa-lib's configuration for current card
262d5ac70f0Sopenharmony_ci *   - _alibpref	- return private alsa-lib's configuration device prefix for current card
263d5ac70f0Sopenharmony_ci *
264d5ac70f0Sopenharmony_ci *   - [=]{NAME}[/[{modifier}|{/device}][/{verb}]]
265d5ac70f0Sopenharmony_ci *                      - value identifier {NAME}
266d5ac70f0Sopenharmony_ci *                      - Search starts at given modifier or device if any,
267d5ac70f0Sopenharmony_ci *                          else at a verb
268d5ac70f0Sopenharmony_ci *                      - Search starts at given verb if any,
269d5ac70f0Sopenharmony_ci *                          else current verb
270d5ac70f0Sopenharmony_ci *                      - Searches modifier/device, then verb, then defaults
271d5ac70f0Sopenharmony_ci *                      - Specify a leading "=" to search only the exact
272d5ac70f0Sopenharmony_ci *                        device/modifier/verb specified, and not search
273d5ac70f0Sopenharmony_ci *                        through each object in turn.
274d5ac70f0Sopenharmony_ci *                      - Examples:
275d5ac70f0Sopenharmony_ci *                          - "PlaybackPCM/Play Music"
276d5ac70f0Sopenharmony_ci *                          - "CapturePCM/SPDIF"
277d5ac70f0Sopenharmony_ci *                          - From ValueDefaults only:
278d5ac70f0Sopenharmony_ci *                              "=Variable"
279d5ac70f0Sopenharmony_ci *                          - From current active verb:
280d5ac70f0Sopenharmony_ci *                              "=Variable//"
281d5ac70f0Sopenharmony_ci *                          - From verb "Verb":
282d5ac70f0Sopenharmony_ci *                              "=Variable//Verb"
283d5ac70f0Sopenharmony_ci *                          - From "Modifier" in current active verb:
284d5ac70f0Sopenharmony_ci *                              "=Variable/Modifier/"
285d5ac70f0Sopenharmony_ci *                          - From "Modifier" in "Verb":
286d5ac70f0Sopenharmony_ci *                              "=Variable/Modifier/Verb"
287d5ac70f0Sopenharmony_ci *
288d5ac70f0Sopenharmony_ci * Recommended names for values:
289d5ac70f0Sopenharmony_ci *   - Linked
290d5ac70f0Sopenharmony_ci *      - value "True" or "1" (case insensitive)
291d5ac70f0Sopenharmony_ci *      - this is a linked UCM card
292d5ac70f0Sopenharmony_ci *      - don't use this UCM card, because the other UCM card refers devices
293d5ac70f0Sopenharmony_ci *      - valid only in the ValueDefaults section (query '=Linked')
294d5ac70f0Sopenharmony_ci *   - TQ
295d5ac70f0Sopenharmony_ci *      - Tone Quality
296d5ac70f0Sopenharmony_ci *   - Priority
297d5ac70f0Sopenharmony_ci *      - priority value (1-10000), higher value means higher priority
298d5ac70f0Sopenharmony_ci *      - valid only for verbs
299d5ac70f0Sopenharmony_ci *      - for devices - PlaybackPriority and CapturePriority
300d5ac70f0Sopenharmony_ci *   - PlaybackPCM
301d5ac70f0Sopenharmony_ci *      - full PCM playback device name
302d5ac70f0Sopenharmony_ci *   - PlaybackPCMIsDummy
303d5ac70f0Sopenharmony_ci *      - Valid values: "yes" and "no". If set to "yes", the PCM named by the
304d5ac70f0Sopenharmony_ci *        PlaybackPCM value is a dummy device, meaning that opening it enables
305d5ac70f0Sopenharmony_ci *        an audio path in the hardware, but writing to the PCM device has no
306d5ac70f0Sopenharmony_ci *        effect.
307d5ac70f0Sopenharmony_ci *   - CapturePCM
308d5ac70f0Sopenharmony_ci *      - full PCM capture device name
309d5ac70f0Sopenharmony_ci *   - CapturePCMIsDummy
310d5ac70f0Sopenharmony_ci *      - Valid values: "yes" and "no". If set to "yes", the PCM named by the
311d5ac70f0Sopenharmony_ci *        CapturePCM value is a dummy device, meaning that opening it enables
312d5ac70f0Sopenharmony_ci *        an audio path in the hardware, but reading from the PCM device has no
313d5ac70f0Sopenharmony_ci *        effect.
314d5ac70f0Sopenharmony_ci *   - PlaybackRate
315d5ac70f0Sopenharmony_ci *      - playback device sample rate
316d5ac70f0Sopenharmony_ci *   - PlaybackChannels
317d5ac70f0Sopenharmony_ci *      - playback device channel count
318d5ac70f0Sopenharmony_ci *   - PlaybackChannel#
319d5ac70f0Sopenharmony_ci *      - describe index of the logical channel in the PCM stream
320d5ac70f0Sopenharmony_ci *      - e.g. "PlaybackChannel0 2" - logical channel 0 is third channel in the PCM stream
321d5ac70f0Sopenharmony_ci *   - PlaybackChannelPos#
322d5ac70f0Sopenharmony_ci *      - describe sound position of the logical channel (ALSA chmap names)
323d5ac70f0Sopenharmony_ci *      - e.g. "PlaybackChannel0 FR" - logical channel 0 is at front left
324d5ac70f0Sopenharmony_ci *   - PlaybackCTL
325d5ac70f0Sopenharmony_ci *      - playback control device name
326d5ac70f0Sopenharmony_ci *   - PlaybackVolume
327d5ac70f0Sopenharmony_ci *      - playback control volume identifier string
328d5ac70f0Sopenharmony_ci *      - can be parsed using #snd_use_case_parse_ctl_elem_id()
329d5ac70f0Sopenharmony_ci *   - PlaybackSwitch
330d5ac70f0Sopenharmony_ci *      - playback control switch identifier string
331d5ac70f0Sopenharmony_ci *	    - can be parsed using #snd_use_case_parse_ctl_elem_id()
332d5ac70f0Sopenharmony_ci *   - PlaybackPriority
333d5ac70f0Sopenharmony_ci *      - priority value (1-10000), higher value means higher priority
334d5ac70f0Sopenharmony_ci *   - CaptureRate
335d5ac70f0Sopenharmony_ci *      - capture device sample rate
336d5ac70f0Sopenharmony_ci *   - CaptureChannels
337d5ac70f0Sopenharmony_ci *      - capture device channel count
338d5ac70f0Sopenharmony_ci *   - CaptureChannel#
339d5ac70f0Sopenharmony_ci *      - describe index of the logical channel in the PCM stream
340d5ac70f0Sopenharmony_ci *      - e.g. "CaptureChannel0 2" - logical channel 0 is third channel in the PCM stream
341d5ac70f0Sopenharmony_ci *   - CaptureChannelPos#
342d5ac70f0Sopenharmony_ci *      - describe sound position of the logical channel (ALSA chmap names)
343d5ac70f0Sopenharmony_ci *      - e.g. "CaptureChannel0 FR" - logical channel 0 is at front left
344d5ac70f0Sopenharmony_ci *   - CaptureCTL
345d5ac70f0Sopenharmony_ci *      - capture control device name
346d5ac70f0Sopenharmony_ci *   - CaptureVolume
347d5ac70f0Sopenharmony_ci *      - capture control volume identifier string
348d5ac70f0Sopenharmony_ci *	    - can be parsed using #snd_use_case_parse_ctl_elem_id()
349d5ac70f0Sopenharmony_ci *   - CaptureSwitch
350d5ac70f0Sopenharmony_ci *      - capture control switch identifier string
351d5ac70f0Sopenharmony_ci *	    - can be parsed using #snd_use_case_parse_ctl_elem_id()
352d5ac70f0Sopenharmony_ci *   - CapturePriority
353d5ac70f0Sopenharmony_ci *      - priority value (1-10000), higher value means higher priority
354d5ac70f0Sopenharmony_ci *   - PlaybackMixer
355d5ac70f0Sopenharmony_ci *      - name of playback mixer
356d5ac70f0Sopenharmony_ci *   - PlaybackMixerElem
357d5ac70f0Sopenharmony_ci *      - mixer element playback identifier
358d5ac70f0Sopenharmony_ci *	    - can be parsed using #snd_use_case_parse_selem_id()
359d5ac70f0Sopenharmony_ci *   - PlaybackMasterElem
360d5ac70f0Sopenharmony_ci *      - mixer element playback identifier for the master control
361d5ac70f0Sopenharmony_ci *	    - can be parsed using #snd_use_case_parse_selem_id()
362d5ac70f0Sopenharmony_ci *   - PlaybackMasterType
363d5ac70f0Sopenharmony_ci *      - type of the master volume control
364d5ac70f0Sopenharmony_ci *      - Valid values: "soft" (software attenuation)
365d5ac70f0Sopenharmony_ci *   - CaptureMixer
366d5ac70f0Sopenharmony_ci *      - name of capture mixer
367d5ac70f0Sopenharmony_ci *   - CaptureMixerElem
368d5ac70f0Sopenharmony_ci *      - mixer element capture identifier
369d5ac70f0Sopenharmony_ci *	    - can be parsed using #snd_use_case_parse_selem_id()
370d5ac70f0Sopenharmony_ci *   - CaptureMasterElem
371d5ac70f0Sopenharmony_ci *      - mixer element playback identifier for the master control
372d5ac70f0Sopenharmony_ci *	    - can be parsed using #snd_use_case_parse_selem_id()
373d5ac70f0Sopenharmony_ci *   - CaptureMasterType
374d5ac70f0Sopenharmony_ci *      - type of the master volume control
375d5ac70f0Sopenharmony_ci *      - Valid values: "soft" (software attenuation)
376d5ac70f0Sopenharmony_ci *   - CaptureMicInfoFile
377d5ac70f0Sopenharmony_ci *      - json file with the microphone array placement and type description
378d5ac70f0Sopenharmony_ci *        (e.g. output from nhlt-dmic-info)
379d5ac70f0Sopenharmony_ci *   - EDIDFile
380d5ac70f0Sopenharmony_ci *      - Path to EDID file for HDMI devices
381d5ac70f0Sopenharmony_ci *   - JackCTL
382d5ac70f0Sopenharmony_ci *      - jack control device name
383d5ac70f0Sopenharmony_ci *   - JackControl
384d5ac70f0Sopenharmony_ci *      - jack control identificator
385d5ac70f0Sopenharmony_ci *      - can be parsed using snd_use_case_parse_ctl_elem_id()
386d5ac70f0Sopenharmony_ci *      - UCM configuration files should contain both JackControl and JackDev
387d5ac70f0Sopenharmony_ci *        when possible, because applications are likely to support only one
388d5ac70f0Sopenharmony_ci *        or the other
389d5ac70f0Sopenharmony_ci *   - JackDev
390d5ac70f0Sopenharmony_ci *      - the input device id of the jack (if the full input device path is
391d5ac70f0Sopenharmony_ci *        /dev/input/by-id/foo, the JackDev value should be "foo")
392d5ac70f0Sopenharmony_ci *      - UCM configuration files should contain both JackControl and JackDev
393d5ac70f0Sopenharmony_ci *        when possible, because applications are likely to support only one
394d5ac70f0Sopenharmony_ci *        or the other
395d5ac70f0Sopenharmony_ci *   - JackHWMute
396d5ac70f0Sopenharmony_ci *	  If this value is set, it indicates that when the jack is plugged
397d5ac70f0Sopenharmony_ci *	  in, the hardware automatically mutes some other device(s). The
398d5ac70f0Sopenharmony_ci *	  value is a space-separated list of device names. If the device
399d5ac70f0Sopenharmony_ci *	  name contains space, it must be enclosed to ' or ", e.g.:
400d5ac70f0Sopenharmony_ci *		JackHWMute "'Dock Headphone' Headphone"
401d5ac70f0Sopenharmony_ci *        Note that JackHWMute should be used only when the hardware enforces
402d5ac70f0Sopenharmony_ci *        the automatic muting. If the hardware doesn't enforce any muting, it
403d5ac70f0Sopenharmony_ci *        may still be tempting to set JackHWMute to trick upper software layers
404d5ac70f0Sopenharmony_ci *        to e.g. automatically mute speakers when headphones are plugged in,
405d5ac70f0Sopenharmony_ci *        but that's application policy configuration that doesn't belong
406d5ac70f0Sopenharmony_ci *        to UCM configuration files.
407d5ac70f0Sopenharmony_ci *   - MinBufferLevel
408d5ac70f0Sopenharmony_ci *	 - This is used on platform where reported buffer level is not accurate.
409d5ac70f0Sopenharmony_ci *	   E.g. "512", which holds 512 samples in device buffer. Note: this will
410d5ac70f0Sopenharmony_ci *	   increase latency.
411d5ac70f0Sopenharmony_ci */
412d5ac70f0Sopenharmony_ciint snd_use_case_get(snd_use_case_mgr_t *uc_mgr,
413d5ac70f0Sopenharmony_ci                     const char *identifier,
414d5ac70f0Sopenharmony_ci                     const char **value);
415d5ac70f0Sopenharmony_ci
416d5ac70f0Sopenharmony_ci/**
417d5ac70f0Sopenharmony_ci * \brief Get current - integer
418d5ac70f0Sopenharmony_ci * \param uc_mgr Use case manager
419d5ac70f0Sopenharmony_ci * \param identifier
420d5ac70f0Sopenharmony_ci * \param value result
421d5ac70f0Sopenharmony_ci * \return Zero if success, otherwise a negative error code
422d5ac70f0Sopenharmony_ci *
423d5ac70f0Sopenharmony_ci * Known identifiers:
424d5ac70f0Sopenharmony_ci *   - _devstatus/{device}	- return status for given device
425d5ac70f0Sopenharmony_ci *   - _modstatus/{modifier}	- return status for given modifier
426d5ac70f0Sopenharmony_ci */
427d5ac70f0Sopenharmony_ciint snd_use_case_geti(snd_use_case_mgr_t *uc_mgr,
428d5ac70f0Sopenharmony_ci		      const char *identifier,
429d5ac70f0Sopenharmony_ci		      long *value);
430d5ac70f0Sopenharmony_ci
431d5ac70f0Sopenharmony_ci/**
432d5ac70f0Sopenharmony_ci * \brief Set new
433d5ac70f0Sopenharmony_ci * \param uc_mgr Use case manager
434d5ac70f0Sopenharmony_ci * \param identifier
435d5ac70f0Sopenharmony_ci * \param value Value
436d5ac70f0Sopenharmony_ci * \return Zero if success, otherwise a negative error code
437d5ac70f0Sopenharmony_ci *
438d5ac70f0Sopenharmony_ci * Known identifiers:
439d5ac70f0Sopenharmony_ci *   - _fboot           - execute the fixed boot sequence (value = NULL)
440d5ac70f0Sopenharmony_ci *   - _boot            - execute the boot sequence (value = NULL)
441d5ac70f0Sopenharmony_ci *                      - only when driver controls identifiers are changed
442d5ac70f0Sopenharmony_ci *                        (otherwise the old control values are restored)
443d5ac70f0Sopenharmony_ci *   - _defaults        - execute the 'defaults' sequence (value = NULL)
444d5ac70f0Sopenharmony_ci *   - _verb            - set current verb = value
445d5ac70f0Sopenharmony_ci *   - _enadev          - enable given device = value
446d5ac70f0Sopenharmony_ci *   - _disdev          - disable given device = value
447d5ac70f0Sopenharmony_ci *   - _swdev/{old_device} - new_device = value
448d5ac70f0Sopenharmony_ci *                      - disable old_device and then enable new_device
449d5ac70f0Sopenharmony_ci *                      - if old_device is not enabled just return
450d5ac70f0Sopenharmony_ci *                      - check transmit sequence firstly
451d5ac70f0Sopenharmony_ci *   - _enamod          - enable given modifier = value
452d5ac70f0Sopenharmony_ci *   - _dismod          - disable given modifier = value
453d5ac70f0Sopenharmony_ci *   - _swmod/{old_modifier}	- new_modifier = value
454d5ac70f0Sopenharmony_ci *                      - disable old_modifier and then enable new_modifier
455d5ac70f0Sopenharmony_ci *                      - if old_modifier is not enabled just return
456d5ac70f0Sopenharmony_ci *                      - check transmit sequence firstly
457d5ac70f0Sopenharmony_ci */
458d5ac70f0Sopenharmony_ciint snd_use_case_set(snd_use_case_mgr_t *uc_mgr,
459d5ac70f0Sopenharmony_ci                     const char *identifier,
460d5ac70f0Sopenharmony_ci                     const char *value);
461d5ac70f0Sopenharmony_ci
462d5ac70f0Sopenharmony_ci/**
463d5ac70f0Sopenharmony_ci * \brief Open and initialise use case core for sound card
464d5ac70f0Sopenharmony_ci * \param uc_mgr Returned use case manager pointer
465d5ac70f0Sopenharmony_ci * \param card_name Sound card name.
466d5ac70f0Sopenharmony_ci * \return zero if success, otherwise a negative error code
467d5ac70f0Sopenharmony_ci *
468d5ac70f0Sopenharmony_ci * By default only first card is used when the driver card
469d5ac70f0Sopenharmony_ci * name or long name is passed in the card_name argument.
470d5ac70f0Sopenharmony_ci *
471d5ac70f0Sopenharmony_ci * The "strict:" prefix in the card_name defines that
472d5ac70f0Sopenharmony_ci * there is no driver name / long name matching. The straight
473d5ac70f0Sopenharmony_ci * configuration is used.
474d5ac70f0Sopenharmony_ci *
475d5ac70f0Sopenharmony_ci * The "hw:" prefix in the card_name will load the configuration
476d5ac70f0Sopenharmony_ci * for the ALSA card specified by the card index (value) or
477d5ac70f0Sopenharmony_ci * the card string identificator.
478d5ac70f0Sopenharmony_ci *
479d5ac70f0Sopenharmony_ci * The sound card might be also composed from several physical
480d5ac70f0Sopenharmony_ci * sound cards (for the default and strict card_name).
481d5ac70f0Sopenharmony_ci * The application cannot expect that the device names will refer
482d5ac70f0Sopenharmony_ci * only one ALSA sound card in this case.
483d5ac70f0Sopenharmony_ci */
484d5ac70f0Sopenharmony_ciint snd_use_case_mgr_open(snd_use_case_mgr_t **uc_mgr,
485d5ac70f0Sopenharmony_ci                          const char *card_name);
486d5ac70f0Sopenharmony_ci
487d5ac70f0Sopenharmony_ci
488d5ac70f0Sopenharmony_ci/**
489d5ac70f0Sopenharmony_ci * \brief Reload and re-parse use case configuration files for sound card.
490d5ac70f0Sopenharmony_ci * \param uc_mgr Use case manager
491d5ac70f0Sopenharmony_ci * \return zero if success, otherwise a negative error code
492d5ac70f0Sopenharmony_ci */
493d5ac70f0Sopenharmony_ciint snd_use_case_mgr_reload(snd_use_case_mgr_t *uc_mgr);
494d5ac70f0Sopenharmony_ci
495d5ac70f0Sopenharmony_ci/**
496d5ac70f0Sopenharmony_ci * \brief Close use case manager
497d5ac70f0Sopenharmony_ci * \param uc_mgr Use case manager
498d5ac70f0Sopenharmony_ci * \return zero if success, otherwise a negative error code
499d5ac70f0Sopenharmony_ci */
500d5ac70f0Sopenharmony_ciint snd_use_case_mgr_close(snd_use_case_mgr_t *uc_mgr);
501d5ac70f0Sopenharmony_ci
502d5ac70f0Sopenharmony_ci/**
503d5ac70f0Sopenharmony_ci * \brief Reset use case manager verb, device, modifier to deafult settings.
504d5ac70f0Sopenharmony_ci * \param uc_mgr Use case manager
505d5ac70f0Sopenharmony_ci * \return zero if success, otherwise a negative error code
506d5ac70f0Sopenharmony_ci */
507d5ac70f0Sopenharmony_ciint snd_use_case_mgr_reset(snd_use_case_mgr_t *uc_mgr);
508d5ac70f0Sopenharmony_ci
509d5ac70f0Sopenharmony_ci/*
510d5ac70f0Sopenharmony_ci * helper functions
511d5ac70f0Sopenharmony_ci */
512d5ac70f0Sopenharmony_ci
513d5ac70f0Sopenharmony_ci/**
514d5ac70f0Sopenharmony_ci * \brief Obtain a list of cards
515d5ac70f0Sopenharmony_ci * \param list Returned allocated list
516d5ac70f0Sopenharmony_ci * \return Number of list entries if success, otherwise a negative error code
517d5ac70f0Sopenharmony_ci */
518d5ac70f0Sopenharmony_cistatic __inline__ int snd_use_case_card_list(const char **list[])
519d5ac70f0Sopenharmony_ci{
520d5ac70f0Sopenharmony_ci	return snd_use_case_get_list(NULL, NULL, list);
521d5ac70f0Sopenharmony_ci}
522d5ac70f0Sopenharmony_ci
523d5ac70f0Sopenharmony_ci/**
524d5ac70f0Sopenharmony_ci * \brief Obtain a list of verbs
525d5ac70f0Sopenharmony_ci * \param uc_mgr Use case manager
526d5ac70f0Sopenharmony_ci * \param list Returned list of verbs
527d5ac70f0Sopenharmony_ci * \return Number of list entries if success, otherwise a negative error code
528d5ac70f0Sopenharmony_ci */
529d5ac70f0Sopenharmony_cistatic __inline__ int snd_use_case_verb_list(snd_use_case_mgr_t *uc_mgr,
530d5ac70f0Sopenharmony_ci					 const char **list[])
531d5ac70f0Sopenharmony_ci{
532d5ac70f0Sopenharmony_ci	return snd_use_case_get_list(uc_mgr, "_verbs", list);
533d5ac70f0Sopenharmony_ci}
534d5ac70f0Sopenharmony_ci
535d5ac70f0Sopenharmony_ci/**
536d5ac70f0Sopenharmony_ci * \brief Parse control element identifier
537d5ac70f0Sopenharmony_ci * \param dst Element identifier
538d5ac70f0Sopenharmony_ci * \param ucm_id Use case identifier
539d5ac70f0Sopenharmony_ci * \param value String value to be parsed
540d5ac70f0Sopenharmony_ci * \return Zero if success, otherwise a negative error code
541d5ac70f0Sopenharmony_ci */
542d5ac70f0Sopenharmony_ciint snd_use_case_parse_ctl_elem_id(snd_ctl_elem_id_t *dst,
543d5ac70f0Sopenharmony_ci				   const char *ucm_id,
544d5ac70f0Sopenharmony_ci				   const char *value);
545d5ac70f0Sopenharmony_ci
546d5ac70f0Sopenharmony_ci/**
547d5ac70f0Sopenharmony_ci * \brief Parse mixer element identifier
548d5ac70f0Sopenharmony_ci * \param dst Simple mixer element identifier
549d5ac70f0Sopenharmony_ci * \param ucm_id Use case identifier
550d5ac70f0Sopenharmony_ci * \param value String value to be parsed
551d5ac70f0Sopenharmony_ci * \return Zero if success, otherwise a negative error code
552d5ac70f0Sopenharmony_ci */
553d5ac70f0Sopenharmony_ciint snd_use_case_parse_selem_id(snd_mixer_selem_id_t *dst,
554d5ac70f0Sopenharmony_ci				const char *ucm_id,
555d5ac70f0Sopenharmony_ci				const char *value);
556d5ac70f0Sopenharmony_ci
557d5ac70f0Sopenharmony_ci/**
558d5ac70f0Sopenharmony_ci *  \}
559d5ac70f0Sopenharmony_ci */
560d5ac70f0Sopenharmony_ci
561d5ac70f0Sopenharmony_ci#ifdef __cplusplus
562d5ac70f0Sopenharmony_ci}
563d5ac70f0Sopenharmony_ci#endif
564d5ac70f0Sopenharmony_ci
565d5ac70f0Sopenharmony_ci#endif /* __ALSA_USE_CASE_H */
566