[pulseaudio-discuss] [PATCH 4/4] move stream when the active_port changes
Hui Wang
hui.wang at canonical.com
Wed Jan 2 13:06:30 UTC 2019
On 2019/1/1 上午2:33, Tanu Kaskinen wrote:
> On Mon, 2018-11-05 at 09:47 +0800, Hui Wang wrote:
>> When the active port of a sink becomes unavailable, all streams from
>> that sink should be moved to the default sink.
>>
>> When the active port of an existing sink changes state from
>> unavailable, all streams that have their "preferred_sink"
>> set to the new sink should be moved to the new sink.
>>
>> Signed-off-by: Hui Wang <hui.wang at canonical.com>
>> ---
>> src/pulsecore/device-port.c | 16 ++++++++++++++++
>> src/pulsecore/sink.c | 13 +++++++++++++
>> src/pulsecore/sink.h | 1 +
>> 3 files changed, 30 insertions(+)
>>
>> diff --git a/src/pulsecore/device-port.c b/src/pulsecore/device-port.c
>> index 464c3f8a2..2604c9051 100644
>> --- a/src/pulsecore/device-port.c
>> +++ b/src/pulsecore/device-port.c
>> @@ -92,6 +92,7 @@ void pa_device_port_set_available(pa_device_port *p, pa_available_t status) {
>> * be created before port objects, and then p->card could be non-NULL for
>> * the whole lifecycle of pa_device_port. */
>> if (p->card && p->card->linked) {
>> + pa_sink *sink;
>> /* A sink or source whose active port is unavailable can't be the
>> * default sink/source, so port availability changes may affect the
>> * default sink/source choice. */
>> @@ -102,6 +103,21 @@ void pa_device_port_set_available(pa_device_port *p, pa_available_t status) {
>>
>> pa_subscription_post(p->core, PA_SUBSCRIPTION_EVENT_CARD|PA_SUBSCRIPTION_EVENT_CHANGE, p->card->index);
>> pa_hook_fire(&p->core->hooks[PA_CORE_HOOK_PORT_AVAILABLE_CHANGED], p);
>> +
>> + sink = pa_sink_get_sink_from_device_port(p);
>> + if (!sink)
>> + return;
>> + switch (p->direction) {
>> + case PA_DIRECTION_OUTPUT:
>> + if (sink->active_port->available == PA_AVAILABLE_NO)
>> + pa_sink_move_streams_from_oldsink_to_newsink(sink, p->core->default_sink, false);
> This logic isn't quite right. We should move streams away from the sink
> only if the active port is the same that just changed its availability
> status. If the current port is something other than the port that
> changed, then we should ignore the change event.
I will change this part and make it follow the correct logic.
>
>> + else
>> + pa_sink_bind_preferred_stream_to_a_sink(sink);
>> +
>> + break;
>> + case PA_DIRECTION_INPUT:
>> + break;
>> + }
>> }
>> }
>>
>> diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c
>> index a2a390beb..9ebc18fa1 100644
>> --- a/src/pulsecore/sink.c
>> +++ b/src/pulsecore/sink.c
>> @@ -3950,3 +3950,16 @@ void pa_sink_bind_preferred_stream_to_a_sink(pa_sink *s) {
>> pa_sink_input_move_to(si, s, false);
>> }
>> }
>> +
>> +pa_sink *pa_sink_get_sink_from_device_port(pa_device_port *p) {
> This is a good helper function, but I think it would fit slightly
> better in the pa_device_port namespace. So I'd rename it to
> pa_device_port_get_sink().
OK, got it.
>
>> + pa_sink *rs = NULL;
>> + pa_sink *sink;
>> + uint32_t state;
>> +
>> + PA_IDXSET_FOREACH(sink, p->card->sinks, state)
>> + if (p == pa_hashmap_get(sink->ports, p->name)) {
>> + rs = sink;
>> + break;
>> + }
>> + return rs;
>> +}
>> diff --git a/src/pulsecore/sink.h b/src/pulsecore/sink.h
>> index 24e4678b1..693344ac3 100644
>> --- a/src/pulsecore/sink.h
>> +++ b/src/pulsecore/sink.h
>> @@ -563,4 +563,5 @@ void pa_sink_set_reference_volume_direct(pa_sink *s, const pa_cvolume *volume);
>>
>> void pa_sink_move_streams_from_oldsink_to_newsink(pa_sink *old_sink, pa_sink *new_sink, bool from_user);
>> void pa_sink_bind_preferred_stream_to_a_sink(pa_sink *s);
>> +pa_sink *pa_sink_get_sink_from_device_port(pa_device_port *p);
>> #endif
More information about the pulseaudio-discuss
mailing list