[vlc-commits] PulseAudio: remove the base volume hack
Rémi Denis-Courmont
git at videolan.org
Sat Oct 25 11:31:31 CEST 2014
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Thu Oct 23 21:58:58 2014 +0300| [d3de0ffc472ddaf38fe6ba20f05071742ad8d86b] | committer: Rémi Denis-Courmont
PulseAudio: remove the base volume hack
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=d3de0ffc472ddaf38fe6ba20f05071742ad8d86b
---
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;
More information about the vlc-commits
mailing list