Optimized small tuning for hi-quality sound.
- need bass.dll, bassflac.dll, basswasapi.dll (execute folders)
- need bass.lib, bassflac.lib, basswasapi.lib (source code folders)
- need Compile option [CPU with MMX]
44100 replace to 96000, You can play Hi-Res 96k music file.
Thank you and have fun.
Code: Select all
; oryaaaaa player : WASAPI EXCLUSIVE OUTPUT SAMPLE CODE
; Copyright(c) Hiroyuki Yokota (oryaaaaa) from 2018.09.06
; PureBasic 5.62 x64
; need x64 SSE4.1 CPU
; Import BASS libraly
; ;BASS 2.4 C/C++ header file, copyright (c) 1999-2018 Ian Luck.
; ;Please report bugs/suggestions/etc... To bass@un4seen.com
; ;
; ;See the BASS.CHM file for implementation documentation
; ;
; ;BASS v2.4 include for PureBasic v4.20
; ;C to PB adaption by Roger "Rescator" Hagensen, 27th March 2008, http://EmSai.net/
;
; ;Needed by some code in this include and various other BASS sourcecodes.
#BASS_SAMPLE_SOFTWARE = 16
#BASS_SAMPLE_FLOAT = 256
#BASS_STREAM_PRESCAN = $20000
#BASS_STREAM_DECODE = $200000
#BASS_POS_BYTE =0
CompilerIf #PB_Compiler_OS = #PB_Compiler_Unicode
#BASS_UNICODE = $80000000
#BASS_CONFIG_UNICODE = 42
CompilerElse
#BASS_UNICODE = 0
#BASS_CONFIG_UNICODE = 0
CompilerEndIf
Import "bass.lib" ; BASS.zip folder C x64 lib and x64 dll and copy to .pb folders
BASS_Init.l(device.l,Freq.l,flags.l,win.l,*dsguid)
BASS_Free.l()
BASS_StreamCreateFile.l(mem.l,*file,offset.q,length.q,flags.l)
BASS_StreamFree.l(handle.l)
BASS_ChannelGetLength.q(handle.l,mode.l)
BASS_ChannelGetPosition.q(handle.l,mode.l)
BASS_ChannelGetData.l(handle.l,*buffer,length.l)
EndImport
; End Import BASS libraly
; Import BASS Plugins
#BASS_WASAPI_EXCLUSIVE = 1
#BASS_ERROR_UNKNOWN = -1
Import "basswasapi.lib" ; basswasapi.zip folder C x64 lib and x64 dll and copy to .pb folders
BASS_WASAPI_Init.b(device.i, Freq.l, chans.l, flags.l, Buffer.f, period.f, *proc, *User)
BASS_WASAPI_Free.b()
BASS_WASAPI_Start.b()
BASS_WASAPI_Stop.b(reset.b)
BASS_WASAPI_CheckFormat.l(device.i, Freq.l, chans.l, flags.l)
BASS_WASAPI_PutData.l(*buffer, length.l)
EndImport
Import "bassflac.lib" ; bassflac.zip folder C x64 lib and x64 dll and copy to .pb folders
BASS_FLAC_StreamCreateFile.l(mem.l,*file,offset.q,length.q,flags.l)
EndImport
Global WASAPI_device_format.i
!XOR Rax, Rax
!MOVNTI [v_WASAPI_device_format], Rax
WASAPI_device_format = BASS_WASAPI_Checkformat(-1, 44100, 2, #BASS_WASAPI_EXCLUSIVE)
If WASAPI_device_format = #BASS_ERROR_UNKNOWN ; If you use USB-DAC devices?
MessageRequester("ERROR 1", "I can't setup Wasapi 44.1kHz device.", #PB_MessageRequester_Error)
End
EndIf
Macro NOP_bx_cx_ax_dx
!NOP bx
!NOP Ebx
!NOP cx
!NOP Ecx
!NOP R8w
!NOP R8d
!NOP R10w
!NOP R10d
!NOP ax
!NOP Eax
!NOP dx
!NOP Edx
!NOP R9w
!NOP R9d
!NOP R11w
!NOP R11d
EndMacro
Macro XCHG_bx_cx_ax_dx
!XCHG bh, bl
!XCHG bl, bh
!XCHG Ebx, Ebx
!XCHG ch, cl
!XCHG cl, ch
!XCHG Ecx, Ecx
!XCHG R8w, R8w
!XCHG R8d, R8d
!XCHG R10w, R10w
!XCHG R10d, R10d
!XCHG ah, al
!XCHG al, ah
!XCHG Eax, Eax
!XCHG dh, dl
!XCHG dl, dh
!XCHG Edx, Edx
!XCHG R9w, R9w
!XCHG R9d, R9d
!XCHG R11w, R11w
!XCHG R11d, R11d
EndMacro
Global *bufferDecode
Global WasapiPos.q, pos.q
Procedure.l WasapiProc(*buffer, length.l, *user)
NOP_bx_cx_ax_dx
XCHG_bx_cx_ax_dx
Protected result.l
!MOVNTDQA xmm0, [p.p_buffer] ; SSE4.1
CopyMemory(*bufferDecode+WasapiPos, *buffer, length) ; or very light memory copy process
!MOVNTDQA xmm0, [p.p_buffer] ; SSE4.1
result = length : WasapiPos + result
!XOR Rax, Rax
ProcedureReturn result
!HLT
EndProcedure
BASS_Init( 0, 44100, 0, 0, 0)
filename.s = OpenFileRequester("Open Audio WAV/FLAC files", "*.*" , "*.WAV;*.FLAC|*.WAV;*.FLAC",0)
If Right(UCase(filename), 4)=".WAV"
chan.l = BASS_StreamCreateFile(#False, @filename, 0, 0, #BASS_UNICODE | #BASS_STREAM_DECODE | #BASS_SAMPLE_FLOAT | #BASS_STREAM_PRESCAN | #BASS_SAMPLE_SOFTWARE)
ElseIf Right(UCase(filename), 5)=".FLAC"
chan.l = BASS_FLAC_StreamCreateFile(#False, @filename, 0, 0, #BASS_UNICODE | #BASS_STREAM_DECODE | #BASS_SAMPLE_FLOAT | #BASS_STREAM_PRESCAN | #BASS_SAMPLE_SOFTWARE)
Else
BASS_Free()
MessageRequester("ERROR 2", "I can't load music file.", #PB_MessageRequester_Error)
End
EndIf
If Not chan
BASS_Free()
MessageRequester("ERROR 3", "I can't load music file.", #PB_MessageRequester_Error)
End
EndIf
Debug "Start music player"
pos.q = BASS_ChannelGetLength(chan,#BASS_POS_BYTE)
*bufferDecode = AllocateMemory(pos)
;
Debug "Finished Intialize Buffer"
;
Bass_ChannelGetData(chan, *bufferDecode, pos)
pos2.q = BASS_ChannelGetPosition(chan,#BASS_POS_BYTE)
If Not pos=pos2
BASS_Free()
MessageRequester("ERROR 4", "I can't decode music file.", #PB_MessageRequester_Error)
End
EndIf
BASS_StreamFree(chan)
Debug "Finished decode music file."
BASS_Free()
; ; ; CreateFile(1, "C:\music.raw")
; ; ; WriteData(1, *bufferDecode, pos)
; ; ; CloseFile(1) ; Audacity, use Import Raw 32bit-FLOAT 2ch LitteleEdian
;ptA WasapiResult.b = BASS_WASAPI_Init(-1, 44100, 2, 0, 6, 0, 0, 0) ; 6 seconds buffer
;ptB WasapiResult.b = BASS_WASAPI_Init(-1, 44100, 2, #BASS_WASAPI_EXCLUSIVE, 0.4, 0, @WasapiProc(), 0)
WasapiResult.b = BASS_WASAPI_Init(-1, 44100, 2, #BASS_WASAPI_EXCLUSIVE, 0.4, 0, @WasapiProc(), 0)
If Not WasapiResult
MessageRequester("ERROR 5", "I can't initialize wasapi device.", #PB_MessageRequester_Error)
End
EndIf
BASS_WASAPI_Start()
;ptA For pos3.q=0 To pos Step 44100*8*6
;ptA BASS_WASAPI_PutData(*bufferDecode+pos3, 44100*8*6)
;ptA Delay(6000) ; have gap noise
;ptA Next
;ptB Delay(90000) ; 90.000 sec
Delay(IntQ(pos/(44100*8))*1000) ; 1 songs time
BASS_WASAPI_Stop(#True)
BASS_WASAPI_Free()
FreeMemory(*bufferDecode)
Debug "END"
End