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.
Coexistance with OSS would be nice, so both could beCode: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; }
used depending on users choice. Perhaps: if this first
part of the mixer name is a valid device file, try OSS,
otherwise try ALSA?



LinkBack URL
About LinkBacks


