Improve logic regarding focus reacquisition change in the callback 74/204874/1 accepted/tizen/unified/20190430.113437 submit/tizen/20190429.054338
authorSangchul Lee <sc11.lee@samsung.com>
Mon, 29 Apr 2019 01:03:52 +0000 (10:03 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Mon, 29 Apr 2019 01:18:55 +0000 (10:18 +0900)
If reacquisition value is changed in the focus callback, taken_by_id
/taken_backup structures for both playback/capture of the node should
be updated.

[Version] 0.12.42
[Issue Type] Bug fix

Change-Id: I0161d0af91878909ae5c60b3072382d576955a80
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
focus_server/mm_sound_mgr_focus.c
packaging/libmm-sound.spec

index 746cc254c1f2d07c694098d7f943b12d4301bb93..de3306f3059e8b8aa93f644b534ffb2fd82159c8 100644 (file)
@@ -57,7 +57,7 @@ typedef struct {
 } focus_cb_data;
 
 #define UPDATE_FOCUS_TAKEN_INFO(x_postfix, x_node, x_pid, x_hid) do { \
-       debug_msg("updating node[%p], taken_"#x_postfix"[%d] : pid = [%d], handle_id = [%d]", x_node, i, x_pid, x_hid); \
+       debug_msg("updating node[%d/%d], taken_"#x_postfix"[%d] : pid = [%d], handle_id = [%d]", x_node->pid, x_node->handle_id, i, x_pid, x_hid); \
        x_node->taken_##x_postfix[i].pid = x_pid; \
        x_node->taken_##x_postfix[i].handle_id = x_hid; \
 } while (0)
@@ -484,37 +484,46 @@ int _mm_sound_mgr_focus_do_callback(focus_command_e command, focus_node_t *victi
        }
 
        for (i = 0; i < NUM_OF_STREAM_IO_TYPE; i++) {
-               if (flag_for_taken_index & (i+1)) {
-                       GList *list = NULL;
-                       focus_node_t *node = NULL;
-
-                       if (command == FOCUS_COMMAND_ACQUIRE && (victim_node->taken_by_id[i].pid != assaulter_param->pid || (victim_node->taken_by_id[i].handle_id != assaulter_param->handle_id))) {
-                               /* skip */
-                               debug_error("skip updating victim node");
-                               continue;
-                       }
-                       if (reacquisition_changed) {
-                               if (!victim_node->reacquisition) {
-                                       for (list = g_focus_node_list; list != NULL; list = list->next) {
-                                               CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
-                                               if (node->taken_by_id[i].pid == victim_node->pid) {
-                                                       UPDATE_FOCUS_TAKEN_INFO(backup, node, node->taken_by_id[i].pid, node->taken_by_id[i].handle_id);
-                                                       UPDATE_FOCUS_TAKEN_INFO(by_id, node, taken_pid, taken_hid);
-                                               } else if (!list->next) {
+               if (reacquisition_changed) {
+                       /* Update taken-info including other nodes here.
+                        * If the victim node's re-acquisition value is set to false,
+                        * propagates its taken-info to its victim node. */
+                       debug_msg("[---------- handling reacquisition change in callback ----------->] ");
+                       if (!victim_node->reacquisition) {
+                               GList *list = NULL;
+                               focus_node_t *node = NULL;
+                               for (list = g_focus_node_list; list != NULL; list = list->next) {
+                                       CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
+                                       if (node->taken_by_id[i].pid == victim_node->pid &&
+                                               node->taken_by_id[i].handle_id == victim_node->handle_id) {
+                                               UPDATE_FOCUS_TAKEN_INFO(backup, node, node->taken_by_id[i].pid, node->taken_by_id[i].handle_id);
+                                               UPDATE_FOCUS_TAKEN_INFO(by_id, node, taken_pid, taken_hid);
+                                       } else if (!list->next) {
+                                               if (flag_for_taken_index & (i+1))
                                                        UPDATE_FOCUS_TAKEN_INFO(backup, victim_node, taken_pid, taken_hid);
-                                                       UPDATE_FOCUS_TAKEN_INFO(by_id, victim_node, 0, 0);
-                                               }
+                                               else
+                                                       UPDATE_FOCUS_TAKEN_INFO(backup, victim_node, victim_node->taken_by_id[i].pid, victim_node->taken_by_id[i].handle_id);
+
+                                               UPDATE_FOCUS_TAKEN_INFO(by_id, victim_node, 0, 0);
                                        }
-                               } else {
-                                       UPDATE_FOCUS_TAKEN_INFO(by_id, victim_node, taken_pid, taken_hid);
-                                       UPDATE_FOCUS_TAKEN_INFO(backup, victim_node, 0, 0);
                                }
                        } else {
-                               if (victim_node->reacquisition)
+                               if (flag_for_taken_index & (i+1)) {
                                        UPDATE_FOCUS_TAKEN_INFO(by_id, victim_node, taken_pid, taken_hid);
-                               else
-                                       UPDATE_FOCUS_TAKEN_INFO(backup, victim_node, taken_pid, taken_hid);
+                                       UPDATE_FOCUS_TAKEN_INFO(backup, victim_node, 0, 0);
+                               }
                        }
+                       debug_msg("[<----------------------------------------------------------------] ");
+               } else if (flag_for_taken_index & (i+1)) {
+                       if (command == FOCUS_COMMAND_ACQUIRE &&
+                               ((victim_node->taken_by_id[i].pid != assaulter_param->pid) ||
+                               (victim_node->taken_by_id[i].handle_id != assaulter_param->handle_id)))
+                               continue;
+
+                       if (victim_node->reacquisition)
+                               UPDATE_FOCUS_TAKEN_INFO(by_id, victim_node, taken_pid, taken_hid);
+                       else
+                               UPDATE_FOCUS_TAKEN_INFO(backup, victim_node, taken_pid, taken_hid);
                }
        }
 
index 0c20ed3302835eb8cbae04203bf10084f6d85c44..90470813c4baa9dc8366156f18cd75bf00accc09 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libmm-sound
 Summary:    MMSound Package contains client lib and sound_server binary
-Version:    0.12.41
+Version:    0.12.42
 Release:    0
 Group:      System/Libraries
 License:    Apache-2.0