BASS ASIO Sample about Gapless

Share your advanced PureBasic knowledge/code with the community.
User avatar
oryaaaaa
Addict
Addict
Posts: 825
Joined: Mon Jan 12, 2004 11:40 pm
Location: Okazaki, JAPAN

BASS ASIO Sample about Gapless

Post by oryaaaaa »

Share my code for you :D

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
ASIO2 Gapless. call add_mixer before END_SYNC

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
User avatar
oryaaaaa
Addict
Addict
Posts: 825
Joined: Mon Jan 12, 2004 11:40 pm
Location: Okazaki, JAPAN

Re: BASS ASIO Sample about Gapless

Post by oryaaaaa »

Sample Binary for test only
http://purebasic.coolverse.jp/bbs/downl ... .php?id=75

support WAV/AIFF/MP3/MP2/MP1/OGG
Exit Finish stream or Force kill process
output asio2 channel first only
User avatar
oryaaaaa
Addict
Addict
Posts: 825
Joined: Mon Jan 12, 2004 11:40 pm
Location: Okazaki, JAPAN

Re: BASS ASIO Sample about Gapless

Post by oryaaaaa »

NR3_Beta8.zip
http://purebasic.coolverse.jp/bbs/downl ... .php?id=80

required
SSE2 high speed CPU:Core2Duo 3GHz over
DAC Headphone AMP embed 8x oversampling digital filter
ASIO2 Audio driver
High grade headphone

support format
44.1/48 FLAC/WAV/OGG/MP3 only, and one file only.
coz Test player

Fature
Super up sampling outputs x1. x2. x4
44.1/48/88.2/96/176.4/192kHz 32FLOAT

Thanks
http://forum.purebasic.com/english/view ... 35&t=47679
Thanks "Wilbert in Netherlands"

have fun
User avatar
oryaaaaa
Addict
Addict
Posts: 825
Joined: Mon Jan 12, 2004 11:40 pm
Location: Okazaki, JAPAN

Re: BASS ASIO Sample about Gapless

Post by oryaaaaa »

I want to share code snippets
http://www.un4seen.com/forum/?topic=13888.0
marroh
User
User
Posts: 72
Joined: Wed Aug 06, 2008 8:21 am

Re: BASS ASIO Sample about Gapless

Post by marroh »

Thanks for share! :D
PureBASIC v5.41 LTS , Windows v8.1 x64
Forget UNICODE - Keep it BASIC !
Post Reply