Thanks for the comments. Code corrected.
Code: Select all
#DSBLOCK_ENTIREBUFFER = $2
#DSBLOCK_FROMWRITECURSOR=$1
IncludeFile "VST_PB.pbi"
Structure DSBUFFERDESC
dwSize.l
dwFlags.l
dwBufferBytes.l
dwReserved.l
*lpwfxFormat
guid3DAlgorithm.GUID
EndStructure
Global *m.Word, dsound.IDirectSound8, dsb.IDirectSoundBuffer, *effect.AEffect
Global bloksize.l;=512;
Global samplerate.f;=44100;
Global BPM.d=120
Debug BPM
Procedure HostInit(); /* initialize to sensible values */
samplerate = 44100
bloksize = 512;
vstTimeInfo\samplePos = 0.0;
vstTimeInfo\sampleRate = samplerate;
vstTimeInfo\nanoSeconds = 0.0;
vstTimeInfo\ppqPos = 0.0;
vstTimeInfo\tempo = BPM;
vstTimeInfo\barStartPos = 0.0;
vstTimeInfo\cycleStartPos = 0.0;
vstTimeInfo\cycleEndPos = 0.0;
vstTimeInfo\timeSigNumerator = 4;
vstTimeInfo\timeSigDenominator = 4;
vstTimeInfo\smpteOffset = 0;
vstTimeInfo\smpteFrameRate = 1; // 0:24, 1:25, 2:29.97, 3:30, 4:29.97 df, 5:30 df
vstTimeInfo\samplesToNextClock = 0;
vstTimeInfo\flags =0; #kVstTransportChanged|#kVstTransportPlaying;
EndProcedure
; открываем библы
If OpenLibrary(0, "dsound.dll") And OpenLibrary(1, OpenFileRequester("vst","d:\Program Files\VstPlugins\","VST (*.dll)|*.dll",0)); And GetWavHeader(wavFormat.WAVEFORMATEX, wavefile) And GetWavData(wavData.WAVDATA, wavefile)
; // Wave device And VST buffer cosntants
#T_FORMAT =#WAVE_FORMAT_PCM
#T_SAMPLERATE =44100
#T_CHANNELS =2
#T_BITS =16
#T_BLOCKALIGN =(#T_CHANNELS*#T_BITS/8); // 2*16/8 = 4
#T_BYTESPERSEC =(#T_SAMPLERATE*#T_BLOCKALIGN)
;// Total buffer size For 1 second worth of playback:
#T_WAVBUFSIZE =(#T_SAMPLERATE*#T_BLOCKALIGN)*10
#T_UPDATESPERSEC =10; // Which gives me 10 playback "pages"
#T_BLOCKSIZE =(#T_SAMPLERATE/#T_UPDATESPERSEC); // 4410 samples
#T_DELAY =(1000/#T_UPDATESPERSEC); // 100 ms timer delay
#NUM_BUFFERS = 5
Global wavFormat.WAVEFORMATEX
wavFormat\wFormatTag = #T_FORMAT;
wavFormat\nChannels = #T_CHANNELS;
wavFormat\nSamplesPerSec = #T_SAMPLERATE;
wavFormat\wBitsPerSample = #T_BITS;
wavFormat\nBlockAlign = #T_BLOCKALIGN;(wavFormat\wBitsPerSample * wavFormat\nChannels / 8);
wavFormat\nAvgBytesPerSec = #T_BYTESPERSEC;wavFormat\nSamplesPerSec * wavFormat\nBlockAlign;
wavFormat\cbSize = 0;SizeOf(wavFormat);
Else
MessageRequester("Error","Can't open VST plugin ",0)
End
EndIf
HostInit()
; If
;Debug "LEN>"+Str(@len)
hwnd = OpenWindow(0,0,0,80,80,"Sound", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
hwnd2=OpenWindow(2,0,0,800,600,"vst", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
CallFunction(0,"DirectSoundCreate8",0,@dsound,0)
dsound\SetCooperativeLevel(hwnd,1)
desc.DSBUFFERDESC\dwSize = SizeOf(DSBUFFERDESC)
desc\dwBufferBytes = #T_WAVBUFSIZE
desc\lpwfxFormat = @wavFormat
dsound\CreateSoundBuffer(@desc,@dsb,0)
sampleFrames = #T_WAVBUFSIZE / 4
Debug sampleFrames
main=Get_Main(1)
If main
*myAEffect.AEffect = CallCFunctionFast(main, @VST_CallBack())
Else
Debug "Not VTS"
End
EndIf
*myAEffect\Dispatcher(*myAEffect, #effOpen,0,1,#Null, 0.0)
*myAEffect\Dispatcher(*myAEffect, #effMainsChanged,0,0,#Null, 0.0)
*myAEffect\Dispatcher(*myAEffect, #effSetSampleRate,0,0,#Null, samplerate)
*myAEffect\Dispatcher(*myAEffect, #effSetBlockSize,0,sampleFrames,#Null, 0.0)
*myAEffect\Dispatcher(*myAEffect, #effMainsChanged,0,1,#Null, 0.0)
*myAEffect\Dispatcher(*myAEffect, #effEditOpen,0,0,hwnd2, 0.0)
;**************************************************
; создание окна
VST_getRect(@ERect)
*myAEffect\Dispatcher(*myAEffect, #effEditGetRect, 0, 0, @ERect, 0.0)
Debug "res " +Str(res)
*rec.ERect=ERect
ResizeWindow(2,#PB_Ignore,#PB_Ignore,*rec\left+*rec\right,*rec\bottom+*rec\top)
;*************************************************************************************
If *myAEffect\numInputs>0
Global Dim in.l(*myAEffect\numInputs-1)
Global Dim leftIn.f(sampleFrames-1)
Global Dim rightIn.f(sampleFrames-1)
If *myAEffect\numInputs>2
in(0) = leftIn()
in(1) = rightIn()
EndIf
EndIf
;**********************
Global Dim out.l(*myAEffect\numOutputs-1)
Global Dim leftOut.f(sampleFrames-1)
Global Dim rightOut.f(sampleFrames-1)
If *myAEffect\numOutputs>2
For i=0 To 1
out(0+n) = leftOut()
out(1+n) = rightOut()
n=n+2
Next
Else
out(0) = leftOut()
out(1) = rightOut()
EndIf
#channels=2
Structure SOUND_BUFFER ; channels, each 16 bit
channel.w[#channels]
EndStructure
Global *Buffer.SOUND_BUFFER
; dsb\Play(0, 0, $1)
Procedure PlayThread(play)
dsb\Play(0, 0, $1)
While play=0
;Debug "."
dsb\Lock(0,0,@m,@len,0,0,#DSBLOCK_ENTIREBUFFER)
*Buffer = m
If *myAEffect\flags & #effFlagsCanReplacing
*myAEffect\ProcessReplacing(*myAEffect,@in(), @out(), sampleFrames)
Else
*myAEffect\Process(*myAEffect,@in(), @out(), sampleFrames)
EndIf
Debug *myAEffect
For i = 0 To sampleFrames-1
*Buffer\channel[0]=leftOut(i)* 32768.0
*Buffer\channel[1]=rightOut(i)* 32768.0
*Buffer + SizeOf(SOUND_BUFFER)
Next
dsb\UnLock(m,len,0,0)
Wend
EndProcedure
;CreateThread(@PlayThread(),0)
Repeat
event= WaitWindowEvent(1)
*myAEffect\Dispatcher(*myAEffect, #effEditIdle, 0, 0,#Null, 0.0)
;*************************************************************************************
;
dsb\Lock(0,0,@m,@len,0,0,#DSBLOCK_ENTIREBUFFER)
*Buffer = m
If *myAEffect\flags & #effFlagsCanReplacing
*myAEffect\ProcessReplacing(*myAEffect,@in(), @out(), sampleFrames)
Else
*myAEffect\Process(*myAEffect,@in(), @out(), sampleFrames)
EndIf
;
For i = 0 To sampleFrames-1
*Buffer\channel[0]=leftOut(i)* 32768.0
*Buffer\channel[1]=rightOut(i)* 32768.0
*Buffer + SizeOf(SOUND_BUFFER)
Next
dsb\UnLock(m,len,0,0)
dsb\Play(0, 0, 1)
Until event = #PB_Event_CloseWindow
*myAEffect\Dispatcher(*myAEffect, #effEditClose, 0, 0,#Null, 0.0)
*myAEffect\Dispatcher(*myAEffect, #effClose,0,0,#Null, 0.0)
dsb\Stop()
dsb\Release()
dsound\Release()
CloseLibrary(1)
CloseLibrary(0)