1d5ac70f0Sopenharmony_ci/** 2d5ac70f0Sopenharmony_ci * \file control/control.c 3d5ac70f0Sopenharmony_ci * \brief CTL interface - primitive controls 4d5ac70f0Sopenharmony_ci * \author Abramo Bagnara <abramo@alsa-project.org> 5d5ac70f0Sopenharmony_ci * \date 2000 6d5ac70f0Sopenharmony_ci * 7d5ac70f0Sopenharmony_ci * CTL interface is designed to access primitive controls. 8d5ac70f0Sopenharmony_ci * See \ref control page for more details. 9d5ac70f0Sopenharmony_ci */ 10d5ac70f0Sopenharmony_ci/* 11d5ac70f0Sopenharmony_ci * Control Interface - main file 12d5ac70f0Sopenharmony_ci * Copyright (c) 2000 by Abramo Bagnara <abramo@alsa-project.org> 13d5ac70f0Sopenharmony_ci * 14d5ac70f0Sopenharmony_ci * 15d5ac70f0Sopenharmony_ci * This library is free software; you can redistribute it and/or modify 16d5ac70f0Sopenharmony_ci * it under the terms of the GNU Lesser General Public License as 17d5ac70f0Sopenharmony_ci * published by the Free Software Foundation; either version 2.1 of 18d5ac70f0Sopenharmony_ci * the License, or (at your option) any later version. 19d5ac70f0Sopenharmony_ci * 20d5ac70f0Sopenharmony_ci * This program is distributed in the hope that it will be useful, 21d5ac70f0Sopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 22d5ac70f0Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 23d5ac70f0Sopenharmony_ci * GNU Lesser General Public License for more details. 24d5ac70f0Sopenharmony_ci * 25d5ac70f0Sopenharmony_ci * You should have received a copy of the GNU Lesser General Public 26d5ac70f0Sopenharmony_ci * License along with this library; if not, write to the Free Software 27d5ac70f0Sopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 28d5ac70f0Sopenharmony_ci * 29d5ac70f0Sopenharmony_ci */ 30d5ac70f0Sopenharmony_ci 31d5ac70f0Sopenharmony_ci/*! \page control Control interface 32d5ac70f0Sopenharmony_ci 33d5ac70f0Sopenharmony_ci<P>Control interface is designed to access primitive controls. There is 34d5ac70f0Sopenharmony_cialso an interface for notifying about control and structure changes. 35d5ac70f0Sopenharmony_ci 36d5ac70f0Sopenharmony_ci 37d5ac70f0Sopenharmony_ci\section control_general_overview General overview 38d5ac70f0Sopenharmony_ci 39d5ac70f0Sopenharmony_ciIn Alsa, there are physical sound cards, such as USB headsets, and 40d5ac70f0Sopenharmony_civirtual sound cards, such as "pulse", which represents the PulseAudio 41d5ac70f0Sopenharmony_ciSound system. Each sound card offers a control interface, making its 42d5ac70f0Sopenharmony_cisettings (e.g. volume knobs) available. The complete list of available 43d5ac70f0Sopenharmony_cicontrol interfaces can be obtained using snd_device_name_hint(), 44d5ac70f0Sopenharmony_cigiving -1 as card index and "ctl" as interface type. Each returned 45d5ac70f0Sopenharmony_ciNAME hint identifies a control interface. 46d5ac70f0Sopenharmony_ci 47d5ac70f0Sopenharmony_ciSound cards have an ID (a string), an index (an int, sometimes called 48d5ac70f0Sopenharmony_cithe "card number"), a name, a longname, a mixername and a "components" 49d5ac70f0Sopenharmony_ciproperty. The file /proc/asound/cards lists most of these properties 50d5ac70f0Sopenharmony_cifor physical sound cards. Virtual sound cards are not listed in that 51d5ac70f0Sopenharmony_cifile. The format is: 52d5ac70f0Sopenharmony_ci 53d5ac70f0Sopenharmony_ci\verbatim 54d5ac70f0Sopenharmony_ciindex [ID ] Driver - name 55d5ac70f0Sopenharmony_ci longname 56d5ac70f0Sopenharmony_ci\endverbatim 57d5ac70f0Sopenharmony_ci 58d5ac70f0Sopenharmony_ciNote that the mixername and components are not listed. 59d5ac70f0Sopenharmony_ci 60d5ac70f0Sopenharmony_ci 61d5ac70f0Sopenharmony_ci\subsection control_cards_id Identifying and Opening Control Interfaces 62d5ac70f0Sopenharmony_ci 63d5ac70f0Sopenharmony_ciTo work with a control interface, is must be opened first, using 64d5ac70f0Sopenharmony_cisnd_ctl_open(). This function takes the interface name. 65d5ac70f0Sopenharmony_ci 66d5ac70f0Sopenharmony_ciFor physical sound cards, the control interface can be identified 67d5ac70f0Sopenharmony_ciusing the string "hw:<index>" (e.g. `hw:2`). The NAME hint - which is 68d5ac70f0Sopenharmony_ci"hw:CARD=<ID>" - can also be used. Further, its device file (something 69d5ac70f0Sopenharmony_cilike `/dev/snd/controlC0`) is also acceptable. Either of them can be 70d5ac70f0Sopenharmony_cigiven to snd_ctl_open(). 71d5ac70f0Sopenharmony_ci 72d5ac70f0Sopenharmony_ciFor virtual sound cards, the NAME hint is given to snd_ctl_open(). 73d5ac70f0Sopenharmony_ci 74d5ac70f0Sopenharmony_ciThe functions snd_card_get_index(), snd_card_get_name() and 75d5ac70f0Sopenharmony_cisnd_card_get_longname() can be used to find an identifying property 76d5ac70f0Sopenharmony_ciwhen another one is already known. 77d5ac70f0Sopenharmony_ci 78d5ac70f0Sopenharmony_ci\section control_elements Elements 79d5ac70f0Sopenharmony_ci 80d5ac70f0Sopenharmony_ciIn ALSA control feature, each sound card can have control elements. The elements 81d5ac70f0Sopenharmony_ciare managed according to below model. 82d5ac70f0Sopenharmony_ci 83d5ac70f0Sopenharmony_ci - Element set 84d5ac70f0Sopenharmony_ci 85d5ac70f0Sopenharmony_ci - A set of elements with the same attribute (i.e. name, get/put operations). 86d5ac70f0Sopenharmony_ci Some element sets can be added to a sound card by drivers in kernel and 87d5ac70f0Sopenharmony_ci userspace applications. 88d5ac70f0Sopenharmony_ci 89d5ac70f0Sopenharmony_ci - Element 90d5ac70f0Sopenharmony_ci 91d5ac70f0Sopenharmony_ci - A control element might be a master volume control, for example, or a 92d5ac70f0Sopenharmony_ci read-only indicator, such as a sync status. An element has a type (e.g. 93d5ac70f0Sopenharmony_ci SNDRV_CTL_ELEM_TYPE_INTEGER or SNDRV_CTL_ELEM_TYPE_BOOLEAN) and - depending 94d5ac70f0Sopenharmony_ci on the type - min/max values, a step size, a set of possible values (for 95d5ac70f0Sopenharmony_ci enums), etc. 96d5ac70f0Sopenharmony_ci 97d5ac70f0Sopenharmony_ci - Member 98d5ac70f0Sopenharmony_ci 99d5ac70f0Sopenharmony_ci - An element usually includes one or more member(s) to have a value. For 100d5ac70f0Sopenharmony_ci example, a stereo volume control element has two members (for left/right), 101d5ac70f0Sopenharmony_ci while a mono volume has only one member. The member count can be obtained 102d5ac70f0Sopenharmony_ci using snd_ctl_elem_info_get_count(). Elements of type 103d5ac70f0Sopenharmony_ci "SNDRV_CTL_ELEM_TYPE_BYTES" or "SNDRV_CTL_ELEM_TYPE_IEC958" have no members 104d5ac70f0Sopenharmony_ci at all (and thus no member count), they have just a single value. The 105d5ac70f0Sopenharmony_ci members share the same properties (e.g. both volume control members have 106d5ac70f0Sopenharmony_ci the same min/max values). The value of each member can be changed by both 107d5ac70f0Sopenharmony_ci of userspace applications and drivers in kernel. 108d5ac70f0Sopenharmony_ci 109d5ac70f0Sopenharmony_ci 110d5ac70f0Sopenharmony_ci\subsection identifying_elements Identifying Elements 111d5ac70f0Sopenharmony_ci 112d5ac70f0Sopenharmony_ciEach element has the following identifying properties: 113d5ac70f0Sopenharmony_ci 114d5ac70f0Sopenharmony_ci - The numid (a numeric identifier, assigned when the sound card is 115d5ac70f0Sopenharmony_ci detected, constant while the sound card is kept connected) 116d5ac70f0Sopenharmony_ci - The interface type (e.g. MIXER, CARD or PCM) 117d5ac70f0Sopenharmony_ci - The device 118d5ac70f0Sopenharmony_ci - The subdevice 119d5ac70f0Sopenharmony_ci - Its name 120d5ac70f0Sopenharmony_ci - Its index 121d5ac70f0Sopenharmony_ci 122d5ac70f0Sopenharmony_ciAn element can be identified either by its short numid or by the full 123d5ac70f0Sopenharmony_ciset of fields (interface type, device, subdevice, name, index). 124d5ac70f0Sopenharmony_ciThis set of fields is always the same (driver updates can change it, 125d5ac70f0Sopenharmony_cibut in practice this is rare). The numid can change on each boot. 126d5ac70f0Sopenharmony_ciIn case of an USB sound card, the numid can also change when it 127d5ac70f0Sopenharmony_ciis reconnected. The short numid is used to reduce the lookup time. 128d5ac70f0Sopenharmony_ci 129d5ac70f0Sopenharmony_ci\subsection element_lists Element Lists 130d5ac70f0Sopenharmony_ci 131d5ac70f0Sopenharmony_ciAn element list can be used to obtain a list of all elements of the 132d5ac70f0Sopenharmony_cisound card. The list contains generic information (e.g. how many 133d5ac70f0Sopenharmony_cielements the card has), and the identifying properties of the elements 134d5ac70f0Sopenharmony_ci(numid, card, name, ...). See #snd_ctl_elem_list_t to learn more about 135d5ac70f0Sopenharmony_cielement lists. 136d5ac70f0Sopenharmony_ci 137d5ac70f0Sopenharmony_ci 138d5ac70f0Sopenharmony_ci\subsection working_with_elements Working with Elements 139d5ac70f0Sopenharmony_ci 140d5ac70f0Sopenharmony_ciIt is possible to obtain information about an element using the 141d5ac70f0Sopenharmony_cisnd_ctl_elem_info_*() functions. For enums, the allowed values can be 142d5ac70f0Sopenharmony_ciobtained, for integers, the min/max values can be obtained, and so 143d5ac70f0Sopenharmony_cion. In addition, these functions can report the identifying 144d5ac70f0Sopenharmony_ciproperties. E.g. when the element is addressed using its numid, the 145d5ac70f0Sopenharmony_cifunctions complements the name, index, etc. 146d5ac70f0Sopenharmony_ci 147d5ac70f0Sopenharmony_ciTo access the members (i.e. values) of a control, use the 148d5ac70f0Sopenharmony_cisnd_ctl_elem_value*() functions. These allow to get and set the 149d5ac70f0Sopenharmony_ciactual values or settings. It is also possible to get and set the ID 150d5ac70f0Sopenharmony_civalues (such as the numid or the name). 151d5ac70f0Sopenharmony_ci 152d5ac70f0Sopenharmony_ci 153d5ac70f0Sopenharmony_ci\subsection element_sets Element Sets 154d5ac70f0Sopenharmony_ci 155d5ac70f0Sopenharmony_ciThe type of element set is one of integer, integer64, boolean, enumerators, 156d5ac70f0Sopenharmony_cibytes and IEC958 structure. This indicates the type of value for each member in 157d5ac70f0Sopenharmony_cielements included in the element set. 158d5ac70f0Sopenharmony_ci 159d5ac70f0Sopenharmony_ci 160d5ac70f0Sopenharmony_ci\section events Events 161d5ac70f0Sopenharmony_ci 162d5ac70f0Sopenharmony_ciWhen the value of a member is changed, corresponding events are transferred to 163d5ac70f0Sopenharmony_ciuserspace applications. The applications should subscribe any events in advance. 164d5ac70f0Sopenharmony_ci 165d5ac70f0Sopenharmony_ci\section tlv_blob Supplemental data for elements in an element set 166d5ac70f0Sopenharmony_ci 167d5ac70f0Sopenharmony_ciTLV feature is designed to transfer data in a shape of Type/Length/Value, 168d5ac70f0Sopenharmony_cibetween a driver and any userspace applications. The main purpose is to attach 169d5ac70f0Sopenharmony_cisupplement information for elements to an element set; e.g. dB range. 170d5ac70f0Sopenharmony_ci 171d5ac70f0Sopenharmony_ciAt first, this feature was implemented to add pre-defined data readable to 172d5ac70f0Sopenharmony_ciuserspace applications. Soon, it was extended to handle several operations; 173d5ac70f0Sopenharmony_ciread, write and command. The original implementation remains as the read 174d5ac70f0Sopenharmony_cioperation. The command operation allows drivers to have own implementations 175d5ac70f0Sopenharmony_ciagainst requests from userspace applications. 176d5ac70f0Sopenharmony_ci 177d5ac70f0Sopenharmony_ciThis feature was introduced to ALSA control feature in 2006, at commit 178d5ac70f0Sopenharmony_cic7a0708a2362, corresponding to a series of work for Linux kernel (42750b04c5ba 179d5ac70f0Sopenharmony_ciand 8aa9b586e420). 180d5ac70f0Sopenharmony_ci 181d5ac70f0Sopenharmony_ciThere's no limitation about maximum size of the data, therefore it can be used 182d5ac70f0Sopenharmony_cito deliver quite large arbitrary data from userspace to in-kernel drivers via 183d5ac70f0Sopenharmony_ciALSA control character device. Focusing on this nature, as of 2016, some 184d5ac70f0Sopenharmony_ciin-kernel implementations utilize this feature for I/O operations. This is 185d5ac70f0Sopenharmony_ciagainst the original design. 186d5ac70f0Sopenharmony_ci*/ 187d5ac70f0Sopenharmony_ci 188d5ac70f0Sopenharmony_ci#include "control_local.h" 189d5ac70f0Sopenharmony_ci#include <stdio.h> 190d5ac70f0Sopenharmony_ci#include <stdlib.h> 191d5ac70f0Sopenharmony_ci#include <stdint.h> 192d5ac70f0Sopenharmony_ci#include <stdarg.h> 193d5ac70f0Sopenharmony_ci#include <unistd.h> 194d5ac70f0Sopenharmony_ci#include <string.h> 195d5ac70f0Sopenharmony_ci#include <fcntl.h> 196d5ac70f0Sopenharmony_ci#include <signal.h> 197d5ac70f0Sopenharmony_ci#include <poll.h> 198d5ac70f0Sopenharmony_ci#include <stdbool.h> 199d5ac70f0Sopenharmony_ci#include <limits.h> 200d5ac70f0Sopenharmony_ci 201d5ac70f0Sopenharmony_ci/** 202d5ac70f0Sopenharmony_ci * \brief get identifier of CTL handle 203d5ac70f0Sopenharmony_ci * \param ctl CTL handle 204d5ac70f0Sopenharmony_ci * \return ascii identifier of CTL handle 205d5ac70f0Sopenharmony_ci * 206d5ac70f0Sopenharmony_ci * Returns the ASCII identifier of given CTL handle. It's the same 207d5ac70f0Sopenharmony_ci * identifier specified in snd_ctl_open(). 208d5ac70f0Sopenharmony_ci */ 209d5ac70f0Sopenharmony_ciconst char *snd_ctl_name(snd_ctl_t *ctl) 210d5ac70f0Sopenharmony_ci{ 211d5ac70f0Sopenharmony_ci assert(ctl); 212d5ac70f0Sopenharmony_ci return ctl->name; 213d5ac70f0Sopenharmony_ci} 214d5ac70f0Sopenharmony_ci 215d5ac70f0Sopenharmony_ci/** 216d5ac70f0Sopenharmony_ci * \brief get type of CTL handle 217d5ac70f0Sopenharmony_ci * \param ctl CTL handle 218d5ac70f0Sopenharmony_ci * \return type of CTL handle 219d5ac70f0Sopenharmony_ci * 220d5ac70f0Sopenharmony_ci * Returns the type #snd_ctl_type_t of given CTL handle. 221d5ac70f0Sopenharmony_ci */ 222d5ac70f0Sopenharmony_cisnd_ctl_type_t snd_ctl_type(snd_ctl_t *ctl) 223d5ac70f0Sopenharmony_ci{ 224d5ac70f0Sopenharmony_ci assert(ctl); 225d5ac70f0Sopenharmony_ci return ctl->type; 226d5ac70f0Sopenharmony_ci} 227d5ac70f0Sopenharmony_ci 228d5ac70f0Sopenharmony_ci/** 229d5ac70f0Sopenharmony_ci * \brief close CTL handle 230d5ac70f0Sopenharmony_ci * \param ctl CTL handle 231d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 232d5ac70f0Sopenharmony_ci * 233d5ac70f0Sopenharmony_ci * Closes the specified CTL handle and frees all associated 234d5ac70f0Sopenharmony_ci * resources. 235d5ac70f0Sopenharmony_ci */ 236d5ac70f0Sopenharmony_ciint snd_ctl_close(snd_ctl_t *ctl) 237d5ac70f0Sopenharmony_ci{ 238d5ac70f0Sopenharmony_ci int err; 239d5ac70f0Sopenharmony_ci while (!list_empty(&ctl->async_handlers)) { 240d5ac70f0Sopenharmony_ci snd_async_handler_t *h = list_entry(&ctl->async_handlers.next, snd_async_handler_t, hlist); 241d5ac70f0Sopenharmony_ci snd_async_del_handler(h); 242d5ac70f0Sopenharmony_ci } 243d5ac70f0Sopenharmony_ci err = ctl->ops->close(ctl); 244d5ac70f0Sopenharmony_ci free(ctl->name); 245d5ac70f0Sopenharmony_ci snd_dlobj_cache_put(ctl->open_func); 246d5ac70f0Sopenharmony_ci free(ctl); 247d5ac70f0Sopenharmony_ci return err; 248d5ac70f0Sopenharmony_ci} 249d5ac70f0Sopenharmony_ci 250d5ac70f0Sopenharmony_ci/** 251d5ac70f0Sopenharmony_ci * \brief set nonblock mode 252d5ac70f0Sopenharmony_ci * \param ctl CTL handle 253d5ac70f0Sopenharmony_ci * \param nonblock 0 = block, 1 = nonblock mode, 2 = abort 254d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 255d5ac70f0Sopenharmony_ci */ 256d5ac70f0Sopenharmony_ciint snd_ctl_nonblock(snd_ctl_t *ctl, int nonblock) 257d5ac70f0Sopenharmony_ci{ 258d5ac70f0Sopenharmony_ci int err; 259d5ac70f0Sopenharmony_ci assert(ctl); 260d5ac70f0Sopenharmony_ci err = ctl->ops->nonblock(ctl, nonblock); 261d5ac70f0Sopenharmony_ci if (err < 0) 262d5ac70f0Sopenharmony_ci return err; 263d5ac70f0Sopenharmony_ci ctl->nonblock = nonblock; 264d5ac70f0Sopenharmony_ci return 0; 265d5ac70f0Sopenharmony_ci} 266d5ac70f0Sopenharmony_ci 267d5ac70f0Sopenharmony_ci#ifndef DOC_HIDDEN 268d5ac70f0Sopenharmony_ciint snd_ctl_new(snd_ctl_t **ctlp, snd_ctl_type_t type, const char *name, int mode) 269d5ac70f0Sopenharmony_ci{ 270d5ac70f0Sopenharmony_ci snd_ctl_t *ctl; 271d5ac70f0Sopenharmony_ci ctl = calloc(1, sizeof(*ctl)); 272d5ac70f0Sopenharmony_ci if (!ctl) 273d5ac70f0Sopenharmony_ci return -ENOMEM; 274d5ac70f0Sopenharmony_ci ctl->type = type; 275d5ac70f0Sopenharmony_ci ctl->mode = mode; 276d5ac70f0Sopenharmony_ci if (name) 277d5ac70f0Sopenharmony_ci ctl->name = strdup(name); 278d5ac70f0Sopenharmony_ci INIT_LIST_HEAD(&ctl->async_handlers); 279d5ac70f0Sopenharmony_ci *ctlp = ctl; 280d5ac70f0Sopenharmony_ci return 0; 281d5ac70f0Sopenharmony_ci} 282d5ac70f0Sopenharmony_ci 283d5ac70f0Sopenharmony_ci 284d5ac70f0Sopenharmony_ci/** 285d5ac70f0Sopenharmony_ci * \brief set async mode 286d5ac70f0Sopenharmony_ci * \param ctl CTL handle 287d5ac70f0Sopenharmony_ci * \param sig Signal to raise: < 0 disable, 0 default (SIGIO) 288d5ac70f0Sopenharmony_ci * \param pid Process ID to signal: 0 current 289d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 290d5ac70f0Sopenharmony_ci * 291d5ac70f0Sopenharmony_ci * A signal is raised when a change happens. 292d5ac70f0Sopenharmony_ci */ 293d5ac70f0Sopenharmony_ciint snd_ctl_async(snd_ctl_t *ctl, int sig, pid_t pid) 294d5ac70f0Sopenharmony_ci{ 295d5ac70f0Sopenharmony_ci assert(ctl); 296d5ac70f0Sopenharmony_ci if (sig == 0) 297d5ac70f0Sopenharmony_ci sig = SIGIO; 298d5ac70f0Sopenharmony_ci if (pid == 0) 299d5ac70f0Sopenharmony_ci pid = getpid(); 300d5ac70f0Sopenharmony_ci return ctl->ops->async(ctl, sig, pid); 301d5ac70f0Sopenharmony_ci} 302d5ac70f0Sopenharmony_ci#endif 303d5ac70f0Sopenharmony_ci 304d5ac70f0Sopenharmony_ci/** 305d5ac70f0Sopenharmony_ci * \brief get count of poll descriptors for CTL handle 306d5ac70f0Sopenharmony_ci * \param ctl CTL handle 307d5ac70f0Sopenharmony_ci * \return count of poll descriptors 308d5ac70f0Sopenharmony_ci */ 309d5ac70f0Sopenharmony_ciint snd_ctl_poll_descriptors_count(snd_ctl_t *ctl) 310d5ac70f0Sopenharmony_ci{ 311d5ac70f0Sopenharmony_ci assert(ctl); 312d5ac70f0Sopenharmony_ci if (ctl->ops->poll_descriptors_count) 313d5ac70f0Sopenharmony_ci return ctl->ops->poll_descriptors_count(ctl); 314d5ac70f0Sopenharmony_ci if (ctl->poll_fd < 0) 315d5ac70f0Sopenharmony_ci return 0; 316d5ac70f0Sopenharmony_ci return 1; 317d5ac70f0Sopenharmony_ci} 318d5ac70f0Sopenharmony_ci 319d5ac70f0Sopenharmony_ci/** 320d5ac70f0Sopenharmony_ci * \brief get poll descriptors 321d5ac70f0Sopenharmony_ci * \param ctl CTL handle 322d5ac70f0Sopenharmony_ci * \param pfds array of poll descriptors 323d5ac70f0Sopenharmony_ci * \param space space in the poll descriptor array 324d5ac70f0Sopenharmony_ci * \return count of filled descriptors 325d5ac70f0Sopenharmony_ci */ 326d5ac70f0Sopenharmony_ciint snd_ctl_poll_descriptors(snd_ctl_t *ctl, struct pollfd *pfds, unsigned int space) 327d5ac70f0Sopenharmony_ci{ 328d5ac70f0Sopenharmony_ci assert(ctl && pfds); 329d5ac70f0Sopenharmony_ci if (ctl->ops->poll_descriptors) 330d5ac70f0Sopenharmony_ci return ctl->ops->poll_descriptors(ctl, pfds, space); 331d5ac70f0Sopenharmony_ci if (ctl->poll_fd < 0) 332d5ac70f0Sopenharmony_ci return 0; 333d5ac70f0Sopenharmony_ci if (space > 0) { 334d5ac70f0Sopenharmony_ci pfds->fd = ctl->poll_fd; 335d5ac70f0Sopenharmony_ci pfds->events = POLLIN|POLLERR|POLLNVAL; 336d5ac70f0Sopenharmony_ci return 1; 337d5ac70f0Sopenharmony_ci } 338d5ac70f0Sopenharmony_ci return 0; 339d5ac70f0Sopenharmony_ci} 340d5ac70f0Sopenharmony_ci 341d5ac70f0Sopenharmony_ci/** 342d5ac70f0Sopenharmony_ci * \brief get returned events from poll descriptors 343d5ac70f0Sopenharmony_ci * \param ctl CTL handle 344d5ac70f0Sopenharmony_ci * \param pfds array of poll descriptors 345d5ac70f0Sopenharmony_ci * \param nfds count of poll descriptors 346d5ac70f0Sopenharmony_ci * \param revents returned events 347d5ac70f0Sopenharmony_ci * \return zero if success, otherwise a negative error code 348d5ac70f0Sopenharmony_ci */ 349d5ac70f0Sopenharmony_ciint snd_ctl_poll_descriptors_revents(snd_ctl_t *ctl, struct pollfd *pfds, unsigned int nfds, unsigned short *revents) 350d5ac70f0Sopenharmony_ci{ 351d5ac70f0Sopenharmony_ci assert(ctl && pfds && revents); 352d5ac70f0Sopenharmony_ci if (ctl->ops->poll_revents) 353d5ac70f0Sopenharmony_ci return ctl->ops->poll_revents(ctl, pfds, nfds, revents); 354d5ac70f0Sopenharmony_ci if (nfds == 1) { 355d5ac70f0Sopenharmony_ci *revents = pfds->revents; 356d5ac70f0Sopenharmony_ci return 0; 357d5ac70f0Sopenharmony_ci } 358d5ac70f0Sopenharmony_ci return -EINVAL; 359d5ac70f0Sopenharmony_ci} 360d5ac70f0Sopenharmony_ci 361d5ac70f0Sopenharmony_ci/** 362d5ac70f0Sopenharmony_ci * \brief Ask to be informed about events (poll, #snd_async_add_ctl_handler, #snd_ctl_read) 363d5ac70f0Sopenharmony_ci * \param ctl CTL handle 364d5ac70f0Sopenharmony_ci * \param subscribe 0 = unsubscribe, 1 = subscribe, -1 = check subscribe or not 365d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 366d5ac70f0Sopenharmony_ci */ 367d5ac70f0Sopenharmony_ciint snd_ctl_subscribe_events(snd_ctl_t *ctl, int subscribe) 368d5ac70f0Sopenharmony_ci{ 369d5ac70f0Sopenharmony_ci assert(ctl); 370d5ac70f0Sopenharmony_ci return ctl->ops->subscribe_events(ctl, subscribe); 371d5ac70f0Sopenharmony_ci} 372d5ac70f0Sopenharmony_ci 373d5ac70f0Sopenharmony_ci 374d5ac70f0Sopenharmony_ci/** 375d5ac70f0Sopenharmony_ci * \brief Get information about the sound card. 376d5ac70f0Sopenharmony_ci * 377d5ac70f0Sopenharmony_ci * Obtain information about the sound card previously opened using 378d5ac70f0Sopenharmony_ci * snd_ctl_open(). The object "info" must be allocated prior to calling this 379d5ac70f0Sopenharmony_ci * function. See snd_ctl_card_info_t for details. 380d5ac70f0Sopenharmony_ci * 381d5ac70f0Sopenharmony_ci * \param ctl The CTL handle. 382d5ac70f0Sopenharmony_ci * \param info The card information is stored here. 383d5ac70f0Sopenharmony_ci * \return 0 on success, otherwise a negative error code. 384d5ac70f0Sopenharmony_ci */ 385d5ac70f0Sopenharmony_ciint snd_ctl_card_info(snd_ctl_t *ctl, snd_ctl_card_info_t *info) 386d5ac70f0Sopenharmony_ci{ 387d5ac70f0Sopenharmony_ci assert(ctl && info); 388d5ac70f0Sopenharmony_ci return ctl->ops->card_info(ctl, info); 389d5ac70f0Sopenharmony_ci} 390d5ac70f0Sopenharmony_ci 391d5ac70f0Sopenharmony_ci/** 392d5ac70f0Sopenharmony_ci * \brief Get a list of element identifiers 393d5ac70f0Sopenharmony_ci * 394d5ac70f0Sopenharmony_ci * Before calling this function, memoru must be allocated using 395d5ac70f0Sopenharmony_ci * snd_ctl_elem_list_malloc(). 396d5ac70f0Sopenharmony_ci * 397d5ac70f0Sopenharmony_ci * This function obtains data from the sound card driver and puts it 398d5ac70f0Sopenharmony_ci * into the list. 399d5ac70f0Sopenharmony_ci * 400d5ac70f0Sopenharmony_ci * If there was space allocated for the element identifiers (using 401d5ac70f0Sopenharmony_ci * snd_ctl_elem_list_alloc_space()), information will be filled in. If 402d5ac70f0Sopenharmony_ci * too little space was allocated, only a part of the elements will be 403d5ac70f0Sopenharmony_ci * queried. If there was too much space allocated, some of it remains 404d5ac70f0Sopenharmony_ci * unused. Use snd_ctl_elem_list_get_count() and 405d5ac70f0Sopenharmony_ci * snd_ctl_elem_list_get_used() to obtain information about space 406d5ac70f0Sopenharmony_ci * usage. See #snd_ctl_elem_list_t to learn more. 407d5ac70f0Sopenharmony_ci * 408d5ac70f0Sopenharmony_ci * \param ctl CTL handle 409d5ac70f0Sopenharmony_ci * \param list CTL element identifiers list pointer 410d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 411d5ac70f0Sopenharmony_ci */ 412d5ac70f0Sopenharmony_ciint snd_ctl_elem_list(snd_ctl_t *ctl, snd_ctl_elem_list_t *list) 413d5ac70f0Sopenharmony_ci{ 414d5ac70f0Sopenharmony_ci assert(ctl && list); 415d5ac70f0Sopenharmony_ci assert(list->space == 0 || list->pids); 416d5ac70f0Sopenharmony_ci return ctl->ops->element_list(ctl, list); 417d5ac70f0Sopenharmony_ci} 418d5ac70f0Sopenharmony_ci 419d5ac70f0Sopenharmony_ci/** 420d5ac70f0Sopenharmony_ci * \brief Get CTL element information 421d5ac70f0Sopenharmony_ci * \param ctl CTL handle 422d5ac70f0Sopenharmony_ci * \param info CTL element id/information pointer 423d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 424d5ac70f0Sopenharmony_ci */ 425d5ac70f0Sopenharmony_ciint snd_ctl_elem_info(snd_ctl_t *ctl, snd_ctl_elem_info_t *info) 426d5ac70f0Sopenharmony_ci{ 427d5ac70f0Sopenharmony_ci assert(ctl && info && (info->id.name[0] || info->id.numid)); 428d5ac70f0Sopenharmony_ci return ctl->ops->element_info(ctl, info); 429d5ac70f0Sopenharmony_ci} 430d5ac70f0Sopenharmony_ci 431d5ac70f0Sopenharmony_ci#ifndef DOC_HIDDEN 432d5ac70f0Sopenharmony_ci#if 0 /* deprecated */ 433d5ac70f0Sopenharmony_cistatic bool validate_element_member_dimension(snd_ctl_elem_info_t *info) 434d5ac70f0Sopenharmony_ci{ 435d5ac70f0Sopenharmony_ci unsigned int members; 436d5ac70f0Sopenharmony_ci unsigned int i; 437d5ac70f0Sopenharmony_ci 438d5ac70f0Sopenharmony_ci if (info->dimen.d[0] == 0) 439d5ac70f0Sopenharmony_ci return true; 440d5ac70f0Sopenharmony_ci 441d5ac70f0Sopenharmony_ci members = 1; 442d5ac70f0Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(info->dimen.d); ++i) { 443d5ac70f0Sopenharmony_ci if (info->dimen.d[i] == 0) 444d5ac70f0Sopenharmony_ci break; 445d5ac70f0Sopenharmony_ci members *= info->dimen.d[i]; 446d5ac70f0Sopenharmony_ci 447d5ac70f0Sopenharmony_ci if (members > info->count) 448d5ac70f0Sopenharmony_ci return false; 449d5ac70f0Sopenharmony_ci } 450d5ac70f0Sopenharmony_ci 451d5ac70f0Sopenharmony_ci for (++i; i < ARRAY_SIZE(info->dimen.d); ++i) { 452d5ac70f0Sopenharmony_ci if (info->dimen.d[i] > 0) 453d5ac70f0Sopenharmony_ci return false; 454d5ac70f0Sopenharmony_ci } 455d5ac70f0Sopenharmony_ci 456d5ac70f0Sopenharmony_ci return members == info->count; 457d5ac70f0Sopenharmony_ci} 458d5ac70f0Sopenharmony_ci#else /* deprecated */ 459d5ac70f0Sopenharmony_ci#define validate_element_member_dimension(info) true 460d5ac70f0Sopenharmony_ci#endif /* deprecated */ 461d5ac70f0Sopenharmony_ci 462d5ac70f0Sopenharmony_ci#define USER_ACCESS_DEFAULT (\ 463d5ac70f0Sopenharmony_ci SNDRV_CTL_ELEM_ACCESS_READWRITE |\ 464d5ac70f0Sopenharmony_ci SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE |\ 465d5ac70f0Sopenharmony_ci SNDRV_CTL_ELEM_ACCESS_USER) 466d5ac70f0Sopenharmony_ci 467d5ac70f0Sopenharmony_ci#define USER_ACCESS_SETTABLE (\ 468d5ac70f0Sopenharmony_ci SNDRV_CTL_ELEM_ACCESS_READWRITE |\ 469d5ac70f0Sopenharmony_ci SNDRV_CTL_ELEM_ACCESS_VOLATILE |\ 470d5ac70f0Sopenharmony_ci SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE |\ 471d5ac70f0Sopenharmony_ci SNDRV_CTL_ELEM_ACCESS_INACTIVE |\ 472d5ac70f0Sopenharmony_ci SNDRV_CTL_ELEM_ACCESS_USER) 473d5ac70f0Sopenharmony_ci 474d5ac70f0Sopenharmony_cistatic inline int set_user_access(snd_ctl_elem_info_t *info) 475d5ac70f0Sopenharmony_ci{ 476d5ac70f0Sopenharmony_ci if (info->access == 0) { 477d5ac70f0Sopenharmony_ci info->access = USER_ACCESS_DEFAULT; 478d5ac70f0Sopenharmony_ci } else { 479d5ac70f0Sopenharmony_ci if ((info->access & SNDRV_CTL_ELEM_ACCESS_READWRITE) == 0) 480d5ac70f0Sopenharmony_ci return -1; 481d5ac70f0Sopenharmony_ci if (info->access & ~USER_ACCESS_SETTABLE) 482d5ac70f0Sopenharmony_ci return -1; 483d5ac70f0Sopenharmony_ci info->access |= SNDRV_CTL_ELEM_ACCESS_USER; 484d5ac70f0Sopenharmony_ci } 485d5ac70f0Sopenharmony_ci return 0; 486d5ac70f0Sopenharmony_ci} 487d5ac70f0Sopenharmony_ci 488d5ac70f0Sopenharmony_ciint __snd_ctl_add_elem_set(snd_ctl_t *ctl, snd_ctl_elem_info_t *info, 489d5ac70f0Sopenharmony_ci unsigned int element_count, 490d5ac70f0Sopenharmony_ci unsigned int member_count) 491d5ac70f0Sopenharmony_ci{ 492d5ac70f0Sopenharmony_ci if (ctl == NULL || info->id.name[0] == '\0') 493d5ac70f0Sopenharmony_ci return -EINVAL; 494d5ac70f0Sopenharmony_ci 495d5ac70f0Sopenharmony_ci if (set_user_access(info)) 496d5ac70f0Sopenharmony_ci return -EINVAL; 497d5ac70f0Sopenharmony_ci 498d5ac70f0Sopenharmony_ci info->owner = element_count; 499d5ac70f0Sopenharmony_ci info->count = member_count; 500d5ac70f0Sopenharmony_ci 501d5ac70f0Sopenharmony_ci if (!validate_element_member_dimension(info)) 502d5ac70f0Sopenharmony_ci return -EINVAL; 503d5ac70f0Sopenharmony_ci 504d5ac70f0Sopenharmony_ci return ctl->ops->element_add(ctl, info); 505d5ac70f0Sopenharmony_ci} 506d5ac70f0Sopenharmony_ci 507d5ac70f0Sopenharmony_ci#endif /* DOC_HIDDEN */ 508d5ac70f0Sopenharmony_ci 509d5ac70f0Sopenharmony_ci/** 510d5ac70f0Sopenharmony_ci * \brief Create and add some user-defined control elements of integer type. 511d5ac70f0Sopenharmony_ci * \param ctl A handle of backend module for control interface. 512d5ac70f0Sopenharmony_ci * \param info Common information for a new element set, with ID of the first new 513d5ac70f0Sopenharmony_ci * element. 514d5ac70f0Sopenharmony_ci * \param element_count The number of elements added by this operation. 515d5ac70f0Sopenharmony_ci * \param member_count The number of members which a element has to 516d5ac70f0Sopenharmony_ci * represent its states. 517d5ac70f0Sopenharmony_ci * \param min Minimum value for each member of the elements. 518d5ac70f0Sopenharmony_ci * \param max Maximum value for each member of the elements. 519d5ac70f0Sopenharmony_ci * \param step The step of value for each member in the elements. 520d5ac70f0Sopenharmony_ci * \return Zero on success, otherwise a negative error code. 521d5ac70f0Sopenharmony_ci * 522d5ac70f0Sopenharmony_ci * This function creates some user elements with integer type. These elements 523d5ac70f0Sopenharmony_ci * are not controlled by device drivers in kernel. They can be operated by the 524d5ac70f0Sopenharmony_ci * same way as usual elements added by the device drivers. 525d5ac70f0Sopenharmony_ci * 526d5ac70f0Sopenharmony_ci * The name field of \a id must be set with unique value to identify new control 527d5ac70f0Sopenharmony_ci * elements. After returning, all fields of \a id are filled. A element can be 528d5ac70f0Sopenharmony_ci * identified by the combination of name and index, or by numid. 529d5ac70f0Sopenharmony_ci * 530d5ac70f0Sopenharmony_ci * All of members in the new elements are locked. The value of each member is 531d5ac70f0Sopenharmony_ci * initialized with the minimum value. 532d5ac70f0Sopenharmony_ci * 533d5ac70f0Sopenharmony_ci * \par Errors: 534d5ac70f0Sopenharmony_ci * <dl> 535d5ac70f0Sopenharmony_ci * <dt>-EBUSY 536d5ac70f0Sopenharmony_ci * <dd>A element with ID \a id already exists. 537d5ac70f0Sopenharmony_ci * <dt>-EINVAL 538d5ac70f0Sopenharmony_ci * <dd>Some arguments include invalid value; i.e. ID field in \a info has no 539d5ac70f0Sopenharmony_ci * name, or the number of members is not between 1 to 127. 540d5ac70f0Sopenharmony_ci * <dt>-ENOMEM 541d5ac70f0Sopenharmony_ci * <dd>Out of memory, or there are too many user elements. 542d5ac70f0Sopenharmony_ci * <dt>-ENXIO 543d5ac70f0Sopenharmony_ci * <dd>This backend module does not support user elements of integer type. 544d5ac70f0Sopenharmony_ci * <dt>-ENODEV 545d5ac70f0Sopenharmony_ci * <dd>Device unplugged. 546d5ac70f0Sopenharmony_ci * </dl> 547d5ac70f0Sopenharmony_ci * 548d5ac70f0Sopenharmony_ci * \par Compatibility: 549d5ac70f0Sopenharmony_ci * This function is added in version 1.1.2. 550d5ac70f0Sopenharmony_ci */ 551d5ac70f0Sopenharmony_ciint snd_ctl_add_integer_elem_set(snd_ctl_t *ctl, snd_ctl_elem_info_t *info, 552d5ac70f0Sopenharmony_ci unsigned int element_count, 553d5ac70f0Sopenharmony_ci unsigned int member_count, 554d5ac70f0Sopenharmony_ci long min, long max, long step) 555d5ac70f0Sopenharmony_ci{ 556d5ac70f0Sopenharmony_ci snd_ctl_elem_value_t data = {0}; 557d5ac70f0Sopenharmony_ci unsigned int i; 558d5ac70f0Sopenharmony_ci unsigned int j; 559d5ac70f0Sopenharmony_ci unsigned int numid; 560d5ac70f0Sopenharmony_ci int err; 561d5ac70f0Sopenharmony_ci 562d5ac70f0Sopenharmony_ci if (info == NULL) 563d5ac70f0Sopenharmony_ci return -EINVAL; 564d5ac70f0Sopenharmony_ci 565d5ac70f0Sopenharmony_ci info->type = SND_CTL_ELEM_TYPE_INTEGER; 566d5ac70f0Sopenharmony_ci info->value.integer.min = min; 567d5ac70f0Sopenharmony_ci info->value.integer.max = max; 568d5ac70f0Sopenharmony_ci info->value.integer.step = step; 569d5ac70f0Sopenharmony_ci 570d5ac70f0Sopenharmony_ci err = __snd_ctl_add_elem_set(ctl, info, element_count, member_count); 571d5ac70f0Sopenharmony_ci if (err < 0) 572d5ac70f0Sopenharmony_ci return err; 573d5ac70f0Sopenharmony_ci numid = snd_ctl_elem_id_get_numid(&info->id); 574d5ac70f0Sopenharmony_ci 575d5ac70f0Sopenharmony_ci /* Set initial value to all of members in all of added elements. */ 576d5ac70f0Sopenharmony_ci data.id = info->id; 577d5ac70f0Sopenharmony_ci for (i = 0; i < element_count; i++) { 578d5ac70f0Sopenharmony_ci snd_ctl_elem_id_set_numid(&data.id, numid + i); 579d5ac70f0Sopenharmony_ci 580d5ac70f0Sopenharmony_ci for (j = 0; j < member_count; j++) 581d5ac70f0Sopenharmony_ci data.value.integer.value[j] = min; 582d5ac70f0Sopenharmony_ci 583d5ac70f0Sopenharmony_ci err = ctl->ops->element_write(ctl, &data); 584d5ac70f0Sopenharmony_ci if (err < 0) 585d5ac70f0Sopenharmony_ci return err; 586d5ac70f0Sopenharmony_ci } 587d5ac70f0Sopenharmony_ci 588d5ac70f0Sopenharmony_ci return 0; 589d5ac70f0Sopenharmony_ci} 590d5ac70f0Sopenharmony_ci 591d5ac70f0Sopenharmony_ci/** 592d5ac70f0Sopenharmony_ci * \brief Create and add some user-defined control elements of integer64 type. 593d5ac70f0Sopenharmony_ci * \param ctl A handle of backend module for control interface. 594d5ac70f0Sopenharmony_ci * \param info Common information for a new element set, with ID of the first new 595d5ac70f0Sopenharmony_ci * element. 596d5ac70f0Sopenharmony_ci * \param element_count The number of elements added by this operation. 597d5ac70f0Sopenharmony_ci * \param member_count The number of members which a element has to 598d5ac70f0Sopenharmony_ci * represent its states. 599d5ac70f0Sopenharmony_ci * \param min Minimum value for each member of the elements. 600d5ac70f0Sopenharmony_ci * \param max Maximum value for each member of the elements. 601d5ac70f0Sopenharmony_ci * \param step The step of value for each member in the elements. 602d5ac70f0Sopenharmony_ci * \return Zero on success, otherwise a negative error code. 603d5ac70f0Sopenharmony_ci * 604d5ac70f0Sopenharmony_ci * This function creates some user elements with integer64 type. These elements 605d5ac70f0Sopenharmony_ci * are not controlled by device drivers in kernel. They can be operated by the 606d5ac70f0Sopenharmony_ci * same way as usual elements added by the device drivers. 607d5ac70f0Sopenharmony_ci * 608d5ac70f0Sopenharmony_ci * The name field of \a id must be set with unique value to identify new control 609d5ac70f0Sopenharmony_ci * elements. After returning, all fields of \a id are filled. A element can be 610d5ac70f0Sopenharmony_ci * identified by the combination of name and index, or by numid. 611d5ac70f0Sopenharmony_ci * 612d5ac70f0Sopenharmony_ci * All of members in the new elements are locked. The value of each member is 613d5ac70f0Sopenharmony_ci * initialized with the minimum value. 614d5ac70f0Sopenharmony_ci * 615d5ac70f0Sopenharmony_ci * \par Errors: 616d5ac70f0Sopenharmony_ci * <dl> 617d5ac70f0Sopenharmony_ci * <dt>-EBUSY 618d5ac70f0Sopenharmony_ci * <dd>A element with ID \a id already exists. 619d5ac70f0Sopenharmony_ci * <dt>-EINVAL 620d5ac70f0Sopenharmony_ci * <dd>Some arguments include invalid value; i.e. ID has no name, or the number 621d5ac70f0Sopenharmony_ci * of members is not between 1 to 127. 622d5ac70f0Sopenharmony_ci * <dt>-ENOMEM 623d5ac70f0Sopenharmony_ci * <dd>Out of memory, or there are too many user elements. 624d5ac70f0Sopenharmony_ci * <dt>-ENXIO 625d5ac70f0Sopenharmony_ci * <dd>This backend module does not support user elements of integer64 type. 626d5ac70f0Sopenharmony_ci * <dt>-ENODEV 627d5ac70f0Sopenharmony_ci * <dd>Device unplugged. 628d5ac70f0Sopenharmony_ci * </dl> 629d5ac70f0Sopenharmony_ci * 630d5ac70f0Sopenharmony_ci * \par Compatibility: 631d5ac70f0Sopenharmony_ci * This function is added in version 1.1.2. 632d5ac70f0Sopenharmony_ci */ 633d5ac70f0Sopenharmony_ciint snd_ctl_add_integer64_elem_set(snd_ctl_t *ctl, snd_ctl_elem_info_t *info, 634d5ac70f0Sopenharmony_ci unsigned int element_count, 635d5ac70f0Sopenharmony_ci unsigned int member_count, 636d5ac70f0Sopenharmony_ci long long min, long long max, long long step) 637d5ac70f0Sopenharmony_ci{ 638d5ac70f0Sopenharmony_ci snd_ctl_elem_value_t data = {0}; 639d5ac70f0Sopenharmony_ci unsigned int i; 640d5ac70f0Sopenharmony_ci unsigned int j; 641d5ac70f0Sopenharmony_ci unsigned int numid; 642d5ac70f0Sopenharmony_ci int err; 643d5ac70f0Sopenharmony_ci 644d5ac70f0Sopenharmony_ci if (info == NULL) 645d5ac70f0Sopenharmony_ci return -EINVAL; 646d5ac70f0Sopenharmony_ci 647d5ac70f0Sopenharmony_ci info->type = SND_CTL_ELEM_TYPE_INTEGER64; 648d5ac70f0Sopenharmony_ci info->value.integer64.min = min; 649d5ac70f0Sopenharmony_ci info->value.integer64.max = max; 650d5ac70f0Sopenharmony_ci info->value.integer64.step = step; 651d5ac70f0Sopenharmony_ci 652d5ac70f0Sopenharmony_ci err = __snd_ctl_add_elem_set(ctl, info, element_count, member_count); 653d5ac70f0Sopenharmony_ci if (err < 0) 654d5ac70f0Sopenharmony_ci return err; 655d5ac70f0Sopenharmony_ci numid = snd_ctl_elem_id_get_numid(&info->id); 656d5ac70f0Sopenharmony_ci 657d5ac70f0Sopenharmony_ci /* Set initial value to all of members in all of added elements. */ 658d5ac70f0Sopenharmony_ci data.id = info->id; 659d5ac70f0Sopenharmony_ci for (i = 0; i < element_count; i++) { 660d5ac70f0Sopenharmony_ci snd_ctl_elem_id_set_numid(&data.id, numid + i); 661d5ac70f0Sopenharmony_ci 662d5ac70f0Sopenharmony_ci for (j = 0; j < member_count; j++) 663d5ac70f0Sopenharmony_ci data.value.integer64.value[j] = min; 664d5ac70f0Sopenharmony_ci 665d5ac70f0Sopenharmony_ci err = ctl->ops->element_write(ctl, &data); 666d5ac70f0Sopenharmony_ci if (err < 0) 667d5ac70f0Sopenharmony_ci return err; 668d5ac70f0Sopenharmony_ci } 669d5ac70f0Sopenharmony_ci 670d5ac70f0Sopenharmony_ci return 0; 671d5ac70f0Sopenharmony_ci} 672d5ac70f0Sopenharmony_ci 673d5ac70f0Sopenharmony_ci/** 674d5ac70f0Sopenharmony_ci * \brief Create and add some user-defined control elements of boolean type. 675d5ac70f0Sopenharmony_ci * \param ctl A handle of backend module for control interface. 676d5ac70f0Sopenharmony_ci * \param info Common information for a new element set, with ID of the first new 677d5ac70f0Sopenharmony_ci * element. 678d5ac70f0Sopenharmony_ci * \param element_count The number of elements added by this operation. 679d5ac70f0Sopenharmony_ci * \param member_count The number of members which a element has to 680d5ac70f0Sopenharmony_ci * represent its states. 681d5ac70f0Sopenharmony_ci * 682d5ac70f0Sopenharmony_ci * This function creates some user elements with boolean type. These elements 683d5ac70f0Sopenharmony_ci * are not controlled by device drivers in kernel. They can be operated by the 684d5ac70f0Sopenharmony_ci * same way as usual elements added by the device drivers. 685d5ac70f0Sopenharmony_ci * 686d5ac70f0Sopenharmony_ci * The name field of \a id must be set with unique value to identify new control 687d5ac70f0Sopenharmony_ci * elements. After returning, all fields of \a id are filled. A element can be 688d5ac70f0Sopenharmony_ci * identified by the combination of name and index, or by numid. 689d5ac70f0Sopenharmony_ci * 690d5ac70f0Sopenharmony_ci * All of members in the new elements are locked. The value of each member is 691d5ac70f0Sopenharmony_ci * initialized with false. 692d5ac70f0Sopenharmony_ci * 693d5ac70f0Sopenharmony_ci * \par Errors: 694d5ac70f0Sopenharmony_ci * <dl> 695d5ac70f0Sopenharmony_ci * <dt>-EBUSY 696d5ac70f0Sopenharmony_ci * <dd>A element with ID \a id already exists. 697d5ac70f0Sopenharmony_ci * <dt>-EINVAL 698d5ac70f0Sopenharmony_ci * <dd>Some parameters include invalid value; i.e. ID has no name, or the number 699d5ac70f0Sopenharmony_ci * of members is not between 1 to 127. 700d5ac70f0Sopenharmony_ci * <dt>-ENOMEM 701d5ac70f0Sopenharmony_ci * <dd>Out of memory, or there are too many user elements. 702d5ac70f0Sopenharmony_ci * <dt>-ENXIO 703d5ac70f0Sopenharmony_ci * <dd>This backend module does not support user elements of boolean type. 704d5ac70f0Sopenharmony_ci * <dt>-ENODEV 705d5ac70f0Sopenharmony_ci * <dd>Device unplugged. 706d5ac70f0Sopenharmony_ci * </dl> 707d5ac70f0Sopenharmony_ci * 708d5ac70f0Sopenharmony_ci * \par Compatibility: 709d5ac70f0Sopenharmony_ci * This function is added in version 1.1.2. 710d5ac70f0Sopenharmony_ci */ 711d5ac70f0Sopenharmony_ciint snd_ctl_add_boolean_elem_set(snd_ctl_t *ctl, snd_ctl_elem_info_t *info, 712d5ac70f0Sopenharmony_ci unsigned int element_count, 713d5ac70f0Sopenharmony_ci unsigned int member_count) 714d5ac70f0Sopenharmony_ci{ 715d5ac70f0Sopenharmony_ci if (info == NULL) 716d5ac70f0Sopenharmony_ci return -EINVAL; 717d5ac70f0Sopenharmony_ci 718d5ac70f0Sopenharmony_ci info->type = SND_CTL_ELEM_TYPE_BOOLEAN; 719d5ac70f0Sopenharmony_ci info->value.integer.min = 0; 720d5ac70f0Sopenharmony_ci info->value.integer.max = 1; 721d5ac70f0Sopenharmony_ci 722d5ac70f0Sopenharmony_ci return __snd_ctl_add_elem_set(ctl, info, element_count, member_count); 723d5ac70f0Sopenharmony_ci} 724d5ac70f0Sopenharmony_ci 725d5ac70f0Sopenharmony_ci/** 726d5ac70f0Sopenharmony_ci * \brief Create and add some user-defined control elements of enumerated type. 727d5ac70f0Sopenharmony_ci * \param ctl A handle of backend module for control interface. 728d5ac70f0Sopenharmony_ci * \param info Common information for a new element set, with ID of the first new 729d5ac70f0Sopenharmony_ci * element. 730d5ac70f0Sopenharmony_ci * \param element_count The number of elements added by this operation. 731d5ac70f0Sopenharmony_ci * \param member_count The number of members which a element has to 732d5ac70f0Sopenharmony_ci * represent its states. 733d5ac70f0Sopenharmony_ci * \param items Range of possible values (0 ... \a items - 1). 734d5ac70f0Sopenharmony_ci * \param labels An array containing \a items strings. 735d5ac70f0Sopenharmony_ci * \return Zero on success, otherwise a negative error code. 736d5ac70f0Sopenharmony_ci * 737d5ac70f0Sopenharmony_ci * This function creates some user elements with enumerated type. These elements 738d5ac70f0Sopenharmony_ci * are not controlled by device drivers in kernel. They can be operated by the 739d5ac70f0Sopenharmony_ci * same way as usual elements added by the device drivers. 740d5ac70f0Sopenharmony_ci * 741d5ac70f0Sopenharmony_ci * The name field of \a id must be set with unique value to identify new control 742d5ac70f0Sopenharmony_ci * elements. After returning, all fields of \a id are filled. A element can be 743d5ac70f0Sopenharmony_ci * identified by the combination of name and index, or by numid. 744d5ac70f0Sopenharmony_ci * 745d5ac70f0Sopenharmony_ci * All of members in the new elements are locked. The value of each member is 746d5ac70f0Sopenharmony_ci * initialized with the first entry of labels. 747d5ac70f0Sopenharmony_ci * 748d5ac70f0Sopenharmony_ci * \par Errors: 749d5ac70f0Sopenharmony_ci * <dl> 750d5ac70f0Sopenharmony_ci * <dt>-EBUSY 751d5ac70f0Sopenharmony_ci * <dd>A control element with ID \a id already exists. 752d5ac70f0Sopenharmony_ci * <dt>-EINVAL 753d5ac70f0Sopenharmony_ci * <dd>Some arguments include invalid value; i.e. \a element_count is not 754d5ac70f0Sopenharmony_ci * between 1 to 127, or \a items is not at least one, or a string in \a 755d5ac70f0Sopenharmony_ci * labels is empty, or longer than 63 bytes, or total length of the labels 756d5ac70f0Sopenharmony_ci * requires more than 64 KiB storage. 757d5ac70f0Sopenharmony_ci * <dt>-ENOMEM 758d5ac70f0Sopenharmony_ci * <dd>Out of memory, or there are too many user control elements. 759d5ac70f0Sopenharmony_ci * <dt>-ENXIO 760d5ac70f0Sopenharmony_ci * <dd>This driver does not support (enumerated) user controls. 761d5ac70f0Sopenharmony_ci * <dt>-ENODEV 762d5ac70f0Sopenharmony_ci * <dd>Device unplugged. 763d5ac70f0Sopenharmony_ci * </dl> 764d5ac70f0Sopenharmony_ci * 765d5ac70f0Sopenharmony_ci * \par Compatibility: 766d5ac70f0Sopenharmony_ci * This function is added in version 1.1.2. 767d5ac70f0Sopenharmony_ci */ 768d5ac70f0Sopenharmony_ciint snd_ctl_add_enumerated_elem_set(snd_ctl_t *ctl, snd_ctl_elem_info_t *info, 769d5ac70f0Sopenharmony_ci unsigned int element_count, 770d5ac70f0Sopenharmony_ci unsigned int member_count, 771d5ac70f0Sopenharmony_ci unsigned int items, 772d5ac70f0Sopenharmony_ci const char *const labels[]) 773d5ac70f0Sopenharmony_ci{ 774d5ac70f0Sopenharmony_ci unsigned int i, bytes; 775d5ac70f0Sopenharmony_ci char *buf, *p; 776d5ac70f0Sopenharmony_ci int err; 777d5ac70f0Sopenharmony_ci 778d5ac70f0Sopenharmony_ci if (info == NULL || labels == NULL) 779d5ac70f0Sopenharmony_ci return -EINVAL; 780d5ac70f0Sopenharmony_ci 781d5ac70f0Sopenharmony_ci info->type = SND_CTL_ELEM_TYPE_ENUMERATED; 782d5ac70f0Sopenharmony_ci info->owner = element_count; 783d5ac70f0Sopenharmony_ci info->count = member_count; 784d5ac70f0Sopenharmony_ci info->value.enumerated.items = items; 785d5ac70f0Sopenharmony_ci 786d5ac70f0Sopenharmony_ci bytes = 0; 787d5ac70f0Sopenharmony_ci for (i = 0; i < items; ++i) 788d5ac70f0Sopenharmony_ci bytes += strlen(labels[i]) + 1; 789d5ac70f0Sopenharmony_ci if (bytes == 0) 790d5ac70f0Sopenharmony_ci return -EINVAL; 791d5ac70f0Sopenharmony_ci buf = malloc(bytes); 792d5ac70f0Sopenharmony_ci if (buf == NULL) 793d5ac70f0Sopenharmony_ci return -ENOMEM; 794d5ac70f0Sopenharmony_ci info->value.enumerated.names_ptr = (uintptr_t)buf; 795d5ac70f0Sopenharmony_ci info->value.enumerated.names_length = bytes; 796d5ac70f0Sopenharmony_ci p = buf; 797d5ac70f0Sopenharmony_ci for (i = 0; i < items; ++i) { 798d5ac70f0Sopenharmony_ci strcpy(p, labels[i]); 799d5ac70f0Sopenharmony_ci p += strlen(labels[i]) + 1; 800d5ac70f0Sopenharmony_ci } 801d5ac70f0Sopenharmony_ci 802d5ac70f0Sopenharmony_ci err = __snd_ctl_add_elem_set(ctl, info, element_count, member_count); 803d5ac70f0Sopenharmony_ci 804d5ac70f0Sopenharmony_ci free(buf); 805d5ac70f0Sopenharmony_ci 806d5ac70f0Sopenharmony_ci return err; 807d5ac70f0Sopenharmony_ci} 808d5ac70f0Sopenharmony_ci 809d5ac70f0Sopenharmony_ci/** 810d5ac70f0Sopenharmony_ci * \brief Create and add some user-defined control elements of bytes type. 811d5ac70f0Sopenharmony_ci * \param ctl A handle of backend module for control interface. 812d5ac70f0Sopenharmony_ci * \param info Common information for a new element set, with ID of the first new 813d5ac70f0Sopenharmony_ci * element. 814d5ac70f0Sopenharmony_ci * \param element_count The number of elements added by this operation. 815d5ac70f0Sopenharmony_ci * \param member_count The number of members which a element has to 816d5ac70f0Sopenharmony_ci * represent its states. 817d5ac70f0Sopenharmony_ci * \return Zero on success, otherwise a negative error code. 818d5ac70f0Sopenharmony_ci * 819d5ac70f0Sopenharmony_ci * This function creates some user elements with bytes type. These elements are 820d5ac70f0Sopenharmony_ci * not controlled by device drivers in kernel. They can be operated by the same 821d5ac70f0Sopenharmony_ci * way as usual elements added by the device drivers. 822d5ac70f0Sopenharmony_ci * 823d5ac70f0Sopenharmony_ci * The name field of \a id must be set with unique value to identify new control 824d5ac70f0Sopenharmony_ci * elements. After returning, all fields of \a id are filled. A element can be 825d5ac70f0Sopenharmony_ci * identified by the combination of name and index, or by numid. 826d5ac70f0Sopenharmony_ci * 827d5ac70f0Sopenharmony_ci * All of members in the new elements are locked. The value of each member is 828d5ac70f0Sopenharmony_ci * initialized with the minimum value. 829d5ac70f0Sopenharmony_ci * 830d5ac70f0Sopenharmony_ci * \par Errors: 831d5ac70f0Sopenharmony_ci * <dl> 832d5ac70f0Sopenharmony_ci * <dt>-EBUSY 833d5ac70f0Sopenharmony_ci * <dd>A element with ID \a id already exists. 834d5ac70f0Sopenharmony_ci * <dt>-EINVAL 835d5ac70f0Sopenharmony_ci * <dd>Some arguments include invalid value; i.e. ID has no name, or the number 836d5ac70f0Sopenharmony_ci * of members is not between 1 to 511. 837d5ac70f0Sopenharmony_ci * <dt>-ENOMEM 838d5ac70f0Sopenharmony_ci * <dd>Out of memory, or there are too many user elements. 839d5ac70f0Sopenharmony_ci * <dt>-ENXIO 840d5ac70f0Sopenharmony_ci * <dd>This backend module does not support user elements of bytes type. 841d5ac70f0Sopenharmony_ci * <dt>-ENODEV 842d5ac70f0Sopenharmony_ci * <dd>Device unplugged. 843d5ac70f0Sopenharmony_ci * </dl> 844d5ac70f0Sopenharmony_ci * 845d5ac70f0Sopenharmony_ci * \par Compatibility: 846d5ac70f0Sopenharmony_ci * This function is added in version 1.1.2. 847d5ac70f0Sopenharmony_ci */ 848d5ac70f0Sopenharmony_ciint snd_ctl_add_bytes_elem_set(snd_ctl_t *ctl, snd_ctl_elem_info_t *info, 849d5ac70f0Sopenharmony_ci unsigned int element_count, 850d5ac70f0Sopenharmony_ci unsigned int member_count) 851d5ac70f0Sopenharmony_ci{ 852d5ac70f0Sopenharmony_ci if (info == NULL) 853d5ac70f0Sopenharmony_ci return -EINVAL; 854d5ac70f0Sopenharmony_ci 855d5ac70f0Sopenharmony_ci info->type = SND_CTL_ELEM_TYPE_BYTES; 856d5ac70f0Sopenharmony_ci 857d5ac70f0Sopenharmony_ci return __snd_ctl_add_elem_set(ctl, info, element_count, member_count); 858d5ac70f0Sopenharmony_ci} 859d5ac70f0Sopenharmony_ci 860d5ac70f0Sopenharmony_ci/** 861d5ac70f0Sopenharmony_ci * \brief Create and add an user-defined control element of integer type. 862d5ac70f0Sopenharmony_ci * 863d5ac70f0Sopenharmony_ci * This is a wrapper function to snd_ctl_add_integer_elem_set() for a control 864d5ac70f0Sopenharmony_ci * element. This doesn't fill the id data with full information, thus it's 865d5ac70f0Sopenharmony_ci * recommended to use snd_ctl_add_integer_elem_set(), instead. 866d5ac70f0Sopenharmony_ci */ 867d5ac70f0Sopenharmony_ciint snd_ctl_elem_add_integer(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id, 868d5ac70f0Sopenharmony_ci unsigned int member_count, 869d5ac70f0Sopenharmony_ci long min, long max, long step) 870d5ac70f0Sopenharmony_ci{ 871d5ac70f0Sopenharmony_ci snd_ctl_elem_info_t info = {0}; 872d5ac70f0Sopenharmony_ci 873d5ac70f0Sopenharmony_ci assert(ctl && id && id->name[0]); 874d5ac70f0Sopenharmony_ci 875d5ac70f0Sopenharmony_ci info.id = *id; 876d5ac70f0Sopenharmony_ci 877d5ac70f0Sopenharmony_ci return snd_ctl_add_integer_elem_set(ctl, &info, 1, member_count, 878d5ac70f0Sopenharmony_ci min, max, step); 879d5ac70f0Sopenharmony_ci} 880d5ac70f0Sopenharmony_ci 881d5ac70f0Sopenharmony_ci/** 882d5ac70f0Sopenharmony_ci * \brief Create and add an user-defined control element of integer64 type. 883d5ac70f0Sopenharmony_ci * 884d5ac70f0Sopenharmony_ci * This is a wrapper function to snd_ctl_add_integer64_elem_set() for a single 885d5ac70f0Sopenharmony_ci * control element. This doesn't fill the id data with full information, thus 886d5ac70f0Sopenharmony_ci * it's recommended to use snd_ctl_add_integer64_elem_set(), instead. 887d5ac70f0Sopenharmony_ci */ 888d5ac70f0Sopenharmony_ciint snd_ctl_elem_add_integer64(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id, 889d5ac70f0Sopenharmony_ci unsigned int member_count, 890d5ac70f0Sopenharmony_ci long long min, long long max, long long step) 891d5ac70f0Sopenharmony_ci{ 892d5ac70f0Sopenharmony_ci snd_ctl_elem_info_t info = {0}; 893d5ac70f0Sopenharmony_ci 894d5ac70f0Sopenharmony_ci assert(ctl && id && id->name[0]); 895d5ac70f0Sopenharmony_ci 896d5ac70f0Sopenharmony_ci info.id = *id; 897d5ac70f0Sopenharmony_ci 898d5ac70f0Sopenharmony_ci return snd_ctl_add_integer64_elem_set(ctl, &info, 1, member_count, 899d5ac70f0Sopenharmony_ci min, max, step); 900d5ac70f0Sopenharmony_ci} 901d5ac70f0Sopenharmony_ci 902d5ac70f0Sopenharmony_ci/** 903d5ac70f0Sopenharmony_ci * \brief Create and add an user-defined control element of boolean type. 904d5ac70f0Sopenharmony_ci * 905d5ac70f0Sopenharmony_ci * This is a wrapper function to snd_ctl_add_boolean_elem_set() for a single 906d5ac70f0Sopenharmony_ci * control element. This doesn't fill the id data with full information, thus 907d5ac70f0Sopenharmony_ci * it's recommended to use snd_ctl_add_boolean_elem_set(), instead. 908d5ac70f0Sopenharmony_ci */ 909d5ac70f0Sopenharmony_ciint snd_ctl_elem_add_boolean(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id, 910d5ac70f0Sopenharmony_ci unsigned int member_count) 911d5ac70f0Sopenharmony_ci{ 912d5ac70f0Sopenharmony_ci snd_ctl_elem_info_t info = {0}; 913d5ac70f0Sopenharmony_ci 914d5ac70f0Sopenharmony_ci assert(ctl && id && id->name[0]); 915d5ac70f0Sopenharmony_ci 916d5ac70f0Sopenharmony_ci info.id = *id; 917d5ac70f0Sopenharmony_ci 918d5ac70f0Sopenharmony_ci return snd_ctl_add_boolean_elem_set(ctl, &info, 1, member_count); 919d5ac70f0Sopenharmony_ci} 920d5ac70f0Sopenharmony_ci 921d5ac70f0Sopenharmony_ci/** 922d5ac70f0Sopenharmony_ci * \brief Create and add a user-defined control element of enumerated type. 923d5ac70f0Sopenharmony_ci * 924d5ac70f0Sopenharmony_ci * This is a wrapper function to snd_ctl_add_enumerated_elem_set() for a single 925d5ac70f0Sopenharmony_ci * control element. This doesn't fill the id data with full information, thus 926d5ac70f0Sopenharmony_ci * it's recommended to use snd_ctl_add_enumerated_elem_set(), instead. 927d5ac70f0Sopenharmony_ci * 928d5ac70f0Sopenharmony_ci * This function is added in version 1.0.25. 929d5ac70f0Sopenharmony_ci */ 930d5ac70f0Sopenharmony_ciint snd_ctl_elem_add_enumerated(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id, 931d5ac70f0Sopenharmony_ci unsigned int member_count, unsigned int items, 932d5ac70f0Sopenharmony_ci const char *const labels[]) 933d5ac70f0Sopenharmony_ci{ 934d5ac70f0Sopenharmony_ci snd_ctl_elem_info_t info = {0}; 935d5ac70f0Sopenharmony_ci 936d5ac70f0Sopenharmony_ci assert(ctl && id && id->name[0] && labels); 937d5ac70f0Sopenharmony_ci 938d5ac70f0Sopenharmony_ci info.id = *id; 939d5ac70f0Sopenharmony_ci 940d5ac70f0Sopenharmony_ci return snd_ctl_add_enumerated_elem_set(ctl, &info, 1, member_count, 941d5ac70f0Sopenharmony_ci items, labels); 942d5ac70f0Sopenharmony_ci} 943d5ac70f0Sopenharmony_ci 944d5ac70f0Sopenharmony_ci/** 945d5ac70f0Sopenharmony_ci * \brief Create and add a user-defined control element of IEC958 type. 946d5ac70f0Sopenharmony_ci * \param[in] ctl A handle of backend module for control interface. 947d5ac70f0Sopenharmony_ci * \param[in,out] id ID of the new control element. 948d5ac70f0Sopenharmony_ci * 949d5ac70f0Sopenharmony_ci * This function creates an user element with IEC958 type. This element is not 950d5ac70f0Sopenharmony_ci * controlled by device drivers in kernel. It can be operated by the same way as 951d5ac70f0Sopenharmony_ci * usual elements added by the device drivers. 952d5ac70f0Sopenharmony_ci * 953d5ac70f0Sopenharmony_ci * The name field of \a id must be set with unique value to identify a new 954d5ac70f0Sopenharmony_ci * control element. After returning, all fields of \a id are filled. A element 955d5ac70f0Sopenharmony_ci * can be identified by the combination of name and index, or by numid. 956d5ac70f0Sopenharmony_ci * 957d5ac70f0Sopenharmony_ci * A member in the new element is locked and filled with zero. 958d5ac70f0Sopenharmony_ci * 959d5ac70f0Sopenharmony_ci * \par Errors: 960d5ac70f0Sopenharmony_ci * <dl> 961d5ac70f0Sopenharmony_ci * <dt>-EBUSY 962d5ac70f0Sopenharmony_ci * <dd>A control element with ID \a id already exists. 963d5ac70f0Sopenharmony_ci * <dt>-EINVAL 964d5ac70f0Sopenharmony_ci * <dd>ID has no name. 965d5ac70f0Sopenharmony_ci * <dt>-ENOMEM 966d5ac70f0Sopenharmony_ci * <dd>Out of memory, or there are too many user elements. 967d5ac70f0Sopenharmony_ci * <dt>-ENXIO 968d5ac70f0Sopenharmony_ci * <dd>This backend module does not support user elements of IEC958 type. 969d5ac70f0Sopenharmony_ci * <dt>-ENODEV 970d5ac70f0Sopenharmony_ci * <dd>Device unplugged. 971d5ac70f0Sopenharmony_ci * </dl> 972d5ac70f0Sopenharmony_ci */ 973d5ac70f0Sopenharmony_ciint snd_ctl_elem_add_iec958(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id) 974d5ac70f0Sopenharmony_ci{ 975d5ac70f0Sopenharmony_ci snd_ctl_elem_info_t info = {0}; 976d5ac70f0Sopenharmony_ci 977d5ac70f0Sopenharmony_ci assert(ctl && id && id->name[0]); 978d5ac70f0Sopenharmony_ci 979d5ac70f0Sopenharmony_ci info.id = *id; 980d5ac70f0Sopenharmony_ci info.type = SND_CTL_ELEM_TYPE_IEC958; 981d5ac70f0Sopenharmony_ci info.owner = 1; 982d5ac70f0Sopenharmony_ci info.count = 1; 983d5ac70f0Sopenharmony_ci return ctl->ops->element_add(ctl, &info); 984d5ac70f0Sopenharmony_ci} 985d5ac70f0Sopenharmony_ci 986d5ac70f0Sopenharmony_ci/** 987d5ac70f0Sopenharmony_ci * \brief Remove an user CTL element 988d5ac70f0Sopenharmony_ci * \param ctl CTL handle 989d5ac70f0Sopenharmony_ci * \param id CTL element identification 990d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 991d5ac70f0Sopenharmony_ci */ 992d5ac70f0Sopenharmony_ciint snd_ctl_elem_remove(snd_ctl_t *ctl, snd_ctl_elem_id_t *id) 993d5ac70f0Sopenharmony_ci{ 994d5ac70f0Sopenharmony_ci assert(ctl && id && (id->name[0] || id->numid)); 995d5ac70f0Sopenharmony_ci return ctl->ops->element_remove(ctl, id); 996d5ac70f0Sopenharmony_ci} 997d5ac70f0Sopenharmony_ci 998d5ac70f0Sopenharmony_ci/** 999d5ac70f0Sopenharmony_ci * \brief Get CTL element value. 1000d5ac70f0Sopenharmony_ci * 1001d5ac70f0Sopenharmony_ci * Read information from sound card. You must set the ID of the 1002d5ac70f0Sopenharmony_ci * element before calling this function. 1003d5ac70f0Sopenharmony_ci * 1004d5ac70f0Sopenharmony_ci * See snd_ctl_elem_value_t for details. 1005d5ac70f0Sopenharmony_ci * 1006d5ac70f0Sopenharmony_ci * \param ctl CTL handle. 1007d5ac70f0Sopenharmony_ci * \param data The element value. The ID must be set before calling 1008d5ac70f0Sopenharmony_ci * the function, and the actual value will be returned 1009d5ac70f0Sopenharmony_ci * here. 1010d5ac70f0Sopenharmony_ci * 1011d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code. 1012d5ac70f0Sopenharmony_ci */ 1013d5ac70f0Sopenharmony_ciint snd_ctl_elem_read(snd_ctl_t *ctl, snd_ctl_elem_value_t *data) 1014d5ac70f0Sopenharmony_ci{ 1015d5ac70f0Sopenharmony_ci assert(ctl && data && (data->id.name[0] || data->id.numid)); 1016d5ac70f0Sopenharmony_ci return ctl->ops->element_read(ctl, data); 1017d5ac70f0Sopenharmony_ci} 1018d5ac70f0Sopenharmony_ci 1019d5ac70f0Sopenharmony_ci/** 1020d5ac70f0Sopenharmony_ci * \brief Set CTL element value. 1021d5ac70f0Sopenharmony_ci * 1022d5ac70f0Sopenharmony_ci * Write new value(s) to the sound card. You must set the ID and the 1023d5ac70f0Sopenharmony_ci * value of the element before calling this function. 1024d5ac70f0Sopenharmony_ci * 1025d5ac70f0Sopenharmony_ci * See snd_ctl_elem_value_t for details. 1026d5ac70f0Sopenharmony_ci * 1027d5ac70f0Sopenharmony_ci * \param ctl CTL handle. 1028d5ac70f0Sopenharmony_ci * \param data The new value. 1029d5ac70f0Sopenharmony_ci * 1030d5ac70f0Sopenharmony_ci * \retval 0 on success 1031d5ac70f0Sopenharmony_ci * \retval >0 on success when value was changed 1032d5ac70f0Sopenharmony_ci * \retval <0 a negative error code 1033d5ac70f0Sopenharmony_ci */ 1034d5ac70f0Sopenharmony_ciint snd_ctl_elem_write(snd_ctl_t *ctl, snd_ctl_elem_value_t *data) 1035d5ac70f0Sopenharmony_ci{ 1036d5ac70f0Sopenharmony_ci assert(ctl && data && (data->id.name[0] || data->id.numid)); 1037d5ac70f0Sopenharmony_ci return ctl->ops->element_write(ctl, data); 1038d5ac70f0Sopenharmony_ci} 1039d5ac70f0Sopenharmony_ci 1040d5ac70f0Sopenharmony_cistatic int snd_ctl_tlv_do(snd_ctl_t *ctl, int op_flag, 1041d5ac70f0Sopenharmony_ci const snd_ctl_elem_id_t *id, 1042d5ac70f0Sopenharmony_ci unsigned int *tlv, unsigned int tlv_size) 1043d5ac70f0Sopenharmony_ci{ 1044d5ac70f0Sopenharmony_ci snd_ctl_elem_info_t *info = NULL; 1045d5ac70f0Sopenharmony_ci int err; 1046d5ac70f0Sopenharmony_ci 1047d5ac70f0Sopenharmony_ci if (id->numid == 0) { 1048d5ac70f0Sopenharmony_ci info = calloc(1, sizeof(*info)); 1049d5ac70f0Sopenharmony_ci if (info == NULL) 1050d5ac70f0Sopenharmony_ci return -ENOMEM; 1051d5ac70f0Sopenharmony_ci info->id = *id; 1052d5ac70f0Sopenharmony_ci id = &info->id; 1053d5ac70f0Sopenharmony_ci err = snd_ctl_elem_info(ctl, info); 1054d5ac70f0Sopenharmony_ci if (err < 0) 1055d5ac70f0Sopenharmony_ci goto __err; 1056d5ac70f0Sopenharmony_ci if (id->numid == 0) { 1057d5ac70f0Sopenharmony_ci err = -ENOENT; 1058d5ac70f0Sopenharmony_ci goto __err; 1059d5ac70f0Sopenharmony_ci } 1060d5ac70f0Sopenharmony_ci } 1061d5ac70f0Sopenharmony_ci err = ctl->ops->element_tlv(ctl, op_flag, id->numid, tlv, tlv_size); 1062d5ac70f0Sopenharmony_ci __err: 1063d5ac70f0Sopenharmony_ci if (info) 1064d5ac70f0Sopenharmony_ci free(info); 1065d5ac70f0Sopenharmony_ci return err; 1066d5ac70f0Sopenharmony_ci} 1067d5ac70f0Sopenharmony_ci 1068d5ac70f0Sopenharmony_ci/** 1069d5ac70f0Sopenharmony_ci * \brief Read structured data from an element set to given buffer. 1070d5ac70f0Sopenharmony_ci * \param ctl A handle of backend module for control interface. 1071d5ac70f0Sopenharmony_ci * \param id ID of an element. 1072d5ac70f0Sopenharmony_ci * \param tlv An array with members of unsigned int type. 1073d5ac70f0Sopenharmony_ci * \param tlv_size The length of the array. 1074d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 1075d5ac70f0Sopenharmony_ci * 1076d5ac70f0Sopenharmony_ci * The format of an array of \a tlv argument is: 1077d5ac70f0Sopenharmony_ci * tlv[0]: Type. One of SND_CTL_TLVT_XXX. 1078d5ac70f0Sopenharmony_ci * tlv[1]: Length. The length of value in units of byte. 1079d5ac70f0Sopenharmony_ci * tlv[2..]: Value. Depending on the type. 1080d5ac70f0Sopenharmony_ci * 1081d5ac70f0Sopenharmony_ci * Details are described in <sound/tlv.h>. 1082d5ac70f0Sopenharmony_ci */ 1083d5ac70f0Sopenharmony_ciint snd_ctl_elem_tlv_read(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id, 1084d5ac70f0Sopenharmony_ci unsigned int *tlv, unsigned int tlv_size) 1085d5ac70f0Sopenharmony_ci{ 1086d5ac70f0Sopenharmony_ci int err; 1087d5ac70f0Sopenharmony_ci assert(ctl && id && (id->name[0] || id->numid) && tlv); 1088d5ac70f0Sopenharmony_ci if (tlv_size < 2 * sizeof(int)) 1089d5ac70f0Sopenharmony_ci return -EINVAL; 1090d5ac70f0Sopenharmony_ci /* 1.0.12 driver doesn't return the error even if the user TLV 1091d5ac70f0Sopenharmony_ci * is empty. So, initialize TLV here with an invalid type 1092d5ac70f0Sopenharmony_ci * and compare the returned value after ioctl for checking 1093d5ac70f0Sopenharmony_ci * the validity of TLV. 1094d5ac70f0Sopenharmony_ci */ 1095d5ac70f0Sopenharmony_ci tlv[SNDRV_CTL_TLVO_TYPE] = -1; 1096d5ac70f0Sopenharmony_ci tlv[SNDRV_CTL_TLVO_LEN] = 0; 1097d5ac70f0Sopenharmony_ci err = snd_ctl_tlv_do(ctl, 0, id, tlv, tlv_size); 1098d5ac70f0Sopenharmony_ci if (err >= 0 && tlv[SNDRV_CTL_TLVO_TYPE] == (unsigned int)-1) 1099d5ac70f0Sopenharmony_ci err = -ENXIO; 1100d5ac70f0Sopenharmony_ci return err; 1101d5ac70f0Sopenharmony_ci} 1102d5ac70f0Sopenharmony_ci 1103d5ac70f0Sopenharmony_ci/** 1104d5ac70f0Sopenharmony_ci * \brief Write structured data from given buffer to an element set. 1105d5ac70f0Sopenharmony_ci * \param ctl A handle of backend module for control interface. 1106d5ac70f0Sopenharmony_ci * \param id ID of an element. 1107d5ac70f0Sopenharmony_ci * \param tlv An array with members of unsigned int type. The second member 1108d5ac70f0Sopenharmony_ci * must represent total bytes of the rest of array. 1109d5ac70f0Sopenharmony_ci * \retval 0 on success 1110d5ac70f0Sopenharmony_ci * \retval >0 on success when value was changed 1111d5ac70f0Sopenharmony_ci * \retval <0 a negative error code 1112d5ac70f0Sopenharmony_ci * 1113d5ac70f0Sopenharmony_ci * The format of an array of \a tlv argument is: 1114d5ac70f0Sopenharmony_ci * tlv[0]: Type. One of SND_CTL_TLVT_XXX. 1115d5ac70f0Sopenharmony_ci * tlv[1]: Length. The length of value in units of byte. 1116d5ac70f0Sopenharmony_ci * tlv[2..]: Value. Depending on the type. 1117d5ac70f0Sopenharmony_ci * 1118d5ac70f0Sopenharmony_ci * Details are described in <sound/tlv.h>. 1119d5ac70f0Sopenharmony_ci */ 1120d5ac70f0Sopenharmony_ciint snd_ctl_elem_tlv_write(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id, 1121d5ac70f0Sopenharmony_ci const unsigned int *tlv) 1122d5ac70f0Sopenharmony_ci{ 1123d5ac70f0Sopenharmony_ci assert(ctl && id && (id->name[0] || id->numid) && tlv); 1124d5ac70f0Sopenharmony_ci return snd_ctl_tlv_do(ctl, 1, id, (unsigned int *)tlv, 1125d5ac70f0Sopenharmony_ci tlv[SNDRV_CTL_TLVO_LEN] + 2 * sizeof(unsigned int)); 1126d5ac70f0Sopenharmony_ci} 1127d5ac70f0Sopenharmony_ci 1128d5ac70f0Sopenharmony_ci/** 1129d5ac70f0Sopenharmony_ci * \brief Process structured data from given buffer for an element set. 1130d5ac70f0Sopenharmony_ci * \param ctl A handle of backend module for control interface. 1131d5ac70f0Sopenharmony_ci * \param id ID of an element. 1132d5ac70f0Sopenharmony_ci * \param tlv An array with members of unsigned int type. The second member 1133d5ac70f0Sopenharmony_ci * must represent total bytes of the rest of array. 1134d5ac70f0Sopenharmony_ci * \retval 0 on success 1135d5ac70f0Sopenharmony_ci * \retval >0 on success when value was changed 1136d5ac70f0Sopenharmony_ci * \retval <0 a negative error code 1137d5ac70f0Sopenharmony_ci * 1138d5ac70f0Sopenharmony_ci * The format of an array of \a tlv argument is: 1139d5ac70f0Sopenharmony_ci * tlv[0]: Type. One of SND_CTL_TLVT_XXX. 1140d5ac70f0Sopenharmony_ci * tlv[1]: Length. The length of value in units of byte. 1141d5ac70f0Sopenharmony_ci * tlv[2..]: Value. Depending on the type. 1142d5ac70f0Sopenharmony_ci * 1143d5ac70f0Sopenharmony_ci * Details are described in <sound/tlv.h>. 1144d5ac70f0Sopenharmony_ci */ 1145d5ac70f0Sopenharmony_ciint snd_ctl_elem_tlv_command(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id, 1146d5ac70f0Sopenharmony_ci const unsigned int *tlv) 1147d5ac70f0Sopenharmony_ci{ 1148d5ac70f0Sopenharmony_ci assert(ctl && id && (id->name[0] || id->numid) && tlv); 1149d5ac70f0Sopenharmony_ci return snd_ctl_tlv_do(ctl, -1, id, (unsigned int *)tlv, 1150d5ac70f0Sopenharmony_ci tlv[SNDRV_CTL_TLVO_LEN] + 2 * sizeof(unsigned int)); 1151d5ac70f0Sopenharmony_ci} 1152d5ac70f0Sopenharmony_ci 1153d5ac70f0Sopenharmony_ci/** 1154d5ac70f0Sopenharmony_ci * \brief Lock CTL element 1155d5ac70f0Sopenharmony_ci * \param ctl CTL handle 1156d5ac70f0Sopenharmony_ci * \param id CTL element id pointer 1157d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 1158d5ac70f0Sopenharmony_ci */ 1159d5ac70f0Sopenharmony_ciint snd_ctl_elem_lock(snd_ctl_t *ctl, snd_ctl_elem_id_t *id) 1160d5ac70f0Sopenharmony_ci{ 1161d5ac70f0Sopenharmony_ci assert(ctl && id); 1162d5ac70f0Sopenharmony_ci return ctl->ops->element_lock(ctl, id); 1163d5ac70f0Sopenharmony_ci} 1164d5ac70f0Sopenharmony_ci 1165d5ac70f0Sopenharmony_ci/** 1166d5ac70f0Sopenharmony_ci * \brief Unlock CTL element 1167d5ac70f0Sopenharmony_ci * \param ctl CTL handle 1168d5ac70f0Sopenharmony_ci * \param id CTL element id pointer 1169d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 1170d5ac70f0Sopenharmony_ci */ 1171d5ac70f0Sopenharmony_ciint snd_ctl_elem_unlock(snd_ctl_t *ctl, snd_ctl_elem_id_t *id) 1172d5ac70f0Sopenharmony_ci{ 1173d5ac70f0Sopenharmony_ci assert(ctl && id); 1174d5ac70f0Sopenharmony_ci return ctl->ops->element_unlock(ctl, id); 1175d5ac70f0Sopenharmony_ci} 1176d5ac70f0Sopenharmony_ci 1177d5ac70f0Sopenharmony_ci/** 1178d5ac70f0Sopenharmony_ci * \brief Get next hardware dependent device number 1179d5ac70f0Sopenharmony_ci * \param ctl CTL handle 1180d5ac70f0Sopenharmony_ci * \param device current device on entry and next device on return 1181d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 1182d5ac70f0Sopenharmony_ci */ 1183d5ac70f0Sopenharmony_ciint snd_ctl_hwdep_next_device(snd_ctl_t *ctl, int *device) 1184d5ac70f0Sopenharmony_ci{ 1185d5ac70f0Sopenharmony_ci assert(ctl && device); 1186d5ac70f0Sopenharmony_ci return ctl->ops->hwdep_next_device(ctl, device); 1187d5ac70f0Sopenharmony_ci} 1188d5ac70f0Sopenharmony_ci 1189d5ac70f0Sopenharmony_ci/** 1190d5ac70f0Sopenharmony_ci * \brief Get info about a hardware dependent device 1191d5ac70f0Sopenharmony_ci * \param ctl CTL handle 1192d5ac70f0Sopenharmony_ci * \param info Hardware dependent device id/info pointer 1193d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 1194d5ac70f0Sopenharmony_ci */ 1195d5ac70f0Sopenharmony_ciint snd_ctl_hwdep_info(snd_ctl_t *ctl, snd_hwdep_info_t * info) 1196d5ac70f0Sopenharmony_ci{ 1197d5ac70f0Sopenharmony_ci assert(ctl && info); 1198d5ac70f0Sopenharmony_ci return ctl->ops->hwdep_info(ctl, info); 1199d5ac70f0Sopenharmony_ci} 1200d5ac70f0Sopenharmony_ci 1201d5ac70f0Sopenharmony_ci/** 1202d5ac70f0Sopenharmony_ci * \brief Get next PCM device number 1203d5ac70f0Sopenharmony_ci * \param ctl CTL handle 1204d5ac70f0Sopenharmony_ci * \param device current device on entry and next device on return 1205d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 1206d5ac70f0Sopenharmony_ci */ 1207d5ac70f0Sopenharmony_ciint snd_ctl_pcm_next_device(snd_ctl_t *ctl, int * device) 1208d5ac70f0Sopenharmony_ci{ 1209d5ac70f0Sopenharmony_ci assert(ctl && device); 1210d5ac70f0Sopenharmony_ci return ctl->ops->pcm_next_device(ctl, device); 1211d5ac70f0Sopenharmony_ci} 1212d5ac70f0Sopenharmony_ci 1213d5ac70f0Sopenharmony_ci/** 1214d5ac70f0Sopenharmony_ci * \brief Get info about a PCM device 1215d5ac70f0Sopenharmony_ci * \param ctl CTL handle 1216d5ac70f0Sopenharmony_ci * \param info PCM device id/info pointer 1217d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 1218d5ac70f0Sopenharmony_ci */ 1219d5ac70f0Sopenharmony_ciint snd_ctl_pcm_info(snd_ctl_t *ctl, snd_pcm_info_t * info) 1220d5ac70f0Sopenharmony_ci{ 1221d5ac70f0Sopenharmony_ci assert(ctl && info); 1222d5ac70f0Sopenharmony_ci return ctl->ops->pcm_info(ctl, info); 1223d5ac70f0Sopenharmony_ci} 1224d5ac70f0Sopenharmony_ci 1225d5ac70f0Sopenharmony_ci/** 1226d5ac70f0Sopenharmony_ci * \brief Set preferred PCM subdevice number of successive PCM open 1227d5ac70f0Sopenharmony_ci * \param ctl CTL handle 1228d5ac70f0Sopenharmony_ci * \param subdev Preferred PCM subdevice number 1229d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 1230d5ac70f0Sopenharmony_ci */ 1231d5ac70f0Sopenharmony_ciint snd_ctl_pcm_prefer_subdevice(snd_ctl_t *ctl, int subdev) 1232d5ac70f0Sopenharmony_ci{ 1233d5ac70f0Sopenharmony_ci assert(ctl); 1234d5ac70f0Sopenharmony_ci return ctl->ops->pcm_prefer_subdevice(ctl, subdev); 1235d5ac70f0Sopenharmony_ci} 1236d5ac70f0Sopenharmony_ci 1237d5ac70f0Sopenharmony_ci/** 1238d5ac70f0Sopenharmony_ci * \brief Get next RawMidi device number 1239d5ac70f0Sopenharmony_ci * \param ctl CTL handle 1240d5ac70f0Sopenharmony_ci * \param device current device on entry and next device on return 1241d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 1242d5ac70f0Sopenharmony_ci */ 1243d5ac70f0Sopenharmony_ciint snd_ctl_rawmidi_next_device(snd_ctl_t *ctl, int * device) 1244d5ac70f0Sopenharmony_ci{ 1245d5ac70f0Sopenharmony_ci assert(ctl && device); 1246d5ac70f0Sopenharmony_ci return ctl->ops->rawmidi_next_device(ctl, device); 1247d5ac70f0Sopenharmony_ci} 1248d5ac70f0Sopenharmony_ci 1249d5ac70f0Sopenharmony_ci/** 1250d5ac70f0Sopenharmony_ci * \brief Get info about a RawMidi device 1251d5ac70f0Sopenharmony_ci * \param ctl CTL handle 1252d5ac70f0Sopenharmony_ci * \param info RawMidi device id/info pointer 1253d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 1254d5ac70f0Sopenharmony_ci */ 1255d5ac70f0Sopenharmony_ciint snd_ctl_rawmidi_info(snd_ctl_t *ctl, snd_rawmidi_info_t * info) 1256d5ac70f0Sopenharmony_ci{ 1257d5ac70f0Sopenharmony_ci assert(ctl && info); 1258d5ac70f0Sopenharmony_ci return ctl->ops->rawmidi_info(ctl, info); 1259d5ac70f0Sopenharmony_ci} 1260d5ac70f0Sopenharmony_ci 1261d5ac70f0Sopenharmony_ci/** 1262d5ac70f0Sopenharmony_ci * \brief Set preferred RawMidi subdevice number of successive RawMidi open 1263d5ac70f0Sopenharmony_ci * \param ctl CTL handle 1264d5ac70f0Sopenharmony_ci * \param subdev Preferred RawMidi subdevice number 1265d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 1266d5ac70f0Sopenharmony_ci */ 1267d5ac70f0Sopenharmony_ciint snd_ctl_rawmidi_prefer_subdevice(snd_ctl_t *ctl, int subdev) 1268d5ac70f0Sopenharmony_ci{ 1269d5ac70f0Sopenharmony_ci assert(ctl); 1270d5ac70f0Sopenharmony_ci return ctl->ops->rawmidi_prefer_subdevice(ctl, subdev); 1271d5ac70f0Sopenharmony_ci} 1272d5ac70f0Sopenharmony_ci 1273d5ac70f0Sopenharmony_ci/** 1274d5ac70f0Sopenharmony_ci * \brief Get next UMP device number 1275d5ac70f0Sopenharmony_ci * \param ctl CTL handle 1276d5ac70f0Sopenharmony_ci * \param device current device on entry and next device on return 1277d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 1278d5ac70f0Sopenharmony_ci */ 1279d5ac70f0Sopenharmony_ciint snd_ctl_ump_next_device(snd_ctl_t *ctl, int *device) 1280d5ac70f0Sopenharmony_ci{ 1281d5ac70f0Sopenharmony_ci assert(ctl && device); 1282d5ac70f0Sopenharmony_ci if (ctl->ops->ump_next_device) 1283d5ac70f0Sopenharmony_ci return ctl->ops->ump_next_device(ctl, device); 1284d5ac70f0Sopenharmony_ci return -ENXIO; 1285d5ac70f0Sopenharmony_ci} 1286d5ac70f0Sopenharmony_ci 1287d5ac70f0Sopenharmony_ci/** 1288d5ac70f0Sopenharmony_ci * \brief Get UMP Endpoint info about a UMP RawMidi device 1289d5ac70f0Sopenharmony_ci * \param ctl CTL handle 1290d5ac70f0Sopenharmony_ci * \param info UMP Endpoint info pointer 1291d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 1292d5ac70f0Sopenharmony_ci */ 1293d5ac70f0Sopenharmony_ciint snd_ctl_ump_endpoint_info(snd_ctl_t *ctl, snd_ump_endpoint_info_t *info) 1294d5ac70f0Sopenharmony_ci{ 1295d5ac70f0Sopenharmony_ci assert(ctl && info); 1296d5ac70f0Sopenharmony_ci return ctl->ops->ump_endpoint_info(ctl, info); 1297d5ac70f0Sopenharmony_ci} 1298d5ac70f0Sopenharmony_ci 1299d5ac70f0Sopenharmony_ci/** 1300d5ac70f0Sopenharmony_ci * \brief Get UMP Block info about a UMP RawMidi device 1301d5ac70f0Sopenharmony_ci * \param ctl CTL handle 1302d5ac70f0Sopenharmony_ci * \param info UMP Block info pointer 1303d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 1304d5ac70f0Sopenharmony_ci */ 1305d5ac70f0Sopenharmony_ciint snd_ctl_ump_block_info(snd_ctl_t *ctl, snd_ump_block_info_t *info) 1306d5ac70f0Sopenharmony_ci{ 1307d5ac70f0Sopenharmony_ci assert(ctl && info); 1308d5ac70f0Sopenharmony_ci return ctl->ops->ump_block_info(ctl, info); 1309d5ac70f0Sopenharmony_ci} 1310d5ac70f0Sopenharmony_ci 1311d5ac70f0Sopenharmony_ci/** 1312d5ac70f0Sopenharmony_ci * \brief Set Power State to given SND_CTL_POWER_* value and do the power management 1313d5ac70f0Sopenharmony_ci * \param ctl CTL handle 1314d5ac70f0Sopenharmony_ci * \param state Desired Power State 1315d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 1316d5ac70f0Sopenharmony_ci */ 1317d5ac70f0Sopenharmony_ciint snd_ctl_set_power_state(snd_ctl_t *ctl, unsigned int state) 1318d5ac70f0Sopenharmony_ci{ 1319d5ac70f0Sopenharmony_ci assert(ctl); 1320d5ac70f0Sopenharmony_ci if (ctl->ops->set_power_state) 1321d5ac70f0Sopenharmony_ci return ctl->ops->set_power_state(ctl, state); 1322d5ac70f0Sopenharmony_ci return -ENXIO; 1323d5ac70f0Sopenharmony_ci} 1324d5ac70f0Sopenharmony_ci 1325d5ac70f0Sopenharmony_ci/** 1326d5ac70f0Sopenharmony_ci * \brief Get actual Power State 1327d5ac70f0Sopenharmony_ci * \param ctl CTL handle 1328d5ac70f0Sopenharmony_ci * \param state Destination value 1329d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 1330d5ac70f0Sopenharmony_ci */ 1331d5ac70f0Sopenharmony_ciint snd_ctl_get_power_state(snd_ctl_t *ctl, unsigned int *state) 1332d5ac70f0Sopenharmony_ci{ 1333d5ac70f0Sopenharmony_ci assert(ctl); 1334d5ac70f0Sopenharmony_ci if (ctl->ops->get_power_state) 1335d5ac70f0Sopenharmony_ci return ctl->ops->get_power_state(ctl, state); 1336d5ac70f0Sopenharmony_ci return -ENXIO; 1337d5ac70f0Sopenharmony_ci} 1338d5ac70f0Sopenharmony_ci 1339d5ac70f0Sopenharmony_ci/** 1340d5ac70f0Sopenharmony_ci * \brief Read an event 1341d5ac70f0Sopenharmony_ci * \param ctl CTL handle 1342d5ac70f0Sopenharmony_ci * \param event Event pointer 1343d5ac70f0Sopenharmony_ci * \return number of events read otherwise a negative error code on failure 1344d5ac70f0Sopenharmony_ci */ 1345d5ac70f0Sopenharmony_ciint snd_ctl_read(snd_ctl_t *ctl, snd_ctl_event_t *event) 1346d5ac70f0Sopenharmony_ci{ 1347d5ac70f0Sopenharmony_ci assert(ctl && event); 1348d5ac70f0Sopenharmony_ci return (ctl->ops->read)(ctl, event); 1349d5ac70f0Sopenharmony_ci} 1350d5ac70f0Sopenharmony_ci 1351d5ac70f0Sopenharmony_ci/** 1352d5ac70f0Sopenharmony_ci * \brief Wait for a CTL to become ready (i.e. at least one event pending) 1353d5ac70f0Sopenharmony_ci * \param ctl CTL handle 1354d5ac70f0Sopenharmony_ci * \param timeout maximum time in milliseconds to wait 1355d5ac70f0Sopenharmony_ci * \return 0 otherwise a negative error code on failure 1356d5ac70f0Sopenharmony_ci */ 1357d5ac70f0Sopenharmony_ciint snd_ctl_wait(snd_ctl_t *ctl, int timeout) 1358d5ac70f0Sopenharmony_ci{ 1359d5ac70f0Sopenharmony_ci struct pollfd *pfd; 1360d5ac70f0Sopenharmony_ci unsigned short revents; 1361d5ac70f0Sopenharmony_ci int npfds, err, err_poll; 1362d5ac70f0Sopenharmony_ci 1363d5ac70f0Sopenharmony_ci npfds = snd_ctl_poll_descriptors_count(ctl); 1364d5ac70f0Sopenharmony_ci if (npfds <= 0 || npfds >= 16) { 1365d5ac70f0Sopenharmony_ci SNDERR("Invalid poll_fds %d", npfds); 1366d5ac70f0Sopenharmony_ci return -EIO; 1367d5ac70f0Sopenharmony_ci } 1368d5ac70f0Sopenharmony_ci pfd = alloca(sizeof(*pfd) * npfds); 1369d5ac70f0Sopenharmony_ci err = snd_ctl_poll_descriptors(ctl, pfd, npfds); 1370d5ac70f0Sopenharmony_ci if (err < 0) 1371d5ac70f0Sopenharmony_ci return err; 1372d5ac70f0Sopenharmony_ci if (err != npfds) { 1373d5ac70f0Sopenharmony_ci SNDMSG("invalid poll descriptors %d", err); 1374d5ac70f0Sopenharmony_ci return -EIO; 1375d5ac70f0Sopenharmony_ci } 1376d5ac70f0Sopenharmony_ci for (;;) { 1377d5ac70f0Sopenharmony_ci err_poll = poll(pfd, npfds, timeout); 1378d5ac70f0Sopenharmony_ci if (err_poll < 0) 1379d5ac70f0Sopenharmony_ci return -errno; 1380d5ac70f0Sopenharmony_ci if (! err_poll) 1381d5ac70f0Sopenharmony_ci return 0; 1382d5ac70f0Sopenharmony_ci err = snd_ctl_poll_descriptors_revents(ctl, pfd, npfds, &revents); 1383d5ac70f0Sopenharmony_ci if (err < 0) 1384d5ac70f0Sopenharmony_ci return err; 1385d5ac70f0Sopenharmony_ci if (revents & (POLLERR | POLLNVAL)) 1386d5ac70f0Sopenharmony_ci return -EIO; 1387d5ac70f0Sopenharmony_ci if (revents & (POLLIN | POLLOUT)) 1388d5ac70f0Sopenharmony_ci return 1; 1389d5ac70f0Sopenharmony_ci } 1390d5ac70f0Sopenharmony_ci} 1391d5ac70f0Sopenharmony_ci 1392d5ac70f0Sopenharmony_ci/** 1393d5ac70f0Sopenharmony_ci * \brief Add an async handler for a CTL 1394d5ac70f0Sopenharmony_ci * \param handler Returned handler handle 1395d5ac70f0Sopenharmony_ci * \param ctl CTL handle 1396d5ac70f0Sopenharmony_ci * \param callback Callback function 1397d5ac70f0Sopenharmony_ci * \param private_data Callback private data 1398d5ac70f0Sopenharmony_ci * \return 0 otherwise a negative error code on failure 1399d5ac70f0Sopenharmony_ci */ 1400d5ac70f0Sopenharmony_ciint snd_async_add_ctl_handler(snd_async_handler_t **handler, snd_ctl_t *ctl, 1401d5ac70f0Sopenharmony_ci snd_async_callback_t callback, void *private_data) 1402d5ac70f0Sopenharmony_ci{ 1403d5ac70f0Sopenharmony_ci int err; 1404d5ac70f0Sopenharmony_ci int was_empty; 1405d5ac70f0Sopenharmony_ci snd_async_handler_t *h; 1406d5ac70f0Sopenharmony_ci err = snd_async_add_handler(&h, _snd_ctl_async_descriptor(ctl), 1407d5ac70f0Sopenharmony_ci callback, private_data); 1408d5ac70f0Sopenharmony_ci if (err < 0) 1409d5ac70f0Sopenharmony_ci return err; 1410d5ac70f0Sopenharmony_ci h->type = SND_ASYNC_HANDLER_CTL; 1411d5ac70f0Sopenharmony_ci h->u.ctl = ctl; 1412d5ac70f0Sopenharmony_ci was_empty = list_empty(&ctl->async_handlers); 1413d5ac70f0Sopenharmony_ci list_add_tail(&h->hlist, &ctl->async_handlers); 1414d5ac70f0Sopenharmony_ci if (was_empty) { 1415d5ac70f0Sopenharmony_ci err = snd_ctl_async(ctl, snd_async_handler_get_signo(h), getpid()); 1416d5ac70f0Sopenharmony_ci if (err < 0) { 1417d5ac70f0Sopenharmony_ci snd_async_del_handler(h); 1418d5ac70f0Sopenharmony_ci return err; 1419d5ac70f0Sopenharmony_ci } 1420d5ac70f0Sopenharmony_ci } 1421d5ac70f0Sopenharmony_ci *handler = h; 1422d5ac70f0Sopenharmony_ci return 0; 1423d5ac70f0Sopenharmony_ci} 1424d5ac70f0Sopenharmony_ci 1425d5ac70f0Sopenharmony_ci/** 1426d5ac70f0Sopenharmony_ci * \brief Return CTL handle related to an async handler 1427d5ac70f0Sopenharmony_ci * \param handler Async handler handle 1428d5ac70f0Sopenharmony_ci * \return CTL handle 1429d5ac70f0Sopenharmony_ci */ 1430d5ac70f0Sopenharmony_cisnd_ctl_t *snd_async_handler_get_ctl(snd_async_handler_t *handler) 1431d5ac70f0Sopenharmony_ci{ 1432d5ac70f0Sopenharmony_ci assert(handler->type == SND_ASYNC_HANDLER_CTL); 1433d5ac70f0Sopenharmony_ci return handler->u.ctl; 1434d5ac70f0Sopenharmony_ci} 1435d5ac70f0Sopenharmony_ci 1436d5ac70f0Sopenharmony_cistatic const char *const build_in_ctls[] = { 1437d5ac70f0Sopenharmony_ci "hw", "empty", "remap", "shm", NULL 1438d5ac70f0Sopenharmony_ci}; 1439d5ac70f0Sopenharmony_ci 1440d5ac70f0Sopenharmony_cistatic int snd_ctl_open_conf(snd_ctl_t **ctlp, const char *name, 1441d5ac70f0Sopenharmony_ci snd_config_t *ctl_root, snd_config_t *ctl_conf, int mode) 1442d5ac70f0Sopenharmony_ci{ 1443d5ac70f0Sopenharmony_ci const char *str; 1444d5ac70f0Sopenharmony_ci char *buf = NULL, *buf1 = NULL; 1445d5ac70f0Sopenharmony_ci int err; 1446d5ac70f0Sopenharmony_ci snd_config_t *conf, *type_conf = NULL; 1447d5ac70f0Sopenharmony_ci snd_config_iterator_t i, next; 1448d5ac70f0Sopenharmony_ci const char *lib = NULL, *open_name = NULL; 1449d5ac70f0Sopenharmony_ci const char *id; 1450d5ac70f0Sopenharmony_ci int (*open_func)(snd_ctl_t **, const char *, snd_config_t *, snd_config_t *, int) = NULL; 1451d5ac70f0Sopenharmony_ci#ifndef PIC 1452d5ac70f0Sopenharmony_ci extern void *snd_control_open_symbols(void); 1453d5ac70f0Sopenharmony_ci#endif 1454d5ac70f0Sopenharmony_ci if (snd_config_get_type(ctl_conf) != SND_CONFIG_TYPE_COMPOUND) { 1455d5ac70f0Sopenharmony_ci if (name) 1456d5ac70f0Sopenharmony_ci SNDERR("Invalid type for CTL %s definition", name); 1457d5ac70f0Sopenharmony_ci else 1458d5ac70f0Sopenharmony_ci SNDERR("Invalid type for CTL definition"); 1459d5ac70f0Sopenharmony_ci return -EINVAL; 1460d5ac70f0Sopenharmony_ci } 1461d5ac70f0Sopenharmony_ci err = snd_config_search(ctl_conf, "type", &conf); 1462d5ac70f0Sopenharmony_ci if (err < 0) { 1463d5ac70f0Sopenharmony_ci SNDERR("type is not defined"); 1464d5ac70f0Sopenharmony_ci return err; 1465d5ac70f0Sopenharmony_ci } 1466d5ac70f0Sopenharmony_ci err = snd_config_get_id(conf, &id); 1467d5ac70f0Sopenharmony_ci if (err < 0) { 1468d5ac70f0Sopenharmony_ci SNDERR("unable to get id"); 1469d5ac70f0Sopenharmony_ci return err; 1470d5ac70f0Sopenharmony_ci } 1471d5ac70f0Sopenharmony_ci err = snd_config_get_string(conf, &str); 1472d5ac70f0Sopenharmony_ci if (err < 0) { 1473d5ac70f0Sopenharmony_ci SNDERR("Invalid type for %s", id); 1474d5ac70f0Sopenharmony_ci return err; 1475d5ac70f0Sopenharmony_ci } 1476d5ac70f0Sopenharmony_ci err = snd_config_search_definition(ctl_root, "ctl_type", str, &type_conf); 1477d5ac70f0Sopenharmony_ci if (err >= 0) { 1478d5ac70f0Sopenharmony_ci if (snd_config_get_type(type_conf) != SND_CONFIG_TYPE_COMPOUND) { 1479d5ac70f0Sopenharmony_ci SNDERR("Invalid type for CTL type %s definition", str); 1480d5ac70f0Sopenharmony_ci err = -EINVAL; 1481d5ac70f0Sopenharmony_ci goto _err; 1482d5ac70f0Sopenharmony_ci } 1483d5ac70f0Sopenharmony_ci snd_config_for_each(i, next, type_conf) { 1484d5ac70f0Sopenharmony_ci snd_config_t *n = snd_config_iterator_entry(i); 1485d5ac70f0Sopenharmony_ci const char *id; 1486d5ac70f0Sopenharmony_ci if (snd_config_get_id(n, &id) < 0) 1487d5ac70f0Sopenharmony_ci continue; 1488d5ac70f0Sopenharmony_ci if (strcmp(id, "comment") == 0) 1489d5ac70f0Sopenharmony_ci continue; 1490d5ac70f0Sopenharmony_ci if (strcmp(id, "lib") == 0) { 1491d5ac70f0Sopenharmony_ci err = snd_config_get_string(n, &lib); 1492d5ac70f0Sopenharmony_ci if (err < 0) { 1493d5ac70f0Sopenharmony_ci SNDERR("Invalid type for %s", id); 1494d5ac70f0Sopenharmony_ci goto _err; 1495d5ac70f0Sopenharmony_ci } 1496d5ac70f0Sopenharmony_ci continue; 1497d5ac70f0Sopenharmony_ci } 1498d5ac70f0Sopenharmony_ci if (strcmp(id, "open") == 0) { 1499d5ac70f0Sopenharmony_ci err = snd_config_get_string(n, &open_name); 1500d5ac70f0Sopenharmony_ci if (err < 0) { 1501d5ac70f0Sopenharmony_ci SNDERR("Invalid type for %s", id); 1502d5ac70f0Sopenharmony_ci goto _err; 1503d5ac70f0Sopenharmony_ci } 1504d5ac70f0Sopenharmony_ci continue; 1505d5ac70f0Sopenharmony_ci } 1506d5ac70f0Sopenharmony_ci SNDERR("Unknown field %s", id); 1507d5ac70f0Sopenharmony_ci err = -EINVAL; 1508d5ac70f0Sopenharmony_ci goto _err; 1509d5ac70f0Sopenharmony_ci } 1510d5ac70f0Sopenharmony_ci } 1511d5ac70f0Sopenharmony_ci if (!open_name) { 1512d5ac70f0Sopenharmony_ci buf = malloc(strlen(str) + 32); 1513d5ac70f0Sopenharmony_ci if (buf == NULL) { 1514d5ac70f0Sopenharmony_ci err = -ENOMEM; 1515d5ac70f0Sopenharmony_ci goto _err; 1516d5ac70f0Sopenharmony_ci } 1517d5ac70f0Sopenharmony_ci open_name = buf; 1518d5ac70f0Sopenharmony_ci sprintf(buf, "_snd_ctl_%s_open", str); 1519d5ac70f0Sopenharmony_ci } 1520d5ac70f0Sopenharmony_ci if (!lib) { 1521d5ac70f0Sopenharmony_ci const char *const *build_in = build_in_ctls; 1522d5ac70f0Sopenharmony_ci while (*build_in) { 1523d5ac70f0Sopenharmony_ci if (!strcmp(*build_in, str)) 1524d5ac70f0Sopenharmony_ci break; 1525d5ac70f0Sopenharmony_ci build_in++; 1526d5ac70f0Sopenharmony_ci } 1527d5ac70f0Sopenharmony_ci if (*build_in == NULL) { 1528d5ac70f0Sopenharmony_ci buf1 = malloc(strlen(str) + 32); 1529d5ac70f0Sopenharmony_ci if (buf1 == NULL) { 1530d5ac70f0Sopenharmony_ci err = -ENOMEM; 1531d5ac70f0Sopenharmony_ci goto _err; 1532d5ac70f0Sopenharmony_ci } 1533d5ac70f0Sopenharmony_ci lib = buf1; 1534d5ac70f0Sopenharmony_ci sprintf(buf1, "libasound_module_ctl_%s.so", str); 1535d5ac70f0Sopenharmony_ci } 1536d5ac70f0Sopenharmony_ci } 1537d5ac70f0Sopenharmony_ci#ifndef PIC 1538d5ac70f0Sopenharmony_ci snd_control_open_symbols(); 1539d5ac70f0Sopenharmony_ci#endif 1540d5ac70f0Sopenharmony_ci open_func = snd_dlobj_cache_get(lib, open_name, 1541d5ac70f0Sopenharmony_ci SND_DLSYM_VERSION(SND_CONTROL_DLSYM_VERSION), 1); 1542d5ac70f0Sopenharmony_ci if (open_func) { 1543d5ac70f0Sopenharmony_ci err = open_func(ctlp, name, ctl_root, ctl_conf, mode); 1544d5ac70f0Sopenharmony_ci if (err >= 0) { 1545d5ac70f0Sopenharmony_ci (*ctlp)->open_func = open_func; 1546d5ac70f0Sopenharmony_ci err = 0; 1547d5ac70f0Sopenharmony_ci } else { 1548d5ac70f0Sopenharmony_ci snd_dlobj_cache_put(open_func); 1549d5ac70f0Sopenharmony_ci } 1550d5ac70f0Sopenharmony_ci } else { 1551d5ac70f0Sopenharmony_ci err = -ENXIO; 1552d5ac70f0Sopenharmony_ci } 1553d5ac70f0Sopenharmony_ci _err: 1554d5ac70f0Sopenharmony_ci if (type_conf) 1555d5ac70f0Sopenharmony_ci snd_config_delete(type_conf); 1556d5ac70f0Sopenharmony_ci free(buf); 1557d5ac70f0Sopenharmony_ci free(buf1); 1558d5ac70f0Sopenharmony_ci return err; 1559d5ac70f0Sopenharmony_ci} 1560d5ac70f0Sopenharmony_ci 1561d5ac70f0Sopenharmony_cistatic int snd_ctl_open_noupdate(snd_ctl_t **ctlp, snd_config_t *root, 1562d5ac70f0Sopenharmony_ci const char *name, int mode, int hop) 1563d5ac70f0Sopenharmony_ci{ 1564d5ac70f0Sopenharmony_ci int err; 1565d5ac70f0Sopenharmony_ci snd_config_t *ctl_conf; 1566d5ac70f0Sopenharmony_ci const char *str; 1567d5ac70f0Sopenharmony_ci 1568d5ac70f0Sopenharmony_ci err = snd_config_search_definition(root, "ctl", name, &ctl_conf); 1569d5ac70f0Sopenharmony_ci if (err < 0) { 1570d5ac70f0Sopenharmony_ci SNDERR("Invalid CTL %s", name); 1571d5ac70f0Sopenharmony_ci return err; 1572d5ac70f0Sopenharmony_ci } 1573d5ac70f0Sopenharmony_ci if (snd_config_get_string(ctl_conf, &str) >= 0) 1574d5ac70f0Sopenharmony_ci err = snd_ctl_open_noupdate(ctlp, root, str, mode, hop + 1); 1575d5ac70f0Sopenharmony_ci else { 1576d5ac70f0Sopenharmony_ci snd_config_set_hop(ctl_conf, hop); 1577d5ac70f0Sopenharmony_ci err = snd_ctl_open_conf(ctlp, name, root, ctl_conf, mode); 1578d5ac70f0Sopenharmony_ci } 1579d5ac70f0Sopenharmony_ci snd_config_delete(ctl_conf); 1580d5ac70f0Sopenharmony_ci return err; 1581d5ac70f0Sopenharmony_ci} 1582d5ac70f0Sopenharmony_ci 1583d5ac70f0Sopenharmony_ci#ifndef DOC_HIDDEN 1584d5ac70f0Sopenharmony_ciint _snd_ctl_open_named_child(snd_ctl_t **pctl, const char *name, 1585d5ac70f0Sopenharmony_ci snd_config_t *root, snd_config_t *conf, 1586d5ac70f0Sopenharmony_ci int mode, snd_config_t *parent_conf) 1587d5ac70f0Sopenharmony_ci{ 1588d5ac70f0Sopenharmony_ci const char *str; 1589d5ac70f0Sopenharmony_ci int hop; 1590d5ac70f0Sopenharmony_ci 1591d5ac70f0Sopenharmony_ci if ((hop = snd_config_check_hop(parent_conf)) < 0) 1592d5ac70f0Sopenharmony_ci return hop; 1593d5ac70f0Sopenharmony_ci if (snd_config_get_string(conf, &str) >= 0) 1594d5ac70f0Sopenharmony_ci return snd_ctl_open_noupdate(pctl, root, str, mode, hop + 1); 1595d5ac70f0Sopenharmony_ci return snd_ctl_open_conf(pctl, name, root, conf, mode); 1596d5ac70f0Sopenharmony_ci} 1597d5ac70f0Sopenharmony_ci#endif 1598d5ac70f0Sopenharmony_ci 1599d5ac70f0Sopenharmony_ci/** 1600d5ac70f0Sopenharmony_ci * \brief Opens a sound card. 1601d5ac70f0Sopenharmony_ci * 1602d5ac70f0Sopenharmony_ci * \param ctlp Returned CTL handle. 1603d5ac70f0Sopenharmony_ci * \param name A string identifying the card (See \ref control_cards_id). 1604d5ac70f0Sopenharmony_ci * \param mode Open mode (see #SND_CTL_NONBLOCK, #SND_CTL_ASYNC). 1605d5ac70f0Sopenharmony_ci * 1606d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code. 1607d5ac70f0Sopenharmony_ci */ 1608d5ac70f0Sopenharmony_ciint snd_ctl_open(snd_ctl_t **ctlp, const char *name, int mode) 1609d5ac70f0Sopenharmony_ci{ 1610d5ac70f0Sopenharmony_ci snd_config_t *top; 1611d5ac70f0Sopenharmony_ci int err; 1612d5ac70f0Sopenharmony_ci 1613d5ac70f0Sopenharmony_ci assert(ctlp && name); 1614d5ac70f0Sopenharmony_ci if (_snd_is_ucm_device(name)) { 1615d5ac70f0Sopenharmony_ci name = uc_mgr_alibcfg_by_device(&top, name); 1616d5ac70f0Sopenharmony_ci if (name == NULL) 1617d5ac70f0Sopenharmony_ci return -ENODEV; 1618d5ac70f0Sopenharmony_ci } else { 1619d5ac70f0Sopenharmony_ci err = snd_config_update_ref(&top); 1620d5ac70f0Sopenharmony_ci if (err < 0) 1621d5ac70f0Sopenharmony_ci return err; 1622d5ac70f0Sopenharmony_ci } 1623d5ac70f0Sopenharmony_ci err = snd_ctl_open_noupdate(ctlp, top, name, mode, 0); 1624d5ac70f0Sopenharmony_ci snd_config_unref(top); 1625d5ac70f0Sopenharmony_ci return err; 1626d5ac70f0Sopenharmony_ci} 1627d5ac70f0Sopenharmony_ci 1628d5ac70f0Sopenharmony_ci/** 1629d5ac70f0Sopenharmony_ci * \brief Opens a CTL using local configuration 1630d5ac70f0Sopenharmony_ci * \param ctlp Returned CTL handle 1631d5ac70f0Sopenharmony_ci * \param name ASCII identifier of the CTL handle 1632d5ac70f0Sopenharmony_ci * \param mode Open mode (see #SND_CTL_NONBLOCK, #SND_CTL_ASYNC) 1633d5ac70f0Sopenharmony_ci * \param lconf Local configuration 1634d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 1635d5ac70f0Sopenharmony_ci */ 1636d5ac70f0Sopenharmony_ciint snd_ctl_open_lconf(snd_ctl_t **ctlp, const char *name, 1637d5ac70f0Sopenharmony_ci int mode, snd_config_t *lconf) 1638d5ac70f0Sopenharmony_ci{ 1639d5ac70f0Sopenharmony_ci assert(ctlp && name && lconf); 1640d5ac70f0Sopenharmony_ci return snd_ctl_open_noupdate(ctlp, lconf, name, mode, 0); 1641d5ac70f0Sopenharmony_ci} 1642d5ac70f0Sopenharmony_ci 1643d5ac70f0Sopenharmony_ci/** 1644d5ac70f0Sopenharmony_ci * \brief Opens a fallback CTL 1645d5ac70f0Sopenharmony_ci * \param ctlp Returned CTL handle 1646d5ac70f0Sopenharmony_ci * \param root Configuration root 1647d5ac70f0Sopenharmony_ci * \param name ASCII identifier of the CTL handle used as fallback 1648d5ac70f0Sopenharmony_ci * \param orig_name The original ASCII name 1649d5ac70f0Sopenharmony_ci * \param mode Open mode (see #SND_CTL_NONBLOCK, #SND_CTL_ASYNC) 1650d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code 1651d5ac70f0Sopenharmony_ci */ 1652d5ac70f0Sopenharmony_ciint snd_ctl_open_fallback(snd_ctl_t **ctlp, snd_config_t *root, 1653d5ac70f0Sopenharmony_ci const char *name, const char *orig_name, int mode) 1654d5ac70f0Sopenharmony_ci{ 1655d5ac70f0Sopenharmony_ci int err; 1656d5ac70f0Sopenharmony_ci assert(ctlp && name && root); 1657d5ac70f0Sopenharmony_ci err = snd_ctl_open_noupdate(ctlp, root, name, mode, 0); 1658d5ac70f0Sopenharmony_ci if (err >= 0) { 1659d5ac70f0Sopenharmony_ci free((*ctlp)->name); 1660d5ac70f0Sopenharmony_ci (*ctlp)->name = orig_name ? strdup(orig_name) : NULL; 1661d5ac70f0Sopenharmony_ci } 1662d5ac70f0Sopenharmony_ci return err; 1663d5ac70f0Sopenharmony_ci} 1664d5ac70f0Sopenharmony_ci 1665d5ac70f0Sopenharmony_ci#ifndef DOC_HIDDEN 1666d5ac70f0Sopenharmony_ci#define TYPE(v) [SND_CTL_ELEM_TYPE_##v] = #v 1667d5ac70f0Sopenharmony_ci#define IFACE(v) [SND_CTL_ELEM_IFACE_##v] = #v 1668d5ac70f0Sopenharmony_ci#define IFACE1(v, n) [SND_CTL_ELEM_IFACE_##v] = #n 1669d5ac70f0Sopenharmony_ci#define EVENT(v) [SND_CTL_EVENT_##v] = #v 1670d5ac70f0Sopenharmony_ci 1671d5ac70f0Sopenharmony_cistatic const char *const snd_ctl_elem_type_names[] = { 1672d5ac70f0Sopenharmony_ci TYPE(NONE), 1673d5ac70f0Sopenharmony_ci TYPE(BOOLEAN), 1674d5ac70f0Sopenharmony_ci TYPE(INTEGER), 1675d5ac70f0Sopenharmony_ci TYPE(ENUMERATED), 1676d5ac70f0Sopenharmony_ci TYPE(BYTES), 1677d5ac70f0Sopenharmony_ci TYPE(IEC958), 1678d5ac70f0Sopenharmony_ci TYPE(INTEGER64), 1679d5ac70f0Sopenharmony_ci}; 1680d5ac70f0Sopenharmony_ci 1681d5ac70f0Sopenharmony_cistatic const char *const snd_ctl_elem_iface_names[] = { 1682d5ac70f0Sopenharmony_ci IFACE(CARD), 1683d5ac70f0Sopenharmony_ci IFACE(HWDEP), 1684d5ac70f0Sopenharmony_ci IFACE(MIXER), 1685d5ac70f0Sopenharmony_ci IFACE(PCM), 1686d5ac70f0Sopenharmony_ci IFACE(RAWMIDI), 1687d5ac70f0Sopenharmony_ci IFACE(TIMER), 1688d5ac70f0Sopenharmony_ci IFACE(SEQUENCER), 1689d5ac70f0Sopenharmony_ci}; 1690d5ac70f0Sopenharmony_ci 1691d5ac70f0Sopenharmony_cistatic const char *const snd_ctl_event_type_names[] = { 1692d5ac70f0Sopenharmony_ci EVENT(ELEM), 1693d5ac70f0Sopenharmony_ci}; 1694d5ac70f0Sopenharmony_ci#endif 1695d5ac70f0Sopenharmony_ci 1696d5ac70f0Sopenharmony_ci/** 1697d5ac70f0Sopenharmony_ci * \brief get name of a CTL element type 1698d5ac70f0Sopenharmony_ci * \param type CTL element type 1699d5ac70f0Sopenharmony_ci * \return ascii name of CTL element type 1700d5ac70f0Sopenharmony_ci */ 1701d5ac70f0Sopenharmony_ciconst char *snd_ctl_elem_type_name(snd_ctl_elem_type_t type) 1702d5ac70f0Sopenharmony_ci{ 1703d5ac70f0Sopenharmony_ci assert(type <= SND_CTL_ELEM_TYPE_LAST); 1704d5ac70f0Sopenharmony_ci return snd_ctl_elem_type_names[type]; 1705d5ac70f0Sopenharmony_ci} 1706d5ac70f0Sopenharmony_ci 1707d5ac70f0Sopenharmony_ci/** 1708d5ac70f0Sopenharmony_ci * \brief get name of a CTL element related interface 1709d5ac70f0Sopenharmony_ci * \param iface CTL element related interface 1710d5ac70f0Sopenharmony_ci * \return ascii name of CTL element related interface 1711d5ac70f0Sopenharmony_ci */ 1712d5ac70f0Sopenharmony_ciconst char *snd_ctl_elem_iface_name(snd_ctl_elem_iface_t iface) 1713d5ac70f0Sopenharmony_ci{ 1714d5ac70f0Sopenharmony_ci assert(iface <= SND_CTL_ELEM_IFACE_LAST); 1715d5ac70f0Sopenharmony_ci return snd_ctl_elem_iface_names[iface]; 1716d5ac70f0Sopenharmony_ci} 1717d5ac70f0Sopenharmony_ci 1718d5ac70f0Sopenharmony_ci/** 1719d5ac70f0Sopenharmony_ci * \brief get name of a CTL event type 1720d5ac70f0Sopenharmony_ci * \param type CTL event type 1721d5ac70f0Sopenharmony_ci * \return ascii name of CTL event type 1722d5ac70f0Sopenharmony_ci */ 1723d5ac70f0Sopenharmony_ciconst char *snd_ctl_event_type_name(snd_ctl_event_type_t type) 1724d5ac70f0Sopenharmony_ci{ 1725d5ac70f0Sopenharmony_ci assert(type <= SND_CTL_EVENT_LAST); 1726d5ac70f0Sopenharmony_ci return snd_ctl_event_type_names[type]; 1727d5ac70f0Sopenharmony_ci} 1728d5ac70f0Sopenharmony_ci 1729d5ac70f0Sopenharmony_ci/** 1730d5ac70f0Sopenharmony_ci * \brief allocate space for CTL element identifiers list 1731d5ac70f0Sopenharmony_ci * 1732d5ac70f0Sopenharmony_ci * The space can be released with snd_ctl_elem_list_free_space(). 1733d5ac70f0Sopenharmony_ci * 1734d5ac70f0Sopenharmony_ci * \param obj CTL element identifiers list. 1735d5ac70f0Sopenharmony_ci * \param entries How many entries to allocate. See 1736d5ac70f0Sopenharmony_ci * #snd_ctl_elem_list_t to learn how to obtain 1737d5ac70f0Sopenharmony_ci * this number in advance. 1738d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code. 1739d5ac70f0Sopenharmony_ci */ 1740d5ac70f0Sopenharmony_ciint snd_ctl_elem_list_alloc_space(snd_ctl_elem_list_t *obj, unsigned int entries) 1741d5ac70f0Sopenharmony_ci{ 1742d5ac70f0Sopenharmony_ci free(obj->pids); 1743d5ac70f0Sopenharmony_ci obj->pids = calloc(entries, sizeof(*obj->pids)); 1744d5ac70f0Sopenharmony_ci if (!obj->pids) { 1745d5ac70f0Sopenharmony_ci obj->space = 0; 1746d5ac70f0Sopenharmony_ci return -ENOMEM; 1747d5ac70f0Sopenharmony_ci } 1748d5ac70f0Sopenharmony_ci obj->space = entries; 1749d5ac70f0Sopenharmony_ci return 0; 1750d5ac70f0Sopenharmony_ci} 1751d5ac70f0Sopenharmony_ci 1752d5ac70f0Sopenharmony_ci/** 1753d5ac70f0Sopenharmony_ci * \brief free previously allocated space for CTL element identifiers list 1754d5ac70f0Sopenharmony_ci * 1755d5ac70f0Sopenharmony_ci * Releases space previously allocated using 1756d5ac70f0Sopenharmony_ci * snd_ctl_elem_list_alloc_space(). 1757d5ac70f0Sopenharmony_ci * 1758d5ac70f0Sopenharmony_ci * \param obj CTL element identifiers list 1759d5ac70f0Sopenharmony_ci */ 1760d5ac70f0Sopenharmony_civoid snd_ctl_elem_list_free_space(snd_ctl_elem_list_t *obj) 1761d5ac70f0Sopenharmony_ci{ 1762d5ac70f0Sopenharmony_ci free(obj->pids); 1763d5ac70f0Sopenharmony_ci obj->pids = NULL; 1764d5ac70f0Sopenharmony_ci obj->space = 0; 1765d5ac70f0Sopenharmony_ci} 1766d5ac70f0Sopenharmony_ci 1767d5ac70f0Sopenharmony_ci/** 1768d5ac70f0Sopenharmony_ci * \brief Get event mask for an element related event 1769d5ac70f0Sopenharmony_ci * \param obj CTL event 1770d5ac70f0Sopenharmony_ci * \return event mask for element related event 1771d5ac70f0Sopenharmony_ci */ 1772d5ac70f0Sopenharmony_ciunsigned int snd_ctl_event_elem_get_mask(const snd_ctl_event_t *obj) 1773d5ac70f0Sopenharmony_ci{ 1774d5ac70f0Sopenharmony_ci assert(obj); 1775d5ac70f0Sopenharmony_ci assert(obj->type == SND_CTL_EVENT_ELEM); 1776d5ac70f0Sopenharmony_ci return obj->data.elem.mask; 1777d5ac70f0Sopenharmony_ci} 1778d5ac70f0Sopenharmony_ci 1779d5ac70f0Sopenharmony_ci/** 1780d5ac70f0Sopenharmony_ci * \brief Get CTL element identifier for an element related event 1781d5ac70f0Sopenharmony_ci * \param obj CTL event 1782d5ac70f0Sopenharmony_ci * \param ptr Pointer to returned CTL element identifier 1783d5ac70f0Sopenharmony_ci */ 1784d5ac70f0Sopenharmony_civoid snd_ctl_event_elem_get_id(const snd_ctl_event_t *obj, snd_ctl_elem_id_t *ptr) 1785d5ac70f0Sopenharmony_ci{ 1786d5ac70f0Sopenharmony_ci assert(obj && ptr); 1787d5ac70f0Sopenharmony_ci assert(obj->type == SND_CTL_EVENT_ELEM); 1788d5ac70f0Sopenharmony_ci *ptr = obj->data.elem.id; 1789d5ac70f0Sopenharmony_ci} 1790d5ac70f0Sopenharmony_ci 1791d5ac70f0Sopenharmony_ci/** 1792d5ac70f0Sopenharmony_ci * \brief Get element numeric identifier for an element related event 1793d5ac70f0Sopenharmony_ci * \param obj CTL event 1794d5ac70f0Sopenharmony_ci * \return element numeric identifier 1795d5ac70f0Sopenharmony_ci */ 1796d5ac70f0Sopenharmony_ciunsigned int snd_ctl_event_elem_get_numid(const snd_ctl_event_t *obj) 1797d5ac70f0Sopenharmony_ci{ 1798d5ac70f0Sopenharmony_ci assert(obj); 1799d5ac70f0Sopenharmony_ci assert(obj->type == SND_CTL_EVENT_ELEM); 1800d5ac70f0Sopenharmony_ci return obj->data.elem.id.numid; 1801d5ac70f0Sopenharmony_ci} 1802d5ac70f0Sopenharmony_ci 1803d5ac70f0Sopenharmony_ci/** 1804d5ac70f0Sopenharmony_ci * \brief Get interface part of CTL element identifier for an element related event 1805d5ac70f0Sopenharmony_ci * \param obj CTL event 1806d5ac70f0Sopenharmony_ci * \return interface part of element identifier 1807d5ac70f0Sopenharmony_ci */ 1808d5ac70f0Sopenharmony_cisnd_ctl_elem_iface_t snd_ctl_event_elem_get_interface(const snd_ctl_event_t *obj) 1809d5ac70f0Sopenharmony_ci{ 1810d5ac70f0Sopenharmony_ci assert(obj); 1811d5ac70f0Sopenharmony_ci assert(obj->type == SND_CTL_EVENT_ELEM); 1812d5ac70f0Sopenharmony_ci return obj->data.elem.id.iface; 1813d5ac70f0Sopenharmony_ci} 1814d5ac70f0Sopenharmony_ci 1815d5ac70f0Sopenharmony_ci/** 1816d5ac70f0Sopenharmony_ci * \brief Get device part of CTL element identifier for an element related event 1817d5ac70f0Sopenharmony_ci * \param obj CTL event 1818d5ac70f0Sopenharmony_ci * \return device part of element identifier 1819d5ac70f0Sopenharmony_ci */ 1820d5ac70f0Sopenharmony_ciunsigned int snd_ctl_event_elem_get_device(const snd_ctl_event_t *obj) 1821d5ac70f0Sopenharmony_ci{ 1822d5ac70f0Sopenharmony_ci assert(obj); 1823d5ac70f0Sopenharmony_ci assert(obj->type == SND_CTL_EVENT_ELEM); 1824d5ac70f0Sopenharmony_ci return obj->data.elem.id.device; 1825d5ac70f0Sopenharmony_ci} 1826d5ac70f0Sopenharmony_ci 1827d5ac70f0Sopenharmony_ci/** 1828d5ac70f0Sopenharmony_ci * \brief Get subdevice part of CTL element identifier for an element related event 1829d5ac70f0Sopenharmony_ci * \param obj CTL event 1830d5ac70f0Sopenharmony_ci * \return subdevice part of element identifier 1831d5ac70f0Sopenharmony_ci */ 1832d5ac70f0Sopenharmony_ciunsigned int snd_ctl_event_elem_get_subdevice(const snd_ctl_event_t *obj) 1833d5ac70f0Sopenharmony_ci{ 1834d5ac70f0Sopenharmony_ci assert(obj); 1835d5ac70f0Sopenharmony_ci assert(obj->type == SND_CTL_EVENT_ELEM); 1836d5ac70f0Sopenharmony_ci return obj->data.elem.id.subdevice; 1837d5ac70f0Sopenharmony_ci} 1838d5ac70f0Sopenharmony_ci 1839d5ac70f0Sopenharmony_ci/** 1840d5ac70f0Sopenharmony_ci * \brief Get name part of CTL element identifier for an element related event 1841d5ac70f0Sopenharmony_ci * \param obj CTL event 1842d5ac70f0Sopenharmony_ci * \return name part of element identifier 1843d5ac70f0Sopenharmony_ci */ 1844d5ac70f0Sopenharmony_ciconst char *snd_ctl_event_elem_get_name(const snd_ctl_event_t *obj) 1845d5ac70f0Sopenharmony_ci{ 1846d5ac70f0Sopenharmony_ci assert(obj); 1847d5ac70f0Sopenharmony_ci assert(obj->type == SND_CTL_EVENT_ELEM); 1848d5ac70f0Sopenharmony_ci return (const char *)obj->data.elem.id.name; 1849d5ac70f0Sopenharmony_ci} 1850d5ac70f0Sopenharmony_ci 1851d5ac70f0Sopenharmony_ci/** 1852d5ac70f0Sopenharmony_ci * \brief Get index part of CTL element identifier for an element related event 1853d5ac70f0Sopenharmony_ci * \param obj CTL event 1854d5ac70f0Sopenharmony_ci * \return index part of element identifier 1855d5ac70f0Sopenharmony_ci */ 1856d5ac70f0Sopenharmony_ciunsigned int snd_ctl_event_elem_get_index(const snd_ctl_event_t *obj) 1857d5ac70f0Sopenharmony_ci{ 1858d5ac70f0Sopenharmony_ci assert(obj); 1859d5ac70f0Sopenharmony_ci assert(obj->type == SND_CTL_EVENT_ELEM); 1860d5ac70f0Sopenharmony_ci return obj->data.elem.id.index; 1861d5ac70f0Sopenharmony_ci} 1862d5ac70f0Sopenharmony_ci 1863d5ac70f0Sopenharmony_ci#ifndef DOC_HIDDEN 1864d5ac70f0Sopenharmony_ciint _snd_ctl_poll_descriptor(snd_ctl_t *ctl) 1865d5ac70f0Sopenharmony_ci{ 1866d5ac70f0Sopenharmony_ci assert(ctl); 1867d5ac70f0Sopenharmony_ci return ctl->poll_fd; 1868d5ac70f0Sopenharmony_ci} 1869d5ac70f0Sopenharmony_ci#endif 1870d5ac70f0Sopenharmony_ci 1871d5ac70f0Sopenharmony_ci/** 1872d5ac70f0Sopenharmony_ci * \brief get size of #snd_ctl_elem_id_t 1873d5ac70f0Sopenharmony_ci * \return size in bytes 1874d5ac70f0Sopenharmony_ci */ 1875d5ac70f0Sopenharmony_cisize_t snd_ctl_elem_id_sizeof() 1876d5ac70f0Sopenharmony_ci{ 1877d5ac70f0Sopenharmony_ci return sizeof(snd_ctl_elem_id_t); 1878d5ac70f0Sopenharmony_ci} 1879d5ac70f0Sopenharmony_ci 1880d5ac70f0Sopenharmony_ci/** 1881d5ac70f0Sopenharmony_ci * \brief allocate an invalid #snd_ctl_elem_id_t using standard malloc 1882d5ac70f0Sopenharmony_ci * \param ptr returned pointer 1883d5ac70f0Sopenharmony_ci * \return 0 on success otherwise negative error code 1884d5ac70f0Sopenharmony_ci */ 1885d5ac70f0Sopenharmony_ciint snd_ctl_elem_id_malloc(snd_ctl_elem_id_t **ptr) 1886d5ac70f0Sopenharmony_ci{ 1887d5ac70f0Sopenharmony_ci assert(ptr); 1888d5ac70f0Sopenharmony_ci *ptr = calloc(1, sizeof(snd_ctl_elem_id_t)); 1889d5ac70f0Sopenharmony_ci if (!*ptr) 1890d5ac70f0Sopenharmony_ci return -ENOMEM; 1891d5ac70f0Sopenharmony_ci return 0; 1892d5ac70f0Sopenharmony_ci} 1893d5ac70f0Sopenharmony_ci 1894d5ac70f0Sopenharmony_ci/** 1895d5ac70f0Sopenharmony_ci * \brief frees a previously allocated #snd_ctl_elem_id_t 1896d5ac70f0Sopenharmony_ci * \param obj pointer to object to free 1897d5ac70f0Sopenharmony_ci */ 1898d5ac70f0Sopenharmony_civoid snd_ctl_elem_id_free(snd_ctl_elem_id_t *obj) 1899d5ac70f0Sopenharmony_ci{ 1900d5ac70f0Sopenharmony_ci free(obj); 1901d5ac70f0Sopenharmony_ci} 1902d5ac70f0Sopenharmony_ci 1903d5ac70f0Sopenharmony_ci/** 1904d5ac70f0Sopenharmony_ci * \brief clear given #snd_ctl_elem_id_t object 1905d5ac70f0Sopenharmony_ci * \param obj pointer to object to clear 1906d5ac70f0Sopenharmony_ci */ 1907d5ac70f0Sopenharmony_civoid snd_ctl_elem_id_clear(snd_ctl_elem_id_t *obj) 1908d5ac70f0Sopenharmony_ci{ 1909d5ac70f0Sopenharmony_ci memset(obj, 0, sizeof(snd_ctl_elem_id_t)); 1910d5ac70f0Sopenharmony_ci} 1911d5ac70f0Sopenharmony_ci 1912d5ac70f0Sopenharmony_ci/** 1913d5ac70f0Sopenharmony_ci * \brief copy one #snd_ctl_elem_id_t to another 1914d5ac70f0Sopenharmony_ci * \param dst pointer to destination 1915d5ac70f0Sopenharmony_ci * \param src pointer to source 1916d5ac70f0Sopenharmony_ci */ 1917d5ac70f0Sopenharmony_civoid snd_ctl_elem_id_copy(snd_ctl_elem_id_t *dst, const snd_ctl_elem_id_t *src) 1918d5ac70f0Sopenharmony_ci{ 1919d5ac70f0Sopenharmony_ci assert(dst && src); 1920d5ac70f0Sopenharmony_ci *dst = *src; 1921d5ac70f0Sopenharmony_ci} 1922d5ac70f0Sopenharmony_ci 1923d5ac70f0Sopenharmony_ci/** 1924d5ac70f0Sopenharmony_ci * \brief compare one #snd_ctl_elem_id_t to another using numid 1925d5ac70f0Sopenharmony_ci * \param id1 pointer to first id 1926d5ac70f0Sopenharmony_ci * \param id2 pointer to second id 1927d5ac70f0Sopenharmony_ci * \retval zero when values are identical, other value on a difference (like strcmp) 1928d5ac70f0Sopenharmony_ci * 1929d5ac70f0Sopenharmony_ci * This comparison ignores the set of fields part. 1930d5ac70f0Sopenharmony_ci * 1931d5ac70f0Sopenharmony_ci * The return value can be used for sorting like qsort(). It gives persistent 1932d5ac70f0Sopenharmony_ci * results. 1933d5ac70f0Sopenharmony_ci */ 1934d5ac70f0Sopenharmony_ciint snd_ctl_elem_id_compare_numid(const snd_ctl_elem_id_t *id1, const snd_ctl_elem_id_t *id2) 1935d5ac70f0Sopenharmony_ci{ 1936d5ac70f0Sopenharmony_ci int64_t d; 1937d5ac70f0Sopenharmony_ci 1938d5ac70f0Sopenharmony_ci assert(id1 && id2); 1939d5ac70f0Sopenharmony_ci d = (int64_t)id1->numid - (int64_t)id2->numid; 1940d5ac70f0Sopenharmony_ci if (d & ((int64_t)INT_MAX + 1)) { /* fast path */ 1941d5ac70f0Sopenharmony_ci if (d > INT_MAX) 1942d5ac70f0Sopenharmony_ci d = INT_MAX; 1943d5ac70f0Sopenharmony_ci else if (d < INT_MIN) 1944d5ac70f0Sopenharmony_ci d = INT_MIN; 1945d5ac70f0Sopenharmony_ci } 1946d5ac70f0Sopenharmony_ci return d; 1947d5ac70f0Sopenharmony_ci} 1948d5ac70f0Sopenharmony_ci 1949d5ac70f0Sopenharmony_ci/** 1950d5ac70f0Sopenharmony_ci * \brief compare one #snd_ctl_elem_id_t to another 1951d5ac70f0Sopenharmony_ci * \param id1 pointer to first id 1952d5ac70f0Sopenharmony_ci * \param id2 pointer to second id 1953d5ac70f0Sopenharmony_ci * \retval zero when values are identical, other value on a difference (like strcmp) 1954d5ac70f0Sopenharmony_ci * 1955d5ac70f0Sopenharmony_ci * This comparison ignores the numid part. The numid comparison can be easily 1956d5ac70f0Sopenharmony_ci * implemented using snd_ctl_elem_id_get_numid() calls. 1957d5ac70f0Sopenharmony_ci * 1958d5ac70f0Sopenharmony_ci * The identifier set fields are compared in this order: interface, device, 1959d5ac70f0Sopenharmony_ci * subdevice, name, index. 1960d5ac70f0Sopenharmony_ci * 1961d5ac70f0Sopenharmony_ci * The return value can be used for sorting like qsort(). It gives persistent 1962d5ac70f0Sopenharmony_ci * results. 1963d5ac70f0Sopenharmony_ci */ 1964d5ac70f0Sopenharmony_ciint snd_ctl_elem_id_compare_set(const snd_ctl_elem_id_t *id1, const snd_ctl_elem_id_t *id2) 1965d5ac70f0Sopenharmony_ci{ 1966d5ac70f0Sopenharmony_ci int d; 1967d5ac70f0Sopenharmony_ci 1968d5ac70f0Sopenharmony_ci assert(id1 && id2); 1969d5ac70f0Sopenharmony_ci /* although those values are unsigned integer, practically, */ 1970d5ac70f0Sopenharmony_ci /* the useable limit is really much lower */ 1971d5ac70f0Sopenharmony_ci assert((id1->iface | id1->device | id1->subdevice | id1->index) <= INT_MAX); 1972d5ac70f0Sopenharmony_ci assert((id2->iface | id2->device | id2->subdevice | id1->index) <= INT_MAX); 1973d5ac70f0Sopenharmony_ci d = id1->iface - id2->iface; 1974d5ac70f0Sopenharmony_ci if (d != 0) 1975d5ac70f0Sopenharmony_ci return d; 1976d5ac70f0Sopenharmony_ci d = id1->device - id2->device; 1977d5ac70f0Sopenharmony_ci if (d != 0) 1978d5ac70f0Sopenharmony_ci return d; 1979d5ac70f0Sopenharmony_ci d = id1->subdevice - id2->subdevice; 1980d5ac70f0Sopenharmony_ci if (d != 0) 1981d5ac70f0Sopenharmony_ci return d; 1982d5ac70f0Sopenharmony_ci d = strcmp((const char *)id1->name, (const char *)id2->name); 1983d5ac70f0Sopenharmony_ci if (d != 0) 1984d5ac70f0Sopenharmony_ci return d; 1985d5ac70f0Sopenharmony_ci return id1->index - id2->index; 1986d5ac70f0Sopenharmony_ci} 1987d5ac70f0Sopenharmony_ci 1988d5ac70f0Sopenharmony_ci/** 1989d5ac70f0Sopenharmony_ci * \brief Get numeric identifier from a CTL element identifier 1990d5ac70f0Sopenharmony_ci * \param obj CTL element identifier 1991d5ac70f0Sopenharmony_ci * \return CTL element numeric identifier 1992d5ac70f0Sopenharmony_ci */ 1993d5ac70f0Sopenharmony_ciunsigned int snd_ctl_elem_id_get_numid(const snd_ctl_elem_id_t *obj) 1994d5ac70f0Sopenharmony_ci{ 1995d5ac70f0Sopenharmony_ci assert(obj); 1996d5ac70f0Sopenharmony_ci return obj->numid; 1997d5ac70f0Sopenharmony_ci} 1998d5ac70f0Sopenharmony_ci 1999d5ac70f0Sopenharmony_ci/** 2000d5ac70f0Sopenharmony_ci * \brief Get interface part of a CTL element identifier 2001d5ac70f0Sopenharmony_ci * \param obj CTL element identifier 2002d5ac70f0Sopenharmony_ci * \return CTL element related interface 2003d5ac70f0Sopenharmony_ci */ 2004d5ac70f0Sopenharmony_cisnd_ctl_elem_iface_t snd_ctl_elem_id_get_interface(const snd_ctl_elem_id_t *obj) 2005d5ac70f0Sopenharmony_ci{ 2006d5ac70f0Sopenharmony_ci assert(obj); 2007d5ac70f0Sopenharmony_ci return obj->iface; 2008d5ac70f0Sopenharmony_ci} 2009d5ac70f0Sopenharmony_ci 2010d5ac70f0Sopenharmony_ci/** 2011d5ac70f0Sopenharmony_ci * \brief Get device part of a CTL element identifier 2012d5ac70f0Sopenharmony_ci * \param obj CTL element identifier 2013d5ac70f0Sopenharmony_ci * \return CTL element related device 2014d5ac70f0Sopenharmony_ci */ 2015d5ac70f0Sopenharmony_ciunsigned int snd_ctl_elem_id_get_device(const snd_ctl_elem_id_t *obj) 2016d5ac70f0Sopenharmony_ci{ 2017d5ac70f0Sopenharmony_ci assert(obj); 2018d5ac70f0Sopenharmony_ci return obj->device; 2019d5ac70f0Sopenharmony_ci} 2020d5ac70f0Sopenharmony_ci 2021d5ac70f0Sopenharmony_ci/** 2022d5ac70f0Sopenharmony_ci * \brief Get subdevice part of a CTL element identifier 2023d5ac70f0Sopenharmony_ci * \param obj CTL element identifier 2024d5ac70f0Sopenharmony_ci * \return CTL element related subdevice 2025d5ac70f0Sopenharmony_ci */ 2026d5ac70f0Sopenharmony_ciunsigned int snd_ctl_elem_id_get_subdevice(const snd_ctl_elem_id_t *obj) 2027d5ac70f0Sopenharmony_ci{ 2028d5ac70f0Sopenharmony_ci assert(obj); 2029d5ac70f0Sopenharmony_ci return obj->subdevice; 2030d5ac70f0Sopenharmony_ci} 2031d5ac70f0Sopenharmony_ci 2032d5ac70f0Sopenharmony_ci/** 2033d5ac70f0Sopenharmony_ci * \brief Get name part of a CTL element identifier 2034d5ac70f0Sopenharmony_ci * \param obj CTL element identifier 2035d5ac70f0Sopenharmony_ci * \return CTL element name 2036d5ac70f0Sopenharmony_ci */ 2037d5ac70f0Sopenharmony_ciconst char *snd_ctl_elem_id_get_name(const snd_ctl_elem_id_t *obj) 2038d5ac70f0Sopenharmony_ci{ 2039d5ac70f0Sopenharmony_ci assert(obj); 2040d5ac70f0Sopenharmony_ci return (const char *)obj->name; 2041d5ac70f0Sopenharmony_ci} 2042d5ac70f0Sopenharmony_ci 2043d5ac70f0Sopenharmony_ci/** 2044d5ac70f0Sopenharmony_ci * \brief Get index part of a CTL element identifier 2045d5ac70f0Sopenharmony_ci * \param obj CTL element identifier 2046d5ac70f0Sopenharmony_ci * \return CTL element index 2047d5ac70f0Sopenharmony_ci */ 2048d5ac70f0Sopenharmony_ciunsigned int snd_ctl_elem_id_get_index(const snd_ctl_elem_id_t *obj) 2049d5ac70f0Sopenharmony_ci{ 2050d5ac70f0Sopenharmony_ci assert(obj); 2051d5ac70f0Sopenharmony_ci return obj->index; 2052d5ac70f0Sopenharmony_ci} 2053d5ac70f0Sopenharmony_ci 2054d5ac70f0Sopenharmony_ci/** 2055d5ac70f0Sopenharmony_ci * \brief Set numeric identifier for a CTL element identifier 2056d5ac70f0Sopenharmony_ci * \param obj CTL element identifier 2057d5ac70f0Sopenharmony_ci * \param val CTL element numeric identifier 2058d5ac70f0Sopenharmony_ci */ 2059d5ac70f0Sopenharmony_civoid snd_ctl_elem_id_set_numid(snd_ctl_elem_id_t *obj, unsigned int val) 2060d5ac70f0Sopenharmony_ci{ 2061d5ac70f0Sopenharmony_ci assert(obj); 2062d5ac70f0Sopenharmony_ci obj->numid = val; 2063d5ac70f0Sopenharmony_ci} 2064d5ac70f0Sopenharmony_ci 2065d5ac70f0Sopenharmony_ci/** 2066d5ac70f0Sopenharmony_ci * \brief Set interface part for a CTL element identifier 2067d5ac70f0Sopenharmony_ci * \param obj CTL element identifier 2068d5ac70f0Sopenharmony_ci * \param val CTL element related interface 2069d5ac70f0Sopenharmony_ci */ 2070d5ac70f0Sopenharmony_civoid snd_ctl_elem_id_set_interface(snd_ctl_elem_id_t *obj, snd_ctl_elem_iface_t val) 2071d5ac70f0Sopenharmony_ci{ 2072d5ac70f0Sopenharmony_ci assert(obj); 2073d5ac70f0Sopenharmony_ci obj->iface = val; 2074d5ac70f0Sopenharmony_ci} 2075d5ac70f0Sopenharmony_ci 2076d5ac70f0Sopenharmony_ci/** 2077d5ac70f0Sopenharmony_ci * \brief Set device part for a CTL element identifier 2078d5ac70f0Sopenharmony_ci * \param obj CTL element identifier 2079d5ac70f0Sopenharmony_ci * \param val CTL element related device 2080d5ac70f0Sopenharmony_ci */ 2081d5ac70f0Sopenharmony_civoid snd_ctl_elem_id_set_device(snd_ctl_elem_id_t *obj, unsigned int val) 2082d5ac70f0Sopenharmony_ci{ 2083d5ac70f0Sopenharmony_ci assert(obj); 2084d5ac70f0Sopenharmony_ci obj->device = val; 2085d5ac70f0Sopenharmony_ci} 2086d5ac70f0Sopenharmony_ci 2087d5ac70f0Sopenharmony_ci/** 2088d5ac70f0Sopenharmony_ci * \brief Set subdevice part for a CTL element identifier 2089d5ac70f0Sopenharmony_ci * \param obj CTL element identifier 2090d5ac70f0Sopenharmony_ci * \param val CTL element related subdevice 2091d5ac70f0Sopenharmony_ci */ 2092d5ac70f0Sopenharmony_civoid snd_ctl_elem_id_set_subdevice(snd_ctl_elem_id_t *obj, unsigned int val) 2093d5ac70f0Sopenharmony_ci{ 2094d5ac70f0Sopenharmony_ci assert(obj); 2095d5ac70f0Sopenharmony_ci obj->subdevice = val; 2096d5ac70f0Sopenharmony_ci} 2097d5ac70f0Sopenharmony_ci 2098d5ac70f0Sopenharmony_ci/** 2099d5ac70f0Sopenharmony_ci * \brief Set name part for a CTL element identifier 2100d5ac70f0Sopenharmony_ci * \param obj CTL element identifier 2101d5ac70f0Sopenharmony_ci * \param val CTL element name 2102d5ac70f0Sopenharmony_ci */ 2103d5ac70f0Sopenharmony_civoid snd_ctl_elem_id_set_name(snd_ctl_elem_id_t *obj, const char *val) 2104d5ac70f0Sopenharmony_ci{ 2105d5ac70f0Sopenharmony_ci assert(obj); 2106d5ac70f0Sopenharmony_ci snd_strlcpy((char *)obj->name, val, sizeof(obj->name)); 2107d5ac70f0Sopenharmony_ci} 2108d5ac70f0Sopenharmony_ci 2109d5ac70f0Sopenharmony_ci/** 2110d5ac70f0Sopenharmony_ci * \brief Set index part for a CTL element identifier 2111d5ac70f0Sopenharmony_ci * \param obj CTL element identifier 2112d5ac70f0Sopenharmony_ci * \param val CTL element index 2113d5ac70f0Sopenharmony_ci */ 2114d5ac70f0Sopenharmony_civoid snd_ctl_elem_id_set_index(snd_ctl_elem_id_t *obj, unsigned int val) 2115d5ac70f0Sopenharmony_ci{ 2116d5ac70f0Sopenharmony_ci assert(obj); 2117d5ac70f0Sopenharmony_ci obj->index = val; 2118d5ac70f0Sopenharmony_ci} 2119d5ac70f0Sopenharmony_ci 2120d5ac70f0Sopenharmony_ci/** 2121d5ac70f0Sopenharmony_ci * \brief get size of #snd_ctl_card_info_t. 2122d5ac70f0Sopenharmony_ci * \return Size in bytes. 2123d5ac70f0Sopenharmony_ci */ 2124d5ac70f0Sopenharmony_cisize_t snd_ctl_card_info_sizeof() 2125d5ac70f0Sopenharmony_ci{ 2126d5ac70f0Sopenharmony_ci return sizeof(snd_ctl_card_info_t); 2127d5ac70f0Sopenharmony_ci} 2128d5ac70f0Sopenharmony_ci 2129d5ac70f0Sopenharmony_ci/** 2130d5ac70f0Sopenharmony_ci * \brief Allocate an invalid #snd_ctl_card_info_t on the heap. 2131d5ac70f0Sopenharmony_ci * 2132d5ac70f0Sopenharmony_ci * Allocate space for a card info object on the heap. The allocated memory 2133d5ac70f0Sopenharmony_ci * must be freed using snd_ctl_card_info_free(). 2134d5ac70f0Sopenharmony_ci * 2135d5ac70f0Sopenharmony_ci * See snd_ctl_card_info_t for details. 2136d5ac70f0Sopenharmony_ci * 2137d5ac70f0Sopenharmony_ci * \param ptr Pointer to a snd_ctl_card_info_t pointer. The address 2138d5ac70f0Sopenharmony_ci * of the allocated space will be returned here. 2139d5ac70f0Sopenharmony_ci * \return 0 on success, otherwise a negative error code. 2140d5ac70f0Sopenharmony_ci */ 2141d5ac70f0Sopenharmony_ciint snd_ctl_card_info_malloc(snd_ctl_card_info_t **ptr) 2142d5ac70f0Sopenharmony_ci{ 2143d5ac70f0Sopenharmony_ci assert(ptr); 2144d5ac70f0Sopenharmony_ci *ptr = calloc(1, sizeof(snd_ctl_card_info_t)); 2145d5ac70f0Sopenharmony_ci if (!*ptr) 2146d5ac70f0Sopenharmony_ci return -ENOMEM; 2147d5ac70f0Sopenharmony_ci return 0; 2148d5ac70f0Sopenharmony_ci} 2149d5ac70f0Sopenharmony_ci 2150d5ac70f0Sopenharmony_ci/** 2151d5ac70f0Sopenharmony_ci * \brief Free an #snd_ctl_card_info_t previously allocated using 2152d5ac70f0Sopenharmony_ci * snd_ctl_card_info_malloc(). 2153d5ac70f0Sopenharmony_ci * 2154d5ac70f0Sopenharmony_ci * \param obj Pointer to the snd_ctl_card_info_t. 2155d5ac70f0Sopenharmony_ci */ 2156d5ac70f0Sopenharmony_civoid snd_ctl_card_info_free(snd_ctl_card_info_t *obj) 2157d5ac70f0Sopenharmony_ci{ 2158d5ac70f0Sopenharmony_ci free(obj); 2159d5ac70f0Sopenharmony_ci} 2160d5ac70f0Sopenharmony_ci 2161d5ac70f0Sopenharmony_ci/** 2162d5ac70f0Sopenharmony_ci * \brief Clear given card info object. 2163d5ac70f0Sopenharmony_ci * 2164d5ac70f0Sopenharmony_ci * See snd_ctl_elem_value_t for details. 2165d5ac70f0Sopenharmony_ci * 2166d5ac70f0Sopenharmony_ci * \param obj Card info object. 2167d5ac70f0Sopenharmony_ci */ 2168d5ac70f0Sopenharmony_civoid snd_ctl_card_info_clear(snd_ctl_card_info_t *obj) 2169d5ac70f0Sopenharmony_ci{ 2170d5ac70f0Sopenharmony_ci memset(obj, 0, sizeof(snd_ctl_card_info_t)); 2171d5ac70f0Sopenharmony_ci} 2172d5ac70f0Sopenharmony_ci 2173d5ac70f0Sopenharmony_ci/** 2174d5ac70f0Sopenharmony_ci * \brief Bitwise copy of a #snd_ctl_card_info_t object. 2175d5ac70f0Sopenharmony_ci * 2176d5ac70f0Sopenharmony_ci * \param dst Pointer to destination. 2177d5ac70f0Sopenharmony_ci * \param src Pointer to source. 2178d5ac70f0Sopenharmony_ci */ 2179d5ac70f0Sopenharmony_civoid snd_ctl_card_info_copy(snd_ctl_card_info_t *dst, const snd_ctl_card_info_t *src) 2180d5ac70f0Sopenharmony_ci{ 2181d5ac70f0Sopenharmony_ci assert(dst && src); 2182d5ac70f0Sopenharmony_ci *dst = *src; 2183d5ac70f0Sopenharmony_ci} 2184d5ac70f0Sopenharmony_ci 2185d5ac70f0Sopenharmony_ci/** 2186d5ac70f0Sopenharmony_ci * \brief Get the sound card index from the given info object. 2187d5ac70f0Sopenharmony_ci * 2188d5ac70f0Sopenharmony_ci * See snd_ctl_card_info_t for more details. 2189d5ac70f0Sopenharmony_ci * 2190d5ac70f0Sopenharmony_ci * \param obj The card info object. 2191d5ac70f0Sopenharmony_ci * \return Sound card index. 2192d5ac70f0Sopenharmony_ci */ 2193d5ac70f0Sopenharmony_ciint snd_ctl_card_info_get_card(const snd_ctl_card_info_t *obj) 2194d5ac70f0Sopenharmony_ci{ 2195d5ac70f0Sopenharmony_ci assert(obj); 2196d5ac70f0Sopenharmony_ci return obj->card; 2197d5ac70f0Sopenharmony_ci} 2198d5ac70f0Sopenharmony_ci 2199d5ac70f0Sopenharmony_ci/** 2200d5ac70f0Sopenharmony_ci * \brief Get the sound card ID from the given info object. 2201d5ac70f0Sopenharmony_ci * 2202d5ac70f0Sopenharmony_ci * See snd_ctl_card_info_t for more details. 2203d5ac70f0Sopenharmony_ci * 2204d5ac70f0Sopenharmony_ci * \param obj The card info object. 2205d5ac70f0Sopenharmony_ci * \return Sound card ID. 2206d5ac70f0Sopenharmony_ci */ 2207d5ac70f0Sopenharmony_ciconst char *snd_ctl_card_info_get_id(const snd_ctl_card_info_t *obj) 2208d5ac70f0Sopenharmony_ci{ 2209d5ac70f0Sopenharmony_ci assert(obj); 2210d5ac70f0Sopenharmony_ci return (const char *)obj->id; 2211d5ac70f0Sopenharmony_ci} 2212d5ac70f0Sopenharmony_ci 2213d5ac70f0Sopenharmony_ci/** 2214d5ac70f0Sopenharmony_ci * \brief Get the sound card driver from the given info object. 2215d5ac70f0Sopenharmony_ci * 2216d5ac70f0Sopenharmony_ci * See snd_ctl_card_info_t for more details. 2217d5ac70f0Sopenharmony_ci * 2218d5ac70f0Sopenharmony_ci * \param obj The card info object. 2219d5ac70f0Sopenharmony_ci * \return The sound card driver. 2220d5ac70f0Sopenharmony_ci */ 2221d5ac70f0Sopenharmony_ciconst char *snd_ctl_card_info_get_driver(const snd_ctl_card_info_t *obj) 2222d5ac70f0Sopenharmony_ci{ 2223d5ac70f0Sopenharmony_ci assert(obj); 2224d5ac70f0Sopenharmony_ci return (const char *)obj->driver; 2225d5ac70f0Sopenharmony_ci} 2226d5ac70f0Sopenharmony_ci 2227d5ac70f0Sopenharmony_ci/** 2228d5ac70f0Sopenharmony_ci * \brief Get the sound card name from the given info object. 2229d5ac70f0Sopenharmony_ci * 2230d5ac70f0Sopenharmony_ci * See snd_ctl_card_info_t for more details. 2231d5ac70f0Sopenharmony_ci * 2232d5ac70f0Sopenharmony_ci * \param obj The card info object. 2233d5ac70f0Sopenharmony_ci * \return Sound card name. 2234d5ac70f0Sopenharmony_ci */ 2235d5ac70f0Sopenharmony_ciconst char *snd_ctl_card_info_get_name(const snd_ctl_card_info_t *obj) 2236d5ac70f0Sopenharmony_ci{ 2237d5ac70f0Sopenharmony_ci assert(obj); 2238d5ac70f0Sopenharmony_ci return (const char *)obj->name; 2239d5ac70f0Sopenharmony_ci} 2240d5ac70f0Sopenharmony_ci 2241d5ac70f0Sopenharmony_ci/** 2242d5ac70f0Sopenharmony_ci * \brief Get the sound cards long name from the given info object. 2243d5ac70f0Sopenharmony_ci * 2244d5ac70f0Sopenharmony_ci * See snd_ctl_card_info_t for more details. 2245d5ac70f0Sopenharmony_ci * 2246d5ac70f0Sopenharmony_ci * \param obj The card info object. 2247d5ac70f0Sopenharmony_ci * \return Sound cards long name. 2248d5ac70f0Sopenharmony_ci */ 2249d5ac70f0Sopenharmony_ciconst char *snd_ctl_card_info_get_longname(const snd_ctl_card_info_t *obj) 2250d5ac70f0Sopenharmony_ci{ 2251d5ac70f0Sopenharmony_ci assert(obj); 2252d5ac70f0Sopenharmony_ci return (const char *)obj->longname; 2253d5ac70f0Sopenharmony_ci} 2254d5ac70f0Sopenharmony_ci 2255d5ac70f0Sopenharmony_ci/** 2256d5ac70f0Sopenharmony_ci * \brief Get the sound card mixer name from the given info object. 2257d5ac70f0Sopenharmony_ci * 2258d5ac70f0Sopenharmony_ci * See snd_ctl_card_info_t for more details. 2259d5ac70f0Sopenharmony_ci * 2260d5ac70f0Sopenharmony_ci * \param obj The card info object. 2261d5ac70f0Sopenharmony_ci * \return Sound card mixer name. 2262d5ac70f0Sopenharmony_ci */ 2263d5ac70f0Sopenharmony_ciconst char *snd_ctl_card_info_get_mixername(const snd_ctl_card_info_t *obj) 2264d5ac70f0Sopenharmony_ci{ 2265d5ac70f0Sopenharmony_ci assert(obj); 2266d5ac70f0Sopenharmony_ci return (const char *)obj->mixername; 2267d5ac70f0Sopenharmony_ci} 2268d5ac70f0Sopenharmony_ci 2269d5ac70f0Sopenharmony_ci/** 2270d5ac70f0Sopenharmony_ci * \brief Get the sound cards "components" property from the given info object. 2271d5ac70f0Sopenharmony_ci * 2272d5ac70f0Sopenharmony_ci * See snd_ctl_card_info_t for more details. 2273d5ac70f0Sopenharmony_ci * 2274d5ac70f0Sopenharmony_ci * \param obj The card info object. 2275d5ac70f0Sopenharmony_ci * \return Sound cards "components" property. 2276d5ac70f0Sopenharmony_ci */ 2277d5ac70f0Sopenharmony_ciconst char *snd_ctl_card_info_get_components(const snd_ctl_card_info_t *obj) 2278d5ac70f0Sopenharmony_ci{ 2279d5ac70f0Sopenharmony_ci assert(obj); 2280d5ac70f0Sopenharmony_ci return (const char *)obj->components; 2281d5ac70f0Sopenharmony_ci} 2282d5ac70f0Sopenharmony_ci 2283d5ac70f0Sopenharmony_ci/** 2284d5ac70f0Sopenharmony_ci * \brief get size of #snd_ctl_event_t 2285d5ac70f0Sopenharmony_ci * \return size in bytes 2286d5ac70f0Sopenharmony_ci */ 2287d5ac70f0Sopenharmony_cisize_t snd_ctl_event_sizeof() 2288d5ac70f0Sopenharmony_ci{ 2289d5ac70f0Sopenharmony_ci return sizeof(snd_ctl_event_t); 2290d5ac70f0Sopenharmony_ci} 2291d5ac70f0Sopenharmony_ci 2292d5ac70f0Sopenharmony_ci/** 2293d5ac70f0Sopenharmony_ci * \brief allocate an invalid #snd_ctl_event_t using standard malloc 2294d5ac70f0Sopenharmony_ci * \param ptr returned pointer 2295d5ac70f0Sopenharmony_ci * \return 0 on success otherwise negative error code 2296d5ac70f0Sopenharmony_ci */ 2297d5ac70f0Sopenharmony_ciint snd_ctl_event_malloc(snd_ctl_event_t **ptr) 2298d5ac70f0Sopenharmony_ci{ 2299d5ac70f0Sopenharmony_ci assert(ptr); 2300d5ac70f0Sopenharmony_ci *ptr = calloc(1, sizeof(snd_ctl_event_t)); 2301d5ac70f0Sopenharmony_ci if (!*ptr) 2302d5ac70f0Sopenharmony_ci return -ENOMEM; 2303d5ac70f0Sopenharmony_ci return 0; 2304d5ac70f0Sopenharmony_ci} 2305d5ac70f0Sopenharmony_ci 2306d5ac70f0Sopenharmony_ci/** 2307d5ac70f0Sopenharmony_ci * \brief frees a previously allocated #snd_ctl_event_t 2308d5ac70f0Sopenharmony_ci * \param obj pointer to object to free 2309d5ac70f0Sopenharmony_ci */ 2310d5ac70f0Sopenharmony_civoid snd_ctl_event_free(snd_ctl_event_t *obj) 2311d5ac70f0Sopenharmony_ci{ 2312d5ac70f0Sopenharmony_ci free(obj); 2313d5ac70f0Sopenharmony_ci} 2314d5ac70f0Sopenharmony_ci 2315d5ac70f0Sopenharmony_ci/** 2316d5ac70f0Sopenharmony_ci * \brief clear given #snd_ctl_event_t object 2317d5ac70f0Sopenharmony_ci * \param obj pointer to object to clear 2318d5ac70f0Sopenharmony_ci */ 2319d5ac70f0Sopenharmony_civoid snd_ctl_event_clear(snd_ctl_event_t *obj) 2320d5ac70f0Sopenharmony_ci{ 2321d5ac70f0Sopenharmony_ci memset(obj, 0, sizeof(snd_ctl_event_t)); 2322d5ac70f0Sopenharmony_ci} 2323d5ac70f0Sopenharmony_ci 2324d5ac70f0Sopenharmony_ci/** 2325d5ac70f0Sopenharmony_ci * \brief copy one #snd_ctl_event_t to another 2326d5ac70f0Sopenharmony_ci * \param dst pointer to destination 2327d5ac70f0Sopenharmony_ci * \param src pointer to source 2328d5ac70f0Sopenharmony_ci */ 2329d5ac70f0Sopenharmony_civoid snd_ctl_event_copy(snd_ctl_event_t *dst, const snd_ctl_event_t *src) 2330d5ac70f0Sopenharmony_ci{ 2331d5ac70f0Sopenharmony_ci assert(dst && src); 2332d5ac70f0Sopenharmony_ci *dst = *src; 2333d5ac70f0Sopenharmony_ci} 2334d5ac70f0Sopenharmony_ci 2335d5ac70f0Sopenharmony_ci/** 2336d5ac70f0Sopenharmony_ci * \brief Get type of a CTL event 2337d5ac70f0Sopenharmony_ci * \param obj CTL event 2338d5ac70f0Sopenharmony_ci * \return CTL event type 2339d5ac70f0Sopenharmony_ci */ 2340d5ac70f0Sopenharmony_cisnd_ctl_event_type_t snd_ctl_event_get_type(const snd_ctl_event_t *obj) 2341d5ac70f0Sopenharmony_ci{ 2342d5ac70f0Sopenharmony_ci assert(obj); 2343d5ac70f0Sopenharmony_ci return obj->type; 2344d5ac70f0Sopenharmony_ci} 2345d5ac70f0Sopenharmony_ci 2346d5ac70f0Sopenharmony_ci/** 2347d5ac70f0Sopenharmony_ci * \brief get size of #snd_ctl_elem_list_t. 2348d5ac70f0Sopenharmony_ci * \return size in bytes 2349d5ac70f0Sopenharmony_ci */ 2350d5ac70f0Sopenharmony_cisize_t snd_ctl_elem_list_sizeof() 2351d5ac70f0Sopenharmony_ci{ 2352d5ac70f0Sopenharmony_ci return sizeof(snd_ctl_elem_list_t); 2353d5ac70f0Sopenharmony_ci} 2354d5ac70f0Sopenharmony_ci 2355d5ac70f0Sopenharmony_ci/** 2356d5ac70f0Sopenharmony_ci * \brief allocate a #snd_ctl_elem_list_t using standard malloc. 2357d5ac70f0Sopenharmony_ci * 2358d5ac70f0Sopenharmony_ci * The memory can be released using snd_ctl_elem_list_free(). 2359d5ac70f0Sopenharmony_ci * 2360d5ac70f0Sopenharmony_ci * \param ptr returned pointer 2361d5ac70f0Sopenharmony_ci * \return 0 on success otherwise negative error code 2362d5ac70f0Sopenharmony_ci */ 2363d5ac70f0Sopenharmony_ciint snd_ctl_elem_list_malloc(snd_ctl_elem_list_t **ptr) 2364d5ac70f0Sopenharmony_ci{ 2365d5ac70f0Sopenharmony_ci assert(ptr); 2366d5ac70f0Sopenharmony_ci *ptr = calloc(1, sizeof(snd_ctl_elem_list_t)); 2367d5ac70f0Sopenharmony_ci if (!*ptr) 2368d5ac70f0Sopenharmony_ci return -ENOMEM; 2369d5ac70f0Sopenharmony_ci return 0; 2370d5ac70f0Sopenharmony_ci} 2371d5ac70f0Sopenharmony_ci 2372d5ac70f0Sopenharmony_ci/** 2373d5ac70f0Sopenharmony_ci * \brief frees a previously allocated #snd_ctl_elem_list_t. 2374d5ac70f0Sopenharmony_ci * 2375d5ac70f0Sopenharmony_ci * Release memory previously allocated using 2376d5ac70f0Sopenharmony_ci * snd_ctl_elem_list_malloc(). 2377d5ac70f0Sopenharmony_ci * 2378d5ac70f0Sopenharmony_ci * If you used snd_ctl_elem_list_alloc_space() on the list, you must 2379d5ac70f0Sopenharmony_ci * use snd_ctl_elem_list_free_space() \em before calling this 2380d5ac70f0Sopenharmony_ci * function. 2381d5ac70f0Sopenharmony_ci * 2382d5ac70f0Sopenharmony_ci * \param obj pointer to object to free 2383d5ac70f0Sopenharmony_ci */ 2384d5ac70f0Sopenharmony_civoid snd_ctl_elem_list_free(snd_ctl_elem_list_t *obj) 2385d5ac70f0Sopenharmony_ci{ 2386d5ac70f0Sopenharmony_ci free(obj); 2387d5ac70f0Sopenharmony_ci} 2388d5ac70f0Sopenharmony_ci 2389d5ac70f0Sopenharmony_ci/** 2390d5ac70f0Sopenharmony_ci * \brief Clear given #snd_ctl_elem_list_t object. 2391d5ac70f0Sopenharmony_ci * 2392d5ac70f0Sopenharmony_ci * This will make the stored identifiers inaccessible without freeing 2393d5ac70f0Sopenharmony_ci * their space. 2394d5ac70f0Sopenharmony_ci * 2395d5ac70f0Sopenharmony_ci * \warning The element identifier space cannot be freed after calling 2396d5ac70f0Sopenharmony_ci * this function. Therefore, snd_ctl_elem_list_free_space() 2397d5ac70f0Sopenharmony_ci * must be called in advance. 2398d5ac70f0Sopenharmony_ci * 2399d5ac70f0Sopenharmony_ci * \param obj pointer to object to clear 2400d5ac70f0Sopenharmony_ci */ 2401d5ac70f0Sopenharmony_civoid snd_ctl_elem_list_clear(snd_ctl_elem_list_t *obj) 2402d5ac70f0Sopenharmony_ci{ 2403d5ac70f0Sopenharmony_ci memset(obj, 0, sizeof(snd_ctl_elem_list_t)); 2404d5ac70f0Sopenharmony_ci} 2405d5ac70f0Sopenharmony_ci 2406d5ac70f0Sopenharmony_ci/** 2407d5ac70f0Sopenharmony_ci * \brief copy one #snd_ctl_elem_list_t to another. 2408d5ac70f0Sopenharmony_ci * 2409d5ac70f0Sopenharmony_ci * This performs a shallow copy. That means the both lists will share 2410d5ac70f0Sopenharmony_ci * the same space for the elements. The elements will not be copied. 2411d5ac70f0Sopenharmony_ci * 2412d5ac70f0Sopenharmony_ci * \param dst pointer to destination 2413d5ac70f0Sopenharmony_ci * \param src pointer to source 2414d5ac70f0Sopenharmony_ci */ 2415d5ac70f0Sopenharmony_civoid snd_ctl_elem_list_copy(snd_ctl_elem_list_t *dst, const snd_ctl_elem_list_t *src) 2416d5ac70f0Sopenharmony_ci{ 2417d5ac70f0Sopenharmony_ci assert(dst && src); 2418d5ac70f0Sopenharmony_ci *dst = *src; 2419d5ac70f0Sopenharmony_ci} 2420d5ac70f0Sopenharmony_ci 2421d5ac70f0Sopenharmony_ci/** 2422d5ac70f0Sopenharmony_ci * \brief Set index of first wanted CTL element identifier in a CTL element identifiers list 2423d5ac70f0Sopenharmony_ci * \param obj CTL element identifiers list 2424d5ac70f0Sopenharmony_ci * \param val index of CTL element to put at position 0 of list 2425d5ac70f0Sopenharmony_ci */ 2426d5ac70f0Sopenharmony_civoid snd_ctl_elem_list_set_offset(snd_ctl_elem_list_t *obj, unsigned int val) 2427d5ac70f0Sopenharmony_ci{ 2428d5ac70f0Sopenharmony_ci assert(obj); 2429d5ac70f0Sopenharmony_ci obj->offset = val; 2430d5ac70f0Sopenharmony_ci} 2431d5ac70f0Sopenharmony_ci 2432d5ac70f0Sopenharmony_ci/** 2433d5ac70f0Sopenharmony_ci * \brief Get number of used entries in CTL element identifiers list 2434d5ac70f0Sopenharmony_ci * 2435d5ac70f0Sopenharmony_ci * This function returns how many entries are actually filled with 2436d5ac70f0Sopenharmony_ci * useful information. 2437d5ac70f0Sopenharmony_ci * 2438d5ac70f0Sopenharmony_ci * See also snd_ctl_elem_list_get_count(). 2439d5ac70f0Sopenharmony_ci * 2440d5ac70f0Sopenharmony_ci * \param obj CTL element identifier list 2441d5ac70f0Sopenharmony_ci * \return number of used entries 2442d5ac70f0Sopenharmony_ci */ 2443d5ac70f0Sopenharmony_ciunsigned int snd_ctl_elem_list_get_used(const snd_ctl_elem_list_t *obj) 2444d5ac70f0Sopenharmony_ci{ 2445d5ac70f0Sopenharmony_ci assert(obj); 2446d5ac70f0Sopenharmony_ci return obj->used; 2447d5ac70f0Sopenharmony_ci} 2448d5ac70f0Sopenharmony_ci 2449d5ac70f0Sopenharmony_ci/** 2450d5ac70f0Sopenharmony_ci * \brief Get total count of elements present in CTL device 2451d5ac70f0Sopenharmony_ci * 2452d5ac70f0Sopenharmony_ci * This function returns how many entries were allocated using 2453d5ac70f0Sopenharmony_ci * snd_ctl_elem_list_alloc_space(). This information is present after 2454d5ac70f0Sopenharmony_ci * snd_ctl_elem_list() was called. 2455d5ac70f0Sopenharmony_ci * 2456d5ac70f0Sopenharmony_ci * See also snd_ctl_elem_list_get_used(). 2457d5ac70f0Sopenharmony_ci * 2458d5ac70f0Sopenharmony_ci * \param obj CTL element identifier list 2459d5ac70f0Sopenharmony_ci * \return total number of elements 2460d5ac70f0Sopenharmony_ci */ 2461d5ac70f0Sopenharmony_ciunsigned int snd_ctl_elem_list_get_count(const snd_ctl_elem_list_t *obj) 2462d5ac70f0Sopenharmony_ci{ 2463d5ac70f0Sopenharmony_ci assert(obj); 2464d5ac70f0Sopenharmony_ci return obj->count; 2465d5ac70f0Sopenharmony_ci} 2466d5ac70f0Sopenharmony_ci 2467d5ac70f0Sopenharmony_ci/** 2468d5ac70f0Sopenharmony_ci * \brief Get CTL element identifier for an entry of a CTL element identifiers list 2469d5ac70f0Sopenharmony_ci * \param obj CTL element identifier list 2470d5ac70f0Sopenharmony_ci * \param idx Index of entry 2471d5ac70f0Sopenharmony_ci * \param ptr Pointer to returned CTL element identifier 2472d5ac70f0Sopenharmony_ci */ 2473d5ac70f0Sopenharmony_civoid snd_ctl_elem_list_get_id(const snd_ctl_elem_list_t *obj, unsigned int idx, snd_ctl_elem_id_t *ptr) 2474d5ac70f0Sopenharmony_ci{ 2475d5ac70f0Sopenharmony_ci assert(obj && ptr); 2476d5ac70f0Sopenharmony_ci assert(idx < obj->used); 2477d5ac70f0Sopenharmony_ci *ptr = obj->pids[idx]; 2478d5ac70f0Sopenharmony_ci} 2479d5ac70f0Sopenharmony_ci 2480d5ac70f0Sopenharmony_ci/** 2481d5ac70f0Sopenharmony_ci * \brief Get CTL element numeric identifier for an entry of a CTL element identifiers list 2482d5ac70f0Sopenharmony_ci * \param obj CTL element identifier list 2483d5ac70f0Sopenharmony_ci * \param idx Index of entry 2484d5ac70f0Sopenharmony_ci * \return CTL element numeric identifier 2485d5ac70f0Sopenharmony_ci */ 2486d5ac70f0Sopenharmony_ciunsigned int snd_ctl_elem_list_get_numid(const snd_ctl_elem_list_t *obj, unsigned int idx) 2487d5ac70f0Sopenharmony_ci{ 2488d5ac70f0Sopenharmony_ci assert(obj); 2489d5ac70f0Sopenharmony_ci assert(idx < obj->used); 2490d5ac70f0Sopenharmony_ci return obj->pids[idx].numid; 2491d5ac70f0Sopenharmony_ci} 2492d5ac70f0Sopenharmony_ci 2493d5ac70f0Sopenharmony_ci/** 2494d5ac70f0Sopenharmony_ci * \brief Get interface part of CTL element identifier for an entry of a CTL element identifiers list 2495d5ac70f0Sopenharmony_ci * \param obj CTL element identifier list 2496d5ac70f0Sopenharmony_ci * \param idx Index of entry 2497d5ac70f0Sopenharmony_ci * \return CTL element related interface 2498d5ac70f0Sopenharmony_ci */ 2499d5ac70f0Sopenharmony_cisnd_ctl_elem_iface_t snd_ctl_elem_list_get_interface(const snd_ctl_elem_list_t *obj, unsigned int idx) 2500d5ac70f0Sopenharmony_ci{ 2501d5ac70f0Sopenharmony_ci assert(obj); 2502d5ac70f0Sopenharmony_ci assert(idx < obj->used); 2503d5ac70f0Sopenharmony_ci return obj->pids[idx].iface; 2504d5ac70f0Sopenharmony_ci} 2505d5ac70f0Sopenharmony_ci 2506d5ac70f0Sopenharmony_ci/** 2507d5ac70f0Sopenharmony_ci * \brief Get the device part of CTL element identifier for an entry of a CTL element identifiers list 2508d5ac70f0Sopenharmony_ci * \param obj CTL element identifier list 2509d5ac70f0Sopenharmony_ci * \param idx Index of entry 2510d5ac70f0Sopenharmony_ci * \return CTL element related device 2511d5ac70f0Sopenharmony_ci */ 2512d5ac70f0Sopenharmony_ciunsigned int snd_ctl_elem_list_get_device(const snd_ctl_elem_list_t *obj, unsigned int idx) 2513d5ac70f0Sopenharmony_ci{ 2514d5ac70f0Sopenharmony_ci assert(obj); 2515d5ac70f0Sopenharmony_ci assert(idx < obj->used); 2516d5ac70f0Sopenharmony_ci return obj->pids[idx].device; 2517d5ac70f0Sopenharmony_ci} 2518d5ac70f0Sopenharmony_ci 2519d5ac70f0Sopenharmony_ci/** 2520d5ac70f0Sopenharmony_ci * \brief Get subdevice part of CTL element identifier for an entry of a CTL element identifiers list 2521d5ac70f0Sopenharmony_ci * \param obj CTL element identifier list 2522d5ac70f0Sopenharmony_ci * \param idx Index of entry 2523d5ac70f0Sopenharmony_ci * \return CTL element related subdevice 2524d5ac70f0Sopenharmony_ci */ 2525d5ac70f0Sopenharmony_ciunsigned int snd_ctl_elem_list_get_subdevice(const snd_ctl_elem_list_t *obj, unsigned int idx) 2526d5ac70f0Sopenharmony_ci{ 2527d5ac70f0Sopenharmony_ci assert(obj); 2528d5ac70f0Sopenharmony_ci assert(idx < obj->used); 2529d5ac70f0Sopenharmony_ci return obj->pids[idx].subdevice; 2530d5ac70f0Sopenharmony_ci} 2531d5ac70f0Sopenharmony_ci 2532d5ac70f0Sopenharmony_ci/** 2533d5ac70f0Sopenharmony_ci * \brief Get name part of CTL element identifier for an entry of a CTL element identifiers list 2534d5ac70f0Sopenharmony_ci * \param obj CTL element identifier list 2535d5ac70f0Sopenharmony_ci * \param idx Index of entry 2536d5ac70f0Sopenharmony_ci * \return CTL element name 2537d5ac70f0Sopenharmony_ci */ 2538d5ac70f0Sopenharmony_ciconst char *snd_ctl_elem_list_get_name(const snd_ctl_elem_list_t *obj, unsigned int idx) 2539d5ac70f0Sopenharmony_ci{ 2540d5ac70f0Sopenharmony_ci assert(obj); 2541d5ac70f0Sopenharmony_ci assert(idx < obj->used); 2542d5ac70f0Sopenharmony_ci return (const char *)obj->pids[idx].name; 2543d5ac70f0Sopenharmony_ci} 2544d5ac70f0Sopenharmony_ci 2545d5ac70f0Sopenharmony_ci/** 2546d5ac70f0Sopenharmony_ci * \brief Get index part of CTL element identifier for an entry of a CTL element identifiers list 2547d5ac70f0Sopenharmony_ci * \param obj CTL element identifier list 2548d5ac70f0Sopenharmony_ci * \param idx Index of entry 2549d5ac70f0Sopenharmony_ci * \return CTL element index 2550d5ac70f0Sopenharmony_ci */ 2551d5ac70f0Sopenharmony_ciunsigned int snd_ctl_elem_list_get_index(const snd_ctl_elem_list_t *obj, unsigned int idx) 2552d5ac70f0Sopenharmony_ci{ 2553d5ac70f0Sopenharmony_ci assert(obj); 2554d5ac70f0Sopenharmony_ci assert(idx < obj->used); 2555d5ac70f0Sopenharmony_ci return obj->pids[idx].index; 2556d5ac70f0Sopenharmony_ci} 2557d5ac70f0Sopenharmony_ci 2558d5ac70f0Sopenharmony_ci/** 2559d5ac70f0Sopenharmony_ci * \brief get size of #snd_ctl_elem_info_t 2560d5ac70f0Sopenharmony_ci * \return size in bytes 2561d5ac70f0Sopenharmony_ci */ 2562d5ac70f0Sopenharmony_cisize_t snd_ctl_elem_info_sizeof() 2563d5ac70f0Sopenharmony_ci{ 2564d5ac70f0Sopenharmony_ci return sizeof(snd_ctl_elem_info_t); 2565d5ac70f0Sopenharmony_ci} 2566d5ac70f0Sopenharmony_ci 2567d5ac70f0Sopenharmony_ci/** 2568d5ac70f0Sopenharmony_ci * \brief allocate an invalid #snd_ctl_elem_info_t using standard malloc 2569d5ac70f0Sopenharmony_ci * \param ptr returned pointer 2570d5ac70f0Sopenharmony_ci * \return 0 on success otherwise negative error code 2571d5ac70f0Sopenharmony_ci */ 2572d5ac70f0Sopenharmony_ciint snd_ctl_elem_info_malloc(snd_ctl_elem_info_t **ptr) 2573d5ac70f0Sopenharmony_ci{ 2574d5ac70f0Sopenharmony_ci assert(ptr); 2575d5ac70f0Sopenharmony_ci *ptr = calloc(1, sizeof(snd_ctl_elem_info_t)); 2576d5ac70f0Sopenharmony_ci if (!*ptr) 2577d5ac70f0Sopenharmony_ci return -ENOMEM; 2578d5ac70f0Sopenharmony_ci return 0; 2579d5ac70f0Sopenharmony_ci} 2580d5ac70f0Sopenharmony_ci 2581d5ac70f0Sopenharmony_ci/** 2582d5ac70f0Sopenharmony_ci * \brief frees a previously allocated #snd_ctl_elem_info_t 2583d5ac70f0Sopenharmony_ci * \param obj pointer to object to free 2584d5ac70f0Sopenharmony_ci */ 2585d5ac70f0Sopenharmony_civoid snd_ctl_elem_info_free(snd_ctl_elem_info_t *obj) 2586d5ac70f0Sopenharmony_ci{ 2587d5ac70f0Sopenharmony_ci free(obj); 2588d5ac70f0Sopenharmony_ci} 2589d5ac70f0Sopenharmony_ci 2590d5ac70f0Sopenharmony_ci/** 2591d5ac70f0Sopenharmony_ci * \brief clear given #snd_ctl_elem_info_t object 2592d5ac70f0Sopenharmony_ci * \param obj pointer to object to clear 2593d5ac70f0Sopenharmony_ci */ 2594d5ac70f0Sopenharmony_civoid snd_ctl_elem_info_clear(snd_ctl_elem_info_t *obj) 2595d5ac70f0Sopenharmony_ci{ 2596d5ac70f0Sopenharmony_ci memset(obj, 0, sizeof(snd_ctl_elem_info_t)); 2597d5ac70f0Sopenharmony_ci} 2598d5ac70f0Sopenharmony_ci 2599d5ac70f0Sopenharmony_ci/** 2600d5ac70f0Sopenharmony_ci * \brief copy one #snd_ctl_elem_info_t to another 2601d5ac70f0Sopenharmony_ci * \param dst pointer to destination 2602d5ac70f0Sopenharmony_ci * \param src pointer to source 2603d5ac70f0Sopenharmony_ci */ 2604d5ac70f0Sopenharmony_civoid snd_ctl_elem_info_copy(snd_ctl_elem_info_t *dst, const snd_ctl_elem_info_t *src) 2605d5ac70f0Sopenharmony_ci{ 2606d5ac70f0Sopenharmony_ci assert(dst && src); 2607d5ac70f0Sopenharmony_ci *dst = *src; 2608d5ac70f0Sopenharmony_ci} 2609d5ac70f0Sopenharmony_ci 2610d5ac70f0Sopenharmony_ci/** 2611d5ac70f0Sopenharmony_ci * \brief Get type from a CTL element id/info 2612d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 2613d5ac70f0Sopenharmony_ci * \return CTL element content type 2614d5ac70f0Sopenharmony_ci */ 2615d5ac70f0Sopenharmony_cisnd_ctl_elem_type_t snd_ctl_elem_info_get_type(const snd_ctl_elem_info_t *obj) 2616d5ac70f0Sopenharmony_ci{ 2617d5ac70f0Sopenharmony_ci assert(obj); 2618d5ac70f0Sopenharmony_ci return obj->type; 2619d5ac70f0Sopenharmony_ci} 2620d5ac70f0Sopenharmony_ci 2621d5ac70f0Sopenharmony_ci/** 2622d5ac70f0Sopenharmony_ci * \brief Get info about readability from a CTL element id/info 2623d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 2624d5ac70f0Sopenharmony_ci * \return 0 if element is not readable, 1 if element is readable 2625d5ac70f0Sopenharmony_ci */ 2626d5ac70f0Sopenharmony_ciint snd_ctl_elem_info_is_readable(const snd_ctl_elem_info_t *obj) 2627d5ac70f0Sopenharmony_ci{ 2628d5ac70f0Sopenharmony_ci assert(obj); 2629d5ac70f0Sopenharmony_ci return !!(obj->access & SNDRV_CTL_ELEM_ACCESS_READ); 2630d5ac70f0Sopenharmony_ci} 2631d5ac70f0Sopenharmony_ci 2632d5ac70f0Sopenharmony_ci/** 2633d5ac70f0Sopenharmony_ci * \brief Get info about writability from a CTL element id/info 2634d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 2635d5ac70f0Sopenharmony_ci * \return 0 if element is not writable, 1 if element is not writable 2636d5ac70f0Sopenharmony_ci */ 2637d5ac70f0Sopenharmony_ciint snd_ctl_elem_info_is_writable(const snd_ctl_elem_info_t *obj) 2638d5ac70f0Sopenharmony_ci{ 2639d5ac70f0Sopenharmony_ci assert(obj); 2640d5ac70f0Sopenharmony_ci return !!(obj->access & SNDRV_CTL_ELEM_ACCESS_WRITE); 2641d5ac70f0Sopenharmony_ci} 2642d5ac70f0Sopenharmony_ci 2643d5ac70f0Sopenharmony_ci/** 2644d5ac70f0Sopenharmony_ci * \brief Get info about notification feasibility from a CTL element id/info 2645d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 2646d5ac70f0Sopenharmony_ci * \return 0 if all element value changes are notified to subscribed applications, 1 otherwise 2647d5ac70f0Sopenharmony_ci */ 2648d5ac70f0Sopenharmony_ciint snd_ctl_elem_info_is_volatile(const snd_ctl_elem_info_t *obj) 2649d5ac70f0Sopenharmony_ci{ 2650d5ac70f0Sopenharmony_ci assert(obj); 2651d5ac70f0Sopenharmony_ci return !!(obj->access & SNDRV_CTL_ELEM_ACCESS_VOLATILE); 2652d5ac70f0Sopenharmony_ci} 2653d5ac70f0Sopenharmony_ci 2654d5ac70f0Sopenharmony_ci/** 2655d5ac70f0Sopenharmony_ci * \brief Get info about status from a CTL element id/info 2656d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 2657d5ac70f0Sopenharmony_ci * \return 0 if element value is not active, 1 if is active 2658d5ac70f0Sopenharmony_ci */ 2659d5ac70f0Sopenharmony_ciint snd_ctl_elem_info_is_inactive(const snd_ctl_elem_info_t *obj) 2660d5ac70f0Sopenharmony_ci{ 2661d5ac70f0Sopenharmony_ci assert(obj); 2662d5ac70f0Sopenharmony_ci return !!(obj->access & SNDRV_CTL_ELEM_ACCESS_INACTIVE); 2663d5ac70f0Sopenharmony_ci} 2664d5ac70f0Sopenharmony_ci 2665d5ac70f0Sopenharmony_ci/** 2666d5ac70f0Sopenharmony_ci * \brief Get info whether an element is locked 2667d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 2668d5ac70f0Sopenharmony_ci * \return 0 if element value is currently changeable, 1 if it's locked by another application 2669d5ac70f0Sopenharmony_ci */ 2670d5ac70f0Sopenharmony_ciint snd_ctl_elem_info_is_locked(const snd_ctl_elem_info_t *obj) 2671d5ac70f0Sopenharmony_ci{ 2672d5ac70f0Sopenharmony_ci assert(obj); 2673d5ac70f0Sopenharmony_ci return !!(obj->access & SNDRV_CTL_ELEM_ACCESS_LOCK); 2674d5ac70f0Sopenharmony_ci} 2675d5ac70f0Sopenharmony_ci 2676d5ac70f0Sopenharmony_ci/** 2677d5ac70f0Sopenharmony_ci * \brief Get info if I own an element 2678d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 2679d5ac70f0Sopenharmony_ci * \return 0 if element value is currently changeable, 1 if it's locked by another application 2680d5ac70f0Sopenharmony_ci */ 2681d5ac70f0Sopenharmony_ciint snd_ctl_elem_info_is_owner(const snd_ctl_elem_info_t *obj) 2682d5ac70f0Sopenharmony_ci{ 2683d5ac70f0Sopenharmony_ci assert(obj); 2684d5ac70f0Sopenharmony_ci return !!(obj->access & SNDRV_CTL_ELEM_ACCESS_OWNER); 2685d5ac70f0Sopenharmony_ci} 2686d5ac70f0Sopenharmony_ci 2687d5ac70f0Sopenharmony_ci/** 2688d5ac70f0Sopenharmony_ci * \brief Get info if it's a user element 2689d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 2690d5ac70f0Sopenharmony_ci * \return 0 if element value is a system element, 1 if it's a user-created element 2691d5ac70f0Sopenharmony_ci */ 2692d5ac70f0Sopenharmony_ciint snd_ctl_elem_info_is_user(const snd_ctl_elem_info_t *obj) 2693d5ac70f0Sopenharmony_ci{ 2694d5ac70f0Sopenharmony_ci assert(obj); 2695d5ac70f0Sopenharmony_ci return !!(obj->access & SNDRV_CTL_ELEM_ACCESS_USER); 2696d5ac70f0Sopenharmony_ci} 2697d5ac70f0Sopenharmony_ci 2698d5ac70f0Sopenharmony_ci/** 2699d5ac70f0Sopenharmony_ci * \brief Get info about TLV readability from a CTL element id/info 2700d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 2701d5ac70f0Sopenharmony_ci * \return 0 if element's TLV is not readable, 1 if element's TLV is readable 2702d5ac70f0Sopenharmony_ci */ 2703d5ac70f0Sopenharmony_ciint snd_ctl_elem_info_is_tlv_readable(const snd_ctl_elem_info_t *obj) 2704d5ac70f0Sopenharmony_ci{ 2705d5ac70f0Sopenharmony_ci assert(obj); 2706d5ac70f0Sopenharmony_ci return !!(obj->access & SNDRV_CTL_ELEM_ACCESS_TLV_READ); 2707d5ac70f0Sopenharmony_ci} 2708d5ac70f0Sopenharmony_ci 2709d5ac70f0Sopenharmony_ci/** 2710d5ac70f0Sopenharmony_ci * \brief Get info about TLV writeability from a CTL element id/info 2711d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 2712d5ac70f0Sopenharmony_ci * \return 0 if element's TLV is not writable, 1 if element's TLV is writable 2713d5ac70f0Sopenharmony_ci */ 2714d5ac70f0Sopenharmony_ciint snd_ctl_elem_info_is_tlv_writable(const snd_ctl_elem_info_t *obj) 2715d5ac70f0Sopenharmony_ci{ 2716d5ac70f0Sopenharmony_ci assert(obj); 2717d5ac70f0Sopenharmony_ci return !!(obj->access & SNDRV_CTL_ELEM_ACCESS_TLV_WRITE); 2718d5ac70f0Sopenharmony_ci} 2719d5ac70f0Sopenharmony_ci 2720d5ac70f0Sopenharmony_ci/** 2721d5ac70f0Sopenharmony_ci * \brief Get info about TLV command possibility from a CTL element id/info 2722d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 2723d5ac70f0Sopenharmony_ci * \return 0 if element's TLV command is not possible, 1 if element's TLV command is supported 2724d5ac70f0Sopenharmony_ci */ 2725d5ac70f0Sopenharmony_ciint snd_ctl_elem_info_is_tlv_commandable(const snd_ctl_elem_info_t *obj) 2726d5ac70f0Sopenharmony_ci{ 2727d5ac70f0Sopenharmony_ci assert(obj); 2728d5ac70f0Sopenharmony_ci return !!(obj->access & SNDRV_CTL_ELEM_ACCESS_TLV_COMMAND); 2729d5ac70f0Sopenharmony_ci} 2730d5ac70f0Sopenharmony_ci 2731d5ac70f0Sopenharmony_ci/** 2732d5ac70f0Sopenharmony_ci * \brief (DEPRECATED) Get info about values passing policy from a CTL element value 2733d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 2734d5ac70f0Sopenharmony_ci * \return 0 if element value need to be passed by contents, 1 if need to be passed with a pointer 2735d5ac70f0Sopenharmony_ci */ 2736d5ac70f0Sopenharmony_ciint snd_ctl_elem_info_is_indirect(const snd_ctl_elem_info_t *obj) 2737d5ac70f0Sopenharmony_ci{ 2738d5ac70f0Sopenharmony_ci assert(obj); 2739d5ac70f0Sopenharmony_ci return 0; 2740d5ac70f0Sopenharmony_ci} 2741d5ac70f0Sopenharmony_cilink_warning(snd_ctl_elem_info_is_indirect, "Warning: snd_ctl_elem_info_is_indirect is deprecated, do not use it"); 2742d5ac70f0Sopenharmony_ci 2743d5ac70f0Sopenharmony_ci/** 2744d5ac70f0Sopenharmony_ci * \brief Get owner of a locked element 2745d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 2746d5ac70f0Sopenharmony_ci * \return value entries count 2747d5ac70f0Sopenharmony_ci */ 2748d5ac70f0Sopenharmony_cipid_t snd_ctl_elem_info_get_owner(const snd_ctl_elem_info_t *obj) 2749d5ac70f0Sopenharmony_ci{ 2750d5ac70f0Sopenharmony_ci assert(obj); 2751d5ac70f0Sopenharmony_ci return obj->owner; 2752d5ac70f0Sopenharmony_ci} 2753d5ac70f0Sopenharmony_ci 2754d5ac70f0Sopenharmony_ci/** 2755d5ac70f0Sopenharmony_ci * \brief Get number of value entries from a CTL element id/info 2756d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 2757d5ac70f0Sopenharmony_ci * \return value entries count 2758d5ac70f0Sopenharmony_ci */ 2759d5ac70f0Sopenharmony_ciunsigned int snd_ctl_elem_info_get_count(const snd_ctl_elem_info_t *obj) 2760d5ac70f0Sopenharmony_ci{ 2761d5ac70f0Sopenharmony_ci assert(obj); 2762d5ac70f0Sopenharmony_ci return obj->count; 2763d5ac70f0Sopenharmony_ci} 2764d5ac70f0Sopenharmony_ci 2765d5ac70f0Sopenharmony_ci/** 2766d5ac70f0Sopenharmony_ci * \brief Get minimum value from a #SND_CTL_ELEM_TYPE_INTEGER CTL element id/info 2767d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 2768d5ac70f0Sopenharmony_ci * \return Minimum value 2769d5ac70f0Sopenharmony_ci */ 2770d5ac70f0Sopenharmony_cilong snd_ctl_elem_info_get_min(const snd_ctl_elem_info_t *obj) 2771d5ac70f0Sopenharmony_ci{ 2772d5ac70f0Sopenharmony_ci assert(obj); 2773d5ac70f0Sopenharmony_ci assert(obj->type == SND_CTL_ELEM_TYPE_INTEGER); 2774d5ac70f0Sopenharmony_ci return obj->value.integer.min; 2775d5ac70f0Sopenharmony_ci} 2776d5ac70f0Sopenharmony_ci 2777d5ac70f0Sopenharmony_ci/** 2778d5ac70f0Sopenharmony_ci * \brief Get maximum value from a #SND_CTL_ELEM_TYPE_INTEGER CTL element id/info 2779d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 2780d5ac70f0Sopenharmony_ci * \return Maximum value 2781d5ac70f0Sopenharmony_ci */ 2782d5ac70f0Sopenharmony_cilong snd_ctl_elem_info_get_max(const snd_ctl_elem_info_t *obj) 2783d5ac70f0Sopenharmony_ci{ 2784d5ac70f0Sopenharmony_ci assert(obj); 2785d5ac70f0Sopenharmony_ci assert(obj->type == SND_CTL_ELEM_TYPE_INTEGER); 2786d5ac70f0Sopenharmony_ci return obj->value.integer.max; 2787d5ac70f0Sopenharmony_ci} 2788d5ac70f0Sopenharmony_ci 2789d5ac70f0Sopenharmony_ci/** 2790d5ac70f0Sopenharmony_ci * \brief Get value step from a #SND_CTL_ELEM_TYPE_INTEGER CTL element id/info 2791d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 2792d5ac70f0Sopenharmony_ci * \return Step 2793d5ac70f0Sopenharmony_ci */ 2794d5ac70f0Sopenharmony_cilong snd_ctl_elem_info_get_step(const snd_ctl_elem_info_t *obj) 2795d5ac70f0Sopenharmony_ci{ 2796d5ac70f0Sopenharmony_ci assert(obj); 2797d5ac70f0Sopenharmony_ci assert(obj->type == SND_CTL_ELEM_TYPE_INTEGER); 2798d5ac70f0Sopenharmony_ci return obj->value.integer.step; 2799d5ac70f0Sopenharmony_ci} 2800d5ac70f0Sopenharmony_ci 2801d5ac70f0Sopenharmony_ci/** 2802d5ac70f0Sopenharmony_ci * \brief Get minimum value from a #SND_CTL_ELEM_TYPE_INTEGER64 CTL element id/info 2803d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 2804d5ac70f0Sopenharmony_ci * \return Minimum value 2805d5ac70f0Sopenharmony_ci */ 2806d5ac70f0Sopenharmony_cilong long snd_ctl_elem_info_get_min64(const snd_ctl_elem_info_t *obj) 2807d5ac70f0Sopenharmony_ci{ 2808d5ac70f0Sopenharmony_ci assert(obj); 2809d5ac70f0Sopenharmony_ci assert(obj->type == SND_CTL_ELEM_TYPE_INTEGER64); 2810d5ac70f0Sopenharmony_ci return obj->value.integer64.min; 2811d5ac70f0Sopenharmony_ci} 2812d5ac70f0Sopenharmony_ci 2813d5ac70f0Sopenharmony_ci/** 2814d5ac70f0Sopenharmony_ci * \brief Get maximum value from a #SND_CTL_ELEM_TYPE_INTEGER64 CTL element id/info 2815d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 2816d5ac70f0Sopenharmony_ci * \return Maximum value 2817d5ac70f0Sopenharmony_ci */ 2818d5ac70f0Sopenharmony_cilong long snd_ctl_elem_info_get_max64(const snd_ctl_elem_info_t *obj) 2819d5ac70f0Sopenharmony_ci{ 2820d5ac70f0Sopenharmony_ci assert(obj); 2821d5ac70f0Sopenharmony_ci assert(obj->type == SND_CTL_ELEM_TYPE_INTEGER64); 2822d5ac70f0Sopenharmony_ci return obj->value.integer64.max; 2823d5ac70f0Sopenharmony_ci} 2824d5ac70f0Sopenharmony_ci 2825d5ac70f0Sopenharmony_ci/** 2826d5ac70f0Sopenharmony_ci * \brief Get value step from a #SND_CTL_ELEM_TYPE_INTEGER64 CTL element id/info 2827d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 2828d5ac70f0Sopenharmony_ci * \return Step 2829d5ac70f0Sopenharmony_ci */ 2830d5ac70f0Sopenharmony_cilong long snd_ctl_elem_info_get_step64(const snd_ctl_elem_info_t *obj) 2831d5ac70f0Sopenharmony_ci{ 2832d5ac70f0Sopenharmony_ci assert(obj); 2833d5ac70f0Sopenharmony_ci assert(obj->type == SND_CTL_ELEM_TYPE_INTEGER64); 2834d5ac70f0Sopenharmony_ci return obj->value.integer64.step; 2835d5ac70f0Sopenharmony_ci} 2836d5ac70f0Sopenharmony_ci 2837d5ac70f0Sopenharmony_ci/** 2838d5ac70f0Sopenharmony_ci * \brief Get number of items available from a #SND_CTL_ELEM_TYPE_ENUMERATED CTL element id/info 2839d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 2840d5ac70f0Sopenharmony_ci * \return items count 2841d5ac70f0Sopenharmony_ci */ 2842d5ac70f0Sopenharmony_ciunsigned int snd_ctl_elem_info_get_items(const snd_ctl_elem_info_t *obj) 2843d5ac70f0Sopenharmony_ci{ 2844d5ac70f0Sopenharmony_ci assert(obj); 2845d5ac70f0Sopenharmony_ci assert(obj->type == SND_CTL_ELEM_TYPE_ENUMERATED); 2846d5ac70f0Sopenharmony_ci return obj->value.enumerated.items; 2847d5ac70f0Sopenharmony_ci} 2848d5ac70f0Sopenharmony_ci 2849d5ac70f0Sopenharmony_ci/** 2850d5ac70f0Sopenharmony_ci * \brief Select item in a #SND_CTL_ELEM_TYPE_ENUMERATED CTL element id/info 2851d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 2852d5ac70f0Sopenharmony_ci * \param val item number 2853d5ac70f0Sopenharmony_ci */ 2854d5ac70f0Sopenharmony_civoid snd_ctl_elem_info_set_item(snd_ctl_elem_info_t *obj, unsigned int val) 2855d5ac70f0Sopenharmony_ci{ 2856d5ac70f0Sopenharmony_ci assert(obj); 2857d5ac70f0Sopenharmony_ci obj->value.enumerated.item = val; 2858d5ac70f0Sopenharmony_ci} 2859d5ac70f0Sopenharmony_ci 2860d5ac70f0Sopenharmony_ci/** 2861d5ac70f0Sopenharmony_ci * \brief Get name for selected item in a #SND_CTL_ELEM_TYPE_ENUMERATED CTL element id/info 2862d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 2863d5ac70f0Sopenharmony_ci * \return name of chosen item 2864d5ac70f0Sopenharmony_ci */ 2865d5ac70f0Sopenharmony_ciconst char *snd_ctl_elem_info_get_item_name(const snd_ctl_elem_info_t *obj) 2866d5ac70f0Sopenharmony_ci{ 2867d5ac70f0Sopenharmony_ci assert(obj); 2868d5ac70f0Sopenharmony_ci assert(obj->type == SND_CTL_ELEM_TYPE_ENUMERATED); 2869d5ac70f0Sopenharmony_ci return obj->value.enumerated.name; 2870d5ac70f0Sopenharmony_ci} 2871d5ac70f0Sopenharmony_ci 2872d5ac70f0Sopenharmony_ci/** 2873d5ac70f0Sopenharmony_ci * \brief Get count of dimensions for given element 2874d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 2875d5ac70f0Sopenharmony_ci * \return zero value if no dimensions are defined, otherwise positive value with count of dimensions 2876d5ac70f0Sopenharmony_ci * 2877d5ac70f0Sopenharmony_ci * \deprecated Since 1.1.5 2878d5ac70f0Sopenharmony_ci * #snd_ctl_elem_info_get_dimensions is deprecated without any replacement. 2879d5ac70f0Sopenharmony_ci */ 2880d5ac70f0Sopenharmony_ci#ifndef DOXYGEN 2881d5ac70f0Sopenharmony_ciEXPORT_SYMBOL int INTERNAL(snd_ctl_elem_info_get_dimensions)(const snd_ctl_elem_info_t *obj ATTRIBUTE_UNUSED) 2882d5ac70f0Sopenharmony_ci#else 2883d5ac70f0Sopenharmony_ciint snd_ctl_elem_info_get_dimensions(const snd_ctl_elem_info_t *obj) 2884d5ac70f0Sopenharmony_ci#endif 2885d5ac70f0Sopenharmony_ci{ 2886d5ac70f0Sopenharmony_ci#if 0 /* deprecated */ 2887d5ac70f0Sopenharmony_ci int i; 2888d5ac70f0Sopenharmony_ci 2889d5ac70f0Sopenharmony_ci assert(obj); 2890d5ac70f0Sopenharmony_ci for (i = 3; i >= 0; i--) 2891d5ac70f0Sopenharmony_ci if (obj->dimen.d[i]) 2892d5ac70f0Sopenharmony_ci break; 2893d5ac70f0Sopenharmony_ci return i + 1; 2894d5ac70f0Sopenharmony_ci#else 2895d5ac70f0Sopenharmony_ci return -EINVAL; 2896d5ac70f0Sopenharmony_ci#endif 2897d5ac70f0Sopenharmony_ci} 2898d5ac70f0Sopenharmony_ciuse_default_symbol_version(__snd_ctl_elem_info_get_dimensions, snd_ctl_elem_info_get_dimensions, ALSA_0.9.3); 2899d5ac70f0Sopenharmony_ci 2900d5ac70f0Sopenharmony_ci/** 2901d5ac70f0Sopenharmony_ci * \brief Get specified of dimension width for given element 2902d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 2903d5ac70f0Sopenharmony_ci * \param idx The dimension index 2904d5ac70f0Sopenharmony_ci * \return zero value if no dimension width is defined, otherwise positive value with with of specified dimension 2905d5ac70f0Sopenharmony_ci * 2906d5ac70f0Sopenharmony_ci * \deprecated Since 1.1.5 2907d5ac70f0Sopenharmony_ci * #snd_ctl_elem_info_get_dimension is deprecated without any replacement. 2908d5ac70f0Sopenharmony_ci */ 2909d5ac70f0Sopenharmony_ci#ifndef DOXYGEN 2910d5ac70f0Sopenharmony_ciEXPORT_SYMBOL int INTERNAL(snd_ctl_elem_info_get_dimension)(const snd_ctl_elem_info_t *obj ATTRIBUTE_UNUSED, unsigned int idx ATTRIBUTE_UNUSED) 2911d5ac70f0Sopenharmony_ci#else 2912d5ac70f0Sopenharmony_ciint snd_ctl_elem_info_get_dimension(const snd_ctl_elem_info_t *obj, unsigned int idx) 2913d5ac70f0Sopenharmony_ci#endif 2914d5ac70f0Sopenharmony_ci{ 2915d5ac70f0Sopenharmony_ci#if 0 /* deprecated */ 2916d5ac70f0Sopenharmony_ci assert(obj); 2917d5ac70f0Sopenharmony_ci if (idx > 3) 2918d5ac70f0Sopenharmony_ci return 0; 2919d5ac70f0Sopenharmony_ci return obj->dimen.d[idx]; 2920d5ac70f0Sopenharmony_ci#else /* deprecated */ 2921d5ac70f0Sopenharmony_ci return -EINVAL; 2922d5ac70f0Sopenharmony_ci#endif /* deprecated */ 2923d5ac70f0Sopenharmony_ci} 2924d5ac70f0Sopenharmony_ciuse_default_symbol_version(__snd_ctl_elem_info_get_dimension, snd_ctl_elem_info_get_dimension, ALSA_0.9.3); 2925d5ac70f0Sopenharmony_ci 2926d5ac70f0Sopenharmony_ci/** 2927d5ac70f0Sopenharmony_ci * \brief Set width to a specified dimension level of given element information. 2928d5ac70f0Sopenharmony_ci * \param info Information of an element. 2929d5ac70f0Sopenharmony_ci * \param dimension Dimension width for each level by member unit. 2930d5ac70f0Sopenharmony_ci * \return Zero on success, otherwise a negative error code. 2931d5ac70f0Sopenharmony_ci * 2932d5ac70f0Sopenharmony_ci * \par Errors: 2933d5ac70f0Sopenharmony_ci * <dl> 2934d5ac70f0Sopenharmony_ci * <dt>-EINVAL 2935d5ac70f0Sopenharmony_ci * <dd>Invalid arguments are given as parameters. 2936d5ac70f0Sopenharmony_ci * </dl> 2937d5ac70f0Sopenharmony_ci * 2938d5ac70f0Sopenharmony_ci * \par Compatibility: 2939d5ac70f0Sopenharmony_ci * This function is added in version 1.1.2. 2940d5ac70f0Sopenharmony_ci * 2941d5ac70f0Sopenharmony_ci * \deprecated Since 1.1.5 2942d5ac70f0Sopenharmony_ci * #snd_ctl_elem_info_set_dimension is deprecated without any replacement. 2943d5ac70f0Sopenharmony_ci */ 2944d5ac70f0Sopenharmony_ciint snd_ctl_elem_info_set_dimension(snd_ctl_elem_info_t *info ATTRIBUTE_UNUSED, 2945d5ac70f0Sopenharmony_ci const int dimension[4] ATTRIBUTE_UNUSED) 2946d5ac70f0Sopenharmony_ci{ 2947d5ac70f0Sopenharmony_ci#if 0 /* deprecated */ 2948d5ac70f0Sopenharmony_ci unsigned int i; 2949d5ac70f0Sopenharmony_ci 2950d5ac70f0Sopenharmony_ci if (info == NULL) 2951d5ac70f0Sopenharmony_ci return -EINVAL; 2952d5ac70f0Sopenharmony_ci 2953d5ac70f0Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(info->dimen.d); i++) { 2954d5ac70f0Sopenharmony_ci if (dimension[i] < 0) 2955d5ac70f0Sopenharmony_ci return -EINVAL; 2956d5ac70f0Sopenharmony_ci 2957d5ac70f0Sopenharmony_ci info->dimen.d[i] = dimension[i]; 2958d5ac70f0Sopenharmony_ci } 2959d5ac70f0Sopenharmony_ci 2960d5ac70f0Sopenharmony_ci return 0; 2961d5ac70f0Sopenharmony_ci#else /* deprecated */ 2962d5ac70f0Sopenharmony_ci return -EINVAL; 2963d5ac70f0Sopenharmony_ci#endif /* deprecated */ 2964d5ac70f0Sopenharmony_ci} 2965d5ac70f0Sopenharmony_ci 2966d5ac70f0Sopenharmony_ci/** 2967d5ac70f0Sopenharmony_ci * \brief Get CTL element identifier of a CTL element id/info 2968d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 2969d5ac70f0Sopenharmony_ci * \param ptr Pointer to returned CTL element identifier 2970d5ac70f0Sopenharmony_ci */ 2971d5ac70f0Sopenharmony_civoid snd_ctl_elem_info_get_id(const snd_ctl_elem_info_t *obj, snd_ctl_elem_id_t *ptr) 2972d5ac70f0Sopenharmony_ci{ 2973d5ac70f0Sopenharmony_ci assert(obj && ptr); 2974d5ac70f0Sopenharmony_ci *ptr = obj->id; 2975d5ac70f0Sopenharmony_ci} 2976d5ac70f0Sopenharmony_ci 2977d5ac70f0Sopenharmony_ci/** 2978d5ac70f0Sopenharmony_ci * \brief Get element numeric identifier of a CTL element id/info 2979d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 2980d5ac70f0Sopenharmony_ci * \return element numeric identifier 2981d5ac70f0Sopenharmony_ci */ 2982d5ac70f0Sopenharmony_ciunsigned int snd_ctl_elem_info_get_numid(const snd_ctl_elem_info_t *obj) 2983d5ac70f0Sopenharmony_ci{ 2984d5ac70f0Sopenharmony_ci assert(obj); 2985d5ac70f0Sopenharmony_ci return obj->id.numid; 2986d5ac70f0Sopenharmony_ci} 2987d5ac70f0Sopenharmony_ci 2988d5ac70f0Sopenharmony_ci/** 2989d5ac70f0Sopenharmony_ci * \brief Get interface part of CTL element identifier of a CTL element id/info 2990d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 2991d5ac70f0Sopenharmony_ci * \return interface part of element identifier 2992d5ac70f0Sopenharmony_ci */ 2993d5ac70f0Sopenharmony_cisnd_ctl_elem_iface_t snd_ctl_elem_info_get_interface(const snd_ctl_elem_info_t *obj) 2994d5ac70f0Sopenharmony_ci{ 2995d5ac70f0Sopenharmony_ci assert(obj); 2996d5ac70f0Sopenharmony_ci return obj->id.iface; 2997d5ac70f0Sopenharmony_ci} 2998d5ac70f0Sopenharmony_ci 2999d5ac70f0Sopenharmony_ci/** 3000d5ac70f0Sopenharmony_ci * \brief Get device part of CTL element identifier of a CTL element id/info 3001d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 3002d5ac70f0Sopenharmony_ci * \return device part of element identifier 3003d5ac70f0Sopenharmony_ci */ 3004d5ac70f0Sopenharmony_ciunsigned int snd_ctl_elem_info_get_device(const snd_ctl_elem_info_t *obj) 3005d5ac70f0Sopenharmony_ci{ 3006d5ac70f0Sopenharmony_ci assert(obj); 3007d5ac70f0Sopenharmony_ci return obj->id.device; 3008d5ac70f0Sopenharmony_ci} 3009d5ac70f0Sopenharmony_ci 3010d5ac70f0Sopenharmony_ci/** 3011d5ac70f0Sopenharmony_ci * \brief Get subdevice part of CTL element identifier of a CTL element id/info 3012d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 3013d5ac70f0Sopenharmony_ci * \return subdevice part of element identifier 3014d5ac70f0Sopenharmony_ci */ 3015d5ac70f0Sopenharmony_ciunsigned int snd_ctl_elem_info_get_subdevice(const snd_ctl_elem_info_t *obj) 3016d5ac70f0Sopenharmony_ci{ 3017d5ac70f0Sopenharmony_ci assert(obj); 3018d5ac70f0Sopenharmony_ci return obj->id.subdevice; 3019d5ac70f0Sopenharmony_ci} 3020d5ac70f0Sopenharmony_ci 3021d5ac70f0Sopenharmony_ci/** 3022d5ac70f0Sopenharmony_ci * \brief Get name part of CTL element identifier of a CTL element id/info 3023d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 3024d5ac70f0Sopenharmony_ci * \return name part of element identifier 3025d5ac70f0Sopenharmony_ci */ 3026d5ac70f0Sopenharmony_ciconst char *snd_ctl_elem_info_get_name(const snd_ctl_elem_info_t *obj) 3027d5ac70f0Sopenharmony_ci{ 3028d5ac70f0Sopenharmony_ci assert(obj); 3029d5ac70f0Sopenharmony_ci return (const char *)obj->id.name; 3030d5ac70f0Sopenharmony_ci} 3031d5ac70f0Sopenharmony_ci 3032d5ac70f0Sopenharmony_ci/** 3033d5ac70f0Sopenharmony_ci * \brief Get index part of CTL element identifier of a CTL element id/info 3034d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 3035d5ac70f0Sopenharmony_ci * \return index part of element identifier 3036d5ac70f0Sopenharmony_ci */ 3037d5ac70f0Sopenharmony_ciunsigned int snd_ctl_elem_info_get_index(const snd_ctl_elem_info_t *obj) 3038d5ac70f0Sopenharmony_ci{ 3039d5ac70f0Sopenharmony_ci assert(obj); 3040d5ac70f0Sopenharmony_ci return obj->id.index; 3041d5ac70f0Sopenharmony_ci} 3042d5ac70f0Sopenharmony_ci 3043d5ac70f0Sopenharmony_ci/** 3044d5ac70f0Sopenharmony_ci * \brief Set CTL element identifier of a CTL element id/info 3045d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 3046d5ac70f0Sopenharmony_ci * \param ptr CTL element identifier 3047d5ac70f0Sopenharmony_ci */ 3048d5ac70f0Sopenharmony_civoid snd_ctl_elem_info_set_id(snd_ctl_elem_info_t *obj, const snd_ctl_elem_id_t *ptr) 3049d5ac70f0Sopenharmony_ci{ 3050d5ac70f0Sopenharmony_ci assert(obj && ptr); 3051d5ac70f0Sopenharmony_ci obj->id = *ptr; 3052d5ac70f0Sopenharmony_ci} 3053d5ac70f0Sopenharmony_ci 3054d5ac70f0Sopenharmony_ci/** 3055d5ac70f0Sopenharmony_ci * \brief Set element numeric identifier of a CTL element id/info 3056d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 3057d5ac70f0Sopenharmony_ci * \param val element numeric identifier 3058d5ac70f0Sopenharmony_ci */ 3059d5ac70f0Sopenharmony_civoid snd_ctl_elem_info_set_numid(snd_ctl_elem_info_t *obj, unsigned int val) 3060d5ac70f0Sopenharmony_ci{ 3061d5ac70f0Sopenharmony_ci assert(obj); 3062d5ac70f0Sopenharmony_ci obj->id.numid = val; 3063d5ac70f0Sopenharmony_ci} 3064d5ac70f0Sopenharmony_ci 3065d5ac70f0Sopenharmony_ci/** 3066d5ac70f0Sopenharmony_ci * \brief Set interface part of CTL element identifier of a CTL element id/info 3067d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 3068d5ac70f0Sopenharmony_ci * \param val interface part of element identifier 3069d5ac70f0Sopenharmony_ci */ 3070d5ac70f0Sopenharmony_civoid snd_ctl_elem_info_set_interface(snd_ctl_elem_info_t *obj, snd_ctl_elem_iface_t val) 3071d5ac70f0Sopenharmony_ci{ 3072d5ac70f0Sopenharmony_ci assert(obj); 3073d5ac70f0Sopenharmony_ci obj->id.iface = val; 3074d5ac70f0Sopenharmony_ci} 3075d5ac70f0Sopenharmony_ci 3076d5ac70f0Sopenharmony_ci/** 3077d5ac70f0Sopenharmony_ci * \brief Set device part of CTL element identifier of a CTL element id/info 3078d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 3079d5ac70f0Sopenharmony_ci * \param val device part of element identifier 3080d5ac70f0Sopenharmony_ci */ 3081d5ac70f0Sopenharmony_civoid snd_ctl_elem_info_set_device(snd_ctl_elem_info_t *obj, unsigned int val) 3082d5ac70f0Sopenharmony_ci{ 3083d5ac70f0Sopenharmony_ci assert(obj); 3084d5ac70f0Sopenharmony_ci obj->id.device = val; 3085d5ac70f0Sopenharmony_ci} 3086d5ac70f0Sopenharmony_ci 3087d5ac70f0Sopenharmony_ci/** 3088d5ac70f0Sopenharmony_ci * \brief Set subdevice part of CTL element identifier of a CTL element id/info 3089d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 3090d5ac70f0Sopenharmony_ci * \param val subdevice part of element identifier 3091d5ac70f0Sopenharmony_ci */ 3092d5ac70f0Sopenharmony_civoid snd_ctl_elem_info_set_subdevice(snd_ctl_elem_info_t *obj, unsigned int val) 3093d5ac70f0Sopenharmony_ci{ 3094d5ac70f0Sopenharmony_ci assert(obj); 3095d5ac70f0Sopenharmony_ci obj->id.subdevice = val; 3096d5ac70f0Sopenharmony_ci} 3097d5ac70f0Sopenharmony_ci 3098d5ac70f0Sopenharmony_ci/** 3099d5ac70f0Sopenharmony_ci * \brief Set name part of CTL element identifier of a CTL element id/info 3100d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 3101d5ac70f0Sopenharmony_ci * \param val name part of element identifier 3102d5ac70f0Sopenharmony_ci */ 3103d5ac70f0Sopenharmony_civoid snd_ctl_elem_info_set_name(snd_ctl_elem_info_t *obj, const char *val) 3104d5ac70f0Sopenharmony_ci{ 3105d5ac70f0Sopenharmony_ci assert(obj); 3106d5ac70f0Sopenharmony_ci snd_strlcpy((char *)obj->id.name, val, sizeof(obj->id.name)); 3107d5ac70f0Sopenharmony_ci} 3108d5ac70f0Sopenharmony_ci 3109d5ac70f0Sopenharmony_ci/** 3110d5ac70f0Sopenharmony_ci * \brief Set index part of CTL element identifier of a CTL element id/info 3111d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 3112d5ac70f0Sopenharmony_ci * \param val index part of element identifier 3113d5ac70f0Sopenharmony_ci */ 3114d5ac70f0Sopenharmony_civoid snd_ctl_elem_info_set_index(snd_ctl_elem_info_t *obj, unsigned int val) 3115d5ac70f0Sopenharmony_ci{ 3116d5ac70f0Sopenharmony_ci assert(obj); 3117d5ac70f0Sopenharmony_ci obj->id.index = val; 3118d5ac70f0Sopenharmony_ci} 3119d5ac70f0Sopenharmony_ci 3120d5ac70f0Sopenharmony_ci/** 3121d5ac70f0Sopenharmony_ci * \brief Set readability/writeability parameter of a CTL element id/info 3122d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 3123d5ac70f0Sopenharmony_ci * \param rval readability part of element identifier 3124d5ac70f0Sopenharmony_ci * \param wval writeability part of element identifier 3125d5ac70f0Sopenharmony_ci */ 3126d5ac70f0Sopenharmony_civoid snd_ctl_elem_info_set_read_write(snd_ctl_elem_info_t *obj, int rval, int wval) 3127d5ac70f0Sopenharmony_ci{ 3128d5ac70f0Sopenharmony_ci assert(obj); 3129d5ac70f0Sopenharmony_ci obj->access = (obj->access & ~SNDRV_CTL_ELEM_ACCESS_READWRITE) | 3130d5ac70f0Sopenharmony_ci (rval ? SNDRV_CTL_ELEM_ACCESS_READ : 0) | 3131d5ac70f0Sopenharmony_ci (wval ? SNDRV_CTL_ELEM_ACCESS_WRITE : 0); 3132d5ac70f0Sopenharmony_ci} 3133d5ac70f0Sopenharmony_ci 3134d5ac70f0Sopenharmony_ci/** 3135d5ac70f0Sopenharmony_ci * \brief Set TLV readability/writeability parameter of a CTL element id/info 3136d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 3137d5ac70f0Sopenharmony_ci * \param rval TLV readability part of element identifier 3138d5ac70f0Sopenharmony_ci * \param wval TLV writeability part of element identifier 3139d5ac70f0Sopenharmony_ci */ 3140d5ac70f0Sopenharmony_civoid snd_ctl_elem_info_set_tlv_read_write(snd_ctl_elem_info_t *obj, int rval, int wval) 3141d5ac70f0Sopenharmony_ci{ 3142d5ac70f0Sopenharmony_ci assert(obj); 3143d5ac70f0Sopenharmony_ci obj->access = (obj->access & ~SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE) | 3144d5ac70f0Sopenharmony_ci (rval ? SNDRV_CTL_ELEM_ACCESS_TLV_READ : 0) | 3145d5ac70f0Sopenharmony_ci (wval ? SNDRV_CTL_ELEM_ACCESS_TLV_WRITE : 0); 3146d5ac70f0Sopenharmony_ci} 3147d5ac70f0Sopenharmony_ci 3148d5ac70f0Sopenharmony_ci/** 3149d5ac70f0Sopenharmony_ci * \brief Set inactive parameter of a CTL element id/info 3150d5ac70f0Sopenharmony_ci * \param obj CTL element id/info 3151d5ac70f0Sopenharmony_ci * \param val inactive part of element identifier 3152d5ac70f0Sopenharmony_ci */ 3153d5ac70f0Sopenharmony_civoid snd_ctl_elem_info_set_inactive(snd_ctl_elem_info_t *obj, int val) 3154d5ac70f0Sopenharmony_ci{ 3155d5ac70f0Sopenharmony_ci assert(obj); 3156d5ac70f0Sopenharmony_ci obj->access = (obj->access & ~SNDRV_CTL_ELEM_ACCESS_INACTIVE) | 3157d5ac70f0Sopenharmony_ci (val ? SNDRV_CTL_ELEM_ACCESS_INACTIVE : 0); 3158d5ac70f0Sopenharmony_ci} 3159d5ac70f0Sopenharmony_ci 3160d5ac70f0Sopenharmony_ci/** 3161d5ac70f0Sopenharmony_ci * \brief Get size of data structure for an element. 3162d5ac70f0Sopenharmony_ci * \return Size in bytes. 3163d5ac70f0Sopenharmony_ci */ 3164d5ac70f0Sopenharmony_cisize_t snd_ctl_elem_value_sizeof() 3165d5ac70f0Sopenharmony_ci{ 3166d5ac70f0Sopenharmony_ci return sizeof(snd_ctl_elem_value_t); 3167d5ac70f0Sopenharmony_ci} 3168d5ac70f0Sopenharmony_ci 3169d5ac70f0Sopenharmony_ci/** 3170d5ac70f0Sopenharmony_ci * \brief Allocate an invalid #snd_ctl_elem_value_t on the heap. 3171d5ac70f0Sopenharmony_ci * 3172d5ac70f0Sopenharmony_ci * Allocate space for a value object on the heap. The allocated memory 3173d5ac70f0Sopenharmony_ci * must be freed using snd_ctl_elem_value_free(). 3174d5ac70f0Sopenharmony_ci * 3175d5ac70f0Sopenharmony_ci * See snd_ctl_elem_value_t for details. 3176d5ac70f0Sopenharmony_ci * 3177d5ac70f0Sopenharmony_ci * \param ptr Pointer to a snd_ctl_elem_value_t pointer. The address 3178d5ac70f0Sopenharmony_ci * of the allocated space will be returned here. 3179d5ac70f0Sopenharmony_ci * \return 0 on success, otherwise a negative error code. 3180d5ac70f0Sopenharmony_ci */ 3181d5ac70f0Sopenharmony_ciint snd_ctl_elem_value_malloc(snd_ctl_elem_value_t **ptr) 3182d5ac70f0Sopenharmony_ci{ 3183d5ac70f0Sopenharmony_ci assert(ptr); 3184d5ac70f0Sopenharmony_ci *ptr = calloc(1, sizeof(snd_ctl_elem_value_t)); 3185d5ac70f0Sopenharmony_ci if (!*ptr) 3186d5ac70f0Sopenharmony_ci return -ENOMEM; 3187d5ac70f0Sopenharmony_ci return 0; 3188d5ac70f0Sopenharmony_ci} 3189d5ac70f0Sopenharmony_ci 3190d5ac70f0Sopenharmony_ci/** 3191d5ac70f0Sopenharmony_ci * \brief Free an #snd_ctl_elem_value_t previously allocated using 3192d5ac70f0Sopenharmony_ci * snd_ctl_elem_value_malloc(). 3193d5ac70f0Sopenharmony_ci * 3194d5ac70f0Sopenharmony_ci * \param obj Pointer to the snd_ctl_elem_value_t. 3195d5ac70f0Sopenharmony_ci */ 3196d5ac70f0Sopenharmony_civoid snd_ctl_elem_value_free(snd_ctl_elem_value_t *obj) 3197d5ac70f0Sopenharmony_ci{ 3198d5ac70f0Sopenharmony_ci free(obj); 3199d5ac70f0Sopenharmony_ci} 3200d5ac70f0Sopenharmony_ci 3201d5ac70f0Sopenharmony_ci/** 3202d5ac70f0Sopenharmony_ci * \brief Clear given data of an element. 3203d5ac70f0Sopenharmony_ci * 3204d5ac70f0Sopenharmony_ci * See snd_ctl_elem_value_t for details. 3205d5ac70f0Sopenharmony_ci * 3206d5ac70f0Sopenharmony_ci * \param obj Data of an element. 3207d5ac70f0Sopenharmony_ci */ 3208d5ac70f0Sopenharmony_civoid snd_ctl_elem_value_clear(snd_ctl_elem_value_t *obj) 3209d5ac70f0Sopenharmony_ci{ 3210d5ac70f0Sopenharmony_ci memset(obj, 0, sizeof(snd_ctl_elem_value_t)); 3211d5ac70f0Sopenharmony_ci} 3212d5ac70f0Sopenharmony_ci 3213d5ac70f0Sopenharmony_ci/** 3214d5ac70f0Sopenharmony_ci * \brief Bitwise copy of a snd_ctl_elem_value_t value. 3215d5ac70f0Sopenharmony_ci * \param dst Pointer to destination. 3216d5ac70f0Sopenharmony_ci * \param src Pointer to source. 3217d5ac70f0Sopenharmony_ci */ 3218d5ac70f0Sopenharmony_civoid snd_ctl_elem_value_copy(snd_ctl_elem_value_t *dst, 3219d5ac70f0Sopenharmony_ci const snd_ctl_elem_value_t *src) 3220d5ac70f0Sopenharmony_ci{ 3221d5ac70f0Sopenharmony_ci assert(dst && src); 3222d5ac70f0Sopenharmony_ci *dst = *src; 3223d5ac70f0Sopenharmony_ci} 3224d5ac70f0Sopenharmony_ci 3225d5ac70f0Sopenharmony_ci/** 3226d5ac70f0Sopenharmony_ci * \brief Compare two snd_ctl_elem_value_t values, bytewise. 3227d5ac70f0Sopenharmony_ci * 3228d5ac70f0Sopenharmony_ci * \param left First value. 3229d5ac70f0Sopenharmony_ci * \param right Second value. 3230d5ac70f0Sopenharmony_ci * \return 0 on match, less than or greater than otherwise, see memcmp(3). 3231d5ac70f0Sopenharmony_ci */ 3232d5ac70f0Sopenharmony_ciint snd_ctl_elem_value_compare(snd_ctl_elem_value_t *left, 3233d5ac70f0Sopenharmony_ci const snd_ctl_elem_value_t *right) 3234d5ac70f0Sopenharmony_ci{ 3235d5ac70f0Sopenharmony_ci assert(left && right); 3236d5ac70f0Sopenharmony_ci return memcmp(left, right, sizeof(*left)); 3237d5ac70f0Sopenharmony_ci} 3238d5ac70f0Sopenharmony_ci 3239d5ac70f0Sopenharmony_ci/** 3240d5ac70f0Sopenharmony_ci * \brief Get the element identifier from the given element value. 3241d5ac70f0Sopenharmony_ci * 3242d5ac70f0Sopenharmony_ci * See snd_ctl_elem_value_t for more details. 3243d5ac70f0Sopenharmony_ci * 3244d5ac70f0Sopenharmony_ci * \param obj The element value. 3245d5ac70f0Sopenharmony_ci * \param ptr Pointer to an identifier object. The identifier is 3246d5ac70f0Sopenharmony_ci * stored there. 3247d5ac70f0Sopenharmony_ci */ 3248d5ac70f0Sopenharmony_civoid snd_ctl_elem_value_get_id(const snd_ctl_elem_value_t *obj, snd_ctl_elem_id_t *ptr) 3249d5ac70f0Sopenharmony_ci{ 3250d5ac70f0Sopenharmony_ci assert(obj && ptr); 3251d5ac70f0Sopenharmony_ci *ptr = obj->id; 3252d5ac70f0Sopenharmony_ci} 3253d5ac70f0Sopenharmony_ci 3254d5ac70f0Sopenharmony_ci/** 3255d5ac70f0Sopenharmony_ci * \brief Get the identifiers 'numid' part from the given element value. 3256d5ac70f0Sopenharmony_ci * 3257d5ac70f0Sopenharmony_ci * See snd_ctl_elem_value_t for more details. 3258d5ac70f0Sopenharmony_ci * 3259d5ac70f0Sopenharmony_ci * \param obj The element value. 3260d5ac70f0Sopenharmony_ci * \return The numid. 3261d5ac70f0Sopenharmony_ci */ 3262d5ac70f0Sopenharmony_ciunsigned int snd_ctl_elem_value_get_numid(const snd_ctl_elem_value_t *obj) 3263d5ac70f0Sopenharmony_ci{ 3264d5ac70f0Sopenharmony_ci assert(obj); 3265d5ac70f0Sopenharmony_ci return obj->id.numid; 3266d5ac70f0Sopenharmony_ci} 3267d5ac70f0Sopenharmony_ci 3268d5ac70f0Sopenharmony_ci/** 3269d5ac70f0Sopenharmony_ci * \brief Get the identifiers 'interface' part from the given element value. 3270d5ac70f0Sopenharmony_ci * 3271d5ac70f0Sopenharmony_ci * See snd_ctl_elem_value_t for more details. 3272d5ac70f0Sopenharmony_ci * 3273d5ac70f0Sopenharmony_ci * \param obj The element value. 3274d5ac70f0Sopenharmony_ci * \return The interface part of element identifier. 3275d5ac70f0Sopenharmony_ci */ 3276d5ac70f0Sopenharmony_cisnd_ctl_elem_iface_t snd_ctl_elem_value_get_interface(const snd_ctl_elem_value_t *obj) 3277d5ac70f0Sopenharmony_ci{ 3278d5ac70f0Sopenharmony_ci assert(obj); 3279d5ac70f0Sopenharmony_ci return obj->id.iface; 3280d5ac70f0Sopenharmony_ci} 3281d5ac70f0Sopenharmony_ci 3282d5ac70f0Sopenharmony_ci/** 3283d5ac70f0Sopenharmony_ci * \brief Get the identifiers 'device' part from the given element value. 3284d5ac70f0Sopenharmony_ci * 3285d5ac70f0Sopenharmony_ci * See snd_ctl_elem_value_t for more details. 3286d5ac70f0Sopenharmony_ci * 3287d5ac70f0Sopenharmony_ci * \param obj The element value. 3288d5ac70f0Sopenharmony_ci * \return The device part of element identifier. 3289d5ac70f0Sopenharmony_ci */ 3290d5ac70f0Sopenharmony_ciunsigned int snd_ctl_elem_value_get_device(const snd_ctl_elem_value_t *obj) 3291d5ac70f0Sopenharmony_ci{ 3292d5ac70f0Sopenharmony_ci assert(obj); 3293d5ac70f0Sopenharmony_ci return obj->id.device; 3294d5ac70f0Sopenharmony_ci} 3295d5ac70f0Sopenharmony_ci 3296d5ac70f0Sopenharmony_ci/** 3297d5ac70f0Sopenharmony_ci * \brief Get the identifiers 'subdevice' part from the given element value. 3298d5ac70f0Sopenharmony_ci * 3299d5ac70f0Sopenharmony_ci * See snd_ctl_elem_value_t for more details. 3300d5ac70f0Sopenharmony_ci * 3301d5ac70f0Sopenharmony_ci * \param obj The element value. 3302d5ac70f0Sopenharmony_ci * \return The subdevice part of element identifier. 3303d5ac70f0Sopenharmony_ci */ 3304d5ac70f0Sopenharmony_ciunsigned int snd_ctl_elem_value_get_subdevice(const snd_ctl_elem_value_t *obj) 3305d5ac70f0Sopenharmony_ci{ 3306d5ac70f0Sopenharmony_ci assert(obj); 3307d5ac70f0Sopenharmony_ci return obj->id.subdevice; 3308d5ac70f0Sopenharmony_ci} 3309d5ac70f0Sopenharmony_ci 3310d5ac70f0Sopenharmony_ci/** 3311d5ac70f0Sopenharmony_ci * \brief Get the identifiers 'name' part from the given element value. 3312d5ac70f0Sopenharmony_ci * 3313d5ac70f0Sopenharmony_ci * See snd_ctl_elem_value_t for more details. 3314d5ac70f0Sopenharmony_ci * 3315d5ac70f0Sopenharmony_ci * \param obj The element value. 3316d5ac70f0Sopenharmony_ci * \return The "name" part of element identifier. 3317d5ac70f0Sopenharmony_ci */ 3318d5ac70f0Sopenharmony_ciconst char *snd_ctl_elem_value_get_name(const snd_ctl_elem_value_t *obj) 3319d5ac70f0Sopenharmony_ci{ 3320d5ac70f0Sopenharmony_ci assert(obj); 3321d5ac70f0Sopenharmony_ci return (const char *)obj->id.name; 3322d5ac70f0Sopenharmony_ci} 3323d5ac70f0Sopenharmony_ci 3324d5ac70f0Sopenharmony_ci/** 3325d5ac70f0Sopenharmony_ci * \brief Get the identifiers 'index' part from the given element value. 3326d5ac70f0Sopenharmony_ci * 3327d5ac70f0Sopenharmony_ci * See snd_ctl_elem_value_t for more details. 3328d5ac70f0Sopenharmony_ci * 3329d5ac70f0Sopenharmony_ci * \param obj The element value. 3330d5ac70f0Sopenharmony_ci * \return The index part of element identifier. 3331d5ac70f0Sopenharmony_ci */ 3332d5ac70f0Sopenharmony_ciunsigned int snd_ctl_elem_value_get_index(const snd_ctl_elem_value_t *obj) 3333d5ac70f0Sopenharmony_ci{ 3334d5ac70f0Sopenharmony_ci assert(obj); 3335d5ac70f0Sopenharmony_ci return obj->id.index; 3336d5ac70f0Sopenharmony_ci} 3337d5ac70f0Sopenharmony_ci 3338d5ac70f0Sopenharmony_ci 3339d5ac70f0Sopenharmony_ci/** 3340d5ac70f0Sopenharmony_ci * \brief Set the element identifier within the given element value. 3341d5ac70f0Sopenharmony_ci * 3342d5ac70f0Sopenharmony_ci * See snd_ctl_elem_value_t for more details. 3343d5ac70f0Sopenharmony_ci * 3344d5ac70f0Sopenharmony_ci * \param obj The element value. 3345d5ac70f0Sopenharmony_ci * \param ptr The new identifier. 3346d5ac70f0Sopenharmony_ci */ 3347d5ac70f0Sopenharmony_civoid snd_ctl_elem_value_set_id(snd_ctl_elem_value_t *obj, const snd_ctl_elem_id_t *ptr) 3348d5ac70f0Sopenharmony_ci{ 3349d5ac70f0Sopenharmony_ci assert(obj && ptr); 3350d5ac70f0Sopenharmony_ci obj->id = *ptr; 3351d5ac70f0Sopenharmony_ci} 3352d5ac70f0Sopenharmony_ci 3353d5ac70f0Sopenharmony_ci/** 3354d5ac70f0Sopenharmony_ci * \brief Set the identifiers 'numid' part within the given element value. 3355d5ac70f0Sopenharmony_ci * 3356d5ac70f0Sopenharmony_ci * See snd_ctl_elem_value_t for more details. 3357d5ac70f0Sopenharmony_ci * 3358d5ac70f0Sopenharmony_ci * \param obj The element value. 3359d5ac70f0Sopenharmony_ci * \param val The new numid. 3360d5ac70f0Sopenharmony_ci */ 3361d5ac70f0Sopenharmony_civoid snd_ctl_elem_value_set_numid(snd_ctl_elem_value_t *obj, unsigned int val) 3362d5ac70f0Sopenharmony_ci{ 3363d5ac70f0Sopenharmony_ci assert(obj); 3364d5ac70f0Sopenharmony_ci obj->id.numid = val; 3365d5ac70f0Sopenharmony_ci} 3366d5ac70f0Sopenharmony_ci 3367d5ac70f0Sopenharmony_ci/** 3368d5ac70f0Sopenharmony_ci * \brief Set the identifiers 'interface' part within the given element value. 3369d5ac70f0Sopenharmony_ci * 3370d5ac70f0Sopenharmony_ci * See snd_ctl_elem_value_t for more details. 3371d5ac70f0Sopenharmony_ci * 3372d5ac70f0Sopenharmony_ci * \param obj The element value. 3373d5ac70f0Sopenharmony_ci * \param val The new interface. 3374d5ac70f0Sopenharmony_ci */ 3375d5ac70f0Sopenharmony_civoid snd_ctl_elem_value_set_interface(snd_ctl_elem_value_t *obj, snd_ctl_elem_iface_t val) 3376d5ac70f0Sopenharmony_ci{ 3377d5ac70f0Sopenharmony_ci assert(obj); 3378d5ac70f0Sopenharmony_ci obj->id.iface = val; 3379d5ac70f0Sopenharmony_ci} 3380d5ac70f0Sopenharmony_ci 3381d5ac70f0Sopenharmony_ci/** 3382d5ac70f0Sopenharmony_ci * \brief Set the identifiers 'device' part within the given element value. 3383d5ac70f0Sopenharmony_ci * 3384d5ac70f0Sopenharmony_ci * See snd_ctl_elem_value_t for more details. 3385d5ac70f0Sopenharmony_ci * 3386d5ac70f0Sopenharmony_ci * \param obj The element value. 3387d5ac70f0Sopenharmony_ci * \param val The new device. 3388d5ac70f0Sopenharmony_ci */ 3389d5ac70f0Sopenharmony_civoid snd_ctl_elem_value_set_device(snd_ctl_elem_value_t *obj, unsigned int val) 3390d5ac70f0Sopenharmony_ci{ 3391d5ac70f0Sopenharmony_ci assert(obj); 3392d5ac70f0Sopenharmony_ci obj->id.device = val; 3393d5ac70f0Sopenharmony_ci} 3394d5ac70f0Sopenharmony_ci 3395d5ac70f0Sopenharmony_ci/** 3396d5ac70f0Sopenharmony_ci * \brief Set the identifiers 'subdevice' part within the given element value. 3397d5ac70f0Sopenharmony_ci * 3398d5ac70f0Sopenharmony_ci * See snd_ctl_elem_value_t for more details. 3399d5ac70f0Sopenharmony_ci * 3400d5ac70f0Sopenharmony_ci * \param obj The element value. 3401d5ac70f0Sopenharmony_ci * \param val The new subdevice. 3402d5ac70f0Sopenharmony_ci */ 3403d5ac70f0Sopenharmony_civoid snd_ctl_elem_value_set_subdevice(snd_ctl_elem_value_t *obj, unsigned int val) 3404d5ac70f0Sopenharmony_ci{ 3405d5ac70f0Sopenharmony_ci assert(obj); 3406d5ac70f0Sopenharmony_ci obj->id.subdevice = val; 3407d5ac70f0Sopenharmony_ci} 3408d5ac70f0Sopenharmony_ci 3409d5ac70f0Sopenharmony_ci/** 3410d5ac70f0Sopenharmony_ci * \brief Set the identifiers 'name' part within the given element value. 3411d5ac70f0Sopenharmony_ci * 3412d5ac70f0Sopenharmony_ci * See snd_ctl_elem_value_t for more details. 3413d5ac70f0Sopenharmony_ci * 3414d5ac70f0Sopenharmony_ci * \param obj The element value. 3415d5ac70f0Sopenharmony_ci * \param val The new name. 3416d5ac70f0Sopenharmony_ci */ 3417d5ac70f0Sopenharmony_civoid snd_ctl_elem_value_set_name(snd_ctl_elem_value_t *obj, const char *val) 3418d5ac70f0Sopenharmony_ci{ 3419d5ac70f0Sopenharmony_ci assert(obj); 3420d5ac70f0Sopenharmony_ci snd_strlcpy((char *)obj->id.name, val, sizeof(obj->id.name)); 3421d5ac70f0Sopenharmony_ci} 3422d5ac70f0Sopenharmony_ci 3423d5ac70f0Sopenharmony_ci/** 3424d5ac70f0Sopenharmony_ci * \brief Set the identifiers 'index' part within the given element value. 3425d5ac70f0Sopenharmony_ci * 3426d5ac70f0Sopenharmony_ci * See snd_ctl_elem_value_t for more details. 3427d5ac70f0Sopenharmony_ci * 3428d5ac70f0Sopenharmony_ci * \param obj The element value. 3429d5ac70f0Sopenharmony_ci * \param val The new index. 3430d5ac70f0Sopenharmony_ci */ 3431d5ac70f0Sopenharmony_civoid snd_ctl_elem_value_set_index(snd_ctl_elem_value_t *obj, unsigned int val) 3432d5ac70f0Sopenharmony_ci{ 3433d5ac70f0Sopenharmony_ci assert(obj); 3434d5ac70f0Sopenharmony_ci obj->id.index = val; 3435d5ac70f0Sopenharmony_ci} 3436d5ac70f0Sopenharmony_ci 3437d5ac70f0Sopenharmony_ci/** 3438d5ac70f0Sopenharmony_ci * \brief Get an element members value. 3439d5ac70f0Sopenharmony_ci * 3440d5ac70f0Sopenharmony_ci * Use this function if the element is of type SNDRV_CTL_ELEM_TYPE_BOOLEAN. It 3441d5ac70f0Sopenharmony_ci * returns the value of one member. See \ref snd_ctl_elem_value_t and \ref 3442d5ac70f0Sopenharmony_ci * control for more details. 3443d5ac70f0Sopenharmony_ci * 3444d5ac70f0Sopenharmony_ci * \param obj The element value object 3445d5ac70f0Sopenharmony_ci * \param idx The index of the member. 3446d5ac70f0Sopenharmony_ci * \return The members value. 3447d5ac70f0Sopenharmony_ci */ 3448d5ac70f0Sopenharmony_ciint snd_ctl_elem_value_get_boolean(const snd_ctl_elem_value_t *obj, unsigned int idx) 3449d5ac70f0Sopenharmony_ci{ 3450d5ac70f0Sopenharmony_ci assert(obj); 3451d5ac70f0Sopenharmony_ci assert(idx < ARRAY_SIZE(obj->value.integer.value)); 3452d5ac70f0Sopenharmony_ci return obj->value.integer.value[idx]; 3453d5ac70f0Sopenharmony_ci} 3454d5ac70f0Sopenharmony_ci 3455d5ac70f0Sopenharmony_ci/** 3456d5ac70f0Sopenharmony_ci * \brief Get an element members value. 3457d5ac70f0Sopenharmony_ci * 3458d5ac70f0Sopenharmony_ci * Use this function if the element is of type SNDRV_CTL_ELEM_TYPE_INTEGER. It 3459d5ac70f0Sopenharmony_ci * returns the value of one member. See \ref snd_ctl_elem_value_t and \ref 3460d5ac70f0Sopenharmony_ci * control for more details. 3461d5ac70f0Sopenharmony_ci * 3462d5ac70f0Sopenharmony_ci * \param obj The element value object. 3463d5ac70f0Sopenharmony_ci * \param idx The index of the member. 3464d5ac70f0Sopenharmony_ci * \return The members value. 3465d5ac70f0Sopenharmony_ci */ 3466d5ac70f0Sopenharmony_cilong snd_ctl_elem_value_get_integer(const snd_ctl_elem_value_t *obj, unsigned int idx) 3467d5ac70f0Sopenharmony_ci{ 3468d5ac70f0Sopenharmony_ci assert(obj); 3469d5ac70f0Sopenharmony_ci assert(idx < ARRAY_SIZE(obj->value.integer.value)); 3470d5ac70f0Sopenharmony_ci return obj->value.integer.value[idx]; 3471d5ac70f0Sopenharmony_ci} 3472d5ac70f0Sopenharmony_ci 3473d5ac70f0Sopenharmony_ci/** 3474d5ac70f0Sopenharmony_ci * \brief Get an element members value. 3475d5ac70f0Sopenharmony_ci * 3476d5ac70f0Sopenharmony_ci * Use this function if the element is of type SNDRV_CTL_ELEM_TYPE_INTEGER64. It 3477d5ac70f0Sopenharmony_ci * returns the value of one member. See \ref snd_ctl_elem_value_t and \ref 3478d5ac70f0Sopenharmony_ci * control for more details. 3479d5ac70f0Sopenharmony_ci * 3480d5ac70f0Sopenharmony_ci * \param obj The element value object. 3481d5ac70f0Sopenharmony_ci * \param idx The index of the member. 3482d5ac70f0Sopenharmony_ci * \return The members value. 3483d5ac70f0Sopenharmony_ci */ 3484d5ac70f0Sopenharmony_cilong long snd_ctl_elem_value_get_integer64(const snd_ctl_elem_value_t *obj, unsigned int idx) 3485d5ac70f0Sopenharmony_ci{ 3486d5ac70f0Sopenharmony_ci assert(obj); 3487d5ac70f0Sopenharmony_ci assert(idx < ARRAY_SIZE(obj->value.integer64.value)); 3488d5ac70f0Sopenharmony_ci return obj->value.integer64.value[idx]; 3489d5ac70f0Sopenharmony_ci} 3490d5ac70f0Sopenharmony_ci 3491d5ac70f0Sopenharmony_ci/** 3492d5ac70f0Sopenharmony_ci * \brief Get an element members value. 3493d5ac70f0Sopenharmony_ci * 3494d5ac70f0Sopenharmony_ci * Use this function if the element is of type 3495d5ac70f0Sopenharmony_ci * SNDRV_CTL_ELEM_TYPE_ENUMERATED. It returns the index of the active item. See 3496d5ac70f0Sopenharmony_ci * \ref snd_ctl_elem_value_t and \ref control for more details. 3497d5ac70f0Sopenharmony_ci * 3498d5ac70f0Sopenharmony_ci * \param obj The element value object. 3499d5ac70f0Sopenharmony_ci * \param idx The index of the requested member. 3500d5ac70f0Sopenharmony_ci * \return The index of the active item. 3501d5ac70f0Sopenharmony_ci */ 3502d5ac70f0Sopenharmony_ciunsigned int snd_ctl_elem_value_get_enumerated(const snd_ctl_elem_value_t *obj, unsigned int idx) 3503d5ac70f0Sopenharmony_ci{ 3504d5ac70f0Sopenharmony_ci assert(obj); 3505d5ac70f0Sopenharmony_ci assert(idx < ARRAY_SIZE(obj->value.enumerated.item)); 3506d5ac70f0Sopenharmony_ci return obj->value.enumerated.item[idx]; 3507d5ac70f0Sopenharmony_ci} 3508d5ac70f0Sopenharmony_ci 3509d5ac70f0Sopenharmony_ci/** 3510d5ac70f0Sopenharmony_ci * \brief Get an element members value. 3511d5ac70f0Sopenharmony_ci * 3512d5ac70f0Sopenharmony_ci * Use this function if the element is of type SNDRV_CTL_ELEM_TYPE_BYTE. It 3513d5ac70f0Sopenharmony_ci * returns the value of one member. See \ref snd_ctl_elem_value_t and \ref 3514d5ac70f0Sopenharmony_ci * control for more details. 3515d5ac70f0Sopenharmony_ci * 3516d5ac70f0Sopenharmony_ci * \param obj The element value object. 3517d5ac70f0Sopenharmony_ci * \param idx The index of the member. 3518d5ac70f0Sopenharmony_ci * \return The members value. 3519d5ac70f0Sopenharmony_ci */ 3520d5ac70f0Sopenharmony_ciunsigned char snd_ctl_elem_value_get_byte(const snd_ctl_elem_value_t *obj, unsigned int idx) 3521d5ac70f0Sopenharmony_ci{ 3522d5ac70f0Sopenharmony_ci assert(obj); 3523d5ac70f0Sopenharmony_ci assert(idx < ARRAY_SIZE(obj->value.bytes.data)); 3524d5ac70f0Sopenharmony_ci return obj->value.bytes.data[idx]; 3525d5ac70f0Sopenharmony_ci} 3526d5ac70f0Sopenharmony_ci 3527d5ac70f0Sopenharmony_ci/** 3528d5ac70f0Sopenharmony_ci * \brief Set an element members value. 3529d5ac70f0Sopenharmony_ci * 3530d5ac70f0Sopenharmony_ci * Use this function if the element is of type SNDRV_CTL_ELEM_TYPE_BOOLEAN. It 3531d5ac70f0Sopenharmony_ci * sets the value of one member. See \ref snd_ctl_elem_value_t and \ref control 3532d5ac70f0Sopenharmony_ci * for more details. 3533d5ac70f0Sopenharmony_ci * 3534d5ac70f0Sopenharmony_ci * \param obj The element value object. 3535d5ac70f0Sopenharmony_ci * \param idx The index of the member. 3536d5ac70f0Sopenharmony_ci * \param val The new value. 3537d5ac70f0Sopenharmony_ci */ 3538d5ac70f0Sopenharmony_civoid snd_ctl_elem_value_set_boolean(snd_ctl_elem_value_t *obj, unsigned int idx, long val) 3539d5ac70f0Sopenharmony_ci{ 3540d5ac70f0Sopenharmony_ci assert(obj); 3541d5ac70f0Sopenharmony_ci assert(idx < ARRAY_SIZE(obj->value.integer.value)); 3542d5ac70f0Sopenharmony_ci obj->value.integer.value[idx] = val; 3543d5ac70f0Sopenharmony_ci} 3544d5ac70f0Sopenharmony_ci 3545d5ac70f0Sopenharmony_ci/** 3546d5ac70f0Sopenharmony_ci * \brief Set an element members value. 3547d5ac70f0Sopenharmony_ci * 3548d5ac70f0Sopenharmony_ci * Use this function if the element is of type SNDRV_CTL_ELEM_TYPE_INTEGER. It 3549d5ac70f0Sopenharmony_ci * sets the value of one member. See \ref snd_ctl_elem_value_t and \ref control 3550d5ac70f0Sopenharmony_ci * for more details. 3551d5ac70f0Sopenharmony_ci * 3552d5ac70f0Sopenharmony_ci * \param obj The element value object. 3553d5ac70f0Sopenharmony_ci * \param idx The index of the member. 3554d5ac70f0Sopenharmony_ci * \param val The new value. 3555d5ac70f0Sopenharmony_ci */ 3556d5ac70f0Sopenharmony_civoid snd_ctl_elem_value_set_integer(snd_ctl_elem_value_t *obj, unsigned int idx, long val) 3557d5ac70f0Sopenharmony_ci{ 3558d5ac70f0Sopenharmony_ci assert(obj); 3559d5ac70f0Sopenharmony_ci assert(idx < ARRAY_SIZE(obj->value.integer.value)); 3560d5ac70f0Sopenharmony_ci obj->value.integer.value[idx] = val; 3561d5ac70f0Sopenharmony_ci} 3562d5ac70f0Sopenharmony_ci 3563d5ac70f0Sopenharmony_ci/** 3564d5ac70f0Sopenharmony_ci * \brief Set an element members value. 3565d5ac70f0Sopenharmony_ci * 3566d5ac70f0Sopenharmony_ci * Use this function if the element is of type SNDRV_CTL_ELEM_TYPE_INTEGER64. It 3567d5ac70f0Sopenharmony_ci * sets the value of one member. See \ref snd_ctl_elem_value_t and \ref control 3568d5ac70f0Sopenharmony_ci * for more details. 3569d5ac70f0Sopenharmony_ci * 3570d5ac70f0Sopenharmony_ci * \param obj The element value object. 3571d5ac70f0Sopenharmony_ci * \param idx The index of the member. 3572d5ac70f0Sopenharmony_ci * \param val The new value. 3573d5ac70f0Sopenharmony_ci */ 3574d5ac70f0Sopenharmony_civoid snd_ctl_elem_value_set_integer64(snd_ctl_elem_value_t *obj, unsigned int idx, long long val) 3575d5ac70f0Sopenharmony_ci{ 3576d5ac70f0Sopenharmony_ci assert(obj); 3577d5ac70f0Sopenharmony_ci assert(idx < ARRAY_SIZE(obj->value.integer64.value)); 3578d5ac70f0Sopenharmony_ci obj->value.integer64.value[idx] = val; 3579d5ac70f0Sopenharmony_ci} 3580d5ac70f0Sopenharmony_ci 3581d5ac70f0Sopenharmony_ci/** 3582d5ac70f0Sopenharmony_ci * \brief Set an element members value. 3583d5ac70f0Sopenharmony_ci * 3584d5ac70f0Sopenharmony_ci * Use this function if the element is of type 3585d5ac70f0Sopenharmony_ci * SNDRV_CTL_ELEM_TYPE_ENUMERATED. It activates the specified item. See \ref 3586d5ac70f0Sopenharmony_ci * snd_ctl_elem_value_t and \ref control for more details. 3587d5ac70f0Sopenharmony_ci * 3588d5ac70f0Sopenharmony_ci * \param obj The element value object. 3589d5ac70f0Sopenharmony_ci * \param idx The index of the requested member. 3590d5ac70f0Sopenharmony_ci * \param val The new index of the item to be activated. 3591d5ac70f0Sopenharmony_ci */ 3592d5ac70f0Sopenharmony_civoid snd_ctl_elem_value_set_enumerated(snd_ctl_elem_value_t *obj, unsigned int idx, unsigned int val) 3593d5ac70f0Sopenharmony_ci{ 3594d5ac70f0Sopenharmony_ci assert(obj); 3595d5ac70f0Sopenharmony_ci assert(idx < ARRAY_SIZE(obj->value.enumerated.item)); 3596d5ac70f0Sopenharmony_ci obj->value.enumerated.item[idx] = val; 3597d5ac70f0Sopenharmony_ci} 3598d5ac70f0Sopenharmony_ci 3599d5ac70f0Sopenharmony_ci/** 3600d5ac70f0Sopenharmony_ci * \brief Set an element members value. 3601d5ac70f0Sopenharmony_ci * 3602d5ac70f0Sopenharmony_ci * Use this function if the element is of type SNDRV_CTL_ELEM_TYPE_BYTE. It 3603d5ac70f0Sopenharmony_ci * sets the value of one member. See \ref snd_ctl_elem_value_t and \ref control 3604d5ac70f0Sopenharmony_ci * for more details. 3605d5ac70f0Sopenharmony_ci * 3606d5ac70f0Sopenharmony_ci * \param obj The element value object. 3607d5ac70f0Sopenharmony_ci * \param idx The index of the member. 3608d5ac70f0Sopenharmony_ci * \param val The new value. 3609d5ac70f0Sopenharmony_ci */ 3610d5ac70f0Sopenharmony_civoid snd_ctl_elem_value_set_byte(snd_ctl_elem_value_t *obj, unsigned int idx, unsigned char val) 3611d5ac70f0Sopenharmony_ci{ 3612d5ac70f0Sopenharmony_ci assert(obj); 3613d5ac70f0Sopenharmony_ci assert(idx < ARRAY_SIZE(obj->value.bytes.data)); 3614d5ac70f0Sopenharmony_ci obj->value.bytes.data[idx] = val; 3615d5ac70f0Sopenharmony_ci} 3616d5ac70f0Sopenharmony_ci 3617d5ac70f0Sopenharmony_ci/** 3618d5ac70f0Sopenharmony_ci * \brief Replace the data stored within the element. 3619d5ac70f0Sopenharmony_ci * 3620d5ac70f0Sopenharmony_ci * Use this function if the element is of type SNDRV_CTL_ELEM_TYPE_BYTES. It 3621d5ac70f0Sopenharmony_ci * replaces the data stored in the element. Note that "bytes" elements don't 3622d5ac70f0Sopenharmony_ci * have members. They have only one single block of data. 3623d5ac70f0Sopenharmony_ci * 3624d5ac70f0Sopenharmony_ci * See \ref snd_ctl_elem_value_t and \ref control for more details. 3625d5ac70f0Sopenharmony_ci * 3626d5ac70f0Sopenharmony_ci * \param obj The element value object. 3627d5ac70f0Sopenharmony_ci * \param data Pointer to the new data. 3628d5ac70f0Sopenharmony_ci * \param size The size of the new data, in bytes. 3629d5ac70f0Sopenharmony_ci */ 3630d5ac70f0Sopenharmony_civoid snd_ctl_elem_set_bytes(snd_ctl_elem_value_t *obj, void *data, size_t size) 3631d5ac70f0Sopenharmony_ci{ 3632d5ac70f0Sopenharmony_ci assert(obj); 3633d5ac70f0Sopenharmony_ci assert(size <= ARRAY_SIZE(obj->value.bytes.data)); 3634d5ac70f0Sopenharmony_ci memcpy(obj->value.bytes.data, data, size); 3635d5ac70f0Sopenharmony_ci} 3636d5ac70f0Sopenharmony_ci 3637d5ac70f0Sopenharmony_ci/** 3638d5ac70f0Sopenharmony_ci * \brief Get the data stored within the element. 3639d5ac70f0Sopenharmony_ci * 3640d5ac70f0Sopenharmony_ci * Use this function if the element is of type SNDRV_CTL_ELEM_TYPE_BYTES. It 3641d5ac70f0Sopenharmony_ci * returns the data stored in the element. Note that "bytes" elements don't have 3642d5ac70f0Sopenharmony_ci * members. They have only one single block of data. 3643d5ac70f0Sopenharmony_ci * 3644d5ac70f0Sopenharmony_ci * See \ref snd_ctl_elem_value_t and \ref control for more details. 3645d5ac70f0Sopenharmony_ci * 3646d5ac70f0Sopenharmony_ci * \param obj The element value object. 3647d5ac70f0Sopenharmony_ci * \return Pointer to the elements data. 3648d5ac70f0Sopenharmony_ci */ 3649d5ac70f0Sopenharmony_ciconst void * snd_ctl_elem_value_get_bytes(const snd_ctl_elem_value_t *obj) 3650d5ac70f0Sopenharmony_ci{ 3651d5ac70f0Sopenharmony_ci assert(obj); 3652d5ac70f0Sopenharmony_ci return obj->value.bytes.data; 3653d5ac70f0Sopenharmony_ci} 3654d5ac70f0Sopenharmony_ci 3655d5ac70f0Sopenharmony_ci/** 3656d5ac70f0Sopenharmony_ci * \brief Get an elements IEC958 data. 3657d5ac70f0Sopenharmony_ci * 3658d5ac70f0Sopenharmony_ci * Use this function if the element is of type SNDRV_CTL_ELEM_TYPE_IEC958. Note that 3659d5ac70f0Sopenharmony_ci * "IEC958" elements don't have members. They have only one single 3660d5ac70f0Sopenharmony_ci * IEC958 information block. 3661d5ac70f0Sopenharmony_ci * 3662d5ac70f0Sopenharmony_ci * See \ref snd_ctl_elem_value_t and \ref control for more details. 3663d5ac70f0Sopenharmony_ci * 3664d5ac70f0Sopenharmony_ci * \param obj The element value object. 3665d5ac70f0Sopenharmony_ci * \param ptr Pointer to an IEC958 structure. The data is stored there. 3666d5ac70f0Sopenharmony_ci */ 3667d5ac70f0Sopenharmony_civoid snd_ctl_elem_value_get_iec958(const snd_ctl_elem_value_t *obj, snd_aes_iec958_t *ptr) 3668d5ac70f0Sopenharmony_ci{ 3669d5ac70f0Sopenharmony_ci assert(obj && ptr); 3670d5ac70f0Sopenharmony_ci memcpy(ptr, &obj->value.iec958, sizeof(*ptr)); 3671d5ac70f0Sopenharmony_ci} 3672d5ac70f0Sopenharmony_ci 3673d5ac70f0Sopenharmony_ci/** 3674d5ac70f0Sopenharmony_ci * \brief Set an elements IEC958 data. 3675d5ac70f0Sopenharmony_ci * 3676d5ac70f0Sopenharmony_ci * Use this function if the element is of type SNDRV_CTL_ELEM_TYPE_IEC958. Note 3677d5ac70f0Sopenharmony_ci * that "IEC958" elements don't have members. They have only one single IEC958 3678d5ac70f0Sopenharmony_ci * information block. 3679d5ac70f0Sopenharmony_ci * 3680d5ac70f0Sopenharmony_ci * See \ref snd_ctl_elem_value_t and \ref control for more details. 3681d5ac70f0Sopenharmony_ci * 3682d5ac70f0Sopenharmony_ci * \param obj The element value object. 3683d5ac70f0Sopenharmony_ci * \param ptr Pointer to the new IEC958 data. 3684d5ac70f0Sopenharmony_ci */ 3685d5ac70f0Sopenharmony_civoid snd_ctl_elem_value_set_iec958(snd_ctl_elem_value_t *obj, const snd_aes_iec958_t *ptr) 3686d5ac70f0Sopenharmony_ci{ 3687d5ac70f0Sopenharmony_ci assert(obj && ptr); 3688d5ac70f0Sopenharmony_ci memcpy(&obj->value.iec958, ptr, sizeof(obj->value.iec958)); 3689d5ac70f0Sopenharmony_ci} 3690