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