capturing sound

Blitz3D Forums/Blitz3D Programming/capturing sound

Would it be possible to capture audio that the soundcard is currently playing in raw format or wav? I want to set the recording side of the soundcard to "what u hear" to capture anything it plays then get this audio data, sample by sample and pass it to the STDIN of a commandline audio encoder such as oggenc. Is this possible in Blitz? Windows API?

You could use this:
http://blitzbasic.co.nz/codearcs/codearcs.php?code=845
Print "Press key to start recording"

FlushKeys()
WaitKey()
FlushKeys()

Print "Recording .. Press key to stop"

StartWAVrecord()

FlushKeys()
WaitKey()
FlushKeys()

Print "Stopping & Playback .. press key to stop"
StopWAVrecord()

SaveWAVrecord("c:\test.wav")

snd = LoadSound("c:\test.wav")
LoopSound snd
PlaySound snd

FlushKeys()
WaitKey()
FlushKeys()

FreeSound snd

End

Here is the decls file:
;----------------------------------------------------
; Filename: Winmm.decls
; Rev 0.1 2003.02.26  ADAmor Ziltch)
; Rev 0.2 2003.06.24  ADAmor
; Rev 0.3 2003.07.20  ADAmor
;----------------------------------------------------

.lib "winmm.dll"

; -- MCI multimedia commands
mciExecute%( Text$ ):"mciExecute"
mciSendCommand%(DeviceID,Message,Param1,Param2):"mciSendCommandA"

mciGetErrorString%(Error,Buffer$,Length%):"mciGetErrorStringA"
mciGetDeviceID(Device$):"GetDeviceIDA"
mciSendString%(Command$,ReturnString*,ReturnLength%,Callback):"mciSendStringA"

setaudio%(DeviceID%,Audio%,Flags%)
AuxGetVolume(DeviceID,lpdwVolume*)
AuxSetVolume(DeviceID,lpdwVolume*)


;  -- Can be used to play sound from memory
winmm_PlaySound%(lpszName*,hModule%,dwFlags%):"PlaySoundA"
winmm_StopSound%(lpszName%,hModule%,dwFlags%):"PlaySoundA"


;  -- mixer
mixerOpen%(phmx%, uMxId%, dwCallback%, dwInstance%, fdwOpen%)
mixerClose%(hmx%)

mixerGetControlDetails%(hmxobj%, pmxcd*, fdwDetails%):"mixerGetControlDetailsA"
mixerGetDevCaps%(uMxId%, pmxcaps*, cbmxcaps%): "mixerGetDevCapsA"
mixerGetID%(hmxobj%, pumxID%, fdwId%)
mixerGetLineControls%(hmxobj%, pmxlc*, fdwControls%): "mixerGetLineControlsA"
mixerGetLineInfo%(hmxobj%, pmxl*, fdwInfo%):"mixerGetLineInfoA"
mixerGetNumDevs%()
mixerMessage%(hmx%, uMsg%, dwParam1%, dwParam2%)
mixerSetControlDetails%(hmxobj%, pmxcd*, fdwDetails%)

; -- Wave in

.lib "winmm.dll"
waveInGetDevCaps%(uDeviceID,WaveInCapsPointer*,WaveInCapsStructSize) : "waveInGetDevCapsA"
waveInOpen%(WaveDeviceInputHandle*,WhichDevice,WaveFormatExPointer*,CallBack,CallBackInstance,Flags) : "waveInOpen"
waveInGetNumDevs%() : "waveInGetNumDevs"
waveInClose%(WaveDeviceInputHandle) : "waveInClose"
waveInStart%(WaveDeviceInputHandle) : "waveInStart"
waveInReset%(WaveDeviceInputHandle) : "waveInReset"
waveInStop%(WaveDeviceInputHandle) : "waveInStop"
waveInAddBuffer%(InputDeviceHandle,WaveHdrPointer*,WaveHdrStructSize) : "waveInAddBuffer"
waveInPrepareHeader%(InputDeviceHandle,WaveHdrPointer*,WaveHdrStructSize) : "waveInPrepareHeader"
waveInUnprepareHeader%(InputDeviceHandle,WaveHdrPointer*,WaveHdrStructSize) : "waveInUnprepareHeader"


;waveInOpen%(LPHWAVEIN%, uDeviceID%, LPCWAVEFORMATEX*,dwCallback%,dwInstance%,fdwOpen%)
;waveInClose%( HWAVEIN)
;waveInPrepareHeader%(HWAVEIN%,LPWaveHDR*,UINT%)
;waveInUnprepareHeader%(HWAVEIN%,LPWaveHDR*, UINT%)
;waveInAddBuffer%(HWAVEIN%,LPWaveHDR*,UINT%)
;waveInStart%(HWAVEIN%)
;waveInStop%(HWAVEIN%)
;waveInReset%(HWAVEIN%)
waveInGetPosition%(HWAVEIN%,LPMMTIME%,UINTt%)
waveInGetID%(HWAVEIN%, puDeviceID%)
;waveInGetNumDevs%()
waveInGetErrorText%(err%, lpText$, uSize%): "waveInGetErrorTextA"

; -- Wave out

waveOutOpen%( LPHWAVEphwo%, uDeviceID, LPCWAVEFORMATEX*, dwCallback%, dwInstance%,fdwOpen%)
waveOutClose%(HWAVEhwo%)
waveOutPrepareHeader%(HWAVEhwo%,LPWaveHDR*,UINT%)
waveOutUnprepareHeader%(HWAVEhwo%,LPWaveHDR*,UINT%)
waveOutWrite%(HWAVEhwo%,LPWaveHDR*,UINT%)
waveOutPause%(HWAVEhwo%)
waveOutRestart%(HWAVEhwo%)
waveOutReset%(HWAVEhwo%)
waveOutBreakLoop%(HWAVEhwo%)
waveOutGetPosition%(HWAVEhwo%,LPMMTIME%,UINT %)
waveOutGetPitch%(HWAVEhwo%, pdwPitch%)
waveOutSetPitch%(HWAVEhwo%,dwPitch%)
waveOutGetPlaybackRate%(HWAVEhwo%, pdwRate%)
waveOutSetPlaybackRate%(HWAVEhwo%,dwRate%)
waveOutGetID%(HWAVEhwo%,puDeviceID%)
waveOutGetNumDevs%()


midiOutGetNumDevs%()
midiOutClose%(hMidiOut%)
midiOutOpen%(lphMidiOut*,uDeviceID%,dwCallback%,dwInstance%,dwFlags%);  nul1*,nul2*,dwFlags%)
midiOutShortMsg%(hMidiOut%,dwMsg%)
midiOutGetDevCaps%( uDeviceID%, lpCaps*, uSize%):"midiOutGetDevCapsA"


midiInGetDevCaps%( uDeviceID%, lpCaps*, uSize%):"midiInGetDevCapsA"
;                              lpCaps.MIDIINCAPS
midiInStop%(hMidiIn%)
midiInStart%(hMidiIn%)
midiInReset%(hMidiIn%)
midiInPrepareHeader%(hMidiIn%, lpMidiInHdr*, uSize%)
;                              lpMidiInHdr.MIDIHDR
midiInOpen%(lphMidiIn*, uDeviceID%, dwCallback%, dwInstance%, dwFlags%)
midiInMessage%(hMidiIn%, msg%, dw1%, dw2%)
midiInGetNumDevs%()
midiInGetID%(hMidiIn%, lpuDeviceID%)
midiInGetErrorText%( err%, lpText*, uSize%):"midiInGetErrorTextA"
;                          lpText.String
midiInClose%(hMidiIn%)
midiInAddBuffer%(hMidiIn%, lpMidiInHdr*, uSize%)
;                          lpMidiInHdr.MIDIHDR
midiDisconnect%(hmi%, hmo%, pReserved%)
;                           pReserved.any
midiConnect%(hmi%, hmo%, pReserved%)
;                        pReserved.any


edit:
Or you could use the MCI commands:
sound$ = "c:\test.wav"

Print "Playing sound " + sound$
Print "Press any key"
writeMCIstring("OPEN " + sound$ + " type WAVEAUDIO ALIAS snd")
writeMCIstring("PLAY snd")

FlushKeys()
WaitKey()
FlushKeys()

writeMCIstring("CLOSE snd")

Function writeMCIstring(command$)

	command$ = command$ + Chr$(0)
	bank = CreateBank(Len(command$))
	For i = 1 To Len(command$)
		PokeByte bank, i - 1, Asc(Mid$(command$, i, 1))
	Next
	CallDLL "winMM.DLL", "mciExecute", bank
	FreeBank bank

End Function


I think there's also a working example in the archives. There's also an example on how to control the mixer, so you could mute certain devices.