mixer

FreeBSD OSS mixer library implementation and a complete rewrite of mixer(8)
git clone git://git.margiolis.net/mixer.git
Log | Files | Refs | README | LICENSE

mixer.h (4255B)


      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_ctlhead, mix_ctl) ctls;	/* control list */
     71 	TAILQ_ENTRY(mix_dev) devs;
     72 };
     73 
     74 struct mixer {
     75 	TAILQ_HEAD(mix_devhead, 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_ */