'################################################################################################################################################ #include "bass24.bi" #include "bass24mix.bi" '################################################################################################################################################ Dim Shared G_GFX_Mux as Any Ptr '################################################################################################################################################ Enum NHF_Audio_GURU NHFA_GURU_NoError = 1 NHFA_GURU_UnknownError = 0 NHFA_GURU_CantInitDevice = -1000 NHFA_GURU_CantStartRecord = -1001 NHFA_GURU_CantFree = -1002 NHFA_GURU_CantLoadFile = -1003 End Enum '################################################################################################################################################ Dim Shared NHF_Audio_OutSoundDidHandle as HSTREAM Dim Shared NHF_Audio_OutSoundDaaHandle as HSTREAM Dim Shared NHF_Audio_OutHandle as HSTREAM '################################################################################################################################################ Dim Shared NHF_Audio_RecHandle as HRECORD Dim Shared NHF_Audio_ThreadPtr as Any Ptr Dim Shared NHF_Audio_ThreadEx as UByte Dim Shared NHF_Audio_Mux as Any Ptr Dim Shared NHF_Audio_RecGFX_SpectrumW as Integer Dim Shared NHF_Audio_RecGFX_SpectrumH as Integer Dim Shared NHF_Audio_RecGFX_Img as Any Ptr Dim Shared NHF_Audio_OutGFX_SpectrumW as Integer Dim Shared NHF_Audio_OutGFX_SpectrumH as Integer Dim Shared NHF_Audio_OutGFX_Img as Any Ptr '################################################################################################################################################ Function NHF_Audio_Output_InitSounds() as NHF_Audio_GURU Dim TPath as String = "data/sound/" Dim TLP as String TLP = TPath & "did.wav" NHF_Audio_OutSoundDidHandle = BASS_StreamCreateFile(FALSE, StrPtr(TLP), 0, 0, 0) If NHF_Audio_OutSoundDidHandle = 0 Then Return NHFA_GURU_CantLoadFile 'TLP = TPath & "daa.wav" TLP = "/media/data20_md1/sound/-mp3-/m/martika___toy_soldiers.mp3" NHF_Audio_OutSoundDaaHandle = BASS_StreamCreateFile(FALSE, StrPtr(TLP), 0, 0, 0) If NHF_Audio_OutSoundDaaHandle = 0 Then Return NHFA_GURU_CantLoadFile Return NHFA_GURU_NoError End Function '################################################################################################################################################ Function NHF_Audio_Output_Init(V_Device as Integer = -1, V_FRQ as UInteger = 44100) as NHF_Audio_GURU If BASS_Init(V_Device, V_FRQ, BASS_DEVICE_MONO, 0, 0) = 0 Then Return NHFA_GURU_CantInitDevice Dim RV as NHF_Audio_GURU RV = NHF_Audio_Output_InitSounds() NHF_Audio_OutHandle = BASS_Mixer_StreamCreate(V_FRQ, BASS_DEVICE_MONO, 0) BASS_Mixer_StreamAddChannel(NHF_Audio_OutHandle, NHF_Audio_OutSoundDidHandle, BASS_MIXER_DOWNMIX) BASS_Mixer_StreamAddChannel(NHF_Audio_OutHandle, NHF_Audio_OutSoundDaaHandle, BASS_MIXER_DOWNMIX) BASS_Mixer_ChannelFlags(NHF_Audio_OutHandle, BASS_MIXER_BUFFER, BASS_MIXER_BUFFER) NHF_Audio_OutGFX_SpectrumW = 256 NHF_Audio_OutGFX_SpectrumH = 50 NHF_Audio_OutGFX_Img = ImageCreate(NHF_Audio_OutGFX_SpectrumW, NHF_Audio_OutGFX_SpectrumH, 32) Return RV Return NHFA_GURU_NoError End Function '------------------------------------------------------------------------------------------------------------------------------------------------ Function NHF_Audio_Output_Term() as NHF_Audio_GURU If NHF_Audio_OutHandle <> 0 Then BASS_StreamFree(NHF_Audio_OutHandle): NHF_Audio_OutHandle = 0 If NHF_Audio_OutSoundDaaHandle <> 0 Then BASS_StreamFree(NHF_Audio_OutSoundDaaHandle): NHF_Audio_OutSoundDaaHandle = 0 If NHF_Audio_OutSoundDidHandle <> 0 Then BASS_StreamFree(NHF_Audio_OutSoundDidHandle): NHF_Audio_OutSoundDidHandle = 0 If BASS_Free() <> TRUE Then Return NHFA_GURU_CantFree Return NHFA_GURU_NoError End Function '################################################################################################################################################ Function NHF_Audio_InputCallback(ByVal V_Handle As HRECORD, ByVal V_Buffer As Any Ptr, ByVal V_Length As UInteger, ByVal V_UserData As Any Ptr) As Integer Return 1 End Function '------------------------------------------------------------------------------------------------------------------------------------------------ Sub NHF_Audio_Thread() Dim TFFT(512) As Single Dim TDat(512) As Short Dim X as UInteger Do BASS_ChannelGetData(NHF_Audio_RecHandle, @TFFT(0), BASS_DATA_FFT512) BASS_ChannelGetData(NHF_Audio_RecHandle, @TDat(0), 512) MutexLock(G_GFX_Mux) If NHF_Audio_ThreadEx = 1 Then MutexUnLock(G_GFX_Mux): Exit Do If NHF_Audio_RecGFX_Img <> 0 Then Line NHF_Audio_RecGFX_Img, (0, 0)-(NHF_Audio_RecGFX_SpectrumW - 1, NHF_Audio_RecGFX_SpectrumH - 1), &H000000, BF For X = 1 to 255 Line NHF_Audio_RecGFX_Img, (X, NHF_Audio_RecGFX_SpectrumH - 1)-(X, (NHF_Audio_RecGFX_SpectrumH - 1) - NHF_Audio_RecGFX_SpectrumH * TFFT(X) * ((X + 1) / 20) * 5), &H666666 TFFT(X) = 0 Next For X = 1 to 256 - 1 Line NHF_Audio_RecGFX_Img, (X, NHF_Audio_RecGFX_SpectrumH / 2 - (NHF_Audio_RecGFX_SpectrumH - 2) / 65535 * TDat(X))-((X + 1), NHF_Audio_RecGFX_SpectrumH / 2 - (NHF_Audio_RecGFX_SpectrumH - 2) / 65535 * TDat(X + 1)), &HFFFFFF TDat(X) = 0 Next TDat(256) = 0 Line NHF_Audio_RecGFX_Img, (0, 0)-(NHF_Audio_RecGFX_SpectrumW - 1, NHF_Audio_RecGFX_SpectrumH - 1), &H0000FF, B End If MutexUnLock(G_GFX_Mux) BASS_Mixer_ChannelGetData(NHF_Audio_OutHandle, @TFFT(0), BASS_DATA_FFT512) BASS_Mixer_ChannelGetData(NHF_Audio_OutHandle, @TDat(0), 512) MutexLock(G_GFX_Mux) If NHF_Audio_OutGFX_Img <> 0 Then Line NHF_Audio_OutGFX_Img, (0, 0)-(NHF_Audio_OutGFX_SpectrumW - 1, NHF_Audio_OutGFX_SpectrumH - 1), &H000000, BF For X = 1 to 255 Line NHF_Audio_OutGFX_Img, (X, NHF_Audio_OutGFX_SpectrumH - 1)-(X, (NHF_Audio_OutGFX_SpectrumH - 1) - NHF_Audio_OutGFX_SpectrumH * TFFT(X) * ((X + 1) / 20) * 5), &H666666 Next For X = 1 to 256 - 1 Line NHF_Audio_OutGFX_Img, (X, NHF_Audio_OutGFX_SpectrumH / 2 - (NHF_Audio_OutGFX_SpectrumH - 2) / 65535 * TDat(X))-((X + 1), NHF_Audio_OutGFX_SpectrumH / 2 - (NHF_Audio_OutGFX_SpectrumH - 2) / 65535 * TDat(X + 1)), &HFFFFFF Next Line NHF_Audio_OutGFX_Img, (0, 0)-(NHF_Audio_OutGFX_SpectrumW - 1, NHF_Audio_OutGFX_SpectrumH - 1), &H0000FF, B End If MutexUnLock(G_GFX_Mux) Sleep 20, 1 Loop End Sub '------------------------------------------------------------------------------------------------------------------------------------------------ Function NHF_Audio_Input_Init(V_Device as Integer = -1, V_FRQ as UInteger = 8000) as NHF_Audio_GURU If BASS_RecordInit(V_Device) = 0 Then Return NHFA_GURU_CantInitDevice NHF_Audio_Mux = MutexCreate() NHF_Audio_RecGFX_SpectrumW = 256 NHF_Audio_RecGFX_SpectrumH = 50 NHF_Audio_RecGFX_Img = ImageCreate(NHF_Audio_RecGFX_SpectrumW, NHF_Audio_RecGFX_SpectrumH, 32) NHF_Audio_RecHandle = BASS_RecordStart(V_FRQ, 1, &HA0000, Cast(RECORDPROC Ptr, @NHF_Audio_InputCallback), 0) If NHF_Audio_RecHandle = 0 Then ImageDestroy(NHF_Audio_RecGFX_Img) Return NHFA_GURU_CantStartRecord End If NHF_Audio_ThreadEx = 0 NHF_Audio_ThreadPtr = ThreadCreate(Cast(Any Ptr, @NHF_Audio_Thread)) Return NHFA_GURU_NoError End Function '------------------------------------------------------------------------------------------------------------------------------------------------ Function NHF_Audio_Input_Term() as NHF_Audio_GURU If BASS_RecordFree() <> TRUE Then Return NHFA_GURU_CantFree MutexLock(NHF_Audio_Mux) ImageDestroy(NHF_Audio_RecGFX_Img) NHF_Audio_RecGFX_Img = 0 NHF_Audio_ThreadEx = 1 MutexUnLock(NHF_Audio_Mux) ThreadWait(NHF_Audio_ThreadPtr) MutexDestroy(NHF_Audio_Mux) Return NHFA_GURU_NoError End Function '################################################################################################################################################ ScreenRes 800, 600, 32 '################################################################################################################################################ G_GFX_Mux = MutexCreate() NHF_Audio_Output_Init() NHF_Audio_Input_Init() BASS_ChannelPlay(NHF_Audio_OutSoundDaaHandle, FALSE) BASS_ChannelPlay(NHF_Audio_OutHandle, FALSE) '################################################################################################################################################ Do MutexLock(G_GFX_Mux) If InKey() = Chr(27) Then MutexUnLock(G_GFX_Mux): Exit Do ScreenLock() CLS() Put (0, 0), NHF_Audio_RecGFX_Img, PSET Put (0, NHF_Audio_RecGFX_SpectrumH), NHF_Audio_OutGFX_Img, PSET ScreenUnLock() MutexUnLock(G_GFX_Mux) Sleep 10, 1 Loop Screen 0 '################################################################################################################################################ Print "Try exit..." NHF_Audio_Input_Term() NHF_Audio_Output_Term() MutexDestroy(G_GFX_Mux) Print "END!"