int focus_tid;
int handle;
int focus_fd;
- GSourceFuncs* g_src_funcs;
- GPollFD* g_poll_fd;
- GSource* focus_src;
+ GSourceFuncs *g_src_funcs;
+ GPollFD *g_poll_fd;
+ GSource *g_src;
bool is_used;
bool auto_reacquire;
GMutex focus_lock;
+ GThread *focus_cb_thread;
+ GMainLoop *focus_loop;
mm_sound_focus_changed_cb focus_callback;
mm_sound_focus_changed_watch_cb watch_callback;
void* user_data;
typedef gboolean (*focus_gLoopPollHandler_t)(gpointer d);
-GThread *g_focus_thread;
-GMainLoop *g_focus_loop;
focus_sound_info_t g_focus_sound_handle[FOCUS_HANDLE_MAX];
focus_session_interrupt_info_t g_focus_session_interrupt_info = {NULL, NULL};
static pthread_mutex_t g_index_mutex = PTHREAD_MUTEX_INITIALIZER;
ret = mm_sound_proxy_finalize();
-
#ifdef USE_FOCUS
-
- if (g_focus_thread) {
- g_main_loop_quit(g_focus_loop);
- g_thread_join(g_focus_thread);
- debug_log("after thread join");
- g_main_loop_unref(g_focus_loop);
- g_focus_thread = NULL;
- }
-
if (g_idle_event_src > 0) {
MMSOUND_ENTER_CRITICAL_SECTION_WITH_RETURN(&g_event_mutex, MM_ERROR_SOUND_INTERNAL);
g_source_remove(g_idle_event_src);
MMSOUND_LEAVE_CRITICAL_SECTION(&g_event_mutex);
}
-
#endif
debug_fleave();
static gpointer _focus_thread_func(gpointer data)
{
unsigned int thread_id = (unsigned int)pthread_self();
- debug_warning(">>> thread func..ID of this thread(%u), mainloop(%p)", thread_id, g_focus_loop);
- if (g_focus_loop)
- g_main_loop_run(g_focus_loop);
+ GMainLoop *focus_loop = (GMainLoop*)data;
+
+ debug_warning(">>> thread func : thread id(%u), mainloop[%p]", thread_id, focus_loop);
+ if (focus_loop)
+ g_main_loop_run(focus_loop);
+ debug_warning("<<< quit thread func : thread id(%u), mainloop[%p]", thread_id, focus_loop);
- debug_warning("<<< quit thread func..(%u), mainloop(%p)", thread_id, g_focus_loop);
return NULL;
}
int tid = 0;
int focus_index = 0;
focus_cb_data_lib cb_data;
- debug_log(">>> focus_callback_handler()..ID of this thread(%u)\n", (unsigned int)pthread_self());
+ debug_log(">>> focus_callback_handler()..this thread id(%u)\n", (unsigned int)pthread_self());
memset(&cb_data, 0, sizeof(focus_cb_data_lib));
}
-static bool _focus_add_sound_callback(int index, int fd, gushort events, focus_gLoopPollHandler_t p_gloop_poll_handler )
+static bool _focus_add_sound_callback(int index, int fd, gushort events, focus_gLoopPollHandler_t p_gloop_poll_handler)
{
GSource* g_src = NULL;
GSourceFuncs *g_src_funcs = NULL; /* handler function */
/* 3. combine g_source object and file descriptor */
g_source_add_poll(g_src, g_poll_fd);
- g_src_id = g_source_attach(g_src, g_main_loop_get_context(g_focus_loop));
+ g_src_id = g_source_attach(g_src, g_main_loop_get_context(g_focus_sound_handle[index].focus_loop));
if (!g_src_id) {
debug_error("failed to attach the source to context");
goto ERROR;
debug_log("g_malloc : g_src_funcs(%p), g_poll_fd(%p)", g_src_funcs, g_poll_fd);
/* 5. store to global handle */
- g_focus_sound_handle[index].focus_src = g_src;
+ g_focus_sound_handle[index].g_src = g_src;
g_focus_sound_handle[index].g_src_funcs = g_src_funcs;
g_focus_sound_handle[index].g_poll_fd = g_poll_fd;
h = &g_focus_sound_handle[index];
- if (h->focus_src && h->g_poll_fd) {
+ if (h->g_src && h->g_poll_fd) {
debug_log("g_source_remove_poll : fd(%d), event(0x%x)",
h->g_poll_fd->fd, h->g_poll_fd->events);
- g_source_remove_poll(h->focus_src, h->g_poll_fd);
+ g_source_remove_poll(h->g_src, h->g_poll_fd);
} else {
- debug_error("[%d] focus_src[%p], g_poll_fd[%p]",
- index, h->focus_src, h->g_poll_fd);
+ debug_error("[%d] g_src[%p], g_poll_fd[%p]",
+ index, h->g_src, h->g_poll_fd);
ret = false;
}
- if (h->focus_src) {
- g_source_destroy(h->focus_src);
- g_source_unref(h->focus_src);
- h->focus_src = NULL;
+ if (h->g_src) {
+ g_source_destroy(h->g_src);
+ g_source_unref(h->g_src);
+ h->g_src = NULL;
}
debug_log("g_free : g_src_funcs(%p), g_poll_fd(%p)",
debug_fleave();
}
-static void _focus_destroy_callback(int index, bool is_for_watching)
+static void _focus_deinit_callback(int index, bool is_for_watching)
{
debug_fenter();
_focus_remove_callback(index);
debug_fleave();
}
+static int _focus_init_context(int index)
+{
+ GMainContext *focus_context;
+
+ debug_fenter();
+
+ if (index < 0 || index >= FOCUS_HANDLE_MAX) {
+ debug_error("index(%d) is not valid", index);
+ return MM_ERROR_INVALID_ARGUMENT;
+ }
+
+ focus_context = g_main_context_new();
+ g_focus_sound_handle[index].focus_loop = g_main_loop_new(focus_context, FALSE);
+ g_main_context_unref(focus_context);
+ if (g_focus_sound_handle[index].focus_loop == NULL) {
+ debug_error("could not create mainloop..");
+ return MM_ERROR_SOUND_INTERNAL;
+ }
+
+ g_focus_sound_handle[index].focus_cb_thread = g_thread_new("focus-cb-thread",
+ _focus_thread_func,
+ g_focus_sound_handle[index].focus_loop);
+ if (g_focus_sound_handle[index].focus_cb_thread == NULL) {
+ debug_error("could not create thread..");
+ g_main_loop_unref(g_focus_sound_handle[index].focus_loop);
+ return MM_ERROR_SOUND_INTERNAL;
+ }
+
+ debug_warning("focus cb thread[%p] with mainloop[%p] is created for index(%d)",
+ g_focus_sound_handle[index].focus_cb_thread, g_focus_sound_handle[index].focus_loop, index);
+
+ debug_fleave();
+
+ return MM_ERROR_NONE;
+}
+
+static void _focus_deinit_context(int index)
+{
+ debug_fenter();
+
+ if (index < 0 || index >= FOCUS_HANDLE_MAX) {
+ debug_error("index(%d) is not valid", index);
+ return;
+ }
+
+ if (!g_focus_sound_handle[index].focus_loop || !g_focus_sound_handle[index].focus_cb_thread) {
+ debug_error("focus_loop[%p] or focus_cb_thread[%p] is null",
+ g_focus_sound_handle[index].focus_loop, g_focus_sound_handle[index].focus_cb_thread);
+ return;
+ }
+
+ g_main_loop_quit(g_focus_sound_handle[index].focus_loop);
+ g_thread_join(g_focus_sound_handle[index].focus_cb_thread);
+ debug_warning("after thread join, thread[%p], mainloop[%p] for index(%d)",
+ g_focus_sound_handle[index].focus_cb_thread, g_focus_sound_handle[index].focus_loop, index);
+ g_main_loop_unref(g_focus_sound_handle[index].focus_loop);
+ g_focus_sound_handle[index].focus_loop = NULL;
+ g_focus_sound_handle[index].focus_cb_thread = NULL;
+
+ debug_fleave();
+}
+
int mm_sound_client_get_unique_id(int *id)
{
int ret = MM_ERROR_NONE;
int mm_sound_client_is_focus_cb_thread(GThread *mine, bool *result)
{
int ret = MM_ERROR_NONE;
+ int i = 0;
if (!mine || !result)
ret = MM_ERROR_INVALID_ARGUMENT;
else {
- if (mine == g_focus_thread)
- *result = true;
- else
- *result = false;
+ *result = false;
+ for (i = 0; i < FOCUS_HANDLE_MAX; i++) {
+ if (!g_focus_sound_handle[i].is_used)
+ continue;
+ if (g_focus_sound_handle[i].focus_cb_thread == mine) {
+ *result = true;
+ break;
+ }
+ }
}
return ret;
g_focus_sound_handle[index].auto_reacquire = true;
ret = mm_sound_proxy_register_focus(id, pid, stream_type, callback, is_for_session, user_data);
-
if (ret == MM_ERROR_NONE) {
debug_msg("[Client] Success to register focus\n");
g_need_emergent_exit = TRUE;
- if (!g_focus_thread) {
- GMainContext* focus_context = g_main_context_new ();
- g_focus_loop = g_main_loop_new (focus_context, FALSE);
- g_main_context_unref(focus_context);
- if (g_focus_loop == NULL) {
- debug_error("could not create mainloop..");
- ret = MM_ERROR_SOUND_INTERNAL;
- goto cleanup;
- }
-
- g_focus_thread = g_thread_new("focus-cb-thread", _focus_thread_func, NULL);
- if (g_focus_thread == NULL) {
- debug_error("could not create thread..");
- g_main_loop_unref(g_focus_loop);
- ret = MM_ERROR_SOUND_INTERNAL;
- goto cleanup;
- }
- } else {
- debug_warning("focus thread(%p) with mainloop(%p) exists, skip thread creation",
- g_focus_thread, g_focus_loop);
+ if (_focus_init_context(index)) {
+ ret = MM_ERROR_SOUND_INTERNAL;
+ goto cleanup;
}
} else {
debug_error("[Client] Error occurred : 0x%x \n",ret);
_focus_init_callback(index, false);
cleanup:
-
if (ret) {
g_focus_sound_handle[index].is_used = false;
}
}
ret = mm_sound_proxy_unregister_focus(instance, id, g_focus_sound_handle[index].is_for_session);
-
if (ret == MM_ERROR_NONE)
debug_msg("[Client] Success to unregister focus\n");
else
g_mutex_unlock(&g_focus_sound_handle[index].focus_lock);
- _focus_destroy_callback(index, false);
+ _focus_deinit_callback(index, false);
g_focus_sound_handle[index].focus_fd = 0;
g_focus_sound_handle[index].focus_tid = 0;
g_focus_sound_handle[index].handle = 0;
g_focus_sound_handle[index].is_used = false;
+ _focus_deinit_context(index);
+
cleanup:
MMSOUND_LEAVE_CRITICAL_SECTION(&g_index_mutex);
debug_fleave();
if (ret == MM_ERROR_NONE) {
debug_msg("[Client] Success to watch focus");
g_need_emergent_exit = TRUE;
- if (!g_focus_thread) {
- GMainContext* focus_context = g_main_context_new ();
- g_focus_loop = g_main_loop_new (focus_context, FALSE);
- g_main_context_unref(focus_context);
- if (g_focus_loop == NULL) {
- debug_error("could not create mainloop..");
- ret = MM_ERROR_SOUND_INTERNAL;
- goto cleanup;
- }
-
- g_focus_thread = g_thread_new("focus-cb-thread", _focus_thread_func, NULL);
- if (g_focus_thread == NULL) {
- debug_error ("could not create thread..");
- g_main_loop_unref(g_focus_loop);
- ret = MM_ERROR_SOUND_INTERNAL;
- goto cleanup;
- }
- } else {
- debug_warning("focus thread(%p) with mainloop(%p) exists, skip thread creation",
- g_focus_thread, g_focus_loop);
+ if (_focus_init_context(index)) {
+ ret = MM_ERROR_SOUND_INTERNAL;
+ goto cleanup;
}
} else {
debug_error("[Client] Error occurred : 0x%x",ret);
_focus_init_callback(index, true);
cleanup:
-
if (ret) {
g_focus_sound_handle[index].is_used = false;
}
g_mutex_unlock(&g_focus_sound_handle[index].focus_lock);
- _focus_destroy_callback(index, true);
+ _focus_deinit_callback(index, true);
g_focus_sound_handle[index].focus_fd = 0;
g_focus_sound_handle[index].focus_tid = 0;
g_focus_sound_handle[index].handle = 0;
+ _focus_deinit_context(index);
+
cleanup:
MMSOUND_LEAVE_CRITICAL_SECTION(&g_index_mutex);
debug_fleave();