deactivate pa_tz_device only when all sink/source suspended 01/104501/1
authorJeongho Mok <jho.mok@samsung.com>
Thu, 8 Dec 2016 08:31:32 +0000 (17:31 +0900)
committerJeongho Mok <jho.mok@samsung.com>
Tue, 13 Dec 2016 11:20:59 +0000 (03:20 -0800)
[Version] 5.0.102
[Profile] Common
[Issue Type] Enhancement

Change-Id: Id61ab39f9fa7ff718481eef66293a3f629451664
(cherry picked from commit 541cbacb548c07b53f1561c5717f62813e054934)

packaging/pulseaudio-modules-tizen.spec
src/device-manager.c
src/tizen-device.c
src/tizen-device.h

index cdacead..f141b46 100644 (file)
@@ -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+
index 7ebf8de..89cdbfa 100644 (file)
@@ -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))) {
index 861a5e3..25cdd39 100644 (file)
@@ -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;
index 82a1612..89b6a85 100644 (file)
@@ -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);