- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试让 D-Bus 信号处理程序在 PulseAudio 中接收器的状态发生变化(例如变为非事件状态)时被调用。不幸的是,它没有被调用,坦率地说,我不确定为什么。
import dbus
import dbus.mainloop.glib
from gi.repository import GObject
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()
def signal_handler(*args, **kwargs):
print('sig: ', args, kwargs)
def connect():
import os
if 'PULSE_DBUS_SERVER' in os.environ:
address = os.environ['PULSE_DBUS_SERVER']
else:
bus = dbus.SessionBus()
server_lookup = bus.get_object("org.PulseAudio1", "/org/pulseaudio/server_lookup1")
address = server_lookup.Get("org.PulseAudio.ServerLookup1", "Address", dbus_interface="org.freedesktop.DBus.Properties")
return dbus.connection.Connection(address)
conn = connect()
core = conn.get_object(object_path='/org/pulseaudio/core1')
core.connect_to_signal('StateUpdated', signal_handler)
core.ListenForSignal('org.PulseAudio.Core1.Device.StateUpdated', dbus.Array(signature='o'), dbus_interface='org.PulseAudio.Core1')
loop = GObject.MainLoop()
loop.run()
最佳答案
试试这个,对我有用。
import dbus
import os
from dbus.mainloop.glib import DBusGMainLoop
import gobject
def pulse_bus_address():
if 'PULSE_DBUS_SERVER' in os.environ:
address = os.environ['PULSE_DBUS_SERVER']
else:
bus = dbus.SessionBus()
server_lookup = bus.get_object("org.PulseAudio1", "/org/pulseaudio/server_lookup1")
address = server_lookup.Get("org.PulseAudio.ServerLookup1", "Address", dbus_interface="org.freedesktop.DBus.Properties")
print(address)
return address
def sig_handler(state):
print("State changed to %s" % state)
if state == 0:
print("Pulseaudio running.")
elif state == 1:
print("Pulseaudio idle.")
elif state == 2:
print("Pulseaudio suspended")
# setup the glib mainloop
DBusGMainLoop(set_as_default=True)
loop = gobject.MainLoop()
pulse_bus = dbus.connection.Connection(pulse_bus_address())
pulse_core = pulse_bus.get_object(object_path='/org/pulseaudio/core1')
pulse_core.ListenForSignal('org.PulseAudio.Core1.Device.StateUpdated', dbus.Array(signature='o'), dbus_interface='org.PulseAudio.Core1')
pulse_bus.add_signal_receiver(sig_handler, 'StateUpdated')
loop.run()
要求 pulseaudio 的 default.pa 具有以下内容:
.ifexists module-dbus-protocol.so
load-module module-dbus-protocol
.endif
编辑:对于那些想知道@conf-f-use 关于应用程序名称的问题的人。原来他们自己回答了这个问题,并把答案贴在这里:https://askubuntu.com/questions/906160/is-there-a-way-to-detect-whether-a-skype-call-is-in-progress-dbus-pulseaudio
窃取@con-f-use 的一段代码并将其应用于我上面的代码,我们得到一个监视器来跟踪状态是什么,并且能够告诉您应用程序名称、艺术家、标题和正在播放的名称。< br/>欢呼@con-f-use :)
import dbus
import os
from dbus.mainloop.glib import DBusGMainLoop
import gobject
def pulse_bus_address():
if 'PULSE_DBUS_SERVER' in os.environ:
address = os.environ['PULSE_DBUS_SERVER']
else:
bus = dbus.SessionBus()
server_lookup = bus.get_object("org.PulseAudio1", "/org/pulseaudio/server_lookup1")
address = server_lookup.Get("org.PulseAudio.ServerLookup1", "Address", dbus_interface="org.freedesktop.DBus.Properties")
print(address)
return address
# convert byte array to string
def dbus2str(db):
if type(db)==dbus.Struct:
return str(tuple(dbus2str(i) for i in db))
if type(db)==dbus.Array:
return "".join([dbus2str(i) for i in db])
if type(db)==dbus.Dictionary:
return dict((dbus2str(k), dbus2str(v)) for k, v in db.items())
if type(db)==dbus.String:
return db+''
if type(db)==dbus.UInt32:
return str(db+0)
if type(db)==dbus.Byte:
return chr(db)
if type(db)==dbus.Boolean:
return db==True
if type(db)==dict:
return dict((dbus2str(k), dbus2str(v)) for k, v in db.items())
return "(%s:%s)" % (type(db), db)
def sig_handler(state):
print("State changed to %s" % state)
if state == 0:
print("Pulseaudio running.")
elif state == 1:
print("Pulseaudio idle.")
elif state == 2:
print("Pulseaudio suspended")
dbus_pstreams = (
dbus.Interface(
pulse_bus.get_object(object_path=path),
dbus_interface='org.freedesktop.DBus.Properties'
) for path in pulse_core.Get(
'org.PulseAudio.Core1',
'PlaybackStreams',
dbus_interface='org.freedesktop.DBus.Properties' )
)
pstreams = {}
for pstream in dbus_pstreams:
try:
pstreams[pstream.Get('org.PulseAudio.Core1.Stream', 'Index')] = pstream
except dbus.exceptions.DBusException:
pass
if pstreams:
for stream in pstreams.keys():
plist = pstreams[stream].Get('org.PulseAudio.Core1.Stream', 'PropertyList')
appname = dbus2str(plist.get('application.name', None))
artist = dbus2str(plist.get('media.artist', None))
title = dbus2str(plist.get('media.title', None))
name = dbus2str(plist.get('media.name', None))
print appname,artist,title,name
# setup the glib mainloop
DBusGMainLoop(set_as_default=True)
loop = gobject.MainLoop()
pulse_bus = dbus.connection.Connection(pulse_bus_address())
pulse_core = pulse_bus.get_object(object_path='/org/pulseaudio/core1')
#pulse_clients = pulse_bus.get_object(object_path='/org/pulseaudio/core1/Clients')
#print dir(pulse_clients)
pulse_core.ListenForSignal('org.PulseAudio.Core1.Device.StateUpdated', dbus.Array(signature='o'), dbus_interface='org.PulseAudio.Core1')
pulse_bus.add_signal_receiver(sig_handler, 'StateUpdated')
loop.run()
关于python - 让信号在 PulseAudio 的 DBus 接口(interface)上工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33250864/
我使用我的gentoo作为kvm的主机操作系统,通过vga直通在Windows上播放,但我的声音有问题,质量不好,我听到声音中有裂纹。我在主机操作系统上使用pulseaudio(带有--system模
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
我是 PulseAudio 的新手。我正在尝试制作简单的程序。一个人会录制声音并将其保存在 baniry 文件中,另一个人应该打开它并播放。这是我的录制代码: #ifdef HAVE_CONFIG_H
在 Ubuntu 15.10 中使用 pulseaudio,我想将两个不同的麦克风组合成一个接收器,并让它们在两个不同的输出上播放组合输出。下面的脚本完成了第一部分(在网上找到的),但输出似乎只在单个
我需要使用一些 documented pulseaudio options for ffmpeg比如设备。文档中的示例有效,但仅设置流名称: ffmpeg -i INPUT -f pulse "str
两者的输出 pactl list sink-inputs和 pacmd list-sink-inputs包含一个属性部分: Properties: media.name = "ALSA Pla
我正在尝试使用 PulseAudio“实时”捕获麦克风信号。该程序是用 C 语言编写的,并使用 PulseAudio Simple API。不幸的是我请求的音频缓冲区不包含任何信号。要么我的代码有问题
我对脉冲音频和 alsa 完全陌生。情况是这样的: 我已经为 alsa 编译了 mpd。这是嵌入式系统,mpd 的脉冲音频插件不可用。 当我不启动脉冲音频时,mpd 使用 alsa 运行良好 一旦我启
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
面对奇怪的 PulseAudio 监控设备(即播放发送到扬声器的声音的音频输入设备)行为。我已根据 PulseAudio 文档 https://freedesktop.org/software/pul
他。 该程序应不断检查来自蓝牙麦克风的传入声音。蓝牙设备可以随时连接/断开连接。 如何从 Pulseaudio 获取源列表发生变化的事件? 我试着用pa_context_set_event_callb
我通过查看各种示例编写了这段代码:Python pulseaudio monitor , Pavumeter source , async playback example , 和 Pacat sou
我想为pulseaudio的几个客户端读出此刻播放的音频音量。 我想解决的问题如下:我正在 xmms 中听音乐,然后暂停,听 friend 在 youtube 上发给我的歌曲。一个小时后,我突然发现我
我正在为 Maemo/MeeGo 开发移动应用程序,Maemo 使用 PulseAudio。我想给来电者播放 mp3(并在播放时取消麦克风,而不是听来电者,一切都应该在后台完成),为此,我必须从某个(
我有一个使用 KVM 的 Windows 10 专业版虚拟机。它是通过 virt-manager 使用最新版本的 libvirt 和 QEMU 设置的。所有这些都在 Manjaro Linux 20
尝试设置 LibGDX 时,我在 IntelliJ 中遇到此错误。我正在运行 PopOS(基于 Ubuntu)。有什么帮助吗? ALSA lib ../../pulse/pulse.c:242:(pu
我正在尝试从我的 docker 容器中发出声音。我正在使用 Ubuntu 20.10 开发 Raspberry4。 启动容器时,我使用以下行来挂载声音文件文件夹: -v /tmp/pulseaudio
我希望pulseaudio(远程实例)将发送到主要alsa设备的音频通过互联网直接推送到RTP,以便我可以在家用计算机上的VLC上收听它。 在我的/etc/pulse/default.pa load-
使用我的智能手机,我可以通过Raspbery pi上的蓝牙流音乐(我使用脉冲音频)。我现在想录制这首歌或将这首歌直接放在GNU RADIO的“音频”源中。 ALSA/Pulse audio captu
我正在尝试将 raspbmc(在 Raspberry Pi 模型 b 上运行)的默认音频输出记录到原始 wav 流(我想将其通过管道传输到 piFM 以将音频传输到 FM 调谐器)。我没有成功使用 a
我是一名优秀的程序员,十分优秀!