PulseAudioService pa_context_connect() 在所有 Qt GUI 应用程序中失败
PulseAudioService pa_context_connect() failed in all Qt GUI applications
我有一个嵌入式 linux 设备,它是 运行ning linux 内核 4.4 和带有 busybox 的 QT5.9.1。我有两个用 QT 编写的应用程序,一个带有 GUI,另一个后端服务也用 QT 编写,但没有任何 GUI 或小部件,只有控制台。我最近一直在尝试配对和连接蓝牙音频设备,以使用 pulseaudio 和 bluez 录制和播放音频。我还有一个摄像头,可以记录 GUI 上显示的实时视频,同时记录来自蓝牙耳机的音频。这是在无线控制器服务中使用 gstreamer 完成的。
一切正常,但是当我要用音频播放保存的视频时,我使用 GUI 中的视频小部件来简化操作。不幸的是,它无法将 pulseaudio 的默认音频设备识别为蓝牙 headset/speaker,而是始终将其强制从 3.5mm 音频插孔中拔出。我尝试使用此代码打印可用音频设备列表以及 QT 认为是默认音频设备的列表:
const auto deviceInfos = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput);
for (const QAudioDeviceInfo &deviceInfo : deviceInfos)
qDebug() << "Device name: " << deviceInfo.deviceName();
qWarning() << "default device: " << QAudioDeviceInfo::defaultOutputDevice().deviceName();
我最初在后端 wirelesscontroller 服务中尝试过这个,它打印了这个:
[M] qWirelessController WirelessControllerMain::init - Device name: "default"
[M] qWirelessController WirelessControllerMain::init - Device name: "default:CARD=rockchipwitorch"
[M] qWirelessController WirelessControllerMain::init - Device name: "sysdefault:CARD=rockchipwitorch"
[M] qWirelessController WirelessControllerMain::init - Device name: "bluez_sink.0C_A6_94_E4_22_B9.headset_head_unit"
[M] qWirelessController WirelessControllerMain::init - Device name: "alsa_output.0.stereo-fallback"
[W] qWirelessController WirelessControllerMain::init - default device: "bluez_sink.0C_A6_94_E4_22_B9.headset_head_unit"
所以后端服务识别默认音频设备没有问题。我尝试将相同的代码片段添加到我的 GUI 应用程序中,但收到此错误消息:
[W] MyGUI - PulseAudioService: pa_context_connect() failed with return: -1
[M] MyGUI HMIMain::init - Device name: "default"
[M] MyGUI HMIMain::init - Device name: "default:CARD=rockchipwitorch"
[M] MyGUI HMIMain::init - Device name: "sysdefault:CARD=rockchipwitorch"
[M] MyGUI HMIMain::init - Device name: ""
[W] MyGUI HMIMain::init - default device: ""
尝试连接到 pulseaudio 服务时出错。我对这个错误进行了很多搜索,到目前为止,我没有发现与我的设置相关或解决了我的问题。我还发现此错误发生在所有 GUI 应用程序上。我构建了许多带和不带 GUI 的 QT 示例,并将该代码片段放入其中。所有的 GUI 应用程序都给我相同的 pa_context_connect() 错误,而所有基于控制台的应用程序都没有问题连接脉冲音频服务。
据我所知,无论有多少 QT 控制台应用程序 运行ning,它们都能够连接到 pulseaudio 服务。我还确保在尝试让我的 GUI 应用程序与 pulseaudio 连接时没有其他用户应用程序正在 运行ning。目前我正在使用这些参数启动 pulseaudio:
/usr/bin/pulseaudio -D --exit-idle-time=-1
我尝试使用 --system 参数启动它并设置环境变量 PULSE_SERVER=localhost ,这两个结果都导致我收到以下错误:
"PulseAudioService: Connection failure: Connection refused"
如果我 运行 pulseaudio 在后台(不是作为守护进程)和 --vvvv 我看到它在我的后端服务连接到它时打印出很多信息但是自然地,我什么也看不到我的 GUI 应用程序尝试连接到它。
我也曾尝试删除 .config/pulse/ 文件夹中的所有 pulseaudio cookie,正如一个线程所建议的那样,但这也没有改变任何东西。
至于 /etc/pulse/ 中的配置文件,我已将它们全部恢复为库存。但是,我必须做的唯一更改是将“load-module module-stream-restore restore_device=false”添加到 default.pa 以维护默认接收器。
我真的不想添加更多的 gstreamer 代码来播放视频,所以我真的很想弄清楚这里发生了什么。
编辑:我最近找到了环境变量“QT_DEBUG_PLUGINS”并启动了我的应用程序并将其设置为 1 并得到了这个输出:
[M] MyGUI - QFactoryLoader::QFactoryLoader() checking directory path "/usr/lib/qt/plugins/audio" ...
[M] MyGUI - QFactoryLoader::QFactoryLoader() looking at "/usr/lib/qt/plugins/audio/libqtaudio_alsa.so"
[W] MyGUI - Found metadata in lib /usr/lib/qt/plugins/audio/libqtaudio_alsa.so, metadata=
{
"IID": "org.qt-project.qt.audiosystemfactory/5.0",
"MetaData": {
"Keys": [
"alsa"
]
},
"className": "QAlsaPlugin",
"debug": false,
"version": 329988
}
[M] MyGUI - Got keys from plugin meta data ("alsa")
[M] MyGUI - QFactoryLoader::QFactoryLoader() looking at "/usr/lib/qt/plugins/audio/libqtmedia_pulse.so"
[W] MyGUI - Found metadata in lib /usr/lib/qt/plugins/audio/libqtmedia_pulse.so, metadata=
{
"IID": "org.qt-project.qt.audiosystemfactory/5.0",
"MetaData": {
"Keys": [
"default"
]
},
"className": "QPulseAudioPlugin",
"debug": false,
"version": 329988
}
[M] MyGUI - Got keys from plugin meta data ("default")
[M] MyGUI - QFactoryLoader::QFactoryLoader() checking directory path "/mnt/app/bin/audio" ...
[M] MyGUI - loaded library "/usr/lib/qt/plugins/audio/libqtaudio_alsa.so"
[M] MyGUI - loaded library "/usr/lib/qt/plugins/audio/libqtmedia_pulse.so"
[W] MyGUI - PulseAudioService: pa_context_connect() failed with return: -1
[M] MyGUI HMIMain::init - Device name: "default"
[M] MyGUI HMIMain::init - Device name: "default:CARD=rockchipwitorch"
[M] MyGUI HMIMain::init - Device name: "sysdefault:CARD=rockchipwitorch"
[M] MyGUI HMIMain::init - Device name: ""
[W] MyGUI HMIMain::init - default device: ""
感谢 qt 论坛上的 KH-219Design 在这方面的帮助。
使用环境变量 PULSE_LOG=4 我能够诊断出 GUI 正在使用 XDG_RUNTIME_DIR 来寻找脉冲服务器套接字。 XDG 环境变量用于它与控制台应用程序不需要的 wayland 一起工作。
脉冲服务器套接字位于 /tmp/pulse-/native,GUI 无法找到它来连接它,因为它正在查找 /tmp/。xdg/pulse/native
我有一个嵌入式 linux 设备,它是 运行ning linux 内核 4.4 和带有 busybox 的 QT5.9.1。我有两个用 QT 编写的应用程序,一个带有 GUI,另一个后端服务也用 QT 编写,但没有任何 GUI 或小部件,只有控制台。我最近一直在尝试配对和连接蓝牙音频设备,以使用 pulseaudio 和 bluez 录制和播放音频。我还有一个摄像头,可以记录 GUI 上显示的实时视频,同时记录来自蓝牙耳机的音频。这是在无线控制器服务中使用 gstreamer 完成的。
一切正常,但是当我要用音频播放保存的视频时,我使用 GUI 中的视频小部件来简化操作。不幸的是,它无法将 pulseaudio 的默认音频设备识别为蓝牙 headset/speaker,而是始终将其强制从 3.5mm 音频插孔中拔出。我尝试使用此代码打印可用音频设备列表以及 QT 认为是默认音频设备的列表:
const auto deviceInfos = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput);
for (const QAudioDeviceInfo &deviceInfo : deviceInfos)
qDebug() << "Device name: " << deviceInfo.deviceName();
qWarning() << "default device: " << QAudioDeviceInfo::defaultOutputDevice().deviceName();
我最初在后端 wirelesscontroller 服务中尝试过这个,它打印了这个:
[M] qWirelessController WirelessControllerMain::init - Device name: "default"
[M] qWirelessController WirelessControllerMain::init - Device name: "default:CARD=rockchipwitorch"
[M] qWirelessController WirelessControllerMain::init - Device name: "sysdefault:CARD=rockchipwitorch"
[M] qWirelessController WirelessControllerMain::init - Device name: "bluez_sink.0C_A6_94_E4_22_B9.headset_head_unit"
[M] qWirelessController WirelessControllerMain::init - Device name: "alsa_output.0.stereo-fallback"
[W] qWirelessController WirelessControllerMain::init - default device: "bluez_sink.0C_A6_94_E4_22_B9.headset_head_unit"
所以后端服务识别默认音频设备没有问题。我尝试将相同的代码片段添加到我的 GUI 应用程序中,但收到此错误消息:
[W] MyGUI - PulseAudioService: pa_context_connect() failed with return: -1
[M] MyGUI HMIMain::init - Device name: "default"
[M] MyGUI HMIMain::init - Device name: "default:CARD=rockchipwitorch"
[M] MyGUI HMIMain::init - Device name: "sysdefault:CARD=rockchipwitorch"
[M] MyGUI HMIMain::init - Device name: ""
[W] MyGUI HMIMain::init - default device: ""
尝试连接到 pulseaudio 服务时出错。我对这个错误进行了很多搜索,到目前为止,我没有发现与我的设置相关或解决了我的问题。我还发现此错误发生在所有 GUI 应用程序上。我构建了许多带和不带 GUI 的 QT 示例,并将该代码片段放入其中。所有的 GUI 应用程序都给我相同的 pa_context_connect() 错误,而所有基于控制台的应用程序都没有问题连接脉冲音频服务。
据我所知,无论有多少 QT 控制台应用程序 运行ning,它们都能够连接到 pulseaudio 服务。我还确保在尝试让我的 GUI 应用程序与 pulseaudio 连接时没有其他用户应用程序正在 运行ning。目前我正在使用这些参数启动 pulseaudio:
/usr/bin/pulseaudio -D --exit-idle-time=-1
我尝试使用 --system 参数启动它并设置环境变量 PULSE_SERVER=localhost ,这两个结果都导致我收到以下错误:
"PulseAudioService: Connection failure: Connection refused"
如果我 运行 pulseaudio 在后台(不是作为守护进程)和 --vvvv 我看到它在我的后端服务连接到它时打印出很多信息但是自然地,我什么也看不到我的 GUI 应用程序尝试连接到它。
我也曾尝试删除 .config/pulse/ 文件夹中的所有 pulseaudio cookie,正如一个线程所建议的那样,但这也没有改变任何东西。
至于 /etc/pulse/ 中的配置文件,我已将它们全部恢复为库存。但是,我必须做的唯一更改是将“load-module module-stream-restore restore_device=false”添加到 default.pa 以维护默认接收器。
我真的不想添加更多的 gstreamer 代码来播放视频,所以我真的很想弄清楚这里发生了什么。
编辑:我最近找到了环境变量“QT_DEBUG_PLUGINS”并启动了我的应用程序并将其设置为 1 并得到了这个输出:
[M] MyGUI - QFactoryLoader::QFactoryLoader() checking directory path "/usr/lib/qt/plugins/audio" ...
[M] MyGUI - QFactoryLoader::QFactoryLoader() looking at "/usr/lib/qt/plugins/audio/libqtaudio_alsa.so"
[W] MyGUI - Found metadata in lib /usr/lib/qt/plugins/audio/libqtaudio_alsa.so, metadata=
{
"IID": "org.qt-project.qt.audiosystemfactory/5.0",
"MetaData": {
"Keys": [
"alsa"
]
},
"className": "QAlsaPlugin",
"debug": false,
"version": 329988
}
[M] MyGUI - Got keys from plugin meta data ("alsa")
[M] MyGUI - QFactoryLoader::QFactoryLoader() looking at "/usr/lib/qt/plugins/audio/libqtmedia_pulse.so"
[W] MyGUI - Found metadata in lib /usr/lib/qt/plugins/audio/libqtmedia_pulse.so, metadata=
{
"IID": "org.qt-project.qt.audiosystemfactory/5.0",
"MetaData": {
"Keys": [
"default"
]
},
"className": "QPulseAudioPlugin",
"debug": false,
"version": 329988
}
[M] MyGUI - Got keys from plugin meta data ("default")
[M] MyGUI - QFactoryLoader::QFactoryLoader() checking directory path "/mnt/app/bin/audio" ...
[M] MyGUI - loaded library "/usr/lib/qt/plugins/audio/libqtaudio_alsa.so"
[M] MyGUI - loaded library "/usr/lib/qt/plugins/audio/libqtmedia_pulse.so"
[W] MyGUI - PulseAudioService: pa_context_connect() failed with return: -1
[M] MyGUI HMIMain::init - Device name: "default"
[M] MyGUI HMIMain::init - Device name: "default:CARD=rockchipwitorch"
[M] MyGUI HMIMain::init - Device name: "sysdefault:CARD=rockchipwitorch"
[M] MyGUI HMIMain::init - Device name: ""
[W] MyGUI HMIMain::init - default device: ""
感谢 qt 论坛上的 KH-219Design 在这方面的帮助。
使用环境变量 PULSE_LOG=4 我能够诊断出 GUI 正在使用 XDG_RUNTIME_DIR 来寻找脉冲服务器套接字。 XDG 环境变量用于它与控制台应用程序不需要的 wayland 一起工作。
脉冲服务器套接字位于 /tmp/pulse-/native,GUI 无法找到它来连接它,因为它正在查找 /tmp/。xdg/pulse/native