gpt4 book ai didi

linux - Bluez 5.48 - 如何强制蓝牙传输状态从事件到空闲 - 嵌入式接收器端

转载 作者:太空宇宙 更新时间:2023-11-04 10:05:00 25 4
gpt4 key购买 nike

我经常遇到 iOS 应用程序不通过 AVRCP DBus 信号向接收器提供暂停和播放信号的情况。安卓没问题。许多 iOS 应用程序(如果仍然最大化)上暂停流的唯一指示是传输状态将在一段时间后变为空闲。如果用户在暂停和播放之间切换,除了实际音频之外,没有办法知道这个接收器端(即嵌入式扬声器)。 Android 将在我测试过的应用程序上发出暂停信号并通过 AVRCP 播放。在 iOS 上,一旦传输空闲,“播放”将立即将传输置于事件状态。所以...有没有一种方法,Bash、Python、C 或任何我可以从 active=>idle 强制连接设备(即 iPad)的transport嵌入式水槽侧?如果可能的话,我会知道每当按下“播放”时再次激活传输。谢谢!

最佳答案

简而言之,您需要在org.bluez.MediaTransport1 接口(interface)上监听PropertiesChanged 信号,并解析该信号以进行状态更改。

您可以在初始化时注册到Bluez DBUS接口(interface),如下所示。

g_dbus_connection_signal_subscribe(conn, "org.bluez", "org.freedesktop.DBus.Properties",
"PropertiesChanged", NULL, "org.bluez.MediaTransport1", G_DBUS_SIGNAL_FLAGS_NONE,
bluez_signal_transport_changed, NULL, NULL);

下面的示例是解析状态变化信号的功能,

static void bluez_signal_transport_changed(GDBusConnection *conn, const gchar *sender,
const gchar *path, const gchar *interface, const gchar *signal, GVariant *params,
void *userdata) {
(void)conn;
(void)sender;
(void)interface;
(void)userdata;

const gchar *signature = g_variant_get_type_string(params);
GVariantIter *properties = NULL;
GVariantIter *unknown = NULL;
GVariant *value = NULL;
struct ba_transport *t;
const char *iface;
const char *key;

if (strcmp(signature, "(sa{sv}as)") != 0) {
error("Invalid signature for %s: %s != %s", signal, signature, "(sa{sv}as)");
goto fail;
}

g_variant_get(params, "(&sa{sv}as)", &iface, &properties, &unknown);
debug("Signal: %s: %s", signal, iface);

while (g_variant_iter_next(properties, "{&sv}", &key, &value)) {

if (strcmp(key, "State") == 0) {

if (!g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
error("Invalid argument type for %s: %s != %s", key,
g_variant_get_type_string(value), "s");
goto fail;
}

printf("state is %s\n", g_variant_get_string(value, NULL));
}

g_variant_unref(value);
value = NULL;
}

fail:
if (properties != NULL)
g_variant_iter_free(properties);
if (value != NULL)
g_variant_unref(value);
}

g_variant_get_string(value, NULL)) 将为您提供当前状态,您可以根据当前状态决定 SINK 操作。

关于linux - Bluez 5.48 - 如何强制蓝牙传输状态从事件到空闲 - 嵌入式接收器端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53188197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com