]> git.sesse.net Git - vlc/blobdiff - modules/audio_output/pulse.c
DirectSound: apply volume attenuation with DirectSound
[vlc] / modules / audio_output / pulse.c
index 904f794e62f5b985f030914246762f56f3f62b0d..bd296eeee33c47784186dc1a556f382d619aa495 100644 (file)
@@ -254,7 +254,6 @@ static void stream_resync(audio_output_t *aout, pa_stream *s)
     aout_sys_t *sys = aout->sys;
     mtime_t delta;
 
-    assert (pa_stream_is_corked(s) > 0);
     assert (sys->pts != VLC_TS_INVALID);
 
     delta = vlc_pa_get_latency(aout, sys->context, s);
@@ -473,15 +472,16 @@ static void sink_input_info_cb(pa_context *ctx, const pa_sink_input_info *i,
 {
     audio_output_t *aout = userdata;
     aout_sys_t *sys = aout->sys;
-    float volume;
 
     if (eol)
         return;
     (void) ctx;
 
-    sys->cvolume = i->volume;
-    volume = pa_cvolume_max(&i->volume) / (float)PA_VOLUME_NORM;
-    aout_VolumeHardSet(aout, volume, i->mute);
+    sys->cvolume = i->volume; /* cache volume for balance preservation */
+
+    pa_volume_t volume = pa_cvolume_max(&i->volume);
+    volume = pa_sw_volume_divide(volume, sys->base_volume);
+    aout_VolumeHardSet(aout, (float)volume / PA_VOLUME_NORM, i->mute);
 }
 
 
@@ -519,6 +519,8 @@ static void Play(audio_output_t *aout, block_t *block)
     aout_sys_t *sys = aout->sys;
     pa_stream *s = sys->stream;
 
+    assert (sys->paused == VLC_TS_INVALID);
+
     const void *ptr = data_convert(&block);
     if (unlikely(ptr == NULL))
         return;
@@ -605,18 +607,17 @@ static int VolumeSet(audio_output_t *aout, float vol, bool mute)
     pa_operation *op;
     uint32_t idx = pa_stream_get_index(sys->stream);
 
-    pa_cvolume cvolume = sys->cvolume;
-    pa_volume_t volume = sys->base_volume;
-
-    pa_cvolume_scale(&cvolume, PA_VOLUME_NORM); /* preserve balance */
-
     /* VLC provides the software volume so convert directly to PulseAudio
      * software volume, pa_volume_t. This is not a linear amplification factor
      * so do not use PulseAudio linear amplification! */
     vol *= PA_VOLUME_NORM;
     if (unlikely(vol >= PA_VOLUME_MAX))
         vol = PA_VOLUME_MAX;
-    volume = pa_sw_volume_multiply(volume, lround(vol));
+    pa_volume_t volume = pa_sw_volume_multiply(lround(vol), sys->base_volume);
+
+    /* Preserve the balance (VLC does not support it). */
+    pa_cvolume cvolume = sys->cvolume;
+    pa_cvolume_scale(&cvolume, PA_VOLUME_NORM);
     pa_sw_cvolume_multiply_scalar(&cvolume, &cvolume, volume);
 
     assert(pa_cvolume_valid(&cvolume));
@@ -945,7 +946,7 @@ static int Open(vlc_object_t *obj)
     aout->pf_play = Play;
     aout->pf_pause = Pause;
     aout->pf_flush = Flush;
-    aout_VolumeHardInit (aout, VolumeSet);
+    aout_VolumeHardInit (aout, VolumeSet, false);
     return VLC_SUCCESS;
 
 fail: