+ g_dbus_connection_call(conn, bus_name, object, iface, method, args, NULL,
+ G_DBUS_CALL_FLAGS_NONE, G_DBUS_REPLY_TIMEOUT, NULL, NULL, NULL);
+ }
+
+ return ret;
+}
+
+static int __gdbus_subscribe_signal(GDBusConnection *conn,
+ const char *object_name, const char *iface_name, const char *signal_name,
+ GDBusSignalCallback signal_cb, guint *subscribe_id, void *userdata)
+{
+ guint subs_id = 0;
+
+ if (!conn || !object_name || !iface_name || !signal_name || !signal_cb || !subscribe_id) {
+ _mmcam_dbg_err("Invalid Argument %p %p %p %p %p %p",
+ conn, object_name, iface_name, signal_name, signal_cb, subscribe_id);
+ return MM_ERROR_INVALID_ARGUMENT;
+ }
+
+ _mmcam_dbg_log("subscirbe signal Obj %s, iface_name %s, sig_name %s",
+ object_name, iface_name, signal_name);
+
+ subs_id = g_dbus_connection_signal_subscribe(conn,
+ NULL, iface_name, signal_name, object_name, NULL,
+ G_DBUS_SIGNAL_FLAGS_NONE, signal_cb, userdata, NULL);
+ if (!subs_id) {
+ _mmcam_dbg_err("g_dbus_connection_signal_subscribe() failed");
+ return MM_ERROR_CAMCORDER_INTERNAL;
+ } else {
+ *subscribe_id = subs_id;
+ _mmcam_dbg_log("subs_id %u", subs_id);
+ }
+
+ return MM_ERROR_NONE;
+}
+
+
+static void __gdbus_stream_eos_cb(GDBusConnection *connection,
+ const gchar *sender_name, const gchar *object_path, const gchar *interface_name,
+ const gchar *signal_name, GVariant *param, gpointer user_data)
+{
+ int played_idx = 0;
+ _MMCamcorderGDbusCbInfo *gdbus_info = NULL;
+
+ _mmcam_dbg_log("entered");
+
+ if (!param || !user_data) {
+ _mmcam_dbg_err("invalid parameter %p %p", param, user_data);
+ return;
+ }
+
+ gdbus_info = (_MMCamcorderGDbusCbInfo *)user_data;
+
+ g_variant_get(param, "(i)", &played_idx);
+
+ g_mutex_lock(&gdbus_info->sync_mutex);
+
+ _mmcam_dbg_log("gdbus_info->param %d, played_idx : %d",
+ gdbus_info->param, played_idx);
+
+ if (gdbus_info->param == played_idx) {
+ g_dbus_connection_signal_unsubscribe(connection, gdbus_info->subscribe_id);
+
+ gdbus_info->is_playing = FALSE;
+ gdbus_info->subscribe_id = 0;
+ gdbus_info->param = 0;
+
+ g_cond_signal(&gdbus_info->sync_cond);
+ }
+
+ g_mutex_unlock(&gdbus_info->sync_mutex);
+
+ return;
+}
+
+static int __gdbus_wait_for_cb_return(_MMCamcorderGDbusCbInfo *gdbus_info, int time_out)
+{
+ int ret = MM_ERROR_NONE;
+ gint64 end_time = 0;
+
+ if (!gdbus_info) {
+ _mmcam_dbg_err("invalid info");
+ return MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
+ }
+
+ g_mutex_lock(&gdbus_info->sync_mutex);
+
+ _mmcam_dbg_log("entered");
+
+ if (gdbus_info->is_playing == FALSE) {
+ _mmcam_dbg_log("callback is already returned");
+ g_mutex_unlock(&gdbus_info->sync_mutex);
+ return MM_ERROR_NONE;
+ }
+
+ end_time = g_get_monotonic_time()+ (time_out * G_TIME_SPAN_MILLISECOND);
+
+ if (g_cond_wait_until(&gdbus_info->sync_cond, &gdbus_info->sync_mutex, end_time)) {
+ _mmcam_dbg_log("wait signal received");
+ } else {
+ _mmcam_dbg_err("wait time is expired");
+ ret = MM_ERROR_CAMCORDER_RESPONSE_TIMEOUT;