From 541cbacb548c07b53f1561c5717f62813e054934 Mon Sep 17 00:00:00 2001 From: Jeongho Mok Date: Thu, 8 Dec 2016 17:31:32 +0900 Subject: [PATCH] deactivate pa_tz_device only when all sink/source suspended [Version] 5.0.102 [Profile] Common [Issue Type] Enhancement Change-Id: Id61ab39f9fa7ff718481eef66293a3f629451664 --- packaging/pulseaudio-modules-tizen.spec | 2 +- src/device-manager.c | 23 ++++++++--------------- src/tizen-device.c | 18 ++++++++++++++++++ src/tizen-device.h | 1 + 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/packaging/pulseaudio-modules-tizen.spec b/packaging/pulseaudio-modules-tizen.spec index cdacead..f141b46 100644 --- a/packaging/pulseaudio-modules-tizen.spec +++ b/packaging/pulseaudio-modules-tizen.spec @@ -1,6 +1,6 @@ Name: pulseaudio-modules-tizen Summary: Pulseaudio modules for Tizen -Version: 5.0.101 +Version: 5.0.102 Release: 0 Group: Multimedia/Audio License: LGPL-2.1+ diff --git a/src/device-manager.c b/src/device-manager.c index 7ebf8de..89cdbfa 100644 --- a/src/device-manager.c +++ b/src/device-manager.c @@ -1570,7 +1570,6 @@ static pa_hook_result_t source_unlink_hook_callback(pa_core *c, pa_source *sourc static pa_hook_result_t sink_source_state_changed_hook_cb(pa_core *c, pa_object *pdevice, pa_device_manager *dm) { pa_tz_device *device; - bool use_internal_codec = false; uint32_t idx = 0; pa_assert(c); @@ -1581,13 +1580,10 @@ static pa_hook_result_t sink_source_state_changed_hook_cb(pa_core *c, pa_object pa_sink *s = PA_SINK(pdevice); pa_sink_state_t state = pa_sink_get_state(s); pa_log_debug("=========== Sink(%p,%s) state has been changed to [%d](0:RUNNING, 1:IDLE, 2:SUSPEND) ==========", s, s->name, state); - if (s->use_internal_codec) { - if (state == PA_SINK_SUSPENDED) { - PA_IDXSET_FOREACH(device, dm->device_list, idx) { - use_internal_codec = pa_tz_device_is_use_internal_codec(device); - if (use_internal_codec) - pa_tz_device_set_state(device, DM_DEVICE_DIRECTION_OUT, DM_DEVICE_STATE_DEACTIVATED); - } + if (s->use_internal_codec && state == PA_SINK_SUSPENDED) { + PA_IDXSET_FOREACH(device, dm->device_list, idx) { + if (pa_tz_device_is_use_internal_codec(device) && pa_tz_device_is_all_suspended(device)) + pa_tz_device_set_state(device, DM_DEVICE_DIRECTION_OUT, DM_DEVICE_STATE_DEACTIVATED); } } else { if ((device = pa_device_manager_get_device_with_sink(s))) { @@ -1601,13 +1597,10 @@ static pa_hook_result_t sink_source_state_changed_hook_cb(pa_core *c, pa_object pa_source *s = PA_SOURCE(pdevice); pa_source_state_t state = pa_source_get_state(s); pa_log_debug("=========== Source(%p,%s) state has been changed to [%d](0:RUNNING, 1:IDLE, 2:SUSPEND) ==========", s, s->name, state); - if (s->use_internal_codec) { - if (state == PA_SOURCE_SUSPENDED) { - PA_IDXSET_FOREACH(device, dm->device_list, idx) { - use_internal_codec = pa_tz_device_is_use_internal_codec(device); - if (use_internal_codec) - pa_tz_device_set_state(device, DM_DEVICE_DIRECTION_IN, DM_DEVICE_STATE_DEACTIVATED); - } + if (s->use_internal_codec && state == PA_SOURCE_SUSPENDED) { + PA_IDXSET_FOREACH(device, dm->device_list, idx) { + if (pa_tz_device_is_use_internal_codec(device) && pa_tz_device_is_all_suspended(device)) + pa_tz_device_set_state(device, DM_DEVICE_DIRECTION_IN, DM_DEVICE_STATE_DEACTIVATED); } } else { if ((device = pa_device_manager_get_device_with_source(s))) { diff --git a/src/tizen-device.c b/src/tizen-device.c index 861a5e3..25cdd39 100644 --- a/src/tizen-device.c +++ b/src/tizen-device.c @@ -575,6 +575,24 @@ bool pa_tz_device_is_use_internal_codec(pa_tz_device *device) { return device->use_internal_codec; } +bool pa_tz_device_is_all_suspended(pa_tz_device *device) { + pa_sink *sink; + pa_source *source; + void *state1 = NULL, *state2 = NULL; + + PA_HASHMAP_FOREACH(sink, device->playback_devices, state1) { + if (pa_sink_get_state(sink) != PA_SINK_SUSPENDED) + return false; + } + + PA_HASHMAP_FOREACH(source, device->capture_devices, state2) { + if (pa_source_get_state(source) != PA_SOURCE_SUSPENDED) + return false; + } + + return true; +} + static int method_call_bt_sco(pa_dbus_connection *conn, bool onoff) { DBusMessage *msg, *reply; DBusError err; diff --git a/src/tizen-device.h b/src/tizen-device.h index 82a1612..89b6a85 100644 --- a/src/tizen-device.h +++ b/src/tizen-device.h @@ -123,6 +123,7 @@ char* pa_tz_device_get_system_id(pa_tz_device *device); dm_device_direction_t pa_tz_device_get_direction(pa_tz_device *device); pa_usec_t pa_tz_device_get_creation_time(pa_tz_device *device); bool pa_tz_device_is_use_internal_codec(pa_tz_device *device); +bool pa_tz_device_is_all_suspended(pa_tz_device *device); /* Only for BT SCO device */ int pa_tz_device_sco_open(pa_tz_device *device); -- 2.7.4