Get subscription id when add callback 25/45625/4 accepted/tizen/mobile/20150813.011848 accepted/tizen/tv/20150813.011904 accepted/tizen/wearable/20150813.011932 submit/tizen/20150810.104343 submit/tizen/20150811.051325 submit/tizen/20150812.065628
authorMok Jeongho <jho.mok@samsung.com>
Mon, 10 Aug 2015 01:45:03 +0000 (10:45 +0900)
committeryoungseok lee <youngseok7.lee@samsung.com>
Mon, 10 Aug 2015 10:36:15 +0000 (03:36 -0700)
[Version] Release 0.3.16
[Profile] Common
[Issue Type] Interface changed
[Dependency module] libmm-sound
[Dependency commit] 0d396a1f786249ba22dbbb2f6176fcf64a26ef30

Change-Id: If77908fb20b839fa046123c8e5495d1a6ba9932e
Signed-off-by: Mok Jeongho <jho.mok@samsung.com>
include/sound_manager_private.h
src/sound_manager.c

index 000753a2602b14df0e42a23500a504fca2ed3ea7..a09669be21996c4e0494fc395a94f0de3305219c 100644 (file)
@@ -177,6 +177,7 @@ typedef struct {
 }_session_interrupt_info_s;
 
 typedef struct {
+       unsigned int subs_id;
        void *user_data;
        sound_manager_volume_changed_cb user_cb;
 }_volume_changed_info_s;
@@ -188,11 +189,13 @@ typedef struct {
 }_focus_watch_info_s;
 
 typedef struct {
+       unsigned int subs_id;
        void *user_data;
        sound_device_connected_cb user_cb;
 }_device_connected_info_s;
 
 typedef struct {
+       unsigned int subs_id;
        void *user_data;
        sound_device_information_changed_cb user_cb;
 }_device_changed_info_s;
index 6c81a442b068ce3751e6f976e78837d9c9745170..c5d603da301bfd71e9907b319187225793a6670f 100644 (file)
 #define TMP_CODE
 
 _session_interrupt_info_s g_session_interrupt_cb_table = {0, NULL, NULL};
-_volume_changed_info_s g_volume_changed_cb_table = {NULL, NULL};
+_volume_changed_info_s g_volume_changed_cb_table = {0, NULL, NULL};
 _focus_watch_info_s g_focus_watch_cb_table = {-1, NULL, NULL};
-_device_connected_info_s g_device_connected_cb_table = {NULL, NULL};
-_device_changed_info_s g_device_info_changed_cb_table = {NULL, NULL};
+_device_connected_info_s g_device_connected_cb_table = {0, NULL, NULL};
+_device_changed_info_s g_device_info_changed_cb_table = {0, NULL, NULL};
 
 sound_session_type_e g_cached_session = -1;
 _session_mode_e g_cached_session_mode = -1;
@@ -31,6 +31,7 @@ _session_mode_e g_cached_session_mode = -1;
 /* These variables will be removed when session features are deprecated. */
 extern int g_stream_info_count;
 extern pthread_mutex_t g_stream_info_count_mutex;
+pthread_mutex_t g_device_info_cb_mutex, g_device_conn_cb_mutex, g_volume_cb_mutex;
 
 #ifdef TMP_CODE
 /*temporary variable for set/get voip session mode. When 2.4  feature for routing is fully implemented, it will be removed.*/
@@ -143,13 +144,19 @@ int sound_manager_unset_current_sound_type (void)
 int sound_manager_set_volume_changed_cb (sound_manager_volume_changed_cb callback, void* user_data)
 {
        int ret = MM_ERROR_NONE;
+       unsigned int subs_id = 0;
 
-       ret = mm_sound_add_volume_changed_callback((mm_sound_volume_changed_cb)callback, user_data);
+       SM_ENTER_CRITICAL_SECTION_WITH_RETURN(&g_volume_cb_mutex, SOUND_MANAGER_ERROR_INTERNAL);
+
+       ret = mm_sound_add_volume_changed_callback((mm_sound_volume_changed_cb)callback, user_data, &subs_id);
        if (ret == MM_ERROR_NONE) {
+               g_volume_changed_cb_table.subs_id = subs_id;
                g_volume_changed_cb_table.user_cb = (sound_manager_volume_changed_cb)callback;
                g_volume_changed_cb_table.user_data = user_data;
        }
 
+       SM_LEAVE_CRITICAL_SECTION(&g_volume_cb_mutex);
+
        return __convert_sound_manager_error_code(__func__, ret);
 }
 
@@ -157,9 +164,12 @@ int sound_manager_unset_volume_changed_cb (void)
 {
        int ret = MM_ERROR_NONE;
 
-       if (g_volume_changed_cb_table.user_cb) {
-               ret = mm_sound_remove_volume_changed_callback();
+       SM_ENTER_CRITICAL_SECTION_WITH_RETURN(&g_volume_cb_mutex, SOUND_MANAGER_ERROR_INTERNAL);
+
+       if (g_volume_changed_cb_table.subs_id > 0) {
+               ret = mm_sound_remove_volume_changed_callback(g_volume_changed_cb_table.subs_id);
                if (ret == MM_ERROR_NONE) {
+                       g_volume_changed_cb_table.subs_id = 0;
                        g_volume_changed_cb_table.user_cb = NULL;
                        g_volume_changed_cb_table.user_data = NULL;
                }
@@ -167,6 +177,8 @@ int sound_manager_unset_volume_changed_cb (void)
                ret = MM_ERROR_SOUND_INTERNAL;
        }
 
+       SM_LEAVE_CRITICAL_SECTION(&g_volume_cb_mutex);
+
        return __convert_sound_manager_error_code(__func__, ret);
 }
 
@@ -487,7 +499,7 @@ int sound_manager_set_focus_state_watch_cb (sound_stream_focus_mask_e focus_mask
        LOGI(">> enter");
 
        SM_NULL_ARG_CHECK(callback);
-       SM_ENTER_CRITICAL_SECTION_WITH_RETURN( &g_stream_info_count_mutex, SOUND_MANAGER_ERROR_INTERNAL);
+       SM_ENTER_CRITICAL_SECTION_WITH_RETURN(&g_stream_info_count_mutex, SOUND_MANAGER_ERROR_INTERNAL);
 
        if (!g_focus_watch_cb_table.user_cb) {
                SM_REF_FOR_STREAM_INFO(g_stream_info_count, ret);
@@ -514,7 +526,7 @@ int sound_manager_unset_focus_state_watch_cb (void)
 
        LOGI(">> enter");
 
-       SM_ENTER_CRITICAL_SECTION_WITH_RETURN( &g_stream_info_count_mutex, SOUND_MANAGER_ERROR_INTERNAL);
+       SM_ENTER_CRITICAL_SECTION_WITH_RETURN(&g_stream_info_count_mutex, SOUND_MANAGER_ERROR_INTERNAL);
 
        if (g_focus_watch_cb_table.user_cb) {
                ret = mm_sound_unset_focus_watch_callback(g_focus_watch_cb_table.index);
@@ -1064,21 +1076,32 @@ int sound_manager_get_device_state (sound_device_h device, sound_device_state_e
 int sound_manager_set_device_connected_cb (sound_device_mask_e device_mask, sound_device_connected_cb callback, void *user_data)
 {
        int ret = MM_ERROR_NONE;
-       ret = mm_sound_add_device_connected_callback((mm_sound_device_flags_e)device_mask, (mm_sound_device_connected_cb)callback, user_data);
+       unsigned int subs_id = 0;
+
+       SM_ENTER_CRITICAL_SECTION_WITH_RETURN(&g_device_conn_cb_mutex, SOUND_MANAGER_ERROR_INTERNAL);
+
+       ret = mm_sound_add_device_connected_callback((mm_sound_device_flags_e)device_mask, (mm_sound_device_connected_cb)callback, user_data, &subs_id);
        if (ret == MM_ERROR_NONE) {
+               g_device_connected_cb_table.subs_id = subs_id;
                g_device_connected_cb_table.user_cb = (sound_device_connected_cb)callback;
                g_device_connected_cb_table.user_data = user_data;
        }
 
+       SM_LEAVE_CRITICAL_SECTION(&g_device_conn_cb_mutex);
+
        return __convert_sound_manager_error_code(__func__, ret);
 }
 
 int sound_manager_unset_device_connected_cb (void)
 {
        int ret = MM_ERROR_NONE;
-       if (g_device_connected_cb_table.user_cb) {
-               ret = mm_sound_remove_device_connected_callback();
+
+       SM_ENTER_CRITICAL_SECTION_WITH_RETURN(&g_device_conn_cb_mutex, SOUND_MANAGER_ERROR_INTERNAL);
+
+       if (g_device_connected_cb_table.subs_id > 0) {
+               ret = mm_sound_remove_device_connected_callback(g_device_connected_cb_table.subs_id);
                if (ret == MM_ERROR_NONE) {
+                       g_device_connected_cb_table.subs_id = 0;
                        g_device_connected_cb_table.user_cb = NULL;
                        g_device_connected_cb_table.user_data = NULL;
                }
@@ -1086,27 +1109,40 @@ int sound_manager_unset_device_connected_cb (void)
                ret = MM_ERROR_SOUND_INTERNAL;
        }
 
+       SM_LEAVE_CRITICAL_SECTION(&g_device_conn_cb_mutex);
+
        return __convert_sound_manager_error_code(__func__, ret);
 }
 
 int sound_manager_set_device_information_changed_cb (sound_device_mask_e device_mask, sound_device_information_changed_cb callback, void *user_data)
 {
        int ret = MM_ERROR_NONE;
-       ret = mm_sound_add_device_information_changed_callback((mm_sound_device_flags_e)device_mask, (mm_sound_device_info_changed_cb)callback, user_data);
+       unsigned int subs_id = 0;
+
+       SM_ENTER_CRITICAL_SECTION_WITH_RETURN(&g_device_info_cb_mutex, SOUND_MANAGER_ERROR_INTERNAL);
+
+       ret = mm_sound_add_device_information_changed_callback((mm_sound_device_flags_e)device_mask, (mm_sound_device_info_changed_cb)callback, user_data, &subs_id);
        if (ret == MM_ERROR_NONE) {
+               g_device_info_changed_cb_table.subs_id = subs_id;
                g_device_info_changed_cb_table.user_cb = (sound_device_information_changed_cb)callback;
                g_device_info_changed_cb_table.user_data = user_data;
        }
 
+       SM_LEAVE_CRITICAL_SECTION(&g_device_info_cb_mutex);
+
        return __convert_sound_manager_error_code(__func__, ret);
 }
 
 int sound_manager_unset_device_information_changed_cb (void)
 {
        int ret = MM_ERROR_NONE;
-       if (g_device_info_changed_cb_table.user_cb) {
-               ret = mm_sound_remove_device_information_changed_callback();
+
+       SM_ENTER_CRITICAL_SECTION_WITH_RETURN(&g_device_info_cb_mutex, SOUND_MANAGER_ERROR_INTERNAL);
+
+       if (g_device_info_changed_cb_table.subs_id) {
+               ret = mm_sound_remove_device_information_changed_callback(g_device_info_changed_cb_table.subs_id);
                if (ret == MM_ERROR_NONE) {
+                       g_device_info_changed_cb_table.subs_id = 0;
                        g_device_info_changed_cb_table.user_cb = NULL;
                        g_device_info_changed_cb_table.user_data = NULL;
                }
@@ -1114,6 +1150,8 @@ int sound_manager_unset_device_information_changed_cb (void)
                ret = MM_ERROR_SOUND_INTERNAL;
        }
 
+       SM_LEAVE_CRITICAL_SECTION(&g_device_info_cb_mutex);
+
        return __convert_sound_manager_error_code(__func__, ret);
 }