a question about audio synchronization between local sink and tunnel sink

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Tanu,

I have modified code like this in module-combine-sink.c after exchanging idea with you.

In function sink_input_pop_cb():  add these lines before calling request_memblock()
    ...

    if (o->just_attached) {
        pa_usec_t sink_input_latency, sink_latency, total_latency1, total_latency2;
        struct output *j;

        sink_input_latency = pa_sink_input_get_latency_within_thread(i, &sink_latency);
        sink_input_latency += sink_latency;
        total_latency1 = sink_input_latency + pa_bytes_to_usec(pa_memblockq_get_length(o->memblockq), &o->sink_input->sample_spec);
        pa_log_warn("[%s] latency %0.2fms, output buffer latency %0.2fms.", o->sink_input->sink->name, (double)total_latency1/PA_USEC_PER_MSEC, (double)(total_latency1-sink_input_latency)/PA_USEC_PER_MSEC);

        /* OK, let's send this data to the other threads */
        PA_LLIST_FOREACH(j, o->userdata->thread_info.active_outputs) {
            if (j != o) {
                sink_input_latency = pa_sink_input_get_latency_within_thread(j->sink_input, &sink_latency);
                sink_input_latency += sink_latency;
                total_latency2 = sink_input_latency + pa_bytes_to_usec(pa_memblockq_get_length(j->memblockq), &j->sink_input->sample_spec);
                pa_log_warn("Peer: [%s] latency %0.2fms, output buffer latency %0.2fms.", j->sink_input->sink->name, (double)total_latency2/PA_USEC_PER_MSEC, (double)(total_latency2-sink_input_latency)/PA_USEC_PER_MSEC);
                if (total_latency1 > total_latency2)
                    pa_memblockq_drop(o->memblockq, pa_usec_to_bytes(total_latency1-total_latency2, &o->sink_input->sample_spec));
                else if (total_latency1 < total_latency2)
                    pa_memblockq_rewind(o->memblockq, pa_usec_to_bytes(total_latency2-total_latency1, &o->sink_input->sample_spec));
                break;
            }
        }

        o->just_attached = 0;
    }

In function sink_input_attach_cb(): add  o->just_attached = 1;

In function sink_input_detach_cb(): add  o->just_attached = 0;


Then I got following logs when playing audio. Of course un-synchronization issue is still there.

W: [module-tunnel] module-combine-sink.c: [tunnel_sink] attached
W: [module-tunnel] module-combine-sink.c: [tunnel_sink] latency 0.00ms, output buffer latency 0.00ms.
W: [alsa-sink] module-combine-sink.c: [alsa_output] attached
W: [alsa-sink] module-combine-sink.c: [alsa_output] latency 0.88ms, output buffer latency 0.00ms.
W: [alsa-sink] module-combine-sink.c: Peer: [tunnel_sink] latency 0.00ms, output buffer latency 0.00ms.
W: [pulseaudio] module-combine-sink.c: [alsa_output] sample rates too different, not adjusting (44100 vs. 33380).
W: [pulseaudio] module-combine-sink.c: [alsa_output] sample rates too different, not adjusting (44100 vs. 28907).
W: [pulseaudio] module-combine-sink.c: [alsa_output] sample rates too different, not adjusting (44100 vs. 31788).


[Index of Archives]     [Linux Audio Users]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux