diff options
-rw-r--r-- | src/audio_out/audio_oss_out.c | 99 |
1 files changed, 38 insertions, 61 deletions
diff --git a/src/audio_out/audio_oss_out.c b/src/audio_out/audio_oss_out.c index f1daf4c12..3604da5d2 100644 --- a/src/audio_out/audio_oss_out.c +++ b/src/audio_out/audio_oss_out.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: audio_oss_out.c,v 1.109 2004/06/03 12:56:25 mroi Exp $ + * $Id: audio_oss_out.c,v 1.110 2004/10/08 20:32:03 mroi Exp $ * * 20-8-2001 First implementation of Audio sync and Audio driver separation. * Copyright (C) 2001 James Courtier-Dutton James@superbug.demon.co.uk @@ -130,6 +130,7 @@ typedef struct oss_driver_s { struct { char *name; + int fd; int prop; int volume; int mute; @@ -479,6 +480,8 @@ static void ao_oss_close(ao_driver_t *this_gen) { oss_driver_t *this = (oss_driver_t *) this_gen; + close(this->mixer.fd); + this->mixer.fd = -1; close(this->audio_fd); this->audio_fd = -1; } @@ -494,6 +497,8 @@ static void ao_oss_exit(ao_driver_t *this_gen) { oss_driver_t *this = (oss_driver_t *) this_gen; + if (this->mixer.fd != -1) + close(this->mixer.fd); if (this->audio_fd != -1) close(this->audio_fd); @@ -504,36 +509,30 @@ static void ao_oss_exit(ao_driver_t *this_gen) { static int ao_oss_get_property (ao_driver_t *this_gen, int property) { oss_driver_t *this = (oss_driver_t *) this_gen; - int mixer_fd; int audio_devs; switch(property) { case AO_PROP_PCM_VOL: case AO_PROP_MIXER_VOL: if(!this->mixer.mute) { - mixer_fd = open(this->mixer.name, O_RDONLY); - if(mixer_fd != -1) { + + if(this->mixer.fd != -1) { int cmd = 0; int v; - ioctl(mixer_fd, SOUND_MIXER_READ_DEVMASK, &audio_devs); + ioctl(this->mixer.fd, SOUND_MIXER_READ_DEVMASK, &audio_devs); if(audio_devs & SOUND_MASK_PCM) cmd = SOUND_MIXER_READ_PCM; else if(audio_devs & SOUND_MASK_VOLUME) cmd = SOUND_MIXER_READ_VOLUME; - else { - close(mixer_fd); - return 0; - } - ioctl(mixer_fd, cmd, &v); + else + return -1; + + ioctl(this->mixer.fd, cmd, &v); this->mixer.volume = (((v & 0xFF00) >> 8) + (v & 0x00FF)) / 2; - close(mixer_fd); - } else { - xprintf(this->xine, XINE_VERBOSITY_LOG, - _("audio_oss_out: open() %s failed: %s\n"), this->mixer.name, strerror(errno)); + } else return -1; - } } return this->mixer.volume; break; @@ -549,42 +548,32 @@ static int ao_oss_get_property (ao_driver_t *this_gen, int property) { static int ao_oss_set_property (ao_driver_t *this_gen, int property, int value) { oss_driver_t *this = (oss_driver_t *) this_gen; - int mixer_fd; int audio_devs; switch(property) { case AO_PROP_PCM_VOL: case AO_PROP_MIXER_VOL: if(!this->mixer.mute) { - mixer_fd = open(this->mixer.name, O_RDONLY); - - if(mixer_fd != -1) { + + if(this->mixer.fd != -1) { int cmd = 0; int v; - ioctl(mixer_fd, SOUND_MIXER_READ_DEVMASK, &audio_devs); + ioctl(this->mixer.fd, SOUND_MIXER_READ_DEVMASK, &audio_devs); if(audio_devs & SOUND_MASK_PCM) cmd = SOUND_MIXER_WRITE_PCM; else if(audio_devs & SOUND_MASK_VOLUME) cmd = SOUND_MIXER_WRITE_VOLUME; - else { - close(mixer_fd); - return ~value; - } - v = (value << 8) | value; - ioctl(mixer_fd, cmd, &v); - close(mixer_fd); - - if(!this->mixer.mute) - this->mixer.volume = value; + else + return -1; - } - else - xprintf(this->xine, XINE_VERBOSITY_LOG, - _("audio_oss_out: open() %s failed: %s\n"), this->mixer.name, strerror(errno)); - } - else + v = (value << 8) | value; + ioctl(this->mixer.fd, cmd, &v); + this->mixer.volume = value; + } else + return -1; + } else this->mixer.volume = value; return this->mixer.volume; @@ -594,40 +583,31 @@ static int ao_oss_set_property (ao_driver_t *this_gen, int property, int value) this->mixer.mute = (value) ? 1 : 0; if(this->mixer.mute) { - - mixer_fd = open(this->mixer.name, O_RDONLY); - - if(mixer_fd != -1) { + + if(this->mixer.fd != -1) { int cmd = 0; int v = 0; - ioctl(mixer_fd, SOUND_MIXER_READ_DEVMASK, &audio_devs); + ioctl(this->mixer.fd, SOUND_MIXER_READ_DEVMASK, &audio_devs); if(audio_devs & SOUND_MASK_PCM) cmd = SOUND_MIXER_WRITE_PCM; else if(audio_devs & SOUND_MASK_VOLUME) cmd = SOUND_MIXER_WRITE_VOLUME; - else { - close(mixer_fd); - return ~value; - } - - ioctl(mixer_fd, cmd, &v); - close(mixer_fd); + else + return -1; - } - else - xprintf(this->xine, XINE_VERBOSITY_LOG, - _("audio_oss_out: open() %s failed: %s\n"), this->mixer.name, strerror(errno)); - } - else + ioctl(this->mixer.fd, cmd, &v); + } else + return -1; + } else (void) ao_oss_set_property(&this->ao_driver, this->mixer.prop, this->mixer.volume); return value; break; } - return ~value; + return -1; } static int ao_oss_ctrl(ao_driver_t *this_gen, int cmd, ...) { @@ -1031,7 +1011,6 @@ static ao_driver_t *open_plugin (audio_driver_class_t *class_gen, const void *da { char mixer_name[32]; int mixer_num; - int mixer_fd; int audio_devs; char *parse; @@ -1066,11 +1045,11 @@ static ao_driver_t *open_plugin (audio_driver_class_t *class_gen, const void *da } _x_assert(this->mixer.name[0] != '\0'); - mixer_fd = open(this->mixer.name, O_RDONLY); + this->mixer.fd = open(this->mixer.name, O_RDONLY); - if(mixer_fd != -1) { + if(this->mixer.fd != -1) { - ioctl(mixer_fd, SOUND_MIXER_READ_DEVMASK, &audio_devs); + ioctl(this->mixer.fd, SOUND_MIXER_READ_DEVMASK, &audio_devs); if(audio_devs & SOUND_MASK_PCM) { this->capabilities |= AO_CAP_PCM_VOL; @@ -1092,8 +1071,6 @@ static ao_driver_t *open_plugin (audio_driver_class_t *class_gen, const void *da */ this->capabilities |= AO_CAP_MUTE_VOL; - close(mixer_fd); - } else xprintf (class->xine, XINE_VERBOSITY_LOG, _("audio_oss_out: open() mixer %s failed: %s\n"), this->mixer.name, strerror(errno)); |