hal-manager: Add an API for removing message callback and rename set_message_callback... 64/66764/5
authorSangchul Lee <sc11.lee@samsung.com>
Thu, 21 Apr 2016 02:29:43 +0000 (11:29 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Thu, 21 Apr 2016 06:23:37 +0000 (15:23 +0900)
[Version] 5.0.47
[Profile] Common
[Issue Type] Feature enhancement

Change-Id: I065c55f16082267058ae300117dfe36f592622d4
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
packaging/pulseaudio-modules-tizen.spec
src/hal-manager.c
src/hal-manager.h
src/stream-manager.c
src/tizen-audio.h

index 5eadd71..f784a52 100644 (file)
@@ -1,6 +1,6 @@
 Name:             pulseaudio-modules-tizen
 Summary:          Pulseaudio modules for Tizen
-Version:          5.0.46
+Version:          5.0.47
 Release:          0
 Group:            Multimedia/Audio
 License:          LGPL-2.1+
index 903d3c9..9cb6fda 100644 (file)
@@ -79,7 +79,8 @@ pa_hal_manager* pa_hal_manager_get(pa_core *core) {
         h->intf.pcm_recover = dlsym(h->dl_handle, "audio_pcm_recover");
         h->intf.pcm_get_params = dlsym(h->dl_handle, "audio_pcm_get_params");
         h->intf.pcm_set_params = dlsym(h->dl_handle, "audio_pcm_set_params");
-        h->intf.set_message_cb = dlsym(h->dl_handle, "audio_set_message_cb");
+        h->intf.add_message_cb = dlsym(h->dl_handle, "audio_add_message_cb");
+        h->intf.remove_message_cb = dlsym(h->dl_handle, "audio_remove_message_cb");
         if (h->intf.init) {
             if (h->intf.init(&h->ah_handle) != AUDIO_RET_OK)
                 pa_log_error("hal_manager init failed");
@@ -471,18 +472,36 @@ int32_t pa_hal_manager_pcm_set_params(pa_hal_manager *h, pcm_handle pcm_h, uint3
     return ret;
 }
 
-int32_t pa_hal_manager_set_messsage_callback(pa_hal_manager *h, hal_message_callback callback, void *user_data) {
+int32_t pa_hal_manager_add_message_callback(pa_hal_manager *h, hal_message_callback callback, void *user_data) {
     int32_t ret = 0;
     audio_return_t hal_ret = AUDIO_RET_OK;
 
     pa_assert(h);
     pa_assert(callback);
 
-    if (h->intf.set_message_cb == NULL) {
-        pa_log_error("there is no set_message_cb symbol in this audio hal");
+    if (h->intf.add_message_cb == NULL) {
+        pa_log_error("there is no add_message_cb symbol in this audio hal");
         ret = -1;
-    } else if (AUDIO_IS_ERROR((hal_ret = h->intf.set_message_cb(h->ah_handle, (message_cb)callback, user_data)))) {
-        pa_log_error("set_message_cb returns error:0x%x", hal_ret);
+    } else if (AUDIO_IS_ERROR((hal_ret = h->intf.add_message_cb(h->ah_handle, (message_cb)callback, user_data)))) {
+        pa_log_error("add_message_cb returns error:0x%x", hal_ret);
+        ret = -1;
+    }
+
+    return ret;
+}
+
+int32_t pa_hal_manager_remove_message_callback(pa_hal_manager *h, hal_message_callback callback) {
+    int32_t ret = 0;
+    audio_return_t hal_ret = AUDIO_RET_OK;
+
+    pa_assert(h);
+    pa_assert(callback);
+
+    if (h->intf.remove_message_cb == NULL) {
+        pa_log_error("there is no remove_message_cb symbol in this audio hal");
+        ret = -1;
+    } else if (AUDIO_IS_ERROR((hal_ret = h->intf.remove_message_cb(h->ah_handle, (message_cb)callback)))) {
+        pa_log_error("remove_message_cb returns error:0x%x", hal_ret);
         ret = -1;
     }
 
index 95aa58e..d528d5c 100644 (file)
@@ -71,6 +71,7 @@ int32_t pa_hal_manager_pcm_get_fd(pa_hal_manager *h, pcm_handle pcm_h, int *fd);
 int32_t pa_hal_manager_pcm_recover(pa_hal_manager *h, pcm_handle pcm_h, int err);
 int32_t pa_hal_manager_pcm_get_params(pa_hal_manager *h, pcm_handle pcm_h, uint32_t direction, void **sample_spec, uint32_t *period_size, uint32_t *periods);
 int32_t pa_hal_manager_pcm_set_params(pa_hal_manager *h, pcm_handle pcm_h, uint32_t direction, void *sample_spec, uint32_t period_size, uint32_t periods);
-int32_t pa_hal_manager_set_messsage_callback(pa_hal_manager *h, hal_message_callback callback, void *user_data);
+int32_t pa_hal_manager_add_message_callback(pa_hal_manager *h, hal_message_callback callback, void *user_data);
+int32_t pa_hal_manager_remove_message_callback(pa_hal_manager *h, hal_message_callback callback);
 
 #endif
index c4dd326..00166ce 100644 (file)
@@ -3418,8 +3418,8 @@ pa_stream_manager* pa_stream_manager_init(pa_core *c) {
     m->core = c;
 
     m->hal = pa_hal_manager_get(c);
-    if (pa_hal_manager_set_messsage_callback(m->hal, message_cb, m))
-        pa_log_warn("skip setting message callback");
+    if (pa_hal_manager_add_message_callback(m->hal, message_cb, m))
+        pa_log_warn("skip adding message callback");
     m->dm = pa_device_manager_get(c);
     m->subs_ob = pa_subscribe_observer_get(c);
 #ifdef HAVE_DBUS
@@ -3466,8 +3466,10 @@ fail:
     deinit_volumes(m);
     deinit_stream_map(m);
     deinit_ipc(m);
-    if (m->hal)
+    if (m->hal) {
+        pa_hal_manager_remove_message_callback(m->hal, message_cb);
         pa_hal_manager_unref(m->hal);
+    }
     if (m->dm)
         pa_device_manager_unref(m->dm);
     if (m->subs_ob)
@@ -3533,8 +3535,10 @@ void pa_stream_manager_done(pa_stream_manager *m) {
     if (m->dm)
         pa_device_manager_unref(m->dm);
 
-    if (m->hal)
+    if (m->hal) {
+        pa_hal_manager_remove_message_callback(m->hal, message_cb);
         pa_hal_manager_unref(m->hal);
+    }
 
     pa_xfree(m);
 }
index 2c513c3..1a3e956 100644 (file)
@@ -75,6 +75,7 @@ typedef void (*message_cb)(const char *name, int value, void *user_data);
 
 /* Overall */
 typedef struct audio_interface {
+    /* Initialization & de-initialization */
     audio_return_t (*init)(void **audio_handle);
     audio_return_t (*deinit)(void *audio_handle);
     /* Volume */
@@ -87,11 +88,12 @@ typedef struct audio_interface {
     /* Routing */
     audio_return_t (*do_route)(void *audio_handle, audio_route_info_t *info);
     audio_return_t (*update_route_option)(void *audio_handle, audio_route_option_t *option);
+    /* Stream */
     audio_return_t (*update_stream_connection_info) (void *audio_handle, audio_stream_info_t *info, uint32_t is_connected);
-    /* Buffer Attribute */
+    /* Buffer attribute */
     audio_return_t (*get_buffer_attr)(void *audio_handle, uint32_t direction, const char *latency, uint32_t samplerate, int format, uint32_t channels,
                                       uint32_t *maxlength, uint32_t *tlength, uint32_t *prebuf, uint32_t* minreq, uint32_t *fragsize);
-    /* Interface of PCM device */
+    /* PCM device */
     audio_return_t (*pcm_open)(void *audio_handle, void **pcm_handle, uint32_t direction, void *sample_spec, uint32_t period_size, uint32_t periods);
     audio_return_t (*pcm_start)(void *audio_handle, void *pcm_handle);
     audio_return_t (*pcm_stop)(void *audio_handle, void *pcm_handle);
@@ -103,8 +105,9 @@ typedef struct audio_interface {
     audio_return_t (*pcm_recover)(void *audio_handle, void *pcm_handle, int revents);
     audio_return_t (*pcm_get_params)(void *audio_handle, void *pcm_handle, uint32_t direction, void **sample_spec, uint32_t *period_size, uint32_t *periods);
     audio_return_t (*pcm_set_params)(void *audio_handle, void *pcm_handle, uint32_t direction, void *sample_spec, uint32_t period_size, uint32_t periods);
-    /* Message callback */
-    audio_return_t (*set_message_cb)(void *audio_handle, message_cb callback, void *user_data);
+    /* Message callback (optional) */
+    audio_return_t (*add_message_cb)(void *audio_handle, message_cb callback, void *user_data);
+    audio_return_t (*remove_message_cb)(void *audio_handle, message_cb callback);
 } audio_interface_t;
 
 audio_return_t audio_init(void **audio_handle);
@@ -131,5 +134,6 @@ audio_return_t audio_pcm_get_fd(void *audio_handle, void *pcm_handle, int *fd);
 audio_return_t audio_pcm_recover(void *audio_handle, void *pcm_handle, int revents);
 audio_return_t audio_pcm_get_params(void *audio_handle, void *pcm_handle, uint32_t direction, void **sample_spec, uint32_t *period_size, uint32_t *periods);
 audio_return_t audio_pcm_set_params(void *audio_handle, void *pcm_handle, uint32_t direction, void *sample_spec, uint32_t period_size, uint32_t periods);
-audio_return_t audio_set_message_cb(void *audio_handle, message_cb callback, void *user_data);
+audio_return_t audio_add_message_cb(void *audio_handle, message_cb callback, void *user_data);
+audio_return_t audio_remove_message_cb(void *audio_handle, message_cb callback);
 #endif