Хочу получить IDirectSound3DListener и IDirectSound3DBuffer... Создаю первичный и вторичный буферы все отлично работает мелодия воспроизводится... как только добавляю функцию QueryInterface для получения пространственный интерфейсов программа начинает вылетать. Пишу под masm!!! Код (Text): invoke DirectSoundCreate, 0, addr pDirectSound, 0 dsound SetCooperativeLevel, pDirectSound, Hwnd, DSSCL_PRIORITY mov DsBufDesc.dwSize, sizeof DSBUFFERDESC mov DsBufDesc.dwFlags, DSBCAPS_PRIMARYBUFFER + DSBCAPS_CTRL3D mov DsBufDesc.dwBufferBytes, 0 mov DsBufDesc.dwReserved, 0 mov DsBufDesc.lpwfxFormat, 0 dsound CreateSoundBuffer, pDirectSound, ADDR DsBufDesc, ADDR pPrimari, NULL mov WaveFormat.wFormatTag,WAVE_FORMAT_PCM mov WaveFormat.nChannels,1 mov WaveFormat.nSamplesPerSec,22050 mov WaveFormat.wBitsPerSample,16 mov WaveFormat.nBlockAlign,2 mov WaveFormat.nAvgBytesPerSec,44100 mov WaveFormat.cbSize,0 dsbuffer SetFormat, pPrimari, addr WaveFormat dsbuffer QueryInterface, pPrimari, IID_IDirectSound3DListener, addr pListener invoke mmioOpen, ADDR SoundName, NULL, MMIO_ALLOCBUF or MMIO_READ mov hMmio,eax mov WaveInfo.fccType, "EVAW" invoke mmioDescend, hMmio, addr WaveInfo, NULL, MMIO_FINDRIFF mov ChunkInfo.ckid," tmf" invoke mmioDescend, hMmio, addr ChunkInfo, addr WaveInfo, MMIO_FINDCHUNK invoke mmioRead, hMmio, addr WaveFormat, ChunkInfo.ckSize invoke mmioAscend, hMmio, addr ChunkInfo, NULL mov ChunkInfo.ckid, "atad" invoke mmioDescend, hMmio, addr ChunkInfo, addr WaveInfo, MMIO_FINDCHUNK mov eax, ChunkInfo.ckSize mov DsBufDesc.dwBufferBytes, eax mov DsBufDesc.dwReserved, 0 mov DsBufDesc.lpwfxFormat, NULL mov DsBufDesc.dwFlags, DSBCAPS_CTRLFREQUENCY + DSBCAPS_CTRLPAN + DSBCAPS_CTRLVOLUME mov DsBufDesc.lpwfxFormat,offset WaveFormat dsound8 CreateSoundBuffer, pDirectSound, ADDR DsBufDesc, ADDR pBuffer, NULL dsbuffer Lock1, pBuffer, 0, ChunkInfo.ckSize, ADDR S_data, ADDR S_lengte, NULL, 0, 0 invoke mmioRead, hMmio, S_data, ChunkInfo.ckSize dsbuffer Unlock, pBuffer, S_data, S_lengte, NULL, 0 invoke mmioClose,hMmio,NULL dsbuffer QueryInterface, pBuffer, IID_IDirectSound3DBuffer, addr pD3Buffer dsbuffer Play, pBuffer, 0, 0, 0
gwest > Пишу под masm Как определены/инициализированы IID_IDirectSound3DListener и IID_IDirectSound3DBuffer? Не адрес ли их нужно передавать?
Да как раз таки передаю адреса просто в коде который скинул не правильно написал... если делать как в коде тогда программа вообще не компилируется, если передавать адрес тогда компилируется без ошибок но сама программа вылетает... если правильно смог определить процес завершается ошибкой: ERROR_SXS_KEY_NOT_FOUND ; IDirectSoundBuffer ; ---------------------------------------------------------------------------- IID_IDirectSoundBuffer EQU <{0279AFA85h,04981h,011CEh,{0A5h,021h,000h,020h,0AFh,00Bh,0E5h,060}}> ;----------------------------------------------------------------------------- ; Вызов методов IDirectSoundBuffer ;----------------------------------------------------------------------------- dsbuffer MACRO func, this, arglist :VARARG IFB <arglist> INVOKE [IDirectSoundBufferVtbl. func][eax], this ELSE INVOKE [IDirectSoundBufferVtbl. func][eax], this, arglist ENDIF ORG $-3 pop eax push eax mov eax,[eax] call [IDirectSoundBufferVtbl. func][eax] ENDM ;============================================================================= ; IDirectSoundBuffer Виртуальная таблица методов ;============================================================================= IDirectSoundBufferVtbl STRUC ;IUnknown methods STDMETHOD QueryInterface, p3 STDMETHOD AddRef, p1 STDMETHOD Release, p1 ;IDirectSoundBuffer methods STDMETHOD GetCaps, p2 STDMETHOD GetCurrentPosition, p3 STDMETHOD GetFormat, p4 STDMETHOD GetVolume, p2 STDMETHOD GetPan, p2 STDMETHOD GetFrequency, p2 STDMETHOD GetStatus, p2 STDMETHOD Initialize, p3 STDMETHOD Lock1, p8 STDMETHOD Play, p4 STDMETHOD SetCurrentPosition, p2 STDMETHOD SetFormat, p2 STDMETHOD SetVolume, p2 STDMETHOD SetPan, p2 STDMETHOD SetFrequency, p2 STDMETHOD Stop, p1 STDMETHOD Unlock, p5 STDMETHOD Restore, p1 IDirectSoundBufferVtbl ENDS IID_IDirectSound3DListener EQU <{0279AFA84h,04981h,011CEh,{0A5h,021h,000h,020h,0AFh,00Bh,0E5h,060h}}> IID_IDirectSound3DBuffer EQU <{0279AFA86h,04981h,011CEh,{0A5h,021h,000h,020h,0AFh,00Bh,0E5h,060h}}>
а не нужно ли вот так? .data II_3DBuffer GUID IID_IDirectSound3DBuffer .code dsbuffer QueryInterface, pBuffer, ADDR II_3DBuffer, addr pD3Buffer
Откопал пример использования 3D буфера и эффектов, там зациклено на воспроизведение через jmp, поэтому не работает оконная процедура и приложения завершается только через Ctrl+ALT+DEL. Для примера подойдет.
А возможно что ошибка в том что я использую библиотеку 9 версии??? Функция DirectSoundCreate работает отлично но стоит вызвать место нее DirectSoundCreate8, компилятор пишет error LNK2001: unresolved external symbol __imp__DirectSoundCreate8@12 fatal error LNK1120: 1 unresolved externals В dsound9.inc Код (Text): ; DirectSound API ; ---------------------------------------------------------------------------- externdef _imp__DirectSoundCreate@12:ptr p3 DirectSoundCreate equ <_imp__DirectSoundCreate@12> ; DirectSound 8 и выше ; --------------------------------------------------------------------- externdef _imp__DirectSoundCreate8@12:ptr p3 DirectSoundCreate8 equ <_imp__DirectSoundCreate8@12>
Насколько помню DirectSound выше восьмой версии нет. В инклудах от 9 версии тоже самое что и в восьмой за исключением двух строк DIRECTSOUND_VERSION EQU 00900h и ;if DIRECTSOUND_VERSION ge 00900h DSBFREQUENCY_MAX EQU 200000 ;else ;DSBFREQUENCY_MAX EQU 100000 ;ENDIF --------- итого определена лишь другая максимальная частота буфера если версия девятая. Работа со звуком в DirectX давно делается через XACT. Файлы directsound в новых sdk старые, просто вкладываются для совместимости.
2 keYMax Можешь подсказать почему я немогу использовать DirectSoundCreate8 или это не существенно? Насколько я понял если использую DirectSoundCreate то везде надо использовать макросы dsound, dsbuffer и тп, если DirectSoundCreate8, то dsound8, dsbuffer8...
gwest вот ссылка на три примера + инклуды + либа из dx sdk march 2009 dsound_masm.zip компиляется без проблем и запускается, по крайней мере у меня.
keYMax Спасибо разобрался, видимо умня библиотека dsound.lib была кривая... Стоило заменить заработало!!! и музыкальный файл весел много из-за этого почемуто не мог буфер создать...