📄 wave.asm
字号:
;---------------------------------------------------------------------------------;
.DATA
Align 4
WavOutDev DD 0
WavInDev DD 0
WavErrMsg DB "Error",0
;---------------------------------------------------------------------------------;
.DATA?
Align 4
WaveNumDevs DD ?
WOpenHnd DD ?
WInHnd DD ?
WavDblBuff DD ?
WavBuff2 DD ?
WavPtr DD ?
WavHdr WAVEHDR <?>
WavHdr2 WAVEHDR <?>
pWavFmt WAVEFORMATEX <?>
WavOutCaps1 WAVEOUTCAPSA <>
WavErrBuff DB 128 DUP (?)
;---------------------------------------------------------------------------------;
.CODE
;---------------------------------------------------------------------------------;
WavIntHdr Macro pWavHdr:req,nmWavBuf:req,BufSize:req,nLoops,Flags ;out eax - pWaveHdr
mov ebx,nmWavBuf
mov eax,pWavHdr
mov nmHdrWav,eax
mov ecx,BufSize
xor edx,edx
IFNB <nLoops>
mov [eax].WAVEHDR.dwLoops,nLoops
ENDIF
mov [eax].WAVEHDR.lpData,ebx
mov [eax].WAVEHDR.dwBufferLength,ecx
IFNB <Flags>
mov [eax].WAVEHDR.dwFlags, Flags
mov [eax].WAVEHDR.dwBytesRecorded,edx
mov [eax].WAVEHDR.dwUser,edx
mov [eax].WAVEHDR.lpNext,edx
mov [eax].WAVEHDR.Reserved,edx
ENDIF
Invoke waveOutPrepareHeader,WOpenHnd,pWavHdr,Sizeof WAVEHDR
cWaveError
EndM
;---------------------------------------------------------------------------------;
WavInit44St Macro
mov edi,Buffsz
shl edi,3
mov WavDblBuff,@vMem(edi)
mov edi,Buffsz
shl edi,5
mov WavBuff2,@vMem(edi)
Invoke waveOutOpen,Addr WOpenHnd,WavOutDev,Addr pWavFmt,Offset WavProc,NULL,CALLBACK_FUNCTION ;or WAVE_ALLOWSYNC
cWaveError
mov eax,WavDblBuff
mov WavPtr,eax
WavIntHdr Offset WavHdr,WavPtr,Buffsz,1,0
add WavPtr,Buffsz
WavIntHdr Offset WavHdr2,WavPtr,Buffsz,1,0
EndM
;---------------------------------------------------------------------------------;
Play Macro
mov ecx,Buffsz*5
add ecx,WavBuff2
mov WavPtr,ecx
Invoke WavProc,WOpenHnd,WOM_DONE,0,Offset WavHdr,0
Invoke WavProc,WOpenHnd,WOM_DONE,0,Offset WavHdr2,0
EndM
;---------------------------------------------------------------------------------;
cWaveError Macro
call cWaveErrorP
EndM
;---------------------------------------------------------------------------------;
cWaveErrorP Proc
.If eax!=MMSYSERR_NOERROR
Invoke waveOutGetErrorText,eax,Offset WavErrBuff,Sizeof WavErrBuff
Invoke MessageBox,0,Offset WavErrBuff,Offset WavErrMsg,MB_OK or MB_ICONERROR
.EndIf
ret
cWaveErrorP EndP
;---------------------------------------------------------------------------------;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -