Как инициализировать XAudio2 в Python (ошибка CreateMasteringVoice)? - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь сделать музыкальный проигрыватель, использующий XAudio2 под Win10, вот текущий код:

from ctypes import Structure, POINTER, windll, byref, memset, sizeof, pointer, wintypes
from ctypes import c_void_p, c_uint, c_char, c_long
from ctypes.wintypes import DWORD, WORD, BYTE

XAUDIO2_DEFAULT_PROCESSOR = 1

def init():

    class XAUDIO2_EFFECT_DESCRIPTOR(Structure):
        _fields_ = (    ( 'pEffect', c_void_p),
                        ( 'InitialState', BYTE),
                        ( 'OutputChannels', DWORD) )

    class XAUDIO2_EFFECT_CHAIN(Structure):
        _fields_ = (    ( 'EffectCount', DWORD),
                        ( 'pEffectDescriptors', POINTER(XAUDIO2_EFFECT_DESCRIPTOR) ) )

    lib = windll.LoadLibrary('XAudio2_9.dll')
    print(lib)
    func = lib['XAudio2Create']
    print(func)
    ppXAudio2 = c_void_p()
    print(ppXAudio2)  
    res = lib.XAudio2Create(byref(ppXAudio2), 0, XAUDIO2_DEFAULT_PROCESSOR)
    if res:
        print("XAudio2Create err: ", res)
        return
    else:
        print(ppXAudio2)    
    ppMasteringVoice = c_void_p()
    InputChannels = 2
    InputSampleRate = 44100
    effect = XAUDIO2_EFFECT_DESCRIPTOR()
    memset(byref(effect),0,sizeof(effect))
    effect.pEffect = c_void_p()
    effect.InitialState = 0
    effect.OutputChannels = 1
    pEffectChain = XAUDIO2_EFFECT_CHAIN()
    memset(byref(pEffectChain),0,sizeof(pEffectChain))
    pEffectChain.EffectCount = 0
    pEffectChain.pEffectDescriptors = pointer(effect)

    res = ppXAudio2.CreateMasteringVoice( byref(ppMasteringVoice), InputChannels, InputSampleRate,
                                    0, 0, byref(pEffectChain), 0 )   

И ниже вывод, который я получаю, я думаю, мне нужно преобразовать ppXAudio2 в тип экземпляра XAudio2, но я не уверен, как:

WinDLL 'XAudio2_9.dll', дескриптор 7fffcc620000 в 0x224b7068160

_FuncPtr объект в 0x00000224B5150C78

не

c_void_p (None)

c_void_p (2356714864784)

AttributeError: объект 'c_void_p' не имеет атрибута 'CreateMasteringVoice'

...