'################################################################################################################################################
#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!"