#define PA_STREAM_MANAGER_METHOD_NAME_GET_CURRENT_VOLUME_TYPE "GetCurrentVolumeType"
#define PA_STREAM_MANAGER_METHOD_NAME_GET_CURRENT_MEDIA_ROUTING_PATH "GetCurrentMediaRoutingPath"
#define PA_STREAM_MANAGER_METHOD_NAME_UPDATE_FOCUS_STATUS "UpdateFocusStatus"
+#define PA_STREAM_MANAGER_METHOD_NAME_CHECK_STREAM_EXIST_BY_PID "CheckStreamExistByPid"
#define VCONF_PATH_PREFIX_VOLUME "file/private/sound/volume/"
#define VCONF_PATH_MAX 64
return;
}
+static int _check_media_stream_exist_by_pid(unsigned int pid, const char *direction, bool *exist)
+{
+ int ret = MM_ERROR_NONE;
+ GVariant *result = NULL;
+ GDBusConnection *conn = NULL;
+ GError *err = NULL;
+ const gchar *dbus_ret = NULL;
+
+ assert(exist);
+ assert(direction);
+
+ conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
+ if (!conn) {
+ LOGE("g_bus_get_sync() error (%s)", err->message);
+ g_error_free(err);
+ return MM_ERROR_SOUND_INTERNAL;
+ }
+
+ result = g_dbus_connection_call_sync(conn,
+ PA_BUS_NAME,
+ PA_STREAM_MANAGER_OBJECT_PATH,
+ PA_STREAM_MANAGER_INTERFACE,
+ PA_STREAM_MANAGER_METHOD_NAME_CHECK_STREAM_EXIST_BY_PID,
+ g_variant_new("(uss)", pid, "media", direction),
+ G_VARIANT_TYPE("(s)"),
+ G_DBUS_CALL_FLAGS_NONE,
+ 2000,
+ NULL,
+ &err);
+ if (!result) {
+ LOGE("g_dbus_connection_call_sync() for CHECK_STREAM_EXIST_BY_PID error (%s)", err->message);
+ g_error_free(err);
+ ret = MM_ERROR_SOUND_INTERNAL;
+ goto LEAVE;
+ }
+
+ g_variant_get(result, "(&s)", &dbus_ret);
+ LOGI("g_dbus_connection_call_sync() success, method return value is (%s)", dbus_ret);
+ if (!strncmp("STREAM_MANAGER_RETURN_OK", dbus_ret, strlen(dbus_ret)))
+ *exist = true;
+ else if (!strncmp("STREAM_MANAGER_RETURN_ERROR_NO_STREAM", dbus_ret, strlen(dbus_ret)))
+ *exist = false;
+ else
+ ret = MM_ERROR_SOUND_INTERNAL;
+
+ g_variant_unref(result);
+LEAVE:
+ g_object_unref(conn);
+
+ return ret;
+}
+
void _focus_session_interrupt_cb(mm_sound_focus_state_e state, const char *reason, void *user_data)
{
sound_session_interrupted_code_e e;
case MM_SOUND_DEVICE_TYPE_MIRRORING:
case MM_SOUND_DEVICE_TYPE_USB_AUDIO:
if (!is_connected) {
- LOGI("sound device unplugged");
- g_session_interrupt_cb_table.user_cb(SOUND_SESSION_INTERRUPTED_BY_EARJACK_UNPLUG, g_session_interrupt_cb_table.user_data);
+ bool stream_exist = false;
+ LOGI("sound device(%d) is unplugged", type);
+ if (!_check_media_stream_exist_by_pid(getpid(), "out", &stream_exist)) {
+ if (stream_exist) {
+ LOGI("invoke user_cb(%p) for interrupted_by_earjack_unplug", g_session_interrupt_cb_table.user_cb);
+ g_session_interrupt_cb_table.user_cb(SOUND_SESSION_INTERRUPTED_BY_EARJACK_UNPLUG, g_session_interrupt_cb_table.user_data);
+ }
+ break;
+ }
+ if (!_check_media_stream_exist_by_pid(getpid(), "in", &stream_exist)) {
+ if (stream_exist) {
+ LOGI("invoke user_cb(%p) for interrupted_by_earjack_unplug", g_session_interrupt_cb_table.user_cb);
+ g_session_interrupt_cb_table.user_cb(SOUND_SESSION_INTERRUPTED_BY_EARJACK_UNPLUG, g_session_interrupt_cb_table.user_data);
+ }
+ break;
+ }
}
break;
default: