Hello
I'm new in c programming and my requirement is as follows.
I make a code for oss mixer and now when new systems, throwing the OSS, and there is no /dev/mixer I want to port my code to alsa but my skills are minimal.
Any help would be welcome.
Code:
static int mixer_fd = -1, mixer_src = -1;
static char *devices[] = SOUND_DEVICE_NAMES;
int mixer_init(char *mixer_device, char *mixer_source)
{
int i;
mixer_src = -1;
for (i=0;i<SOUND_MIXER_NRDEVICES;i++)
if (strcmp(mixer_source, devices[i]) == 0)
mixer_src = i;
mixer_fd = open(mixer_device, O_RDWR);
if (mixer_src < 0)
return -1;
if (mixer_fd < 0)
return 0;
return 1;
}
char* mixer_get_sndcard_name(void)
{
mixer_info info;
char *result = NULL;
if (ioctl(mixer_fd, SOUND_MIXER_INFO, &info) == -1)
return NULL;
result = strdup(info.name);
return result;
}
char** mixer_get_rec_devices(void)
{
int i, o, devmask, res;
char** result;
if ((ioctl(mixer_fd, SOUND_MIXER_READ_RECMASK, &devmask)) == -1)
return NULL;
else
{
result = malloc(sizeof(char*)*SOUND_MIXER_NRDEVICES);
o = 0;
for (i=0;i<SOUND_MIXER_NRDEVICES;i++)
{
res = (devmask >> i)%2;
if (res)
{
result[o] = malloc(strlen(devices[i])+1);
sprintf(result[o], "%s", devices[i]);
o++;
}
result[o] = NULL;
}
}
return result;
}
int mixer_set_rec_device(void)
{
int devmask, recmask;
if (mixer_fd <= 0)
return 0;
if (mixer_src < 0)
return 0;
if ((ioctl(mixer_fd, SOUND_MIXER_READ_RECMASK, &devmask)) == -1)
return 0;
recmask = 1 << mixer_src;
if (!(recmask & devmask))
return 0;
if ((ioctl(mixer_fd, SOUND_MIXER_WRITE_RECSRC, &recmask)) == -1)
return 0;
return 1;
}
int mixer_close(void)
{
if (mixer_fd > 0)
close(mixer_fd);
return 1;
}
int mixer_set_volume(int volume)
{
int i_vol;
if (mixer_fd<0)
return -1;
assert(volume <= 100);
assert(volume >= 0);
if (mixer_src<0)
return -1;
i_vol = volume;
i_vol += volume << 8;
if ((ioctl(mixer_fd, MIXER_WRITE(mixer_src), &i_vol)) < 0)
return 0;
return 1;
}
int mixer_get_volume(void)
{
int i_vol = 0, r, l, volume;
if (mixer_fd<0)
return -1;
if (mixer_src<0)
return -1;
if ((ioctl(mixer_fd, MIXER_READ(mixer_src), &i_vol)) < 0)
return 0;
r = i_vol >> 8;
l = i_vol % (1 << 8);
volume = (r + l)/2;
assert((volume >= 0) && (volume <= 100));
return volume;
}
Coexistance with OSS would be nice, so both could be
used depending on users choice. Perhaps: if this first
part of the mixer name is a valid device file, try OSS,
otherwise try ALSA?