Use your amazing powers to get this working then, Superduck. I'm sure it's a flushmem() problem.
Framework brl.glmax2d
'----------------------
Import brl.retro
Import brl.blitz
Import brl.freeaudioaudio
'Import brl.oggloader 'causes probs with fmod on mac, thats why I had to use framework. Any help?
Import brl.system
Import pub.fmod
Import brl.keycodes
Import brl.standardio
Global slider_list:TList=CreateList()
sample_rate=44100
dt#=1.0/Float(sample_rate)
Type toneinfo
Field amp# 'Max 32767
Field dphase#
Field phase#=0.0
Function create:toneinfo(freq#,amp#,dt#,chan:String)
temp:toneinfo=New toneinfo
temp.dphase=360.0*freq*dt
temp.amp=amp
Select chan
Case "l"
DebugLog "creating tone on left channel"
l_tone_list.addlast(temp)
Case "r"
DebugLog "creating tone on right channel"
r_tone_list.addlast(temp)
Default
DebugLog "no channel assigned"
temp=Null
EndSelect
Return temp
End Function
End Type
Global l_tone_list:TList=CreateList()
Global r_tone_list:TList=CreateList()
Function makesignedshort:Short(float_num#)
x=Long(float_num)
val_bits:Short=Short(x&%0111111111111111)
sign_bit:Short=Short((x Shr 16)&%1000000000000000)
short_val:Short=Short(sign_bit|val_bits)
Return short_val
End Function
Function FMOD_Stream_Callback(stream:Byte Ptr, buff:Byte Ptr, length:Int, userdata:Byte Ptr)
Local snd_ptr:Short Ptr=Short Ptr(buff)
For n=0 To (length/4)-1
l_sound#=0.0
r_sound#=0.0
For l_tone:toneinfo=EachIn l_tone_list
l_sound:+l_tone.amp*Sin(l_tone.phase)
l_tone.phase:+l_tone.dphase
Next
For r_tone:toneinfo=EachIn r_tone_list
r_sound:+r_tone.amp*Sin(r_tone.phase)
r_tone.phase:+r_tone.dphase
Next
snd_ptr[0]=makesignedshort(l_sound) 'Left speaker
snd_ptr[1]=makesignedshort(r_sound) 'Right speaker
snd_ptr:+2
Next
l_tone.phase:Mod 360.0
r_tone.phase:Mod 360.0
FlushMem()
Return 1
End Function
Local CallbackPtr:Byte Ptr = FMOD_Stream_Callback
Graphics 800,600
?Mac
FSOUND_SetOutput(FSOUND_OUTPUT_MAC)
?
FSOUND_SetDriver(0)
If Not FSOUND_Init(44100, 16, 0)
Print "error"
EndIf
toneinfo.create(100.0,32000.0,dt,"l")
toneinfo.create(107.83,32000.0,dt,"r")
Local stream:Int = FSOUND_Stream_Create(CallbackPtr, 6*2048, FSOUND_NORMAL|FSOUND_16BITS|FSOUND_STEREO, 44100, Null)
FSOUND_Stream_Play(FSOUND_FREE, stream)
If (FSOUND_Stream_Play(FSOUND_FREE, NSFStream) = -1)
Print("Error!")
EndIf
Tslider.create(10,100,600,20,0,100,50)
While Not KeyHit(KEY_ESCAPE)
Cls
Tslider.draw_all()
FlushMem()
Flip()
Wend
FSOUND_Stream_Close(stream)
FSOUND_Close()
End
Type Tslider
Field x#,y#
Field width#,height#
Field minval#,maxval#
Field val#
Field colr#=200,colg#=200,colb#=200
Function create:Tslider(x#,y#,width#,height#,minval#,maxval#,startval#)
temp:Tslider=New Tslider
temp.x=x
temp.y=y
temp.width=width
temp.height=height
temp.minval=minval
temp.maxval=maxval
temp.val=startval
ListAddLast(slider_list,temp)
Return temp
End Function
Function draw_all()
For s:Tslider=EachIn slider_list
SetColor s.colr,s.colg,s.colb
DrawRect s.x,s.y,s.width,s.height
SetColor 1.0,1.0,1.0
DrawRect s.pos_at_val(s.val),s.y,1.0,s.height
Next
End Function
Method pos_at_val(value#)
pos#=Self.x+((value-Self.minval)/(Self.maxval-Self.minval))*Self.width
Return pos
End Method
End Type
'No
|