[pulseaudio-discuss] Why does PA need to rewrite and rewind when I change the volume while playing audio?

Sean Greenslade sean at seangreenslade.com
Fri Aug 6 23:23:13 UTC 2021


On July 26, 2021 8:18:19 PM PDT, Chengyi Zhao <zhaochengyi at uniontech.com> wrote:
>Hi guys,
>
>I found the following logic when I change the volume while playing 
>audio.I guess there is some audio expertise here, would you please tell
>
>me the principle, thanks a lot!
>
>In the file sink-input.c(./src/pulsecore/sink-input.c), why does pa
>need 
>to invoke the function pa_sink_input_request_rewind to rewrite and 
>rewind the data?
>
>void pa_sink_input_set_volume(...) {
>     ...
>
>   pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), 
>PA_SINK_INPUT_MESSAGE_SET_SOFT_VOLUME, NULL, 0, NULL) == 0);
>     }
>
>     ...
>}
>
>int pa_sink_input_process_msg(...) {
>     ...
>
>     switch (code) {
>
>         case PA_SINK_INPUT_MESSAGE_SET_SOFT_VOLUME:
>             if (!pa_cvolume_equal(&i->thread_info.soft_volume, 
>&i->soft_volume)) {
>                 i->thread_info.soft_volume = i->soft_volume;
>                pa_sink_input_request_rewind(i, 0, true, false, false);
>             }
>
>            return 0;
>
>     ...
>}

There's some helpful docs about what rewinding is in the context of pulseaudio here:

https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/Developer/Rewinding/

But in summary, pulse will try to get ahead of things by buffering up processed audio data. When the requested processing changes, for example a new volume level is requested, rewinding clears out the (now out of date) buffered audio samples and rewrites them with the new processing.

--Sean



More information about the pulseaudio-discuss mailing list