xref: /aosp_15_r20/external/tinyalsa_new/include/tinyalsa/mixer.h (revision 02e95f1a335b55495d41ca67eaf42361f13704fa)
1*02e95f1aSMarcin Radomski /* mixer.h
2*02e95f1aSMarcin Radomski **
3*02e95f1aSMarcin Radomski ** Copyright 2011, The Android Open Source Project
4*02e95f1aSMarcin Radomski **
5*02e95f1aSMarcin Radomski ** Redistribution and use in source and binary forms, with or without
6*02e95f1aSMarcin Radomski ** modification, are permitted provided that the following conditions are met:
7*02e95f1aSMarcin Radomski **     * Redistributions of source code must retain the above copyright
8*02e95f1aSMarcin Radomski **       notice, this list of conditions and the following disclaimer.
9*02e95f1aSMarcin Radomski **     * Redistributions in binary form must reproduce the above copyright
10*02e95f1aSMarcin Radomski **       notice, this list of conditions and the following disclaimer in the
11*02e95f1aSMarcin Radomski **       documentation and/or other materials provided with the distribution.
12*02e95f1aSMarcin Radomski **     * Neither the name of The Android Open Source Project nor the names of
13*02e95f1aSMarcin Radomski **       its contributors may be used to endorse or promote products derived
14*02e95f1aSMarcin Radomski **       from this software without specific prior written permission.
15*02e95f1aSMarcin Radomski **
16*02e95f1aSMarcin Radomski ** THIS SOFTWARE IS PROVIDED BY The Android Open Source Project ``AS IS'' AND
17*02e95f1aSMarcin Radomski ** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*02e95f1aSMarcin Radomski ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*02e95f1aSMarcin Radomski ** ARE DISCLAIMED. IN NO EVENT SHALL The Android Open Source Project BE LIABLE
20*02e95f1aSMarcin Radomski ** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21*02e95f1aSMarcin Radomski ** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22*02e95f1aSMarcin Radomski ** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23*02e95f1aSMarcin Radomski ** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24*02e95f1aSMarcin Radomski ** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25*02e95f1aSMarcin Radomski ** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
26*02e95f1aSMarcin Radomski ** DAMAGE.
27*02e95f1aSMarcin Radomski */
28*02e95f1aSMarcin Radomski 
29*02e95f1aSMarcin Radomski /** @file */
30*02e95f1aSMarcin Radomski 
31*02e95f1aSMarcin Radomski /** @defgroup libtinyalsa-mixer Mixer Interface
32*02e95f1aSMarcin Radomski  * @brief All macros, structures and functions that make up the mixer interface.
33*02e95f1aSMarcin Radomski  */
34*02e95f1aSMarcin Radomski 
35*02e95f1aSMarcin Radomski #ifndef TINYALSA_MIXER_H
36*02e95f1aSMarcin Radomski #define TINYALSA_MIXER_H
37*02e95f1aSMarcin Radomski 
38*02e95f1aSMarcin Radomski #include <sys/time.h>
39*02e95f1aSMarcin Radomski #include <stddef.h>
40*02e95f1aSMarcin Radomski 
41*02e95f1aSMarcin Radomski #if defined(__cplusplus)
42*02e95f1aSMarcin Radomski extern "C" {
43*02e95f1aSMarcin Radomski #endif
44*02e95f1aSMarcin Radomski 
45*02e95f1aSMarcin Radomski struct mixer;
46*02e95f1aSMarcin Radomski 
47*02e95f1aSMarcin Radomski struct mixer_ctl;
48*02e95f1aSMarcin Radomski 
49*02e95f1aSMarcin Radomski // mixer_ctl_event is a mirroring structure of snd_ctl_event
50*02e95f1aSMarcin Radomski struct mixer_ctl_event {
51*02e95f1aSMarcin Radomski     int type;
52*02e95f1aSMarcin Radomski     union {
53*02e95f1aSMarcin Radomski         struct {
54*02e95f1aSMarcin Radomski             unsigned int mask;
55*02e95f1aSMarcin Radomski             struct {
56*02e95f1aSMarcin Radomski                 unsigned int numid;
57*02e95f1aSMarcin Radomski                 int iface;
58*02e95f1aSMarcin Radomski                 unsigned int device;
59*02e95f1aSMarcin Radomski                 unsigned int subdevice;
60*02e95f1aSMarcin Radomski                 unsigned char name[44];
61*02e95f1aSMarcin Radomski                 unsigned int index;
62*02e95f1aSMarcin Radomski             } id;
63*02e95f1aSMarcin Radomski         } element;
64*02e95f1aSMarcin Radomski         unsigned char data[60];
65*02e95f1aSMarcin Radomski     } data;
66*02e95f1aSMarcin Radomski };
67*02e95f1aSMarcin Radomski 
68*02e95f1aSMarcin Radomski /** Mixer control type.
69*02e95f1aSMarcin Radomski  * @ingroup libtinyalsa-mixer
70*02e95f1aSMarcin Radomski  */
71*02e95f1aSMarcin Radomski enum mixer_ctl_type {
72*02e95f1aSMarcin Radomski     /** boolean control type */
73*02e95f1aSMarcin Radomski     MIXER_CTL_TYPE_BOOL,
74*02e95f1aSMarcin Radomski     /** integer control type */
75*02e95f1aSMarcin Radomski     MIXER_CTL_TYPE_INT,
76*02e95f1aSMarcin Radomski     /** an enumerated control type */
77*02e95f1aSMarcin Radomski     MIXER_CTL_TYPE_ENUM,
78*02e95f1aSMarcin Radomski     MIXER_CTL_TYPE_BYTE,
79*02e95f1aSMarcin Radomski     MIXER_CTL_TYPE_IEC958,
80*02e95f1aSMarcin Radomski     /** a 64 bit integer control type */
81*02e95f1aSMarcin Radomski     MIXER_CTL_TYPE_INT64,
82*02e95f1aSMarcin Radomski     /** unknown control type */
83*02e95f1aSMarcin Radomski     MIXER_CTL_TYPE_UNKNOWN,
84*02e95f1aSMarcin Radomski     /** end of the enumeration (not a control type) */
85*02e95f1aSMarcin Radomski     MIXER_CTL_TYPE_MAX,
86*02e95f1aSMarcin Radomski };
87*02e95f1aSMarcin Radomski 
88*02e95f1aSMarcin Radomski struct mixer *mixer_open(unsigned int card);
89*02e95f1aSMarcin Radomski 
90*02e95f1aSMarcin Radomski void mixer_close(struct mixer *mixer);
91*02e95f1aSMarcin Radomski 
92*02e95f1aSMarcin Radomski int mixer_add_new_ctls(struct mixer *mixer);
93*02e95f1aSMarcin Radomski 
94*02e95f1aSMarcin Radomski const char *mixer_get_name(const struct mixer *mixer);
95*02e95f1aSMarcin Radomski 
96*02e95f1aSMarcin Radomski unsigned int mixer_get_num_ctls(const struct mixer *mixer);
97*02e95f1aSMarcin Radomski 
98*02e95f1aSMarcin Radomski unsigned int mixer_get_num_ctls_by_name(const struct mixer *mixer, const char *name);
99*02e95f1aSMarcin Radomski 
100*02e95f1aSMarcin Radomski const struct mixer_ctl *mixer_get_ctl_const(const struct mixer *mixer, unsigned int id);
101*02e95f1aSMarcin Radomski 
102*02e95f1aSMarcin Radomski struct mixer_ctl *mixer_get_ctl(struct mixer *mixer, unsigned int id);
103*02e95f1aSMarcin Radomski 
104*02e95f1aSMarcin Radomski struct mixer_ctl *mixer_get_ctl_by_name(struct mixer *mixer, const char *name);
105*02e95f1aSMarcin Radomski 
106*02e95f1aSMarcin Radomski struct mixer_ctl *mixer_get_ctl_by_name_and_device(struct mixer *mixer,
107*02e95f1aSMarcin Radomski                                                    const char *name,
108*02e95f1aSMarcin Radomski                                                    unsigned int device);
109*02e95f1aSMarcin Radomski 
110*02e95f1aSMarcin Radomski struct mixer_ctl *mixer_get_ctl_by_name_and_index(struct mixer *mixer,
111*02e95f1aSMarcin Radomski                                                   const char *name,
112*02e95f1aSMarcin Radomski                                                   unsigned int index);
113*02e95f1aSMarcin Radomski 
114*02e95f1aSMarcin Radomski int mixer_subscribe_events(struct mixer *mixer, int subscribe);
115*02e95f1aSMarcin Radomski 
116*02e95f1aSMarcin Radomski int mixer_wait_event(struct mixer *mixer, int timeout);
117*02e95f1aSMarcin Radomski 
118*02e95f1aSMarcin Radomski unsigned int mixer_ctl_get_id(const struct mixer_ctl *ctl);
119*02e95f1aSMarcin Radomski 
120*02e95f1aSMarcin Radomski const char *mixer_ctl_get_name(const struct mixer_ctl *ctl);
121*02e95f1aSMarcin Radomski 
122*02e95f1aSMarcin Radomski enum mixer_ctl_type mixer_ctl_get_type(const struct mixer_ctl *ctl);
123*02e95f1aSMarcin Radomski 
124*02e95f1aSMarcin Radomski const char *mixer_ctl_get_type_string(const struct mixer_ctl *ctl);
125*02e95f1aSMarcin Radomski 
126*02e95f1aSMarcin Radomski unsigned int mixer_ctl_get_num_values(const struct mixer_ctl *ctl);
127*02e95f1aSMarcin Radomski 
128*02e95f1aSMarcin Radomski unsigned int mixer_ctl_get_num_enums(const struct mixer_ctl *ctl);
129*02e95f1aSMarcin Radomski 
130*02e95f1aSMarcin Radomski const char *mixer_ctl_get_enum_string(struct mixer_ctl *ctl, unsigned int enum_id);
131*02e95f1aSMarcin Radomski 
132*02e95f1aSMarcin Radomski /* Some sound cards update their controls due to external events,
133*02e95f1aSMarcin Radomski  * such as HDMI EDID byte data changing when an HDMI cable is
134*02e95f1aSMarcin Radomski  * connected. This API allows the count of elements to be updated.
135*02e95f1aSMarcin Radomski  */
136*02e95f1aSMarcin Radomski void mixer_ctl_update(struct mixer_ctl *ctl);
137*02e95f1aSMarcin Radomski 
138*02e95f1aSMarcin Radomski int mixer_ctl_is_access_tlv_rw(const struct mixer_ctl *ctl);
139*02e95f1aSMarcin Radomski 
140*02e95f1aSMarcin Radomski /* Set and get mixer controls */
141*02e95f1aSMarcin Radomski int mixer_ctl_get_percent(const struct mixer_ctl *ctl, unsigned int id);
142*02e95f1aSMarcin Radomski 
143*02e95f1aSMarcin Radomski int mixer_ctl_set_percent(struct mixer_ctl *ctl, unsigned int id, int percent);
144*02e95f1aSMarcin Radomski 
145*02e95f1aSMarcin Radomski int mixer_ctl_get_value(const struct mixer_ctl *ctl, unsigned int id);
146*02e95f1aSMarcin Radomski 
147*02e95f1aSMarcin Radomski int mixer_ctl_get_array(const struct mixer_ctl *ctl, void *array, size_t count);
148*02e95f1aSMarcin Radomski 
149*02e95f1aSMarcin Radomski int mixer_ctl_set_value(struct mixer_ctl *ctl, unsigned int id, int value);
150*02e95f1aSMarcin Radomski 
151*02e95f1aSMarcin Radomski int mixer_ctl_set_array(struct mixer_ctl *ctl, const void *array, size_t count);
152*02e95f1aSMarcin Radomski 
153*02e95f1aSMarcin Radomski int mixer_ctl_set_enum_by_string(struct mixer_ctl *ctl, const char *string);
154*02e95f1aSMarcin Radomski 
155*02e95f1aSMarcin Radomski /* Determine range of integer mixer controls */
156*02e95f1aSMarcin Radomski int mixer_ctl_get_range_min(const struct mixer_ctl *ctl);
157*02e95f1aSMarcin Radomski 
158*02e95f1aSMarcin Radomski int mixer_ctl_get_range_max(const struct mixer_ctl *ctl);
159*02e95f1aSMarcin Radomski 
160*02e95f1aSMarcin Radomski unsigned int mixer_ctl_get_device(const struct mixer_ctl *ctl);
161*02e95f1aSMarcin Radomski 
162*02e95f1aSMarcin Radomski int mixer_read_event(struct mixer *mixer, struct mixer_ctl_event *event);
163*02e95f1aSMarcin Radomski 
164*02e95f1aSMarcin Radomski int mixer_consume_event(struct mixer *mixer);
165*02e95f1aSMarcin Radomski #if defined(__cplusplus)
166*02e95f1aSMarcin Radomski }  /* extern "C" */
167*02e95f1aSMarcin Radomski #endif
168*02e95f1aSMarcin Radomski 
169*02e95f1aSMarcin Radomski #endif
170*02e95f1aSMarcin Radomski 
171