在用 Home Assistant
Windows 通过 HDMI 输出声音画面到功放
功放本来是常年不关的,但是感觉发热很厉害,即便无声的时候应该功耗还是在(毕竟画面还是镜像过来了)。
考虑做一个功能,如果 windwos 持续五分钟没有声音输出,切换状态为无声,且立刻关闭功放。如果有声音,状态恢复,开启功放。
现在的问题就是怎么获取到 windows 有声音输出这个状态。特别是合成之后的。比如图中把系统声音关了,那系统声音不要激活功放。
看这贴#9:麻烦高手看看这段代码怎么用? - V2EX
1
JCZ2MkKb5S8ZX9pq OP 试着停止画面输出半个多小时(断开此显示器的连接),温度完全没降,看来是功放本身比较老,没有类似休眠的设定。后一个思路不行了,还是要通过 HA 红外关功放好了。
|
2
JCZ2MkKb5S8ZX9pq OP 搜到一个关联的问题 [perl - How to detect if any sound plays on a windows xp machine - Stack Overflow]( https://stackoverflow.com/questions/3983463/how-to-detect-if-any-sound-plays-on-a-windows-xp-machine)
但是这里的大哥用的是 Delphi,VB 的我也不知道咋弄。 思路应该是这个 [IDirectSoundBuffer8::GetStatus Method | Microsoft Docs]( https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ee418070(v=vs.85)?redirectedfrom=MSDN) 请问用 python 或者命令行怎么读取这个 `DSBSTATUS_PLAYING`? |
3
JCZ2MkKb5S8ZX9pq OP 还有这个大哥写的,也不知道怎么用这个代码。
[.net - Determine if windows is currently playing sound - Stack Overflow]( https://stackoverflow.com/questions/45422255/determine-if-windows-is-currently-playing-sound) |
4
JCZ2MkKb5S8ZX9pq OP 失败,DSBSTATUS_PLAYING 不行。
import win32com.directsound.directsound as ds print(f'{ds.DSBSTATUS_BUFFERLOST = }') print(f'{ds.DSBSTATUS_LOOPING = }') print(f'{ds.DSBSTATUS_PLAYING = }') ds.DSBSTATUS_BUFFERLOST = 2 ds.DSBSTATUS_LOOPING = 4 ds.DSBSTATUS_PLAYING = 1 一直是这三个值,可能就是某种常量,不是当前状态。 |
5
ysc3839 2020-06-09 00:01:49 +08:00
https://www.v2ex.com/t/679678
本来想建议你不应该开一个新帖子,可以使用 Append 功能,但是发现这个帖子没人回复。 估计是发到了比较冷门的区,似乎也没在主页上出现,不知道是不是 V2EX 的 bug ?还是有一定规则决定是否显示的? |
6
JCZ2MkKb5S8ZX9pq OP @ysc3839 追加请教一个问题。
我用 potplayer 看电影的时候,有些音源,比如 DTS/AC3 是 passthough 直出的,也就是从 windows 的音量合成器里是看不到波形的,而功放也是直接接收到的数据 DTS/AC3 类型。 所以在这个情况下,要摸索出如何判断 windows 是否有发声,可能比较困难。我连肉眼查看都不知道在哪儿查看。 换一个思路,有什么办法能获取到 potplayer 当前的播放 /停止状态吗? |