Blame include/use-case.h

Packit Service db8eaa
/**
Packit Service db8eaa
 * \file include/use-case.h
Packit Service db8eaa
 * \brief use case interface for the ALSA driver
Packit Service db8eaa
 * \author Liam Girdwood <lrg@slimlogic.co.uk>
Packit Service db8eaa
 * \author Stefan Schmidt <stefan@slimlogic.co.uk>
Packit Service db8eaa
 * \author Jaroslav Kysela <perex@perex.cz>
Packit Service db8eaa
 * \author Justin Xu <justinx@slimlogic.co.uk>
Packit Service db8eaa
 * \date 2008-2010
Packit Service db8eaa
 */
Packit Service db8eaa
/*
Packit Service db8eaa
 *
Packit Service db8eaa
 *  This library is free software; you can redistribute it and/or modify
Packit Service db8eaa
 *  it under the terms of the GNU Lesser General Public License as
Packit Service db8eaa
 *  published by the Free Software Foundation; either version 2.1 of
Packit Service db8eaa
 *  the License, or (at your option) any later version.
Packit Service db8eaa
 *
Packit Service db8eaa
 *  This program is distributed in the hope that it will be useful,
Packit Service db8eaa
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service db8eaa
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service db8eaa
 *  GNU Lesser General Public License for more details.
Packit Service db8eaa
 *
Packit Service db8eaa
 *  You should have received a copy of the GNU Lesser General Public
Packit Service db8eaa
 *  License along with this library; if not, write to the Free Software
Packit Service db8eaa
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
Packit Service db8eaa
 *
Packit Service db8eaa
 *  Copyright (C) 2008-2010 SlimLogic Ltd
Packit Service db8eaa
 *  Copyright (C) 2010 Wolfson Microelectronics PLC
Packit Service db8eaa
 *  Copyright (C) 2010 Texas Instruments Inc.
Packit Service db8eaa
 *
Packit Service db8eaa
 *  Support for the verb/device/modifier core logic and API,
Packit Service db8eaa
 *  command line tool and file parser was kindly sponsored by
Packit Service db8eaa
 *  Texas Instruments Inc.
Packit Service db8eaa
 *  Support for multiple active modifiers and devices,
Packit Service db8eaa
 *  transition sequences, multiple client access and user defined use
Packit Service db8eaa
 *  cases was kindly sponsored by Wolfson Microelectronics PLC.
Packit Service db8eaa
 */
Packit Service db8eaa
Packit Service db8eaa
#ifndef __ALSA_USE_CASE_H
Packit Service db8eaa
#define __ALSA_USE_CASE_H
Packit Service db8eaa
Packit Service db8eaa
#ifdef __cplusplus
Packit Service db8eaa
extern "C" {
Packit Service db8eaa
#endif
Packit Service db8eaa
Packit Service db8eaa
#include <alsa/asoundlib.h>
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 *  \defgroup ucm Use Case Interface
Packit Service db8eaa
 *  The ALSA Use Case manager interface.
Packit Service db8eaa
 *  See \ref Usecase page for more details.
Packit Service db8eaa
 *  \{
Packit Service db8eaa
 */
Packit Service db8eaa
Packit Service db8eaa
/*! \page Usecase ALSA Use Case Interface
Packit Service db8eaa
 *
Packit Service db8eaa
 * The use case manager works by configuring the sound card ALSA kcontrols to
Packit Service db8eaa
 * change the hardware digital and analog audio routing to match the requested
Packit Service db8eaa
 * device use case. The use case manager kcontrol configurations are stored in
Packit Service db8eaa
 * easy to modify text files.
Packit Service db8eaa
 *
Packit Service db8eaa
 * An audio use case can be defined by a verb and device parameter. The verb
Packit Service db8eaa
 * describes the use case action i.e. a phone call, listening to music, recording
Packit Service db8eaa
 * a conversation etc. The device describes the physical audio capture and playback
Packit Service db8eaa
 * hardware i.e. headphones, phone handset, bluetooth headset, etc.
Packit Service db8eaa
 *
Packit Service db8eaa
 * It's intended clients will mostly only need to set the use case verb and
Packit Service db8eaa
 * device for each system use case change (as the verb and device parameters
Packit Service db8eaa
 * cover most audio use cases).
Packit Service db8eaa
 *
Packit Service db8eaa
 * However there are times when a use case has to be modified at runtime. e.g.
Packit Service db8eaa
 *
Packit Service db8eaa
 *  + Incoming phone call when the device is playing music
Packit Service db8eaa
 *  + Recording sections of a phone call
Packit Service db8eaa
 *  + Playing tones during a call.
Packit Service db8eaa
 *
Packit Service db8eaa
 * In order to allow asynchronous runtime use case adaptations, we have a third
Packit Service db8eaa
 * optional modifier parameter that can be used to further configure
Packit Service db8eaa
 * the use case during live audio runtime.
Packit Service db8eaa
 *
Packit Service db8eaa
 * This interface allows clients to :-
Packit Service db8eaa
 *
Packit Service db8eaa
 *  + Query the supported use case verbs, devices and modifiers for the machine.
Packit Service db8eaa
 *  + Set and Get use case verbs, devices and modifiers for the machine.
Packit Service db8eaa
 *  + Get the ALSA PCM playback and capture device PCMs for use case verb,
Packit Service db8eaa
 *     use case device and modifier.
Packit Service db8eaa
 *  + Get the TQ parameter for each use case verb, use case device and
Packit Service db8eaa
 *     modifier.
Packit Service db8eaa
 *  + Get the ALSA master playback and capture volume/switch kcontrols
Packit Service db8eaa
 *     or mixer elements for each use case.
Packit Service db8eaa
 */
Packit Service db8eaa
Packit Service db8eaa
Packit Service db8eaa
/*
Packit Service db8eaa
 * Use Case Verb.
Packit Service db8eaa
 *
Packit Service db8eaa
 * The use case verb is the main device audio action. e.g. the "HiFi" use
Packit Service db8eaa
 * case verb will configure the audio hardware for HiFi Music playback
Packit Service db8eaa
 * and capture.
Packit Service db8eaa
 */
Packit Service db8eaa
#define SND_USE_CASE_VERB_INACTIVE		"Inactive"		/**< Inactive Verb */
Packit Service db8eaa
#define SND_USE_CASE_VERB_HIFI			"HiFi"			/**< HiFi Verb */
Packit Service db8eaa
#define SND_USE_CASE_VERB_HIFI_LOW_POWER	"HiFi Low Power"	/**< HiFi Low Power Verb */
Packit Service db8eaa
#define SND_USE_CASE_VERB_VOICE			"Voice"			/**< Voice Verb */
Packit Service db8eaa
#define SND_USE_CASE_VERB_VOICE_LOW_POWER	"Voice Low Power"	/**< Voice Low Power Verb */
Packit Service db8eaa
#define SND_USE_CASE_VERB_VOICECALL		"Voice Call"		/**< Voice Call Verb */
Packit Service db8eaa
#define SND_USE_CASE_VERB_IP_VOICECALL		"Voice Call IP"		/**< Voice Call IP Verb */
Packit Service db8eaa
#define SND_USE_CASE_VERB_ANALOG_RADIO		"FM Analog Radio"	/**< FM Analog Radio Verb */
Packit Service db8eaa
#define SND_USE_CASE_VERB_DIGITAL_RADIO		"FM Digital Radio"	/**< FM Digital Radio Verb */
Packit Service db8eaa
/* add new verbs to end of list */
Packit Service db8eaa
Packit Service db8eaa
Packit Service db8eaa
/*
Packit Service db8eaa
 * Use Case Device.
Packit Service db8eaa
 *
Packit Service db8eaa
 * Physical system devices the render and capture audio. Devices can be OR'ed
Packit Service db8eaa
 * together to support audio on simultaneous devices.
Packit Service db8eaa
 *
Packit Service db8eaa
 * If multiple devices with the same name exists, the number suffixes should
Packit Service db8eaa
 * be added to these names like HDMI1,HDMI2,HDMI3 etc. No number gaps are
Packit Service db8eaa
 * allowed. The names with numbers must be continuous. It is allowed to put
Packit Service db8eaa
 * a whitespace between name and index (like 'Line 1') for the better
Packit Service db8eaa
 * readability. The device names 'Line 1' and 'Line1' are equal for
Packit Service db8eaa
 * this purpose.
Packit Service db8eaa
 *
Packit Service db8eaa
 * If EnableSequence/DisableSequence controls independent paths in the hardware
Packit Service db8eaa
 * it is also recommended to split playback and capture UCM devices and use
Packit Service db8eaa
 * the number suffixes. Example use case: Use the integrated microphone
Packit Service db8eaa
 * in the laptop instead the microphone in headphones.
Packit Service db8eaa
 *
Packit Service db8eaa
 * The preference of the devices is determined by the priority value.
Packit Service db8eaa
 */
Packit Service db8eaa
#define SND_USE_CASE_DEV_NONE		"None"		/**< None Device */
Packit Service db8eaa
#define SND_USE_CASE_DEV_SPEAKER	"Speaker"	/**< Speaker Device */
Packit Service db8eaa
#define SND_USE_CASE_DEV_LINE		"Line"		/**< Line Device */
Packit Service db8eaa
#define SND_USE_CASE_DEV_MIC            "Mic"           /**< Microphone Device */
Packit Service db8eaa
#define SND_USE_CASE_DEV_HEADPHONES	"Headphones"	/**< Headphones Device */
Packit Service db8eaa
#define SND_USE_CASE_DEV_HEADSET	"Headset"	/**< Headset Device */
Packit Service db8eaa
#define SND_USE_CASE_DEV_HANDSET	"Handset"	/**< Handset Device */
Packit Service db8eaa
#define SND_USE_CASE_DEV_BLUETOOTH	"Bluetooth"	/**< Bluetooth Device */
Packit Service db8eaa
#define SND_USE_CASE_DEV_EARPIECE	"Earpiece"	/**< Earpiece Device */
Packit Service db8eaa
#define SND_USE_CASE_DEV_SPDIF		"SPDIF"		/**< SPDIF Device */
Packit Service db8eaa
#define SND_USE_CASE_DEV_HDMI		"HDMI"		/**< HDMI Device */
Packit Service db8eaa
#define SND_USE_CASE_DEV_USB		"USB"		/**< USB Device (multifunctional) */
Packit Service db8eaa
/* add new devices to end of list */
Packit Service db8eaa
Packit Service db8eaa
Packit Service db8eaa
/*
Packit Service db8eaa
 * Use Case Modifiers.
Packit Service db8eaa
 *
Packit Service db8eaa
 * The use case modifier allows runtime configuration changes to deal with
Packit Service db8eaa
 * asynchronous events.
Packit Service db8eaa
 *
Packit Service db8eaa
 * If multiple modifiers with the same name exists, the number suffixes should
Packit Service db8eaa
 * be added to these names like 'Echo Reference 1','Echo Reference 2' etc.
Packit Service db8eaa
 * No number gaps are allowed. The names with numbers must be continuous.
Packit Service db8eaa
 * It is allowed to put a whitespace between name and index for the better
Packit Service db8eaa
 * readability. The modifier names 'Something 1' and 'Something1' are equal
Packit Service db8eaa
 * for this purpose.
Packit Service db8eaa
 *
Packit Service db8eaa
 * e.g. to record a voice call :-
Packit Service db8eaa
 *  1. Set verb to SND_USE_CASE_VERB_VOICECALL (for voice call)
Packit Service db8eaa
 *  2. Set modifier SND_USE_CASE_MOD_CAPTURE_VOICE when capture required.
Packit Service db8eaa
 *  3. Call snd_use_case_get("CapturePCM") to get ALSA source PCM name
Packit Service db8eaa
 *     with captured voice pcm data.
Packit Service db8eaa
 *
Packit Service db8eaa
 * e.g. to play a ring tone when listenin to MP3 Music :-
Packit Service db8eaa
 *  1. Set verb to SND_USE_CASE_VERB_HIFI (for MP3 playback)
Packit Service db8eaa
 *  2. Set modifier to SND_USE_CASE_MOD_PLAY_TONE when incoming call happens.
Packit Service db8eaa
 *  3. Call snd_use_case_get("PlaybackPCM") to get ALSA PCM sink name for
Packit Service db8eaa
 *     ringtone pcm data.
Packit Service db8eaa
 */
Packit Service db8eaa
#define SND_USE_CASE_MOD_CAPTURE_VOICE		"Capture Voice"		/**< Capture Voice Modifier */
Packit Service db8eaa
#define SND_USE_CASE_MOD_CAPTURE_MUSIC		"Capture Music"		/**< Capture Music Modifier */
Packit Service db8eaa
#define SND_USE_CASE_MOD_PLAY_MUSIC		"Play Music"		/**< Play Music Modifier */
Packit Service db8eaa
#define SND_USE_CASE_MOD_PLAY_VOICE		"Play Voice"		/**< Play Voice Modifier */
Packit Service db8eaa
#define SND_USE_CASE_MOD_PLAY_TONE		"Play Tone"		/**< Play Tone Modifier */
Packit Service db8eaa
#define SND_USE_CASE_MOD_ECHO_REF		"Echo Reference"	/**< Echo Reference Modifier */
Packit Service db8eaa
/* add new modifiers to end of list */
Packit Service db8eaa
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * TQ - Tone Quality
Packit Service db8eaa
 *
Packit Service db8eaa
 * The interface allows clients to determine the audio TQ required for each
Packit Service db8eaa
 * use case verb and modifier. It's intended as an optional hint to the
Packit Service db8eaa
 * audio driver in order to lower power consumption.
Packit Service db8eaa
 *
Packit Service db8eaa
 */
Packit Service db8eaa
#define SND_USE_CASE_TQ_MUSIC		"Music"		/**< Music Tone Quality */
Packit Service db8eaa
#define SND_USE_CASE_TQ_VOICE		"Voice"		/**< Voice Tone Quality */
Packit Service db8eaa
#define SND_USE_CASE_TQ_TONES		"Tones"		/**< Tones Tone Quality */
Packit Service db8eaa
Packit Service db8eaa
/** use case container */
Packit Service db8eaa
typedef struct snd_use_case_mgr snd_use_case_mgr_t;
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief Create an identifier
Packit Service db8eaa
 * \param fmt Format (sprintf like)
Packit Service db8eaa
 * \param ... Optional arguments for sprintf like format
Packit Service db8eaa
 * \return Allocated string identifier or NULL on error
Packit Service db8eaa
 */
Packit Service db8eaa
char *snd_use_case_identifier(const char *fmt, ...);
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief Free a string list
Packit Service db8eaa
 * \param list The string list to free
Packit Service db8eaa
 * \param items Count of strings
Packit Service db8eaa
 * \return Zero if success, otherwise a negative error code
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_use_case_free_list(const char *list[], int items);
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief Obtain a list of entries
Packit Service db8eaa
 * \param uc_mgr Use case manager (may be NULL - card list)
Packit Service db8eaa
 * \param identifier (may be NULL - card list)
Packit Service db8eaa
 * \param list Returned allocated list
Packit Service db8eaa
 * \return Number of list entries if success, otherwise a negative error code
Packit Service db8eaa
 *
Packit Service db8eaa
 * Defined identifiers:
Packit Service db8eaa
 *   - NULL			- get card list
Packit Service db8eaa
 *				 (in pair cardname+comment)
Packit Service db8eaa
 *   - _verbs			- get verb list
Packit Service db8eaa
 *				  (in pair verb+comment)
Packit Service db8eaa
 *   - _devices[/{verb}]	- get list of supported devices
Packit Service db8eaa
 *				  (in pair device+comment)
Packit Service db8eaa
 *   - _modifiers[/{verb}]	- get list of supported modifiers
Packit Service db8eaa
 *				  (in pair modifier+comment)
Packit Service db8eaa
 *   - TQ[/{verb}]		- get list of TQ identifiers
Packit Service db8eaa
 *   - _enadevs			- get list of enabled devices
Packit Service db8eaa
 *   - _enamods			- get list of enabled modifiers
Packit Service db8eaa
 *
Packit Service db8eaa
 *   - _identifiers/{modifier}|{device}[/{verb}]     - list of value identifiers
Packit Service db8eaa
 *   - _supporteddevs/{modifier}|{device}[/{verb}]   - list of supported devices
Packit Service db8eaa
 *   - _conflictingdevs/{modifier}|{device}[/{verb}] - list of conflicting devices
Packit Service db8eaa
 *
Packit Service db8eaa
 *   Note that at most one of the supported/conflicting devs lists has
Packit Service db8eaa
 *   any entries, and when neither is present, all devices are supported.
Packit Service db8eaa
 *
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
Packit Service db8eaa
                          const char *identifier,
Packit Service db8eaa
                          const char **list[]);
Packit Service db8eaa
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief Get current - string
Packit Service db8eaa
 * \param uc_mgr Use case manager
Packit Service db8eaa
 * \param identifier 
Packit Service db8eaa
 * \param value Value pointer
Packit Service db8eaa
 * \return Zero if success, otherwise a negative error code
Packit Service db8eaa
 *
Packit Service db8eaa
 * Note: The returned string is dynamically allocated, use free() to
Packit Service db8eaa
 * deallocate this string. (Yes, the value parameter shouldn't be marked as
Packit Service db8eaa
 * "const", but it's too late to fix it, sorry about that.)
Packit Service db8eaa
 *
Packit Service db8eaa
 * Known identifiers:
Packit Service db8eaa
 *   - NULL 		- return current card
Packit Service db8eaa
 *   - _verb		- return current verb
Packit Service db8eaa
 *   - _file		- return configuration file loaded for current card
Packit Service db8eaa
 *
Packit Service db8eaa
 *   - [=]{NAME}[/[{modifier}|{/device}][/{verb}]]
Packit Service db8eaa
 *                      - value identifier {NAME}
Packit Service db8eaa
 *                      - Search starts at given modifier or device if any,
Packit Service db8eaa
 *                          else at a verb
Packit Service db8eaa
 *                      - Search starts at given verb if any,
Packit Service db8eaa
 *                          else current verb
Packit Service db8eaa
 *                      - Searches modifier/device, then verb, then defaults
Packit Service db8eaa
 *                      - Specify a leading "=" to search only the exact
Packit Service db8eaa
 *                        device/modifier/verb specified, and not search
Packit Service db8eaa
 *                        through each object in turn.
Packit Service db8eaa
 *                      - Examples:
Packit Service db8eaa
 *                          - "PlaybackPCM/Play Music"
Packit Service db8eaa
 *                          - "CapturePCM/SPDIF"
Packit Service db8eaa
 *                          - From ValueDefaults only:
Packit Service db8eaa
 *                              "=Variable"
Packit Service db8eaa
 *                          - From current active verb:
Packit Service db8eaa
 *                              "=Variable//"
Packit Service db8eaa
 *                          - From verb "Verb":
Packit Service db8eaa
 *                              "=Variable//Verb"
Packit Service db8eaa
 *                          - From "Modifier" in current active verb:
Packit Service db8eaa
 *                              "=Variable/Modifier/"
Packit Service db8eaa
 *                          - From "Modifier" in "Verb":
Packit Service db8eaa
 *                              "=Variable/Modifier/Verb"
Packit Service db8eaa
 *
Packit Service db8eaa
 * Recommended names for values:
Packit Service db8eaa
 *   - Linked
Packit Service db8eaa
 *      - value "True" or "1" (case insensitive)
Packit Service db8eaa
 *      - this is a linked UCM card
Packit Service db8eaa
 *      - don't use this UCM card, because the other UCM card refers devices
Packit Service db8eaa
 *      - valid only in the ValueDefaults section (query '=Linked')
Packit Service db8eaa
 *   - TQ
Packit Service db8eaa
 *      - Tone Quality
Packit Service db8eaa
 *   - Priority
Packit Service db8eaa
 *      - priority value (1-10000), higher value means higher priority
Packit Service db8eaa
 *      - valid only for verbs
Packit Service db8eaa
 *      - for devices - PlaybackPriority and CapturePriority
Packit Service db8eaa
 *   - PlaybackPCM
Packit Service db8eaa
 *      - full PCM playback device name
Packit Service db8eaa
 *   - PlaybackPCMIsDummy
Packit Service db8eaa
 *      - Valid values: "yes" and "no". If set to "yes", the PCM named by the
Packit Service db8eaa
 *        PlaybackPCM value is a dummy device, meaning that opening it enables
Packit Service db8eaa
 *        an audio path in the hardware, but writing to the PCM device has no
Packit Service db8eaa
 *        effect.
Packit Service db8eaa
 *   - CapturePCM
Packit Service db8eaa
 *      - full PCM capture device name
Packit Service db8eaa
 *   - CapturePCMIsDummy
Packit Service db8eaa
 *      - Valid values: "yes" and "no". If set to "yes", the PCM named by the
Packit Service db8eaa
 *        CapturePCM value is a dummy device, meaning that opening it enables
Packit Service db8eaa
 *        an audio path in the hardware, but reading from the PCM device has no
Packit Service db8eaa
 *        effect.
Packit Service db8eaa
 *   - PlaybackRate
Packit Service db8eaa
 *      - playback device sample rate
Packit Service db8eaa
 *   - PlaybackChannels
Packit Service db8eaa
 *      - playback device channel count
Packit Service db8eaa
 *   - PlaybackCTL
Packit Service db8eaa
 *      - playback control device name
Packit Service db8eaa
 *   - PlaybackVolume
Packit Service db8eaa
 *      - playback control volume identifier string
Packit Service db8eaa
 *	- can be parsed using snd_use_case_parse_ctl_elem_id()
Packit Service db8eaa
 *   - PlaybackSwitch
Packit Service db8eaa
 *      - playback control switch identifier string
Packit Service db8eaa
 *	- can be parsed using snd_use_case_parse_ctl_elem_id()
Packit Service db8eaa
 *   - PlaybackPriority
Packit Service db8eaa
 *      - priority value (1-10000), higher value means higher priority
Packit Service db8eaa
 *   - CaptureRate
Packit Service db8eaa
 *      - capture device sample rate
Packit Service db8eaa
 *   - CaptureChannels
Packit Service db8eaa
 *      - capture device channel count
Packit Service db8eaa
 *   - CaptureCTL
Packit Service db8eaa
 *      - capture control device name
Packit Service db8eaa
 *   - CaptureVolume
Packit Service db8eaa
 *      - capture control volume identifier string
Packit Service db8eaa
 *	- can be parsed using snd_use_case_parse_ctl_elem_id()
Packit Service db8eaa
 *   - CaptureSwitch
Packit Service db8eaa
 *      - capture control switch identifier string
Packit Service db8eaa
 *	- can be parsed using snd_use_case_parse_ctl_elem_id()
Packit Service db8eaa
 *   - CapturePriority
Packit Service db8eaa
 *      - priority value (1-10000), higher value means higher priority
Packit Service db8eaa
 *   - PlaybackMixer
Packit Service db8eaa
 *      - name of playback mixer
Packit Service db8eaa
 *   - PlaybackMixerElem
Packit Service db8eaa
 *      - mixer element playback identifier
Packit Service db8eaa
 *	- can be parsed using snd_use_case_parse_selem_id()
Packit Service db8eaa
 *   - PlaybackMasterElem
Packit Service db8eaa
 *      - mixer element playback identifier for the master control
Packit Service db8eaa
 *	- can be parsed using snd_use_case_parse_selem_id()
Packit Service db8eaa
 *   - PlaybackMasterType
Packit Service db8eaa
 *      - type of the master volume control
Packit Service db8eaa
 *      - Valid values: "soft" (software attenuation)
Packit Service db8eaa
 *   - CaptureMixer
Packit Service db8eaa
 *      - name of capture mixer
Packit Service db8eaa
 *   - CaptureMixerElem
Packit Service db8eaa
 *      - mixer element capture identifier
Packit Service db8eaa
 *	- can be parsed using snd_use_case_parse_selem_id()
Packit Service db8eaa
 *   - CaptureMasterElem
Packit Service db8eaa
 *      - mixer element playback identifier for the master control
Packit Service db8eaa
 *	- can be parsed using snd_use_case_parse_selem_id()
Packit Service db8eaa
 *   - CaptureMasterType
Packit Service db8eaa
 *      - type of the master volume control
Packit Service db8eaa
 *      - Valid values: "soft" (software attenuation)
Packit Service db8eaa
 *   - EDIDFile
Packit Service db8eaa
 *      - Path to EDID file for HDMI devices
Packit Service db8eaa
 *   - JackCTL
Packit Service db8eaa
 *      - jack control device name
Packit Service db8eaa
 *   - JackControl
Packit Service db8eaa
 *      - jack control identificator
Packit Service db8eaa
 *      - can be parsed using snd_use_case_parse_ctl_elem_id()
Packit Service db8eaa
 *      - UCM configuration files should contain both JackControl and JackDev
Packit Service db8eaa
 *        when possible, because applications are likely to support only one
Packit Service db8eaa
 *        or the other
Packit Service db8eaa
 *   - JackDev
Packit Service db8eaa
 *      - the input device id of the jack (if the full input device path is
Packit Service db8eaa
 *        /dev/input/by-id/foo, the JackDev value should be "foo")
Packit Service db8eaa
 *      - UCM configuration files should contain both JackControl and JackDev
Packit Service db8eaa
 *        when possible, because applications are likely to support only one
Packit Service db8eaa
 *        or the other
Packit Service db8eaa
 *   - JackHWMute
Packit Service db8eaa
 *	  If this value is set, it indicates that when the jack is plugged
Packit Service db8eaa
 *	  in, the hardware automatically mutes some other device(s). The
Packit Service db8eaa
 *	  value is a space-separated list of device names. If the device
Packit Service db8eaa
 *	  name contains space, it must be enclosed to ' or ", e.g.:
Packit Service db8eaa
 *		JackHWMute "'Dock Headphone' Headphone"
Packit Service db8eaa
 *        Note that JackHWMute should be used only when the hardware enforces
Packit Service db8eaa
 *        the automatic muting. If the hardware doesn't enforce any muting, it
Packit Service db8eaa
 *        may still be tempting to set JackHWMute to trick upper software layers
Packit Service db8eaa
 *        to e.g. automatically mute speakers when headphones are plugged in,
Packit Service db8eaa
 *        but that's application policy configuration that doesn't belong
Packit Service db8eaa
 *        to UCM configuration files.
Packit Service db8eaa
 *   - MinBufferLevel
Packit Service db8eaa
 *	- This is used on platform where reported buffer level is not accurate.
Packit Service db8eaa
 *	  E.g. "512", which holds 512 samples in device buffer. Note: this will
Packit Service db8eaa
 *	  increase latency.
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_use_case_get(snd_use_case_mgr_t *uc_mgr,
Packit Service db8eaa
                     const char *identifier,
Packit Service db8eaa
                     const char **value);
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief Get current - integer
Packit Service db8eaa
 * \param uc_mgr Use case manager
Packit Service db8eaa
 * \param identifier 
Packit Service db8eaa
 * \param value result 
Packit Service db8eaa
 * \return Zero if success, otherwise a negative error code
Packit Service db8eaa
 *
Packit Service db8eaa
 * Known identifiers:
Packit Service db8eaa
 *   - _devstatus/{device}	- return status for given device
Packit Service db8eaa
 *   - _modstatus/{modifier}	- return status for given modifier
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_use_case_geti(snd_use_case_mgr_t *uc_mgr,
Packit Service db8eaa
		      const char *identifier,
Packit Service db8eaa
		      long *value);
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief Set new
Packit Service db8eaa
 * \param uc_mgr Use case manager
Packit Service db8eaa
 * \param identifier
Packit Service db8eaa
 * \param value Value
Packit Service db8eaa
 * \return Zero if success, otherwise a negative error code
Packit Service db8eaa
 *
Packit Service db8eaa
 * Known identifiers:
Packit Service db8eaa
 *   - _boot			- execute the boot sequence (value = NULL)
Packit Service db8eaa
 *   - _defaults		- execute the 'defaults' sequence (value = NULL)
Packit Service db8eaa
 *   - _verb			- set current verb = value
Packit Service db8eaa
 *   - _enadev			- enable given device = value
Packit Service db8eaa
 *   - _disdev			- disable given device = value
Packit Service db8eaa
 *   - _swdev/{old_device}	- new_device = value
Packit Service db8eaa
 *				  - disable old_device and then enable new_device
Packit Service db8eaa
 *				  - if old_device is not enabled just return
Packit Service db8eaa
 *				  - check transmit sequence firstly
Packit Service db8eaa
 *   - _enamod			- enable given modifier = value
Packit Service db8eaa
 *   - _dismod			- disable given modifier = value
Packit Service db8eaa
 *   - _swmod/{old_modifier}	- new_modifier = value
Packit Service db8eaa
 *				  - disable old_modifier and then enable new_modifier
Packit Service db8eaa
 *				  - if old_modifier is not enabled just return
Packit Service db8eaa
 *				  - check transmit sequence firstly
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_use_case_set(snd_use_case_mgr_t *uc_mgr,
Packit Service db8eaa
                     const char *identifier,
Packit Service db8eaa
                     const char *value);
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief Open and initialise use case core for sound card
Packit Service db8eaa
 * \param uc_mgr Returned use case manager pointer
Packit Service db8eaa
 * \param card_name Sound card name.
Packit Service db8eaa
 * \return zero if success, otherwise a negative error code
Packit Service db8eaa
 *
Packit Service db8eaa
 * By default only first card is used when the driver card
Packit Service db8eaa
 * name or long name is passed in the card_name argument.
Packit Service db8eaa
 *
Packit Service db8eaa
 * The "strict:" prefix in the card_name defines that
Packit Service db8eaa
 * there is no driver name / long name matching. The straight
Packit Service db8eaa
 * configuration is used.
Packit Service db8eaa
 *
Packit Service db8eaa
 * The "hw:" prefix in the card_name will load the configuration
Packit Service db8eaa
 * for the ALSA card specified by the card index (value) or
Packit Service db8eaa
 * the card string identificator.
Packit Service db8eaa
 *
Packit Service db8eaa
 * The sound card might be also composed from several physical
Packit Service db8eaa
 * sound cards (for the default and strict card_name).
Packit Service db8eaa
 * The application cannot expect that the device names will refer
Packit Service db8eaa
 * only one ALSA sound card in this case.
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_use_case_mgr_open(snd_use_case_mgr_t **uc_mgr,
Packit Service db8eaa
                          const char *card_name);
Packit Service db8eaa
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief Reload and re-parse use case configuration files for sound card.
Packit Service db8eaa
 * \param uc_mgr Use case manager
Packit Service db8eaa
 * \return zero if success, otherwise a negative error code
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_use_case_mgr_reload(snd_use_case_mgr_t *uc_mgr);
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief Close use case manager
Packit Service db8eaa
 * \param uc_mgr Use case manager
Packit Service db8eaa
 * \return zero if success, otherwise a negative error code
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_use_case_mgr_close(snd_use_case_mgr_t *uc_mgr);
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief Reset use case manager verb, device, modifier to deafult settings.
Packit Service db8eaa
 * \param uc_mgr Use case manager
Packit Service db8eaa
 * \return zero if success, otherwise a negative error code
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_use_case_mgr_reset(snd_use_case_mgr_t *uc_mgr);
Packit Service db8eaa
Packit Service db8eaa
/*
Packit Service db8eaa
 * helper functions
Packit Service db8eaa
 */
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief Obtain a list of cards
Packit Service db8eaa
 * \param list Returned allocated list
Packit Service db8eaa
 * \return Number of list entries if success, otherwise a negative error code
Packit Service db8eaa
 */
Packit Service db8eaa
static __inline__ int snd_use_case_card_list(const char **list[])
Packit Service db8eaa
{
Packit Service db8eaa
	return snd_use_case_get_list(NULL, NULL, list);
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief Obtain a list of verbs
Packit Service db8eaa
 * \param uc_mgr Use case manager
Packit Service db8eaa
 * \param list Returned list of verbs
Packit Service db8eaa
 * \return Number of list entries if success, otherwise a negative error code
Packit Service db8eaa
 */
Packit Service db8eaa
static __inline__ int snd_use_case_verb_list(snd_use_case_mgr_t *uc_mgr,
Packit Service db8eaa
					 const char **list[])
Packit Service db8eaa
{
Packit Service db8eaa
	return snd_use_case_get_list(uc_mgr, "_verbs", list);
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief Parse control element identifier
Packit Service db8eaa
 * \param elem_id Element identifier
Packit Service db8eaa
 * \param ucm_id Use case identifier
Packit Service db8eaa
 * \param value String value to be parsed
Packit Service db8eaa
 * \return Zero if success, otherwise a negative error code
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_use_case_parse_ctl_elem_id(snd_ctl_elem_id_t *dst,
Packit Service db8eaa
				   const char *ucm_id,
Packit Service db8eaa
				   const char *value);
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 * \brief Parse mixer element identifier
Packit Service db8eaa
 * \param dst Simple mixer element identifier
Packit Service db8eaa
 * \param ucm_id Use case identifier
Packit Service db8eaa
 * \param value String value to be parsed
Packit Service db8eaa
 * \return Zero if success, otherwise a negative error code
Packit Service db8eaa
 */
Packit Service db8eaa
int snd_use_case_parse_selem_id(snd_mixer_selem_id_t *dst,
Packit Service db8eaa
				const char *ucm_id,
Packit Service db8eaa
				const char *value);
Packit Service db8eaa
Packit Service db8eaa
/**
Packit Service db8eaa
 *  \}
Packit Service db8eaa
 */
Packit Service db8eaa
Packit Service db8eaa
#ifdef __cplusplus
Packit Service db8eaa
}
Packit Service db8eaa
#endif
Packit Service db8eaa
Packit Service db8eaa
#endif /* __ALSA_USE_CASE_H */