【问题标题】:python's alsaaudio.mixer not refreshing mixer settingspython 的 alsaaudio.mixer 不刷新混音器设置
【发布时间】:2013-01-26 23:36:18
【问题描述】:

我想通过 python 控制我的 ALSA 声卡的混音器。同时,我希望能够从其他可能同时修改声卡的应用程序中获取更改。

我想最简单的方法是使用声卡的混音器接口来设置和查询混音器。 使用alsaaudio 包应该相当容易:

import alsaaudio
mixer=alsaaudio.Mixer()
print mixer.getvolume() # prints e.g. '[100L]'
mixer.setvolume(50)
print mixer.getvolume() # prints '[50L]'

不幸的是,如果控件“在后台”更改,Mixer 的实例不会得到更新。 考虑上面的应用程序正在运行,但现在将混音器更改为 alsamixergui 到 80。

print mixer.getvolume()  # prints '[50L]'
mixer2=alsaaudio.Mixer()
print mixer2.getvolume() # prints '[80L]'
print mixer.getvolume()  # prints '[50L]'

实例化一个新的 Mixer() 是轮询新的混音器设置的唯一方法,还是有更简单的方法来刷新现有实例的值?

【问题讨论】:

    标签: python linux alsa


    【解决方案1】:

    Mixer.polldescriptors() documentation 说:

    返回一个(文件描述符,事件掩码)元组,可用于通过 select.poll 等待混音器上的更改。

    【讨论】:

    • 谢谢;不幸的是,我仍然被困住了;我可以使用 polldescriptors 正确检测控制器是否已更改,但 mixer.getvolume() 仍然返回旧值。每次我检测到(旧)polldescriptor 发生变化时,我是否必须创建一个新的Mixer()(以及新的polldescriptor()s 和新的select.poll()s?这似乎非常效率低下。
    • 这似乎是alsaaudio 中的一个错误。
    • 我不认为这是一个 alsaaudio 错误,而是 libasound 中某种奇怪的缓存形式。请参阅 C 中的 my gist
    • @kristianlm 那个程序有问题;它从不调用snd_mixer_handle_events()。显然,alsaaudiohas the same bug.
    • 天哪,真是一场噩梦。文档说值被缓存,但从未提及如何刷新它们。我正在寻找flushrefresh 程序,但没有尝试handle_events,因为我没有使用它们。对 ALSA 的文档印象不深。非常感谢您的帮助,@CL!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 2020-12-07
    • 2018-03-13
    • 2016-07-27
    • 2015-07-03
    • 1970-01-01
    相关资源
    最近更新 更多