+#define INTERVAL_MS 20
+static int _focus_loop_is_running_timed_wait(GMainLoop *focus_loop, int timeout_ms)
+{
+ int reduced_time_ms = timeout_ms;
+ if (!focus_loop || timeout_ms < 0) {
+ debug_error("invalid argument, focus_loop(%p), timeout_ms(%d)", focus_loop, timeout_ms);
+ return MM_ERROR_INVALID_ARGUMENT;
+ }
+
+ do {
+ if (g_main_loop_is_running(focus_loop))
+ return MM_ERROR_NONE;
+
+ usleep(INTERVAL_MS * 1000);
+ if (reduced_time_ms < timeout_ms)
+ debug_warning("reduced_time_ms(%d)", reduced_time_ms);
+ } while ((reduced_time_ms -= INTERVAL_MS) >= 0);
+
+ debug_error("focus_loop is not running for timeout_ms(%d), focus_loop(%p) ", timeout_ms, focus_loop);
+
+ return MM_ERROR_SOUND_INTERNAL;
+}
+
+#define LOOP_RUNNING_WAIT_TIME_MS 200
+static int _focus_init_context(int index)
+{
+ int ret = MM_ERROR_NONE;
+ 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..");
+ goto ERROR;
+ }
+
+ 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..");
+ goto ERROR;
+ }
+
+ 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);
+
+ if ((ret = _focus_loop_is_running_timed_wait(g_focus_sound_handle[index].focus_loop, LOOP_RUNNING_WAIT_TIME_MS))) {
+ debug_error("failed to _focus_loop_is_running_timed_wait(), ret[0x%x]", ret);
+ goto ERROR;
+ }
+
+ debug_fleave();
+
+ return MM_ERROR_NONE;
+
+ERROR:
+ if (g_focus_sound_handle[index].focus_loop) {
+ g_main_loop_unref(g_focus_sound_handle[index].focus_loop);
+ g_focus_sound_handle[index].focus_loop = NULL;
+ }
+ return MM_ERROR_SOUND_INTERNAL;
+}
+
+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();
+}
+