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