BASS ASIO Sample about Gapless
Posted: Sun Mar 11, 2012 10:29 am
Share my code for you
Simple output ASIO2
ASIO2 Gapless. call add_mixer before END_SYNC

Simple output ASIO2
Code: Select all
XIncludeFile "bass.pbi"
XIncludeFile "bassasio.pbi"
#BASS_ASIO_THREAD = 1
Global filename.s = OpenFileRequester("","*.*","*.*",0)
Global *in
Procedure.l AsioProc(input.b, channel.l, *Buffer, length.l, *user)
c.l = BASS_ChannelGetData(PeekL(*user), *Buffer, length)
If c=-1
c=0
EndIf
ProcedureReturn c
EndProcedure
DataSection
Wave32header:
Data.b $52,$49,$46,$46 ; RIFF : 0
Data.b 0,0,0,0 ; Size - 8 : 4
Data.b $57,$41,$56,$45,$66,$6D,$74,$20 ; WAVEfmt : 8
Data.b $10,$00,$00,$00 ; PCM : 16
Data.b $03,$00 ; Float32 : 20
Data.b $02,$00 ; Streo 2ch : 22
Data.b 0,0,0,0 ; Format : 24
Data.b 0,0,0,0 ; Speed : 28
Data.b 0,0 ; BlockSize Byte/SamplexCh : 32
Data.b 0,0 ; Bit : 34
Data.b $64,$61,$74,$61 ; Data : 38
Data.b 0,0,0,0,0,0 ; Raw Size : 42 : 48
EndDataSection
Procedure Main()
BASS_SetConfig(#BASS_CONFIG_UPDATEPERIOD, 0)
BASS_Init(0, 44100,0,0,#Null)
chan.l = BASS_StreamCreateFile(#False, @filename, 0, 0, #BASS_STREAM_DECODE | #BASS_SAMPLE_FLOAT)
pos.q = BASS_ChannelGetLength(chan,#BASS_POS_BYTE)
I.BASS_CHANNELINFO
; If you want to edit RAW FLOAT32 WAV
*in = AllocateMemory(pos+44)
Bass_ChannelGetData(chan, *in+44, pos)
Bass_StreamFree(chan)
CopyMemory(?Wave32header, *in, 44)
PokeL(*in+4, pos+46-8) ; Size - 8
PokeL(*in+24, 44100) ; Format
PokeL(*in+28, 44100*4*2) ; Speed
PokeW(*in+32, 4*2) ; BlockSize
PokeW(*in+34, 32) ; Bit
;PokeL(*in+42, pos) ; Raw Size
chan.l = BASS_StreamCreateFile(#True, *in, 0, pos+44, #BASS_STREAM_DECODE|#BASS_SAMPLE_FLOAT)
; END
If BASS_ASIO_Init(0, #BASS_ASIO_THREAD)
BASS_ASIO_ControlPanel()
BASS_ASIO_ChannelEnable(0,0,@AsioProc(), @chan)
BASS_ASIO_ChannelJoin(0,1,0)
BASS_ASIO_ChannelSetFormat(0,0,#BASS_ASIO_FORMAT_FLOAT)
BASS_ASIO_ChannelSetRate(0,0,44100)
BASS_ASIO_SetRate(44100)
BASS_ASIO_ChannelSetVolume(#False, 0, 1)
BASS_ASIO_Start(0)
While BASS_ChannelIsActive(chan) :Delay(100): Wend
BASS_ASIO_Free()
BASS_Free()
EndIf
EndProcedure
Main()
End
Code: Select all
XIncludeFile "bass.pbi"
XIncludeFile "bassasio.pbi"
#BASS_ASIO_THREAD = 1
#BASS_MIXER_END = $10000
#BASS_MIXER_NORAMPIN = $800000
Import "bassmix.lib"
BASS_Mixer_StreamCreate.l(freq.l, chans.l, flags.l)
BASS_Mixer_StreamAddChannel.b(Handle.l, channel.l, flags.l)
EndImport
Global filename.s = OpenFileRequester("","*.*","*.*",0)
Global *in
DataSection
Wave32header:
Data.b $52,$49,$46,$46 ; RIFF : 0
Data.b 0,0,0,0 ; Size - 8 : 4
Data.b $57,$41,$56,$45,$66,$6D,$74,$20 ; WAVEfmt : 8
Data.b $10,$00,$00,$00 ; PCM : 16
Data.b $03,$00 ; Float32 : 20
Data.b $02,$00 ; Streo 2ch : 22
Data.b 0,0,0,0 ; Format : 24
Data.b 0,0,0,0 ; Speed : 28
Data.b 0,0 ; BlockSize Byte/SamplexCh : 32
Data.b 0,0 ; Bit : 34
Data.b $64,$61,$74,$61 ; Data : 38
Data.b 0,0,0,0,0,0 ; Raw Size : 42 : 48
EndDataSection
Procedure.l AsioProc(input.b, channel.l, *Buffer, length.l, *user)
c.l = BASS_ChannelGetData(PeekL(*user), *Buffer, length)
If c=-1
c=0
EndIf
ProcedureReturn c
EndProcedure
Procedure.l EndSync(Handle.l, channel.l, Data2.l, user.l)
Shared chan.l, mixer.l, pos.q, base.l, chan2.l
If base>0
BASS_ChannelSetPosition(mixer, 0, #BASS_POS_BYTE)
base+1
ElseIf base=0
base+1
ElseIf base=-10
BASS_ChannelSetPosition(mixer, 0, #BASS_POS_BYTE)
base=-12
EndIf
If base=Round(pos/52400,#PB_Round_Up)
Bass_ChannelGetData(chan, *in+44, pos%52400)
PokeL(*in+4, pos%52400+46-8) ; Size - 8
chan2.l = BASS_StreamCreateFile(#True, *in, 0, pos%52400+44, #BASS_STREAM_DECODE|#BASS_SAMPLE_FLOAT)
BASS_Mixer_StreamAddChannel(mixer, chan2, #BASS_STREAM_AUTOFREE|#BASS_MIXER_NORAMPIN)
base = -10
ElseIf base<0
ElseIf base<Round(pos/52400,#PB_Round_Up)
Bass_ChannelGetData(chan, *in+44, 52400)
PokeL(*in+4, 52400+46-8) ; Size - 8
chan2.l = BASS_StreamCreateFile(#True, *in, 0, 52444, #BASS_STREAM_DECODE|#BASS_SAMPLE_FLOAT)
BASS_Mixer_StreamAddChannel(mixer, chan2, #BASS_STREAM_AUTOFREE|#BASS_MIXER_NORAMPIN)
EndIf
EndProcedure
Procedure Main()
Shared chan.l, mixer.l,pos.q,base.l, chan2.l
BASS_Init(0, 44100,0,0,#Null)
mixer=BASS_Mixer_StreamCreate(44100, 2, #BASS_STREAM_DECODE|#BASS_MIXER_END|#BASS_SAMPLE_FLOAT)
chan.l = BASS_StreamCreateFile(#False, @filename, 0, 0, #BASS_STREAM_DECODE | #BASS_SAMPLE_FLOAT)
pos.q = BASS_ChannelGetLength(chan,#BASS_POS_BYTE)
I.BASS_CHANNELINFO
*in = AllocateMemory(52444) : base=0
If base=Round(pos/52400,#PB_Round_Up)
Bass_ChannelGetData(chan, *in+44, pos%52400)
Else
Bass_ChannelGetData(chan, *in+44, 52400)
EndIf
CopyMemory(?Wave32header, *in, 44)
PokeL(*in+24, 44100) ; Format
PokeL(*in+28, 44100*4*2) ; Speed
PokeW(*in+32, 4*2) ; BlockSize
PokeW(*in+34, 32) ; Bit
If base=Round(pos/52400,#PB_Round_Up)
PokeL(*in+4, pos%52400+46-8) ; Size - 8
chan2.l = BASS_StreamCreateFile(#True, *in, 0, pos%52400+44, #BASS_STREAM_DECODE|#BASS_SAMPLE_FLOAT)
Else
PokeL(*in+4, 52400+46-8) ; Size - 8
chan2.l = BASS_StreamCreateFile(#True, *in, 0, 52444, #BASS_STREAM_DECODE|#BASS_SAMPLE_FLOAT)
EndIf
BASS_ChannelSetSync(mixer, #BASS_SYNC_END| #BASS_SYNC_MIXTIME, 0, @EndSync(), 0); // set sync for end
BASS_Mixer_StreamAddChannel(mixer, chan2, #BASS_STREAM_AUTOFREE)
EndSync(0,0,0,0)
If BASS_ASIO_Init(0, #BASS_ASIO_THREAD)
BASS_ASIO_ControlPanel()
BASS_ASIO_ChannelEnable(0,0,@AsioProc(), @mixer)
BASS_ASIO_ChannelJoin(0,1,0)
BASS_ASIO_ChannelSetFormat(0,0,#BASS_ASIO_FORMAT_FLOAT)
BASS_ASIO_ChannelSetRate(0,0,44100)
BASS_ASIO_SetRate(44100)
BASS_ASIO_ChannelSetVolume(#False, 0, 1)
BASS_ASIO_Start(0)
While base>0 :Delay(1): Wend : Delay(100)
While BASS_ChannelIsActive(mixer) : Delay(1) : Wend
Bass_StreamFree(chan)
BASS_ASIO_Free()
BASS_Free()
EndIf
EndProcedure
Main()
End