123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431 |
- /**
- * \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 ucm Use Case Interface
- * The ALSA Use Case manager interface.
- * See \ref Usecase page for more details.
- * \{
- */
- /*! \page Usecase 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.
- *
- * + Incoming phone call when the device is playing music
- * + Recording sections of a phone call
- * + 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 :-
- *
- * + Query the supported use case verbs, devices and modifiers for the machine.
- * + Set and Get use case verbs, devices and modifiers for the machine.
- * + Get the ALSA PCM playback and capture device PCMs for use case verb,
- * use case device and modifier.
- * + Get the TQ parameter for each use case verb, use case device and
- * modifier.
- * + 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
- * - JackControl, JackDev, JackHWMute
- * - Jack information for a device. The jack status can be reported via
- * a kcontrol and/or via an input device. **JackControl** is the
- * kcontrol name of the jack, and **JackDev** is the input device id of
- * the jack (if the full input device path is /dev/input/by-id/foo, the
- * JackDev value should be "foo"). UCM configuration files should
- * contain both JackControl and JackDev when possible, because
- * applications are likely to support only one or the other.
- *
- * If **JackHWMute** is set, it indicates that when the jack is plugged
- * in, the hardware automatically mutes some other device(s). The
- * JackHWMute value is a space-separated list of device names (this
- * isn't compatible with device names with spaces in them, so don't use
- * such device names!). Note that JackHWMute should be used only when
- * the hardware enforces the automatic muting. If the hardware doesn't
- * enforce any muting, it may still be tempting to set JackHWMute to
- * trick upper software layers to e.g. automatically mute speakers when
- * headphones are plugged in, but that's application policy
- * configuration that doesn't belong to UCM configuration files.
- */
- 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 */
|