| /** |
| * \file include/use-case.h |
| * \brief use case interface for the ALSA driver |
| * \author Liam Girdwood <lrg@slimlogic.co.uk> |
| * \author Stefan Schmidt <stefan@slimlogic.co.uk> |
| * \author Jaroslav Kysela <perex@perex.cz> |
| * \author Justin Xu <justinx@slimlogic.co.uk> |
| * \date 2008-2010 |
| */ |
| /* |
| * |
| * This library is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU Lesser General Public License as |
| * published by the Free Software Foundation; either version 2.1 of |
| * the License, or (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| * |
| * Copyright (C) 2008-2010 SlimLogic Ltd |
| * Copyright (C) 2010 Wolfson Microelectronics PLC |
| * Copyright (C) 2010 Texas Instruments Inc. |
| * |
| * Support for the verb/device/modifier core logic and API, |
| * command line tool and file parser was kindly sponsored by |
| * Texas Instruments Inc. |
| * Support for multiple active modifiers and devices, |
| * transition sequences, multiple client access and user defined use |
| * cases was kindly sponsored by Wolfson Microelectronics PLC. |
| */ |
| |
| #ifndef __ALSA_USE_CASE_H |
| #define __ALSA_USE_CASE_H |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /** |
| * \defgroup Use Case Interface |
| * The ALSA Use Case manager interface. |
| * See \ref Usecase page for more details. |
| * \{ |
| */ |
| |
| /*! \page Usecase ALSA Use Case Interface |
| * |
| * ALSA Use Case Interface |
| * |
| * The use case manager works by configuring the sound card ALSA kcontrols to |
| * change the hardware digital and analog audio routing to match the requested |
| * device use case. The use case manager kcontrol configurations are stored in |
| * easy to modify text files. |
| * |
| * An audio use case can be defined by a verb and device parameter. The verb |
| * describes the use case action i.e. a phone call, listening to music, recording |
| * a conversation etc. The device describes the physical audio capture and playback |
| * hardware i.e. headphones, phone handset, bluetooth headset, etc. |
| * |
| * It's intended clients will mostly only need to set the use case verb and |
| * device for each system use case change (as the verb and device parameters |
| * cover most audio use cases). |
| * |
| * However there are times when a use case has to be modified at runtime. e.g. |
| * |
| * o Incoming phone call when the device is playing music |
| * o Recording sections of a phone call |
| * o Playing tones during a call. |
| * |
| * In order to allow asynchronous runtime use case adaptations, we have a third |
| * optional modifier parameter that can be used to further configure |
| * the use case during live audio runtime. |
| * |
| * This interface allows clients to :- |
| * |
| * o Query the supported use case verbs, devices and modifiers for the machine. |
| * o Set and Get use case verbs, devices and modifiers for the machine. |
| * o Get the ALSA PCM playback and capture device PCMs for use case verb, |
| * use case device and modifier. |
| * o Get the TQ parameter for each use case verb, use case device and |
| * modifier. |
| * o Get the ALSA master playback and capture volume/switch kcontrols |
| * for each use case. |
| */ |
| |
| |
| /* |
| * Use Case Verb. |
| * |
| * The use case verb is the main device audio action. e.g. the "HiFi" use |
| * case verb will configure the audio hardware for HiFi Music playback |
| * and capture. |
| */ |
| #define SND_USE_CASE_VERB_INACTIVE "Inactive" /**< Inactive Verb */ |
| #define SND_USE_CASE_VERB_HIFI "HiFi" /**< HiFi Verb */ |
| #define SND_USE_CASE_VERB_HIFI_LOW_POWER "HiFi Low Power" /**< HiFi Low Power Verb */ |
| #define SND_USE_CASE_VERB_VOICE "Voice" /**< Voice Verb */ |
| #define SND_USE_CASE_VERB_VOICE_LOW_POWER "Voice Low Power" /**< Voice Low Power Verb */ |
| #define SND_USE_CASE_VERB_VOICECALL "Voice Call" /**< Voice Call Verb */ |
| #define SND_USE_CASE_VERB_IP_VOICECALL "Voice Call IP" /**< Voice Call IP Verb */ |
| #define SND_USE_CASE_VERB_ANALOG_RADIO "FM Analog Radio" /**< FM Analog Radio Verb */ |
| #define SND_USE_CASE_VERB_DIGITAL_RADIO "FM Digital Radio" /**< FM Digital Radio Verb */ |
| /* add new verbs to end of list */ |
| |
| |
| /* |
| * Use Case Device. |
| * |
| * Physical system devices the render and capture audio. Devices can be OR'ed |
| * together to support audio on simultaneous devices. |
| */ |
| #define SND_USE_CASE_DEV_NONE "None" /**< None Device */ |
| #define SND_USE_CASE_DEV_SPEAKER "Speaker" /**< Speaker Device */ |
| #define SND_USE_CASE_DEV_LINE "Line" /**< Line Device */ |
| #define SND_USE_CASE_DEV_HEADPHONES "Headphones" /**< Headphones Device */ |
| #define SND_USE_CASE_DEV_HEADSET "Headset" /**< Headset Device */ |
| #define SND_USE_CASE_DEV_HANDSET "Handset" /**< Handset Device */ |
| #define SND_USE_CASE_DEV_BLUETOOTH "Bluetooth" /**< Bluetooth Device */ |
| #define SND_USE_CASE_DEV_EARPIECE "Earpiece" /**< Earpiece Device */ |
| #define SND_USE_CASE_DEV_SPDIF "SPDIF" /**< SPDIF Device */ |
| #define SND_USE_CASE_DEV_HDMI "HDMI" /**< HDMI Device */ |
| /* add new devices to end of list */ |
| |
| |
| /* |
| * Use Case Modifiers. |
| * |
| * The use case modifier allows runtime configuration changes to deal with |
| * asynchronous events. |
| * |
| * e.g. to record a voice call :- |
| * 1. Set verb to SND_USE_CASE_VERB_VOICECALL (for voice call) |
| * 2. Set modifier SND_USE_CASE_MOD_CAPTURE_VOICE when capture required. |
| * 3. Call snd_use_case_get("CapturePCM") to get ALSA source PCM name |
| * with captured voice pcm data. |
| * |
| * e.g. to play a ring tone when listenin to MP3 Music :- |
| * 1. Set verb to SND_USE_CASE_VERB_HIFI (for MP3 playback) |
| * 2. Set modifier to SND_USE_CASE_MOD_PLAY_TONE when incoming call happens. |
| * 3. Call snd_use_case_get("PlaybackPCM") to get ALSA PCM sink name for |
| * ringtone pcm data. |
| */ |
| #define SND_USE_CASE_MOD_CAPTURE_VOICE "Capture Voice" /**< Capture Voice Modifier */ |
| #define SND_USE_CASE_MOD_CAPTURE_MUSIC "Capture Music" /**< Capture Music Modifier */ |
| #define SND_USE_CASE_MOD_PLAY_MUSIC "Play Music" /**< Play Music Modifier */ |
| #define SND_USE_CASE_MOD_PLAY_VOICE "Play Voice" /**< Play Voice Modifier */ |
| #define SND_USE_CASE_MOD_PLAY_TONE "Play Tone" /**< Play Tone Modifier */ |
| #define SND_USE_CASE_MOD_ECHO_REF "Echo Reference" /**< Echo Reference Modifier */ |
| /* add new modifiers to end of list */ |
| |
| |
| /** |
| * TQ - Tone Quality |
| * |
| * The interface allows clients to determine the audio TQ required for each |
| * use case verb and modifier. It's intended as an optional hint to the |
| * audio driver in order to lower power consumption. |
| * |
| */ |
| #define SND_USE_CASE_TQ_MUSIC "Music" /**< Music Tone Quality */ |
| #define SND_USE_CASE_TQ_VOICE "Voice" /**< Voice Tone Quality */ |
| #define SND_USE_CASE_TQ_TONES "Tones" /**< Tones Tone Quality */ |
| |
| /** use case container */ |
| typedef struct snd_use_case_mgr snd_use_case_mgr_t; |
| |
| /** |
| * \brief Create an identifier |
| * \param fmt Format (sprintf like) |
| * \param ... Optional arguments for sprintf like format |
| * \return Allocated string identifier or NULL on error |
| */ |
| char *snd_use_case_identifier(const char *fmt, ...); |
| |
| /** |
| * \brief Free a string list |
| * \param list The string list to free |
| * \param items Count of strings |
| * \return Zero if success, otherwise a negative error code |
| */ |
| int snd_use_case_free_list(const char *list[], int items); |
| |
| /** |
| * \brief Obtain a list of entries |
| * \param uc_mgr Use case manager (may be NULL - card list) |
| * \param identifier (may be NULL - card list) |
| * \param list Returned allocated list |
| * \return Number of list entries if success, otherwise a negative error code |
| * |
| * Defined identifiers: |
| * NULL - get card list |
| * (in pair cardname+comment) |
| * _verbs - get verb list |
| * (in pair verb+comment) |
| * _devices[/{verb}] - get list of supported devices |
| * (in pair device+comment) |
| * _modifiers[/{verb}]- get list of supported modifiers |
| * (in pair modifier+comment) |
| * TQ[/{verb}] - get list of TQ identifiers |
| * _enadevs - get list of enabled devices |
| * _enamods - get list of enabled modifiers |
| * |
| * _supporteddevs/{modifier}|{device}[/{verb}] - list of supported devices |
| * _conflictingdevs/{modifier}|{device}[/{verb}] - list of conflicting devices |
| * Note that at most one of the supported/conflicting devs lists has |
| * any entries, and when neither is present, all devices are supported. |
| * |
| */ |
| int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr, |
| const char *identifier, |
| const char **list[]); |
| |
| |
| /** |
| * \brief Get current - string |
| * \param uc_mgr Use case manager |
| * \param identifier |
| * \param value Value pointer |
| * \return Zero if success, otherwise a negative error code |
| * |
| * Note: The returned string is dynamically allocated, use free() to |
| * deallocate this string. (Yes, the value parameter shouldn't be marked as |
| * "const", but it's too late to fix it, sorry about that.) |
| * |
| * Known identifiers: |
| * NULL - return current card |
| * _verb - return current verb |
| * |
| * [=]{NAME}[/[{modifier}|{/device}][/{verb}]] |
| * - value identifier {NAME} |
| * - Search starts at given modifier or device if any, |
| * else at a verb |
| * - Search starts at given verb if any, |
| * else current verb |
| * - Searches modifier/device, then verb, then defaults |
| * - Specify a leading "=" to search only the exact |
| * device/modifier/verb specified, and not search |
| * through each object in turn. |
| * - Examples: |
| * "PlaybackPCM/Play Music" |
| * "CapturePCM/SPDIF" |
| * From ValueDefaults only: |
| * "=Variable" |
| * From current active verb: |
| * "=Variable//" |
| * From verb "Verb": |
| * "=Variable//Verb" |
| * From "Modifier" in current active verb: |
| * "=Variable/Modifier/" |
| * From "Modifier" in "Verb": |
| * "=Variable/Modifier/Verb" |
| * |
| * Recommended names for values: |
| * TQ - Tone Quality |
| * PlaybackPCM - full PCM playback device name |
| * PlaybackPCMIsDummy - Valid values: "yes" and "no". If set to "yes", the |
| * PCM named by the PlaybackPCM value is a dummy device, |
| * meaning that opening it enables an audio path in the |
| * hardware, but writing to the PCM device has no |
| * effect. |
| * CapturePCM - full PCM capture device name |
| * CapturePCMIsDummy - Valid values: "yes" and "no". If set to "yes", the |
| * PCM named by the CapturePCM value is a dummy device, |
| * meaning that opening it enables an audio path in the |
| * hardware, but reading from the PCM device has no |
| * effect. |
| * PlaybackRate - playback device sample rate |
| * PlaybackChannels - playback device channel count |
| * PlaybackCTL - playback control device name |
| * PlaybackVolume - playback control volume ID string |
| * PlaybackSwitch - playback control switch ID string |
| * CaptureRate - capture device sample rate |
| * CaptureChannels - capture device channel count |
| * CaptureCTL - capture control device name |
| * CaptureVolume - capture control volume ID string |
| * CaptureSwitch - capture control switch ID string |
| * PlaybackMixer - name of playback mixer |
| * PlaybackMixerID - mixer playback ID |
| * CaptureMixer - name of capture mixer |
| * CaptureMixerID - mixer capture ID |
| */ |
| int snd_use_case_get(snd_use_case_mgr_t *uc_mgr, |
| const char *identifier, |
| const char **value); |
| |
| /** |
| * \brief Get current - integer |
| * \param uc_mgr Use case manager |
| * \param identifier |
| * \param value result |
| * \return Zero if success, otherwise a negative error code |
| * |
| * Known identifiers: |
| * _devstatus/{device} - return status for given device |
| * _modstatus/{modifier} - return status for given modifier |
| */ |
| int snd_use_case_geti(snd_use_case_mgr_t *uc_mgr, |
| const char *identifier, |
| long *value); |
| |
| /** |
| * \brief Set new |
| * \param uc_mgr Use case manager |
| * \param identifier |
| * \param value Value |
| * \return Zero if success, otherwise a negative error code |
| * |
| * Known identifiers: |
| * _verb - set current verb = value |
| * _enadev - enable given device = value |
| * _disdev - disable given device = value |
| * _swdev/{old_device} - new_device = value |
| * - disable old_device and then enable new_device |
| * - if old_device is not enabled just return |
| * - check transmit sequence firstly |
| * _enamod - enable given modifier = value |
| * _dismod - disable given modifier = value |
| * _swmod/{old_modifier} - new_modifier = value |
| * - disable old_modifier and then enable new_modifier |
| * - if old_modifier is not enabled just return |
| * - check transmit sequence firstly |
| */ |
| int snd_use_case_set(snd_use_case_mgr_t *uc_mgr, |
| const char *identifier, |
| const char *value); |
| |
| /** |
| * \brief Open and initialise use case core for sound card |
| * \param uc_mgr Returned use case manager pointer |
| * \param card_name Sound card name. |
| * \return zero if success, otherwise a negative error code |
| */ |
| int snd_use_case_mgr_open(snd_use_case_mgr_t **uc_mgr, const char *card_name); |
| |
| |
| /** |
| * \brief Reload and re-parse use case configuration files for sound card. |
| * \param uc_mgr Use case manager |
| * \return zero if success, otherwise a negative error code |
| */ |
| int snd_use_case_mgr_reload(snd_use_case_mgr_t *uc_mgr); |
| |
| /** |
| * \brief Close use case manager |
| * \param uc_mgr Use case manager |
| * \return zero if success, otherwise a negative error code |
| */ |
| int snd_use_case_mgr_close(snd_use_case_mgr_t *uc_mgr); |
| |
| /** |
| * \brief Reset use case manager verb, device, modifier to deafult settings. |
| * \param uc_mgr Use case manager |
| * \return zero if success, otherwise a negative error code |
| */ |
| int snd_use_case_mgr_reset(snd_use_case_mgr_t *uc_mgr); |
| |
| /* |
| * helper functions |
| */ |
| |
| /** |
| * \brief Obtain a list of cards |
| * \param list Returned allocated list |
| * \return Number of list entries if success, otherwise a negative error code |
| */ |
| static __inline__ int snd_use_case_card_list(const char **list[]) |
| { |
| return snd_use_case_get_list(NULL, NULL, list); |
| } |
| |
| /** |
| * \brief Obtain a list of verbs |
| * \param uc_mgr Use case manager |
| * \param list Returned list of verbs |
| * \return Number of list entries if success, otherwise a negative error code |
| */ |
| static __inline__ int snd_use_case_verb_list(snd_use_case_mgr_t *uc_mgr, |
| const char **list[]) |
| { |
| return snd_use_case_get_list(uc_mgr, "_verbs", list); |
| } |
| |
| /** |
| * \} |
| */ |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* __ALSA_USE_CASE_H */ |