Here's a mixer applet (OSS). It gets the list of mixer devices, gets and sets
individual device values.
/ # mixer --help
BusyBox v1.22.1 (2014-06-23 15:19:41 BST) multi-call binary.
Usage: mixer [-d DEVICE] [MIXER [LEVEL]]
Sets the mixer volume at a specific level (0-100)
-d DEVICE use given mixer device (default /dev/mixer)
/ # mixer
Mixer: speaker mic phout
/ # mixer speaker
Level (L/R): 99/99
/ # mixer speaker 20
Level (L/R): 20/20
It adds about about 2.6k to Busybox and I don't really understand why. Even
with the list of mixers it should only be ~500 bytes. If anyone has any
suggestions I can try to fix that.
regards,
Biff.
/* vi: set sw=4 ts=4: */
/*
* Audio mixer for busybox (OSS emulation only)
*
* Copyright (c) Bifferos ([email protected])
*
* Licensed under GPLv2 or later, see file LICENSE in this source tree.
*
* Setting L/R stereo channels independently is unsupported in order to keep this applet small.
*
*
*/
#include <linux/soundcard.h>
#include "libbb.h"
//usage:#define mixer_trivial_usage
//usage: "[-d DEVICE] [MIXER [LEVEL]]"
//usage:#define mixer_full_usage "\n\n"
//usage: "Sets the mixer volume at a specific level (0-100)\n"
//usage: "\n -d DEVICE use given mixer device (default /dev/mixer)"
//usage:#define mixer_example_usage
//usage: "# mixer vol 50\n"
static void pr_level_exit(int level)
{
printf("Level (L/R): %d/%d\n", level&0xff, ((level&0xff00) >> 8));
exit(0);
}
int mixer_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int mixer_main(int argc, char **argv )
{
int fd_mixer;
unsigned opts, extra_args;
char* device;
char* mixer = 0;
uint32_t write_level;
uint32_t read_level;
int devmask, i;
const char *m_names[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_NAMES ;
int mixer_device=0;
/* Option handling */
opt_complementary = "?2"; /* must have no more than 2 */
opts = getopt32(argv, "d:", &device);
extra_args = argc - 1;
if (opts & 1)
{
fd_mixer = xopen(device, O_RDWR);
extra_args -= 2;
}
else
{
fd_mixer = xopen("/dev/mixer", O_RDWR);
}
if (extra_args) mixer = argv[argc - ((extra_args==1)?1:2)];
/* mixer device enumeration */
ioctl_or_perror_and_die(fd_mixer, SOUND_MIXER_READ_DEVMASK, &devmask, "DEVMASK");
if (!mixer) printf("Mixer:");
for (i = 0; i < SOUND_MIXER_NRDEVICES; ++i)
{
if ((1 << i) & devmask) {
if (mixer)
{
if (strcmp(m_names[i], mixer) == 0) mixer_device = i;
}
else
{
printf(" %s", m_names[i]);
}
}
}
if (!mixer)
{
printf("\n");
exit(0);
}
/* mixer device reading */
ioctl_or_perror_and_die(fd_mixer, MIXER_READ(mixer_device), &read_level, "MIXER_READ");
if (extra_args == 1) pr_level_exit(read_level);
/* mixer device setting */
write_level = xatou_range(argv[argc - 1], 0, 100);
write_level = (write_level<<8) + write_level;
ioctl_or_perror_and_die(fd_mixer, MIXER_WRITE(mixer_device), &write_level, "MIXER_WRITE");
pr_level_exit(write_level);
return 0;
}
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox