On 10.04.2017 20:51, Georg Chini wrote:
On 10.04.2017 16:36, Tanu Kaskinen wrote:
On Mon, 2017-04-10 at 16:27 +0200, Georg Chini wrote:
On 10.04.2017 16:23, Tanu Kaskinen wrote:
On Sat, 2017-04-08 at 20:34 +0200, Georg Chini wrote:
If source or sink are changed, the current sink input rate may be
different
from the default rate. Switch sink input rate back to default to
avoid the
influence of the previous combination of source and sink.
---
src/modules/module-loopback.c | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)
diff --git a/src/modules/module-loopback.c
b/src/modules/module-loopback.c
index 2242c62c..535c27d2 100644
--- a/src/modules/module-loopback.c
+++ b/src/modules/module-loopback.c
@@ -639,11 +639,18 @@ static void
source_output_moving_cb(pa_source_output *o, pa_source *dest) {
/* Send a mesage to the output thread that the source
has changed.
* If the sink is invalid here during a profile switching
situation
- * we can safely set push_called to false directly. */
- if (u->sink_input->sink)
+ * we can safely set push_called to false directly. Also, the
current
+ * sampling rate may be far away from the default rate if we
are still
+ * recovering from a previous source or sink change, so reset
rate to
+ * default before moving the source. If the sink is not
valid, only
+ * update the sink input sample spec.*/
+ if (u->sink_input->sink) {
pa_asyncmsgq_send(u->sink_input->sink->asyncmsgq,
PA_MSGOBJECT(u->sink_input), SINK_INPUT_MESSAGE_SOURCE_CHANGED,
NULL, 0, NULL);
- else
+ pa_sink_input_set_rate(u->sink_input,
u->source_output->sample_spec.rate);
+ } else {
u->output_thread_info.push_called = false;
+ u->sink_input->sample_spec.rate =
u->source_output->sample_spec.rate;
+ }
pa_sink_input_set_rate() does other things too than just set
sample_spec.rate. I think you should always call
pa_sink_input_set_rate(), but since pa_sink_input_set_rate() currently
doesn't expect to be called in the middle of a move, it needs to be
fixed first.
I don't understand why it should not be enough to just set the sink
input rate.
Did you look at the code in pa_sink_input_set_rate()? It updates
thread_info.sample_spec.rate, calls pa_resampler_set_input_rate() and
sends a subscription event. Do you think it's ok to skip these things?
OK, but I still think I do not need to fix anything. Since there is no
output thread
at that point in time, I can directly do what is done in
PA_SINK_INPUT_MESSAGE_SET_RATE.
The subscription event will be sent by pa_sink_input_finish_move(). I
wonder
if we could simply put the update of the in_thread sample rate and the
resampler
in pa_sink_input_update_rate(), then my patch would need no change and
we would
also allow other callers to update the rate easily.
It seems to be easy to fix sink_input_set_rate() however, so I'll go
ahead and do that ...
_______________________________________________
pulseaudio-discuss mailing list
pulseaudio-discuss@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss