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);
{
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);
}
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;
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));
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: