使用 PlaySound() 时不产生声音
No sound is generated when using PlaySound()
基本上我想在ctypes中使用PlaySound()
函数。
Yes I know winsound module is built on it and I could use that, but I have a reason to not do so :)
在 C 中我会这样调用函数:
PlaySound("sound.wav", NULL, SND_FILENAME);
我有我的 Python 等效脚本:
import ctypes
winmm = ctypes.WinDLL('winmm.dll')
winmm.PlaySound("sound.wav", None, 0x20000)
我运行它,没有报错但是也不播放声音
我怀疑问题出在十六进制值 (0x20000
) 上,因为其他一切似乎都很好。我得到了这样的值:
import winsound
print(hex(winsound.SND_FILENAME))
或换一种方式:
import ctypes, winsound
winmm = ctypes.WinDLL('winmm.dll')
winmm.PlaySound("sound.wav", None, winsound.SND_FILENAME)
那么我怎样才能让它工作以便播放我的文件?
尽管 documentation 将其指定为字符串。
A string that specifies the sound to play
在 Python 中,您实际上必须将其设为字节值。很简单:
winmm.PlaySound(b"sound.wav", None, 0x20000)
在Windows中,函数有Unicode和ANSI版本。 documentation 表示文件名是 LPCTSTR
。对于定义为 LPCSTR
的 ANSI 版本,对于 Unicode,它是 LPCWSTR
.
下面是调用 Windows 函数的正确方法。通常您需要函数的 W
版本。定义 .argtypes
和 .restype
也有助于错误检查。正如您所发现的,您可以传递错误的类型并且它不会起作用。定义 .argtypes
后,将捕获不兼容的类型。
from ctypes import *
from ctypes import wintypes as w
dll = WinDLL('winmm')
dll.PlaySoundW.argtypes = w.LPCWSTR,w.HMODULE,w.DWORD
dll.PlaySoundW.restype = w.BOOL
SND_FILENAME = 0x20000
# Call it with a Unicode string and it works.
dll.PlaySoundW('sound.wav',None,SND_FILENAME)
# Call it with a byte string and get an error since `.argtypes` is defined.
dll.PlaySoundW(b'sound.wav',None,SND_FILENAME)
输出(声音播放后):
Traceback (most recent call last):
File "C:\test.py", line 15, in <module>
dll.PlaySoundW(b'sound.wav',None,SND_FILENAME)
ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong type
或者跳过所有这些工作,只使用 winsound 模块:
import winsound
winsound.PlaySound('sound.wav',winsound.SND_FILENAME)
基本上我想在ctypes中使用PlaySound()
函数。
Yes I know winsound module is built on it and I could use that, but I have a reason to not do so :)
在 C 中我会这样调用函数:
PlaySound("sound.wav", NULL, SND_FILENAME);
我有我的 Python 等效脚本:
import ctypes
winmm = ctypes.WinDLL('winmm.dll')
winmm.PlaySound("sound.wav", None, 0x20000)
我运行它,没有报错但是也不播放声音
我怀疑问题出在十六进制值 (0x20000
) 上,因为其他一切似乎都很好。我得到了这样的值:
import winsound
print(hex(winsound.SND_FILENAME))
或换一种方式:
import ctypes, winsound
winmm = ctypes.WinDLL('winmm.dll')
winmm.PlaySound("sound.wav", None, winsound.SND_FILENAME)
那么我怎样才能让它工作以便播放我的文件?
尽管 documentation 将其指定为字符串。
A string that specifies the sound to play
在 Python 中,您实际上必须将其设为字节值。很简单:
winmm.PlaySound(b"sound.wav", None, 0x20000)
在Windows中,函数有Unicode和ANSI版本。 documentation 表示文件名是 LPCTSTR
。对于定义为 LPCSTR
的 ANSI 版本,对于 Unicode,它是 LPCWSTR
.
下面是调用 Windows 函数的正确方法。通常您需要函数的 W
版本。定义 .argtypes
和 .restype
也有助于错误检查。正如您所发现的,您可以传递错误的类型并且它不会起作用。定义 .argtypes
后,将捕获不兼容的类型。
from ctypes import *
from ctypes import wintypes as w
dll = WinDLL('winmm')
dll.PlaySoundW.argtypes = w.LPCWSTR,w.HMODULE,w.DWORD
dll.PlaySoundW.restype = w.BOOL
SND_FILENAME = 0x20000
# Call it with a Unicode string and it works.
dll.PlaySoundW('sound.wav',None,SND_FILENAME)
# Call it with a byte string and get an error since `.argtypes` is defined.
dll.PlaySoundW(b'sound.wav',None,SND_FILENAME)
输出(声音播放后):
Traceback (most recent call last):
File "C:\test.py", line 15, in <module>
dll.PlaySoundW(b'sound.wav',None,SND_FILENAME)
ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong type
或者跳过所有这些工作,只使用 winsound 模块:
import winsound
winsound.PlaySound('sound.wav',winsound.SND_FILENAME)