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?
capturing sound
Blitz3D Forums/Blitz3D Programming/capturing sound You could use this:
http://blitzbasic.co.nz/codearcs/codearcs.php?code=845
Here is the decls file:
edit:
Or you could use the MCI commands:
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.