X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faudio_output%2Foss.c;h=940718fa7eff2be64cc0b2fcb3dc4d0157c8929e;hb=cb475372d0643ef60e05c8c3ee0cbddc120cf315;hp=e3c77ef38503df153a59304cd6c1b0c47369f404;hpb=014ad89f53ca44bf3446f86abd41126b5affecb7;p=vlc diff --git a/modules/audio_output/oss.c b/modules/audio_output/oss.c index e3c77ef385..940718fa7e 100644 --- a/modules/audio_output/oss.c +++ b/modules/audio_output/oss.c @@ -111,26 +111,17 @@ static int Start (audio_output_t *aout, audio_sample_format_t *restrict fmt) switch (fmt->i_format) { #ifdef AFMT_FLOAT - case VLC_CODEC_F64B: - case VLC_CODEC_F64L: - case VLC_CODEC_F32B: - case VLC_CODEC_F32L: + case VLC_CODEC_FL64: + case VLC_CODEC_FL32: format = AFMT_FLOAT; break; #endif - case VLC_CODEC_S32B: - format = AFMT_S32_BE; + case VLC_CODEC_S32N: + format = AFMT_S32_NE; break; - case VLC_CODEC_S32L: - format = AFMT_S32_LE; + case VLC_CODEC_S16N: + format = AFMT_S16_NE; break; - case VLC_CODEC_S16B: - format = AFMT_S16_BE; - break; - case VLC_CODEC_S16L: - format = AFMT_S16_LE; - break; - case VLC_CODEC_S8: case VLC_CODEC_U8: format = AFMT_U8; break; @@ -155,14 +146,9 @@ static int Start (audio_output_t *aout, audio_sample_format_t *restrict fmt) switch (format) { - case AFMT_S8: fmt->i_format = VLC_CODEC_S8; break; case AFMT_U8: fmt->i_format = VLC_CODEC_U8; break; - case AFMT_S16_BE: fmt->i_format = VLC_CODEC_S16B; break; - case AFMT_S16_LE: fmt->i_format = VLC_CODEC_S16L; break; - //case AFMT_S24_BE: - //case AFMT_S24_LE: - case AFMT_S32_BE: fmt->i_format = VLC_CODEC_S32B; break; - case AFMT_S32_LE: fmt->i_format = VLC_CODEC_S32L; break; + case AFMT_S16_NE: fmt->i_format = VLC_CODEC_S16N; break; + case AFMT_S32_NE: fmt->i_format = VLC_CODEC_S32N; break; #ifdef AFMT_FLOAT case AFMT_FLOAT: fmt->i_format = VLC_CODEC_FL32; break; #endif @@ -222,8 +208,9 @@ static int Start (audio_output_t *aout, audio_sample_format_t *restrict fmt) fmt->i_original_channels = fmt->i_physical_channels = channels; } + aout_FormatPrepare (fmt); - VolumeSync (aout): + VolumeSync (aout); sys->starting = true; sys->format = *fmt; return VLC_SUCCESS; @@ -295,7 +282,7 @@ static void Flush (audio_output_t *aout, bool wait) if (wait) return; /* drain is implicit with OSS */ - ioctl (fd, SNDCTL_DSP_HALT_OUTPUT, NULL); + ioctl (fd, SNDCTL_DSP_HALT, NULL); } static int VolumeSync (audio_output_t *aout) @@ -332,6 +319,8 @@ static int VolumeSet (audio_output_t *aout, float vol) { aout_sys_t *sys = aout->sys; int fd = sys->fd; + if (fd == -1) + return -1; int level = lroundf (vol * 100.f); if (level > 0xFF) @@ -353,6 +342,8 @@ static int MuteSet (audio_output_t *aout, bool mute) { aout_sys_t *sys = aout->sys; int fd = sys->fd; + if (fd == -1) + return -1; int level = mute ? 0 : (sys->level | (sys->level << 8)); if (ioctl (fd, SNDCTL_DSP_SETPLAYVOL, &level) < 0) @@ -366,27 +357,24 @@ static int MuteSet (audio_output_t *aout, bool mute) return 0; } -static int DevicesEnum (audio_output_t *aout, char ***idp, char ***namep) +static int DevicesEnum (audio_output_t *aout) { - aout_sys_t *sys = sys; - int fd = sys->fd; - oss_sysinfo si; - + int fd = vlc_open ("/dev/dsp", O_WRONLY); if (fd == -1) return -1; + + oss_sysinfo si; + int n = -1; + if (ioctl (fd, SNDCTL_SYSINFO, &si) < 0) { msg_Err (aout, "cannot get system infos: %m"); - return -1; + goto out; } msg_Dbg (aout, "using %s version %s (0x%06X) under %s", si.product, si.version, si.versionnum, si.license); - char **ids = xmalloc (sizeof (*ids) * si.numaudios); - char **names = xmalloc (sizeof (*names) * si.numaudios); - int n = 0; - for (int i = 0; i < si.numaudios; i++) { oss_audioinfo ai = { .dev = i }; @@ -403,12 +391,11 @@ static int DevicesEnum (audio_output_t *aout, char ***idp, char ***namep) if (!ai.enabled) continue; - ids[n] = xstrdup (ai.devnode); - names[n] = xstrdup (ai.name); + aout_HotplugReport (aout, ai.devnode, ai.name); n++; } - *idp = ids; - *namep = names; +out: + close (fd); return n; } @@ -450,8 +437,9 @@ static int Open (vlc_object_t *obj) aout->stop = Stop; aout->volume_set = VolumeSet; aout->mute_set = MuteSet; - aout->device_enum = DevicesEnum; aout->device_select = DeviceSelect; + + DevicesEnum (aout); return VLC_SUCCESS; }