Use static keyword for global variables
[platform/core/multimedia/libmm-sound.git] / mm_sound_proxy.c
index 2a946c8..5f3548c 100644 (file)
@@ -15,8 +15,6 @@
 #include "include/mm_sound_focus_socket.h"
 #include "include/mm_sound_focus_private.h"
 
-extern focus_sound_info_t g_focus_sound_handle[FOCUS_HANDLE_MAX];
-
 struct callback_data {
        void *user_cb;
        void *user_data;
@@ -43,7 +41,7 @@ static int _notify_subscription(audio_event_t event, uint32_t subs_id, gboolean
 
        debug_fenter();
 
-       if ((ret = mm_sound_dbus_get_event_name(event, &event_name) != MM_ERROR_NONE)) {
+       if ((ret = mm_sound_dbus_get_event_name(event, &event_name)) != MM_ERROR_NONE) {
                debug_error("Failed to get event name");
                return MM_ERROR_SOUND_INTERNAL;
        }
@@ -68,7 +66,7 @@ static int _notify_signal_handled(audio_event_t event, uint32_t event_id, uint32
 
        debug_fenter();
 
-       if ((ret = mm_sound_dbus_get_event_name(event, &event_name) != MM_ERROR_NONE)) {
+       if ((ret = mm_sound_dbus_get_event_name(event, &event_name)) != MM_ERROR_NONE) {
                debug_error("Failed to get event name");
                return MM_ERROR_SOUND_INTERNAL;
        }
@@ -240,6 +238,13 @@ static void dbus_callback(audio_event_t event, GVariant *params, void *userdata)
                int ended_handle = 0;
                g_variant_get(params, "(i)", &ended_handle);
                ((mm_sound_stop_callback_wrapper_func)(cb_data->user_cb))(ended_handle, cb_data->user_data);
+       } else if (event == AUDIO_EVENT_DUCKING_STATE_CHANGED) {
+               int idx = 0;
+               int is_ducked = 0;
+
+               g_variant_get(params, "(ii)", &idx, &is_ducked);
+
+               ((mm_sound_ducking_state_changed_wrapper_cb)(cb_data->user_cb))(idx, is_ducked, cb_data->user_data);
        }
 }
 
@@ -292,29 +297,27 @@ int mm_sound_proxy_test(int a, int b, int *get)
 
        debug_fenter();
 
-       params = g_variant_new("(ii)", a, b);
-       if (params) {
-               if ((ret = mm_sound_dbus_method_call_to(AUDIO_PROVIDER_SOUND_SERVER, AUDIO_METHOD_TEST, params, &result)) != MM_ERROR_NONE) {
-                       debug_error("dbus test call failed");
-                       goto cleanup;
-               }
-       } else {
+       if ((params = g_variant_new("(ii)", a, b)) == NULL) {
                debug_error("Construct Param for method call failed");
                return MM_ERROR_SOUND_INTERNAL;
        }
 
+       if ((ret = mm_sound_dbus_method_call_to(AUDIO_PROVIDER_SOUND_SERVER, AUDIO_METHOD_TEST, params, &result)) != MM_ERROR_NONE) {
+               debug_error("dbus test call failed");
+               g_variant_unref(result);
+               return ret;
+       }
+
        if (result) {
                g_variant_get(result, "(i)",  &reply);
                debug_log("reply : %d", reply);
                *get = reply;
+               g_variant_unref(result);
        } else {
                debug_error("reply null");
+               ret = MM_ERROR_SOUND_INTERNAL;
        }
 
-cleanup:
-       if (result)
-               g_variant_unref(result);
-
        debug_fleave();
        return ret;
 }
@@ -322,7 +325,7 @@ cleanup:
 int mm_sound_proxy_is_stream_on_device(int stream_id, int device_id, bool *is_on)
 {
        int ret = MM_ERROR_NONE;
-       GVariant *params, *result;
+       GVariant *params = NULL, *result = NULL;
        gboolean _is_on;
 
        debug_fenter();
@@ -352,10 +355,7 @@ int mm_sound_proxy_is_stream_on_device(int stream_id, int device_id, bool *is_on
        }
 
 cleanup:
-       if (params)
-               g_variant_unref(params);
-       if (result)
-               g_variant_unref(result);
+       g_variant_unref(result);
 
        debug_fleave();
        return ret;
@@ -440,8 +440,7 @@ int mm_sound_proxy_get_current_connected_device_list(int device_flags, GList** d
                                        device_item->name, device_item->vendor_id, device_item->product_id, device_item->is_running);
                        device_item->stream_num = -1;
                } else {
-                       if (device_item)
-                               g_free(device_item);
+                       g_free(device_item);
                        break;
                }
        }
@@ -458,8 +457,7 @@ int mm_sound_proxy_get_current_connected_device_list(int device_flags, GList** d
 #endif /* TIZEN_TV */
 
 cleanup:
-       if (result)
-               g_variant_unref(result);
+       g_variant_unref(result);
 
        debug_fleave();
        return ret;
@@ -515,8 +513,7 @@ int mm_sound_proxy_get_device_by_id(int device_id, mm_sound_device_t **device)
        }
 
 cleanup:
-       if (result)
-               g_variant_unref(result);
+       g_variant_unref(result);
 
        debug_fleave();
        return ret;
@@ -664,30 +661,28 @@ int mm_sound_proxy_set_volume_by_type(const char *volume_type, const unsigned vo
 
        debug_fenter();
 
-       params = g_variant_new("(ssu)", direction, volume_type, volume_level);
-       if (params) {
-               if ((ret = mm_sound_dbus_method_call_to(AUDIO_PROVIDER_STREAM_MANAGER, AUDIO_METHOD_SET_VOLUME_LEVEL, params, &result)) != MM_ERROR_NONE) {
-                       debug_error("dbus set volume by type failed");
-                       goto cleanup;
-               }
-       } else {
+       if ((params = g_variant_new("(ssu)", direction, volume_type, volume_level)) == NULL) {
                debug_error("Construct Param for method call failed");
                return MM_ERROR_SOUND_INTERNAL;
        }
 
+       if ((ret = mm_sound_dbus_method_call_to(AUDIO_PROVIDER_STREAM_MANAGER, AUDIO_METHOD_SET_VOLUME_LEVEL, params, &result)) != MM_ERROR_NONE) {
+               debug_error("dbus set volume by type failed");
+               g_variant_unref(result);
+               return ret;
+       }
+
        if (result) {
                g_variant_get(result, "(&s)",  &reply);
                debug_log("reply : %s", reply);
                if (strcmp(reply, "STREAM_MANAGER_RETURN_OK"))
                        ret = MM_ERROR_SOUND_INTERNAL;
+               g_variant_unref(result);
        } else {
                debug_error("reply null");
+               ret = MM_ERROR_SOUND_INTERNAL;
        }
 
-cleanup:
-       if (result)
-               g_variant_unref(result);
-
        debug_fleave();
        return ret;
 }
@@ -706,7 +701,6 @@ int mm_sound_proxy_add_volume_changed_callback(mm_sound_volume_changed_wrapper_c
        else
                *subs_id = cb_data->subs_id;
 
-
        debug_fleave();
 
        return ret;
@@ -724,6 +718,71 @@ int mm_sound_proxy_remove_volume_changed_callback(unsigned subs_id)
        return ret;
 }
 
+int mm_sound_proxy_add_ducking_state_changed_callback(mm_sound_ducking_state_changed_wrapper_cb func, void* userdata, mm_sound_proxy_userdata_free freefunc, unsigned *subs_id)
+{
+       int ret = MM_ERROR_NONE;
+       struct callback_data *cb_data;
+
+       debug_fenter();
+
+       CB_DATA_NEW(cb_data, func, userdata, freefunc);
+
+       if ((ret = mm_sound_dbus_signal_subscribe_to(AUDIO_PROVIDER_STREAM_MANAGER, AUDIO_EVENT_DUCKING_STATE_CHANGED, dbus_callback, cb_data, simple_callback_data_free_func, &cb_data->subs_id)) != MM_ERROR_NONE)
+               debug_error("Add Duckding State changed callback failed");
+       else
+               *subs_id = cb_data->subs_id;
+
+       debug_fleave();
+
+       return ret;
+}
+
+int mm_sound_proxy_remove_ducking_state_changed_callback(unsigned subs_id)
+{
+       int ret = MM_ERROR_NONE;
+       debug_fenter();
+
+       if ((ret = mm_sound_dbus_signal_unsubscribe(subs_id)) != MM_ERROR_NONE)
+               debug_error("Remove Ducking State changed callback failed");
+
+       debug_fleave();
+       return ret;
+}
+
+int mm_sound_proxy_set_mute_by_type(const char *volume_type, bool mute)
+{
+       int ret = MM_ERROR_NONE;
+       char *reply = NULL, *direction = "out";
+       GVariant *params = NULL, *result = NULL;
+
+       debug_fenter();
+
+       if ((params = g_variant_new("(ssu)", direction, volume_type, (unsigned int)mute)) == NULL) {
+               debug_error("Construct Param for method call failed");
+               return MM_ERROR_SOUND_INTERNAL;
+       }
+
+       if ((ret = mm_sound_dbus_method_call_to(AUDIO_PROVIDER_STREAM_MANAGER, AUDIO_METHOD_SET_MUTE, params, &result)) != MM_ERROR_NONE) {
+               debug_error("dbus set mute by type failed");
+               g_variant_unref(result);
+               return ret;
+       }
+
+       if (result) {
+               g_variant_get(result, "(&s)",  &reply);
+               debug_log("reply : %s", reply);
+               if (strcmp(reply, "STREAM_MANAGER_RETURN_OK"))
+                       ret = MM_ERROR_SOUND_INTERNAL;
+               g_variant_unref(result);
+       } else {
+               debug_error("reply null");
+               ret = MM_ERROR_SOUND_INTERNAL;
+       }
+
+       debug_fleave();
+       return ret;
+}
+
 int mm_sound_proxy_set_filter_by_type(const char *stream_type, const char *filter_name, const char *filter_parameters, const char *filter_group)
 {
        int ret = MM_ERROR_NONE;
@@ -732,30 +791,27 @@ int mm_sound_proxy_set_filter_by_type(const char *stream_type, const char *filte
 
        debug_fenter();
 
-       params = g_variant_new("(ssss)", filter_name, filter_parameters, filter_group, stream_type);
-       if (params) {
-               if ((ret = mm_sound_dbus_method_call_to(AUDIO_PROVIDER_STREAM_MANAGER, AUDIO_METHOD_SET_FILTER, params, &result)) != MM_ERROR_NONE) {
-                       debug_error("dbus set filter by type failed");
-                       goto cleanup;
-               }
-       } else {
+       if ((params = g_variant_new("(ssss)", filter_name, filter_parameters, filter_group, stream_type)) == NULL) {
                debug_error("construct param for method call failed");
                return MM_ERROR_SOUND_INTERNAL;
        }
 
+       if ((ret = mm_sound_dbus_method_call_to(AUDIO_PROVIDER_STREAM_MANAGER, AUDIO_METHOD_SET_FILTER, params, &result)) != MM_ERROR_NONE)
+               debug_error("dbus set filter by type failed");
+
+       /* stream-manager always returns a string as return value */
        if (result) {
                g_variant_get(result, "(&s)", &reply);
                debug_log("reply : %s", reply);
                if (strcmp(reply, "STREAM_MANAGER_RETURN_OK"))
                        ret = MM_ERROR_SOUND_INTERNAL;
+               g_variant_unref(result);
        } else {
                debug_error("reply null");
+               if (ret == MM_ERROR_NONE)
+                       ret = MM_ERROR_SOUND_INTERNAL;
        }
 
-cleanup:
-       if (result)
-               g_variant_unref(result);
-
        debug_fleave();
        return ret;
 }
@@ -768,30 +824,27 @@ int mm_sound_proxy_unset_filter_by_type(const char *stream_type)
 
        debug_fenter();
 
-       params = g_variant_new("(s)", stream_type);
-       if (params) {
-               if ((ret = mm_sound_dbus_method_call_to(AUDIO_PROVIDER_STREAM_MANAGER, AUDIO_METHOD_UNSET_FILTER, params, &result)) != MM_ERROR_NONE) {
-                       debug_error("dbus unset filter by type failed");
-                       goto cleanup;
-               }
-       } else {
+       if ((params = g_variant_new("(s)", stream_type)) == NULL) {
                debug_error("construct param for method call failed");
                return MM_ERROR_SOUND_INTERNAL;
        }
 
+       if ((ret = mm_sound_dbus_method_call_to(AUDIO_PROVIDER_STREAM_MANAGER, AUDIO_METHOD_UNSET_FILTER, params, &result)) != MM_ERROR_NONE)
+               debug_error("dbus unset filter by type failed");
+
+       /* stream-manager always returns a string as return value */
        if (result) {
                g_variant_get(result, "(&s)", &reply);
                debug_log("reply : %s", reply);
                if (strcmp(reply, "STREAM_MANAGER_RETURN_OK"))
                        ret = MM_ERROR_SOUND_INTERNAL;
+               g_variant_unref(result);
        } else {
                debug_error("reply null");
+               if (ret == MM_ERROR_NONE)
+                       ret = MM_ERROR_SOUND_INTERNAL;
        }
 
-cleanup:
-       if (result)
-               g_variant_unref(result);
-
        debug_fleave();
        return ret;
 }
@@ -804,29 +857,28 @@ int mm_sound_proxy_control_filter_by_type(const char *stream_type, const char *f
 
        debug_fenter();
 
-       params = g_variant_new("(sss)", filter_name, filter_controls, stream_type);
-       if (params) {
-               if ((ret = mm_sound_dbus_method_call_to(AUDIO_PROVIDER_STREAM_MANAGER, AUDIO_METHOD_CONTROL_FILTER, params, &result)) != MM_ERROR_NONE) {
-                       debug_error("dbus control filter by type failed");
-                       goto cleanup;
-               }
-       } else {
+       if ((params = g_variant_new("(sss)", filter_name, filter_controls, stream_type)) == NULL) {
                debug_error("construct param for method call failed");
                return MM_ERROR_SOUND_INTERNAL;
        }
 
+       if ((ret = mm_sound_dbus_method_call_to(AUDIO_PROVIDER_STREAM_MANAGER, AUDIO_METHOD_CONTROL_FILTER, params, &result)) != MM_ERROR_NONE)
+               debug_error("dbus control filter by type failed");
+
+       /* stream-manager always returns a string as return value */
        if (result) {
                g_variant_get(result, "(&s)", &reply);
                debug_log("reply : %s", reply);
                if (strcmp(reply, "STREAM_MANAGER_RETURN_OK"))
                        ret = MM_ERROR_SOUND_INTERNAL;
+               g_variant_unref(result);
        } else {
                debug_error("reply null");
+               if (ret == MM_ERROR_NONE)
+                       ret = MM_ERROR_SOUND_INTERNAL;
        }
 
-cleanup:
-       if (result)
-               g_variant_unref(result);
+       g_variant_unref(result);
 
        debug_fleave();
        return ret;
@@ -845,28 +897,27 @@ int mm_sound_proxy_play_tone_with_stream_info(int client_pid, int tone, char *st
                return MM_ERROR_INVALID_ARGUMENT;
        }
 
-       params = g_variant_new("(iiiisi)", tone, repeat, volume, client_pid, stream_type, stream_index);
-       if (params) {
-               if ((ret = mm_sound_dbus_method_call_to(AUDIO_PROVIDER_SOUND_SERVER, AUDIO_METHOD_PLAY_DTMF_WITH_STREAM_INFO, params, &result)) != MM_ERROR_NONE) {
-                       debug_error("dbus play tone failed");
-                       goto cleanup;
-               }
-       } else {
+       if ((params = g_variant_new("(iiiisi)", tone, repeat, volume, client_pid, stream_type, stream_index)) == NULL) {
                debug_error("Construct Param for method call failed");
+               return MM_ERROR_SOUND_INTERNAL;
+       }
+
+       if ((ret = mm_sound_dbus_method_call_to(AUDIO_PROVIDER_SOUND_SERVER, AUDIO_METHOD_PLAY_DTMF_WITH_STREAM_INFO, params, &result)) != MM_ERROR_NONE) {
+               debug_error("dbus play tone failed");
+               g_variant_unref(result);
+               return ret;
        }
 
        if (result) {
                g_variant_get(result, "(i)",  &handle);
                debug_log("handle : %d", handle);
                *codechandle = handle;
+               g_variant_unref(result);
        } else {
                debug_error("reply null");
+               ret = MM_ERROR_SOUND_INTERNAL;
        }
 
-cleanup:
-       if (result)
-               g_variant_unref(result);
-
        debug_fleave();
        return ret;
 }
@@ -885,32 +936,29 @@ int mm_sound_proxy_play_sound_with_stream_info(const char* filename, int repeat,
 
        debug_fenter();
 
-       params = g_variant_new("(siiisi)", filename, repeat, volume, client_pid, stream_type, stream_index);
-       if (params) {
-               if ((ret = mm_sound_dbus_method_call_to(AUDIO_PROVIDER_SOUND_SERVER, AUDIO_METHOD_PLAY_FILE_START_WITH_STREAM_INFO, params, &result)) != MM_ERROR_NONE) {
-                       debug_error("dbus play file failed");
-                       goto cleanup;
-               }
-       } else {
+       if ((params = g_variant_new("(siiisi)", filename, repeat, volume, client_pid, stream_type, stream_index)) == NULL) {
                debug_error("Construct Param for method call failed");
+               return MM_ERROR_SOUND_INTERNAL;
+       }
+
+       if ((ret = mm_sound_dbus_method_call_to(AUDIO_PROVIDER_SOUND_SERVER, AUDIO_METHOD_PLAY_FILE_START_WITH_STREAM_INFO, params, &result)) != MM_ERROR_NONE) {
+               debug_error("dbus play file failed");
+               g_variant_unref(result);
+               return ret;
        }
 
        if (result) {
                g_variant_get(result, "(i)",  &handle);
                debug_log("handle : %d", handle);
                *codechandle = handle;
+               g_variant_unref(result);
        } else {
                debug_error("reply null");
+               ret = MM_ERROR_SOUND_INTERNAL;
        }
 
-cleanup:
-       if (result)
-               g_variant_unref(result);
-
        debug_fleave();
        return ret;
-
-
 }
 
 int mm_sound_proxy_stop_sound(int handle)
@@ -920,14 +968,10 @@ int mm_sound_proxy_stop_sound(int handle)
 
        debug_fenter();
 
-       if ((ret = mm_sound_dbus_method_call_to(AUDIO_PROVIDER_SOUND_SERVER, AUDIO_METHOD_PLAY_FILE_STOP, g_variant_new("(i)", handle), &result)) != MM_ERROR_NONE) {
+       if ((ret = mm_sound_dbus_method_call_to(AUDIO_PROVIDER_SOUND_SERVER, AUDIO_METHOD_PLAY_FILE_STOP, g_variant_new("(i)", handle), &result)) != MM_ERROR_NONE)
                debug_error("dbus stop file playing failed");
-               goto cleanup;
-       }
 
-cleanup:
-       if (result)
-               g_variant_unref(result);
+       g_variant_unref(result);
 
        debug_fleave();
        return ret;
@@ -1045,7 +1089,7 @@ int mm_sound_proxy_acquire_focus(int index, mm_sound_focus_type_e type, int opti
 
        debug_fenter();
 
-       mm_sound_client_is_focus_cb_thread(g_thread_self(), &is_in_focus_cb_thread);
+       mm_sound_client_is_focus_cb_thread(g_thread_self(), &is_in_focus_cb_thread, NULL);
        if (!is_in_focus_cb_thread) {
                if ((ret = mm_sound_focus_socket_acquire(pid, client_fd, id,
                                                                                                type, option, ext_info ? ext_info : "", true)))
@@ -1053,21 +1097,19 @@ int mm_sound_proxy_acquire_focus(int index, mm_sound_focus_type_e type, int opti
        } else {
                GVariant *params = NULL, *result = NULL;
 
-               params = g_variant_new("(iiiis)", pid, id, type, option, ext_info ? ext_info : "");
-               if (params) {
-                       if ((ret = mm_sound_dbus_method_call_to(AUDIO_PROVIDER_FOCUS_SERVER, AUDIO_METHOD_ACQUIRE_FOCUS, params, &result)) != MM_ERROR_NONE)
-                               debug_error("dbus acquire focus failed");
-               } else {
+               if ((params = g_variant_new("(iiiis)", pid, id, type, option, ext_info ? ext_info : "")) == NULL) {
                        debug_error("Construct Param for method call failed");
+                       return MM_ERROR_SOUND_INTERNAL;
                }
 
-               if (ret != MM_ERROR_NONE)
-                       g_variant_get(result, "(i)",  &ret);
-               if (result)
-                       g_variant_unref(result);
+               if ((ret = mm_sound_dbus_method_call_to(AUDIO_PROVIDER_FOCUS_SERVER, AUDIO_METHOD_ACQUIRE_FOCUS, params, &result)) != MM_ERROR_NONE)
+                       debug_error("dbus acquire focus failed");
+
+               g_variant_unref(result);
        }
 
        debug_fleave();
+
        return ret;
 }
 
@@ -1081,28 +1123,26 @@ int mm_sound_proxy_release_focus(int index, mm_sound_focus_type_e type, int opti
 
        debug_fenter();
 
-       mm_sound_client_is_focus_cb_thread(g_thread_self(), &is_in_focus_cb_thread);
+       mm_sound_client_is_focus_cb_thread(g_thread_self(), &is_in_focus_cb_thread, NULL);
        if (!is_in_focus_cb_thread) {
                if ((ret = mm_sound_focus_socket_release(pid, client_fd, id, type, option, ext_info ? ext_info : "", true)))
                        debug_error("failed to mm_sound_focus_socket_release(), ret[0x%x]", ret);
        } else {
                GVariant *params = NULL, *result = NULL;
 
-               params = g_variant_new("(iiiis)", pid, id, type, option, ext_info ? ext_info : "");
-               if (params) {
-                       if ((ret = mm_sound_dbus_method_call_to(AUDIO_PROVIDER_FOCUS_SERVER, AUDIO_METHOD_RELEASE_FOCUS, params, &result)) != MM_ERROR_NONE)
-                               debug_error("dbus release focus failed");
-               } else {
+               if ((params = g_variant_new("(iiiis)", pid, id, type, option, ext_info ? ext_info : "")) == NULL) {
                        debug_error("Construct Param for method call failed");
+                       return MM_ERROR_SOUND_INTERNAL;
                }
 
-               if (ret != MM_ERROR_NONE)
-                       g_variant_get(result, "(i)",  &ret);
-               if (result)
-                       g_variant_unref(result);
+               if ((ret = mm_sound_dbus_method_call_to(AUDIO_PROVIDER_FOCUS_SERVER, AUDIO_METHOD_RELEASE_FOCUS, params, &result)) != MM_ERROR_NONE)
+                       debug_error("dbus release focus failed");
+
+               g_variant_unref(result);
        }
 
        debug_fleave();
+
        return ret;
 }
 
@@ -1114,26 +1154,28 @@ int mm_sound_proxy_update_stream_focus_status(int focus_id, unsigned int status)
 
        debug_fenter();
 
-       params = g_variant_new("(iu)", focus_id, status);
-       if (params) {
-               if ((ret = mm_sound_dbus_method_call_to(AUDIO_PROVIDER_STREAM_MANAGER, AUDIO_METHOD_UPDATE_STREAM_FOCUS_STATUS, params, &result)) != MM_ERROR_NONE) {
-                       debug_error("dbus set volume by type failed");
-                       if (result) {
-                               g_variant_get(result, "(&s)",  &reply);
-                               debug_log("reply : %s", reply);
-                               if (strcmp(reply, "STREAM_MANAGER_RETURN_OK"))
-                                       ret = MM_ERROR_SOUND_INTERNAL;
-                       }
-               }
-       } else {
+       if ((params = g_variant_new("(iu)", focus_id, status)) == NULL) {
                debug_error("Construct Param for method call failed");
                return MM_ERROR_SOUND_INTERNAL;
        }
 
-       if (result)
+       if ((ret = mm_sound_dbus_method_call_to(AUDIO_PROVIDER_STREAM_MANAGER, AUDIO_METHOD_UPDATE_STREAM_FOCUS_STATUS, params, &result)) != MM_ERROR_NONE)
+               debug_error("dbus set volume by type failed");
+
+       /* stream-manager always returns a string as return value */
+       if (result) {
+               g_variant_get(result, "(&s)", &reply);
+               debug_log("reply : %s", reply);
+               if (strcmp(reply, "STREAM_MANAGER_RETURN_OK"))
+                       ret = MM_ERROR_SOUND_INTERNAL;
                g_variant_unref(result);
+       } else {
+               debug_error("reply null");
+               ret = MM_ERROR_SOUND_INTERNAL;
+       }
 
        debug_fleave();
+
        return ret;
 }