vlc/vlc-2.2 | branch: master | Rémi Denis-Courmont <[email protected]> | Thu Oct 23 21:58:58 2014 +0300| [de72116538fcf1bf3bd60dae8bda1fd9689d2a70] | committer: Rémi Denis-Courmont
PulseAudio: remove the base volume hack (cherry picked from commit d3de0ffc472ddaf38fe6ba20f05071742ad8d86b) > http://git.videolan.org/gitweb.cgi/vlc/vlc-2.2.git/?a=commit;h=de72116538fcf1bf3bd60dae8bda1fd9689d2a70 --- modules/audio_output/pulse.c | 94 ++++-------------------------------------- 1 file changed, 7 insertions(+), 87 deletions(-) diff --git a/modules/audio_output/pulse.c b/modules/audio_output/pulse.c index 601911e..a2da4d7 100644 --- a/modules/audio_output/pulse.c +++ b/modules/audio_output/pulse.c @@ -57,7 +57,6 @@ struct sink { struct sink *next; uint32_t index; - pa_volume_t base_volume; char name[1]; }; @@ -67,7 +66,6 @@ struct aout_sys_t pa_context *context; /**< PulseAudio connection context */ pa_threaded_mainloop *mainloop; /**< PulseAudio thread */ pa_time_event *trigger; /**< Deferred stream trigger */ - pa_volume_t base_volume; /**< 0dB reference volume */ pa_cvolume cvolume; /**< actual sink input volume */ mtime_t first_pts; /**< Play time of buffer start */ @@ -83,27 +81,10 @@ static void VolumeReport(audio_output_t *aout) aout_sys_t *sys = aout->sys; pa_volume_t volume = pa_cvolume_max(&sys->cvolume); - volume = pa_sw_volume_divide(volume, sys->base_volume); aout_VolumeReport(aout, (float)volume / PA_VOLUME_NORM); } /*** Sink ***/ -static struct sink *sink_find(aout_sys_t *sys, uint32_t index) -{ - for (struct sink *sink = sys->sinks; sink != NULL; sink = sink->next) - if (sink->index == index) - return sink; - return NULL; -} - -static struct sink *sink_find_by_name(aout_sys_t *sys, const char *name) -{ - for (struct sink *sink = sys->sinks; sink != NULL; sink = sink->next) - if (!strcmp(sink->name, name)) - return sink; - return NULL; -} - static void sink_add_cb(pa_context *ctx, const pa_sink_info *i, int eol, void *userdata) { @@ -128,15 +109,6 @@ static void sink_add_cb(pa_context *ctx, const pa_sink_info *i, int eol, sink->next = sys->sinks; sink->index = i->index; - /* PulseAudio flat volume NORM / 100% / 0dB corresponds to no software - * amplification and maximum hardware amplification. - * VLC maps DEFAULT / 100% to no gain at all (software/hardware). - * Thus we need to use the sink base_volume as a multiplier, - * if and only if flat volume is active for our current sink. */ - if (i->flags & PA_SINK_FLAT_VOLUME) - sink->base_volume = i->base_volume; - else - sink->base_volume = PA_VOLUME_NORM; memcpy(sink->name, i->name, namelen + 1); sys->sinks = sink; } @@ -145,7 +117,6 @@ static void sink_mod_cb(pa_context *ctx, const pa_sink_info *i, int eol, void *userdata) { audio_output_t *aout = userdata; - aout_sys_t *sys = aout->sys; if (eol) return; @@ -154,15 +125,6 @@ static void sink_mod_cb(pa_context *ctx, const pa_sink_info *i, int eol, msg_Dbg(aout, "changing sink %"PRIu32": %s (%s)", i->index, i->name, i->description); aout_HotplugReport(aout, i->name, i->description); - - struct sink *sink = sink_find(sys, i->index); - if (unlikely(sink == NULL)) - return; - - if (i->flags & PA_SINK_FLAT_VOLUME) - sink->base_volume = i->base_volume; - else - sink->base_volume = PA_VOLUME_NORM; } static void sink_del(uint32_t index, audio_output_t *aout) @@ -350,18 +312,10 @@ static void stream_event_cb(pa_stream *s, const char *name, pa_proplist *pl, static void stream_moved_cb(pa_stream *s, void *userdata) { audio_output_t *aout = userdata; - aout_sys_t *sys = aout->sys; const char *name = pa_stream_get_device_name(s); - struct sink *sink = sink_find(sys, pa_stream_get_device_index(s)); msg_Dbg(aout, "connected to sink %s", name); aout_DeviceReport(aout, name); - - sys->base_volume = likely(sink != NULL) ? sink->base_volume - : PA_VOLUME_INVALID; - msg_Dbg(aout, "base volume: %"PRIu32, sys->base_volume); - if (pa_cvolume_valid(&sys->cvolume)) - VolumeReport(aout); } static void stream_overflow_cb(pa_stream *s, void *userdata) @@ -427,8 +381,7 @@ static void sink_input_info_cb(pa_context *ctx, const pa_sink_input_info *i, (void) ctx; sys->cvolume = i->volume; /* cache volume for balance preservation */ - if (PA_VOLUME_IS_VALID(sys->base_volume)) - VolumeReport(aout); + VolumeReport(aout); aout_MuteReport(aout, i->mute); } @@ -616,8 +569,6 @@ static int VolumeSet(audio_output_t *aout, float vol) aout_sys_t *sys = aout->sys; pa_stream *s = sys->stream; pa_operation *op; - int ret = -1; - pa_volume_t base_volume; /* VLC provides the software volume so convert directly to PulseAudio * software volume, pa_volume_t. This is not a linear amplification factor @@ -626,38 +577,17 @@ static int VolumeSet(audio_output_t *aout, float vol) if (unlikely(vol >= PA_VOLUME_MAX)) vol = PA_VOLUME_MAX; - pa_threaded_mainloop_lock(sys->mainloop); - - base_volume = sys->base_volume; - if (!PA_VOLUME_IS_VALID(base_volume)) - { /* Base volume is unknown, typically because sink is unknown. - * Try to guess the base volume. */ - const struct sink *sink = sys->sinks; - if (unlikely(sink == NULL)) - { - msg_Err(aout, "cannot change volume without sink"); - goto out; - } - - base_volume = sink->base_volume; - while ((sink = sink->next) != NULL) - if (sink->base_volume != base_volume) - { - msg_Err(aout, "cannot change volume without base"); - goto out; - } - } - - pa_volume_t volume = pa_sw_volume_multiply(lroundf(vol), base_volume); + pa_volume_t volume = lroundf(vol); if (s == NULL) { sys->volume_force = volume; - aout_VolumeReport(aout, vol / (float)PA_VOLUME_NORM); - ret = 0; - goto out; + aout_VolumeReport(aout, (float)volume / (float)PA_VOLUME_NORM); + return 0; } + pa_threaded_mainloop_lock(sys->mainloop); + if (!pa_cvolume_valid(&sys->cvolume)) { const pa_sample_spec *ss = pa_stream_get_sample_spec(s); @@ -675,13 +605,9 @@ static int VolumeSet(audio_output_t *aout, float vol) op = pa_context_set_sink_input_volume(sys->context, pa_stream_get_index(s), &cvolume, NULL, NULL); if (likely(op != NULL)) - { pa_operation_unref(op); - ret = 0; - } -out: pa_threaded_mainloop_unlock(sys->mainloop); - return ret; + return likely(op != NULL) ? 0 : -1; } static int MuteSet(audio_output_t *aout, bool mute) @@ -714,10 +640,6 @@ static int StreamMove(audio_output_t *aout, const char *name) if (sys->stream == NULL) { - struct sink *sink = sink_find_by_name(sys, name); - - sys->base_volume = likely(sink != NULL) ? sink->base_volume - : PA_VOLUME_INVALID; msg_Dbg(aout, "will connect to sink %s", name); free(sys->sink_force); sys->sink_force = strdup(name); @@ -1005,7 +927,6 @@ static void Stop(audio_output_t *aout) pa_stream_unref(s); sys->stream = NULL; - sys->base_volume = PA_VOLUME_INVALID; pa_threaded_mainloop_unlock(sys->mainloop); } @@ -1027,7 +948,6 @@ static int Open(vlc_object_t *obj) } sys->stream = NULL; sys->context = ctx; - sys->base_volume = PA_VOLUME_INVALID; sys->volume_force = PA_VOLUME_INVALID; sys->flags_force = PA_STREAM_NOFLAGS; sys->sink_force = NULL; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
