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