wave.asm

来自「一个不错的用汇编语言编写的FFT算法程序」· 汇编 代码 · 共 89 行

ASM
89
字号
;---------------------------------------------------------------------------------;
.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 + =
减小字号Ctrl + -
显示快捷键?