]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - lib/libmixer/mixer.h
Import device-tree files from Linux 5.16
[FreeBSD/FreeBSD.git] / lib / libmixer / mixer.h
1 /*-
2  * Copyright (c) 2021 Christos Margiolis <christos@FreeBSD.org>
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a copy
5  * of this software and associated documentation files (the "Software"), to deal
6  * in the Software without restriction, including without limitation the rights
7  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8  * copies of the Software, and to permit persons to whom the Software is
9  * furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20  * THE SOFTWARE.
21  *
22  * $FreeBSD$
23  */
24
25 #ifndef _MIXER_H_
26 #define _MIXER_H_
27
28 #include <sys/cdefs.h>
29 #include <sys/queue.h>
30 #include <sys/soundcard.h>
31
32 #include <limits.h>
33
34 #define MIX_ISSET(n,f)          (((1U << (n)) & (f)) ? 1 : 0)
35 #define MIX_ISDEV(m,n)          MIX_ISSET(n, (m)->devmask)
36 #define MIX_ISMUTE(m,n)         MIX_ISSET(n, (m)->mutemask)
37 #define MIX_ISREC(m,n)          MIX_ISSET(n, (m)->recmask)
38 #define MIX_ISRECSRC(m,n)       MIX_ISSET(n, (m)->recsrc)
39
40 /* Forward declarations */
41 struct mixer;
42 struct mix_dev;
43
44 typedef struct mix_ctl mix_ctl_t;
45 typedef struct mix_volume mix_volume_t;
46
47 /* User-defined controls */
48 struct mix_ctl {
49         struct mix_dev *parent_dev;             /* parent device */
50         int id;                                 /* control id */
51         char name[NAME_MAX];                    /* control name */
52         int (*mod)(struct mix_dev *, void *);   /* modify control values */
53         int (*print)(struct mix_dev *, void *); /* print control */
54         TAILQ_ENTRY(mix_ctl) ctls;
55 };
56
57 struct mix_dev {
58         struct mixer *parent_mixer;             /* parent mixer */
59         char name[NAME_MAX];                    /* device name (e.g "vol") */
60         int devno;                              /* device number */
61         struct mix_volume {
62 #define MIX_VOLMIN              0.0f
63 #define MIX_VOLMAX              1.0f
64 #define MIX_VOLNORM(v)          ((v) / 100.0f)
65 #define MIX_VOLDENORM(v)        ((int)((v) * 100.0f + 0.5f))
66                 float left;                     /* left volume */
67                 float right;                    /* right volume */
68         } vol;
69         int nctl;                               /* number of controls */
70         TAILQ_HEAD(, mix_ctl) ctls;             /* control list */
71         TAILQ_ENTRY(mix_dev) devs;
72 };
73
74 struct mixer {
75         TAILQ_HEAD(, mix_dev) devs;             /* device list */
76         struct mix_dev *dev;                    /* selected device */
77         oss_mixerinfo mi;                       /* mixer info */
78         oss_card_info ci;                       /* audio card info */
79         char name[NAME_MAX];                    /* mixer name (e.g /dev/mixer0) */
80         int fd;                                 /* file descriptor */
81         int unit;                               /* audio card unit */
82         int ndev;                               /* number of devices */
83         int devmask;                            /* supported devices */
84 #define MIX_MUTE                0x01
85 #define MIX_UNMUTE              0x02
86 #define MIX_TOGGLEMUTE          0x04
87         int mutemask;                           /* muted devices */
88         int recmask;                            /* recording devices */
89 #define MIX_ADDRECSRC           0x01
90 #define MIX_REMOVERECSRC        0x02
91 #define MIX_SETRECSRC           0x04
92 #define MIX_TOGGLERECSRC        0x08
93         int recsrc;                             /* recording sources */
94 #define MIX_MODE_MIXER          0x01
95 #define MIX_MODE_PLAY           0x02
96 #define MIX_MODE_REC            0x04
97         int mode;                               /* dev.pcm.X.mode sysctl */
98         int f_default;                          /* default mixer flag */
99 };
100
101 __BEGIN_DECLS
102
103 struct mixer *mixer_open(const char *);
104 int mixer_close(struct mixer *);
105 struct mix_dev *mixer_get_dev(struct mixer *, int);
106 struct mix_dev *mixer_get_dev_byname(struct mixer *, const char *);
107 int mixer_add_ctl(struct mix_dev *, int, const char *,
108     int (*)(struct mix_dev *, void *), int (*)(struct mix_dev *, void *));
109 int mixer_add_ctl_s(mix_ctl_t *);
110 int mixer_remove_ctl(mix_ctl_t *);
111 mix_ctl_t *mixer_get_ctl(struct mix_dev *, int);
112 mix_ctl_t *mixer_get_ctl_byname(struct mix_dev *, const char *);
113 int mixer_set_vol(struct mixer *, mix_volume_t);
114 int mixer_set_mute(struct mixer *, int);
115 int mixer_mod_recsrc(struct mixer *, int);
116 int mixer_get_dunit(void);
117 int mixer_set_dunit(struct mixer *, int);
118 int mixer_get_mode(int);
119 int mixer_get_nmixers(void);
120
121 __END_DECLS
122
123 #endif /* _MIXER_H_ */