" <arg name=\"device_type\" direction=\"in\" type=\"s\"/>\n" \
" <arg name=\"status\" direction=\"in\" type=\"i\"/>\n" \
" </method>\n" \
+ " <method name=\"SetAcmMode\">\n" \
+ " <arg name=\"mode\" direction=\"in\" type=\"u\"/>\n" \
+ " </method>\n" \
" <property name=\"PropertyTest1\" type=\"i\" access=\"readwrite\"/>\n" \
" <property name=\"PropertyTest2\" type=\"s\" access=\"read\"/>\n" \
" <signal name=\"DeviceConnected\">\n" \
static void handle_get_device_string(DBusConnection *conn, DBusMessage *msg, void *userdata);
static void handle_dump_device_list(DBusConnection *conn, DBusMessage *msg, void *userdata);
static void handle_test_device_status_change(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_set_acm_mode(DBusConnection *conn, DBusMessage *msg, void *userdata);
static int method_call_bt_get_name(DBusConnection *conn, const char *device_path, char **name);
METHOD_HANDLER_GET_AVOID_RESAMPLING,
METHOD_HANDLER_DUMP_DEVICE_LIST,
METHOD_HANDLER_STATUS_TEST,
+ METHOD_HANDLER_SET_ACM_MODE,
METHOD_HANDLER_MAX
};
[METHOD_HANDLER_STATUS_TEST] = {
.method_name = "TestStatusChange",
.receive_cb = handle_test_device_status_change },
+ [METHOD_HANDLER_SET_ACM_MODE] = {
+ .method_name = "SetAcmMode",
+ .receive_cb = handle_set_acm_mode },
};
static void save_preference(pa_device_manager *dm, pa_sink *sink) {
dbus_message_unref(reply);
}
+static void handle_set_acm_mode(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+ pa_device_manager *dm;
+ DBusMessage *reply = NULL;
+ uint32_t mode = 0;
+
+ pa_assert(conn);
+ pa_assert(msg);
+ pa_assert(userdata);
+
+ dm = (pa_device_manager *)userdata;
+ pa_assert_se(dbus_message_get_args(msg, NULL,
+ DBUS_TYPE_UINT32, &mode,
+ DBUS_TYPE_INVALID));
+
+ pa_log_info("Set ACM mode to (%d)", mode);
+
+ if (mode == 0) {
+ unload_acm_sink(dm);
+ } else {
+ /* For now, value of not 0 is just loading ACM sink. */
+ if (!load_acm_sink(dm)) {
+ pa_log_error("could not load acm sink");
+ pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "%s", "org.tizen.multimedia.audio.Internal");
+ return;
+ }
+ }
+
+ pa_assert_se((reply = dbus_message_new_method_return(msg)));
+ pa_assert_se(dbus_connection_send(conn, reply, NULL));
+ dbus_message_unref(reply);
+}
+
static DBusHandlerResult handle_introspect(DBusConnection *conn, DBusMessage *msg, void *userdata) {
const char *xml = DEVICE_MANAGER_INTROSPECT_XML;
DBusMessage *r = NULL;
#define DEVICE_API_BLUEZ "bluez"
#define DEVICE_API_ALSA "alsa"
#define DEVICE_API_NULL "null"
+#define DEVICE_API_ACM "acm"
#define DEVICE_API_RAOP "raop"
#define DEVICE_BUS_USB "usb"
#define DEVICE_CLASS_SOUND "sound"
DM_DEVICE_CLASS_TIZEN,
DM_DEVICE_CLASS_BT,
DM_DEVICE_CLASS_NULL,
+ DM_DEVICE_CLASS_ACM,
DM_DEVICE_CLASS_MAX,
} dm_device_class_t;
return DM_DEVICE_CLASS_NULL;
} else if (device_string == strstr(device_string, "tizen")) {
return DM_DEVICE_CLASS_TIZEN;
+ } else if (device_string == strstr(device_string, "acm")) {
+ return DM_DEVICE_CLASS_ACM;
} else {
return DM_DEVICE_CLASS_NONE;
}
}
}
+static bool pulse_device_is_acm(pa_object *pdevice) {
+ pa_proplist *prop = pulse_device_get_proplist(pdevice);
+
+ if (!prop)
+ return false;
+
+ return pa_safe_streq(pa_proplist_gets(prop, PA_PROP_DEVICE_API), DEVICE_API_ACM);
+}
+
static bool pulse_device_is_raop(pa_object *pdevice) {
pa_proplist *prop = pulse_device_get_proplist(pdevice);
return DM_DEVICE_CLASS_TIZEN;
} else if (pulse_device_is_bluez(pdevice)) {
return DM_DEVICE_CLASS_BT;
+ } else if (pulse_device_is_acm(pdevice)) {
+ return DM_DEVICE_CLASS_ACM;
} else {
return DM_DEVICE_CLASS_NONE;
}
return is_sink ? "module-bluez5-device" : NULL;
} else if (device_class == DM_DEVICE_CLASS_NULL) {
return is_sink ? "module-null-sink" : "module-null-source";
+ } else if (device_class == DM_DEVICE_CLASS_ACM) {
+ return is_sink ? "module-acm-sink" : NULL;
} else {
return NULL;
}
char device_name[DEVICE_NAME_MAX];
pa_assert(device_string);
+ pa_assert(params);
pa_assert(target);
- if ((device_class != DM_DEVICE_CLASS_ALSA) && (device_class != DM_DEVICE_CLASS_TIZEN))
+ if ((device_class != DM_DEVICE_CLASS_ALSA) &&
+ (device_class != DM_DEVICE_CLASS_TIZEN) &&
+ (device_class != DM_DEVICE_CLASS_ACM))
return -1;
+ if (device_class == DM_DEVICE_CLASS_ACM) {
+ snprintf(target, DEVICE_PARAM_STRING_MAX, "%s ", params);
+ return 0;
+ }
+
if (device_string_get_name(device_string, device_name) < 0) {
pa_log_error("Invalid device string '%s'", device_string);
return -1;
else if (device_class == DM_DEVICE_CLASS_TIZEN)
snprintf(target, DEVICE_PARAM_STRING_MAX, "device=%s ", device_name);
- if (params)
- strncat(target, params, DEVICE_PARAM_STRING_MAX - strlen(target));
+ strncat(target, params, DEVICE_PARAM_STRING_MAX - strlen(target));
return 0;
}
} else if (device_class == DM_DEVICE_CLASS_BT) {
snprintf(device_string, DEVICE_STR_MAX, "bt");
return 0;
+ } else if (device_class == DM_DEVICE_CLASS_ACM) {
+ snprintf(device_string, DEVICE_STR_MAX, "acm");
+ return 0;
} else {
return -1;
}
}
}
+static void handle_acm_pulse_device(pa_object *pdevice, bool is_loaded, pa_device_manager *dm) {
+ pa_tz_device *device;
+
+ pa_assert(pdevice);
+ pa_assert(dm);
+
+ pa_log_info("Handle ACM pulse device");
+
+ if (is_loaded) {
+ pa_tz_device_new_data data;
+
+ pa_tz_device_new_data_init(&data, dm->device_list, dm->comm, NULL);
+ _fill_new_data_basic(&data, DEVICE_TYPE_NETWORK, DM_DEVICE_DIRECTION_OUT, false, dm);
+ pa_tz_device_new_data_add_sink(&data, DEVICE_ROLE_ACM, PA_SINK(pdevice));
+ pa_tz_device_new(&data);
+ pa_tz_device_new_data_done(&data);
+ } else {
+ if (!(device = device_list_get_device(dm, DEVICE_TYPE_NETWORK, DEVICE_ROLE_ACM, NULL)))
+ pa_log_warn("Can't get ACM device");
+ else
+ pa_tz_device_free(device);
+ }
+}
+
static void handle_internal_pulse_device(pa_object *pdevice, bool is_loaded, pa_device_manager *dm) {
pa_tz_device *device;
struct composite_type *ctype;
pulse_device_set_use_internal_codec(PA_OBJECT(sink), false);
handle_raop_pulse_device(PA_OBJECT(sink), true, dm);
return PA_HOOK_OK;
+ } else if (pulse_device_is_acm(PA_OBJECT(sink))) {
+ pulse_device_set_use_internal_codec(PA_OBJECT(sink), false);
+ handle_acm_pulse_device(PA_OBJECT(sink), true, dm);
+ return PA_HOOK_OK;
} else if (pulse_device_is_alsa(PA_OBJECT(sink)) || pulse_device_is_tizenaudio(PA_OBJECT(sink))) {
pulse_device_set_use_internal_codec(PA_OBJECT(sink), true);
handle_internal_pulse_device(PA_OBJECT(sink), true, dm);
} else if (pulse_device_is_raop(PA_OBJECT(sink))) {
handle_raop_pulse_device(PA_OBJECT(sink), false, dm);
return PA_HOOK_OK;
+ } else if (pulse_device_is_acm(PA_OBJECT(sink))) {
+ handle_acm_pulse_device(PA_OBJECT(sink), false, dm);
+ return PA_HOOK_OK;
} else if (pulse_device_is_alsa(PA_OBJECT(sink)) || pulse_device_is_tizenaudio(PA_OBJECT(sink))) {
handle_internal_pulse_device(PA_OBJECT(sink), false, dm);
return PA_HOOK_OK;
unload_module(dm->core, false, device_string);
}
+pa_sink* load_acm_sink(pa_device_manager *dm) {
+ pa_tz_device *acm_device;
+
+ pa_assert(dm);
+
+ pa_log_info("Load ACM sink");
+
+ if ((acm_device = device_list_get_device(dm, DEVICE_TYPE_NETWORK, DEVICE_ROLE_ACM, NULL))) {
+ pa_log_info("ACM device already exists");
+ return pa_tz_device_get_sink(acm_device, DEVICE_ROLE_ACM);
+ }
+
+ return load_sink(dm, DEVICE_TYPE_NETWORK, DEVICE_ROLE_ACM);
+}
+
+void unload_acm_sink(pa_device_manager *dm) {
+ pa_assert(dm);
+
+ pa_log_info("Unload ACM sink");
+
+ if (!device_list_get_device(dm, DEVICE_TYPE_NETWORK, DEVICE_ROLE_ACM, NULL)) {
+ pa_log_info("ACM device does not exist");
+ return;
+ }
+
+ unload_sink(dm, DEVICE_TYPE_NETWORK, DEVICE_ROLE_ACM);
+
+ return;
+}
+
pa_idxset* pa_device_manager_get_device_list(pa_device_manager *dm) {
pa_assert(dm);
pa_assert(dm->device_list);