При использовании PlaySound () звук не генерируется - PullRequest
0 голосов
/ 25 мая 2018

В основном я хочу использовать функцию PlaySound() в ctypes.

Да, я знаю, что модуль winsound построен на нем, и я мог бы это использовать, но у меня естьпричина не делать этого :)


В CI я бы вызвал функцию следующим образом:

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)

Так как я могу заставить это работать так, чтобы мой файл воспроизводился?

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

В Windows есть версии функций для Unicode и ANSI.Документация указывает, что имя файла - LPCTSTR.Для версии ANSI, которая определена как LPCSTR, а для 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)
0 голосов
/ 25 мая 2018

Несмотря на документацию , указав ее в виде строки.

Строка, определяющая воспроизводимый звук

В Python вам действительно нужносделать это байтовыми значениями.Так просто:

winmm.PlaySound(b"sound.wav", None, 0x20000)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...