Windows Fmod example?
BlitzMax Forums/BlitzMax Programming/Windows Fmod example?
| ||
| Any about? I got svieung's Fmod release, it compiled fine, but the only example I could find was for a mac alteration. But once converted to windows (I.e changing sound output driver), it doesn't load anything. Returns null. |
| ||
| this one worked for me. http://drago-tech.net/FmodWin32.zip from this thread. http://www.blitzbasic.com/Community/posts.php?topic=49584 |
| ||
| The download link doesn't seem to work. Is there another working one? |
| ||
| Hello and I'm very sorry for not including a sample. I've uppdated the Fmod module and included a sample. Still some issues with the asio-driver. Will fix this later. FMOD 3.74 Regards Sveinung |
| ||
| Thanks sven. I found the problem though. FSound_Stream_Play expects a C Formatted string, but you use a regular string. I changed the mod def from filename:String to fileName:Byte ptr, and in blitz used FSound_Stream_Load("title.mp3".toCString() ) (A build in blitz func) and it then worked fine. Here's my audio lib, now with Fmod support. It can load two custom formats, one compressed, one streaming(Streaming using blitz's own sound funcs from disk), and it can also stream/utilise fmod. it's all done by the lib, usage is similar to blitz's own 2d stuff, but this includes a proper 2d 'ear' system that takes rotation into account.
Strict
Const iForm = SF_Mono16BE
Global StreamBufSize = BytesperSample[iForm]*80000
Global chaloc[128]
Function requestChannel()
For Local j=1 To 127
If Not chaloc[j]
chaloc[j]=True
Return j
EndIf
Next
Return -1
End Function
Function freeChannel( chan )
chaloc[chan]=0
End Function
Type sound
Field chan:TChannel,frm:Sfx
Field x#,y#
Field loop,scal#
Field xu:Float Ptr,yu:Float Ptr
Field isStream
Field sPos,sBuf:Byte Ptr,bStr:Tramstream
Field sAud:TAudioSample
Field fChan,isfMod,chanId
Method New()
ListAddLast sound.sounds,Self
scal=1
xu=Null
yu=Null
End Method
Method Delete()
If ListContains(sound.sounds,Self)
ListRemove sound.sounds,Self
End If
If isStream
MemFree sBuf,StreamBufSize
EndIf
If frm.isFmod
freeChannel( chanId )
End If
End Method
Method Position( ax#,ay# )
x=ax
y=ay
End Method
Method updatePars( xp:Float Ptr,yp:Float Ptr )
xu = xp
yu = yp
End Method
Method stop()
If isfMod
If chanid<>0
If Not playing()
fsound_stopsound( chanid )
chanid=0
EndIf
EndIf
Return
EndIf
If chan=Null Return
If ChannelPlaying(chan) StopChannel( chan )
End Method
Method SyncData()
If frm.isFmod
If chanid=0
Return
EndIf
If Fsound_isplaying( fChan ) = False
If loop
fChan = fsound_Stream_play(chanId,frm.fstream)
If fchan=-1
Print "Failed to loop music stream."
End
EndIf
Else
freeChannel( chanId )
chanId=0
EndIf
EndIf
Return
EndIf
If chan = Null Or ChannelPlaying( chan ) = False
If isStream
If sBuf = Null
sBuf = MemAlloc( StreamBufSize )
bStr = CreateRamStream( sbuf,StreamBufSize,True,True )
EndIf
Print "Streaming new Dat"
Local res=False
SeekStream( bstr,0 )
Local csiz = streambufSize
If StreamPos(frm.audstream)+cSiz>StreamSize(frm.audStream)
cSiz = StreamSize(frm.audStream)-StreamPos(frm.audstream)
res=True
EndIf
For Local j=0 To csiz-1
WriteByte bstr,ReadByte(frm.audStream)
Next
If Eof(frm.audStream) Or res=True
SeekStream frm.audStream,12
EndIf
sAud = CreateStaticAudioSample( sbuf,csiz/BytesPerSample[frm.aformat],frm.ahertz,frm.aformat )
Local na:TSound = LoadSound( sAud )
chan = PlaySound( na )
Else
If loop
chan = PlaySound( frm.id )
Else
ListRemove sound.sounds,Self
EndIf
EndIf
End If
End Method
Method sync()
SyncData()
If isFMod=True And chanId=0
Return
End If
If xu<>Null
x=xu[0]
y=yu[0]
EndIf
Local xd#,yd#
Local tx#,ty#
Local nx#,ny#
tx = sfx.ex - x
ty = sfx.ey - y
Local vr# = 360-sfx.eyaw
nx=Cos (vr)*tx - Sin (vr)*ty
ny=Sin (vr)*tx + Cos (vr)*ty
tx = sfx.ex+nx
ty = sfx.ey+ny
xd = tx-sfx.ex
yd = ty-sfx.ey
Local td# = 1.0-(Sqr(xd*xd+yd*yd)/sfx.er)
If td>1 td=1
If td<0 td=0
Local axd# = xd
Local ps# = -(xd/sfx.er)
If ps<-1 ps=-1
If ps>1 ps =1
If frm.isfMod
fsound_setVolume( chanid,td*255 )
fsound_setpan( chanid,128+128*ps )
fsound_setfrequency( chanid,frm.ffreq*scal )
Return
EndIf
SetChannelVolume chan,td
SetChannelRate chan,scal
SetChannelPan chan,ps
End Method
Method Playing()
If frm.isfmod
If frm.fStream<>0
If FSound_stream_getposition(frm.fstream)=>fSound_Stream_getLength(frm.fstream)
Return False
EndIf
Return True
Else
Return FSound_isplaying( chanId )
EndIf
EndIf
Return ChannelPlaying(chan)
sync()
End Method
Function Scale(scal#)
For Local snd:Sound = EachIn sound.sounds
snd.scal = scal
snd.sync()
Next
End Function
Function update()
For Local snd:Sound = EachIn sounds
snd.sync()
Next
End Function
Global sounds:TList
End Type
sound.sounds = CreateList()
sfx.scache = CreateList()
Type sfx
Global sCache:TList
Field id:TSound,loop
Field filename:String
Field raw:TAudioSample
Field isStream
Field aHertz,aLength
Field ffreq
Field audStream:Tstream,aformat
Field isfmod,fStream
Method fromStream( str:TStream )
isStream=True
audStream = str
ahertz = Readint(str)
alength = Readint(str)
aformat = Readint(str)
End Method
Function Load:sfx(File:String,dloop=True,andRaw=False)
For Local sn:Sfx = EachIn sfx.scache
If sn.filename = file
Return sn
EndIf
Next
Local out:sfx = New sfx
Select ExtractExt(file).tolower()
Case "mp3","ogg","wav"
out.isFMod=True
out.fStream = FSOUND_Stream_Open(file.tocstring(),FSOUND_NORMAL,0,0)
Case "stream"
Local fil:tstream = ReadFile(File)
If fil=Null
Throw "streamabe file not found "+file
EndIf
Local out:Sfx = New sfx
out.FromStream( fil )
Return out
Case "buck"
Try
Local bstream:Buckstream = createbuckstream( file )
out.id = LoadSound( bstream.stream() )
Catch s$
Notify s
End
End Try
If out.id=Null
Return Null
Else
Print "Buckets go now."
EndIf
FlushMem
Case "freeWav"
out.id = LoadSound(file )
If out.id = Null
FlushMem
Return Null
EndIf
out.isstream=False
If andRaw
out.raw = LoadAudioSample( file )
'out.raw=out.raw.convert( iForm )
EndIf
End Select
out.filename = file
out.loop=dloop
ListAddLast sfx.scache,out
Return out
End Function
Method SaveAudioStream( file:String )
If raw = Null
Throw "No raw audio sample to save."
EndIf
Local fil:TStream = WriteFile( file )
Local buf:Byte Ptr = raw.samples
Local pos
Local plen = raw.length*bytespersample[ iform ]
WriteInt fil,raw.hertz
WriteInt fil,raw.length
WriteInt fil,raw.format
Local ist:TRamstream =CreateRamStream( buf,raw.length*BytesPerSample[ iform],True,False )
CopyStream( ist,fil )
CloseFile fil
End Method
Method Play:sound(ax#,ay#)
Local out:Sound = New sound
If isFmod
If fStream<>0
out.chanId = requestChannel()
out.fchan= fsound_stream_play(out.chanId,fstream)
out.isfmod=True
ffreq = fsound_GetFrequency( out.chanId )
Print "Frequency was:"+ffreq
If out.fchan = -1
Print "Audio failed to stream."
End
EndIf
EndIf
Else
If isStream
out.isStream=True
Else
out.chan = PlaySound( id )
EndIf
EndIf
out.loop = loop
out.frm = Self
out.sync()
FlushMem
Return out
End Method
Function setEar(x#,y#,yaw#=0)
ex=x
ey=y
eyaw=yaw
End Function
Global er#
Global ex#,ey#
Global eYaw#
End Type
sfx.er=200
Type buckStream
Field str:TRamstream
Field raw:Byte Ptr,siz
Method Delete()
MemFree raw,siz
End Method
Method stream:TRamstream()
Return str
End Method
End Type
Function CreateBuckStream:BuckStream( file:String )
Local fil:tstream = ReadFile(file)
If fil = Null
Throw "File does not exist "+File+" filesize:"+FileSize(file)
End If
Local osiz = Readint(fil)
Local csiz = Readint(Fil)
Local raw:Byte Ptr = MemAlloc( csiz )
Local real:Byte Ptr = MemAlloc( osiz )
Local rs1:TRamStream = CreateRamStream(raw,csiz,False,True)
CopyStream(fil,rs1)
uncompress real,osiz,raw,csiz
MemFree raw,csiz
CloseStream fil
CloseStream rs1
rs1=CreateRamStream( real,osiz,True,False)
Local out:Buckstream = New buckstream
out.raw = real
out.str = rs1
out.siz=osiz
Return out
End Function
Global vb:Byte Ptr
Function initBufSys()
vb = MemAlloc( streambufSize )
End Function
Function CreateSoundBuck( file:String )
Local fil:TStream=ReadFile(file)
If fil = Null
Throw "File does not exist "+File
EndIf
Local siz=StreamSize( fil )
Local raw:Byte Ptr =MemAlloc( FileSize( file ) )
Local com:Byte Ptr =MemAlloc( FileSize( file ) )
Local dlen=siz
Local iStream:TRamstream = CreateRamStream( raw,FileSize(file),True,True )
CopyStream( fil,istream )
compress com,dlen,raw,siz
CloseStream fil
MemFree raw,siz
fil = WriteFile( ExtractDir( file)+"\"+StripAll(file)+".buck")
If fil=Null
Throw "Unable to write buck file "+ExtractDir(file)+StripAll(file)+".buck"
EndIf
CloseStream istream
istream = CreateRamStream( com,dlen,True,False )
WriteInt fil,siz
WriteInt fil,dlen
CopyStream(istream,fil)
CloseStream fil
CloseStream istream
MemFree com,siz
' Print "Was "+siz+" Bytes |"+String(siz/1024)+"K"
' Print "Is "+dlen+" Bytes |"+String(dlen/1024)+"K"
' Print "Saved :"+String((siz/1024)-(dlen/1024))+" K"
End Function
Fsound_init(44100,64,0)
FSOUND_SetOutput(FSOUND_OUTPUT_DSOUND) ' Ensure you use FSOUND_OUTPUT_MAC
FSOUND_SetDriver(0)
Rem
Local ac:Sound
Local sf:Sfx
Graphics 640,480,0
Local sx# = 20
Local sy# = 20
sf = Sfx.Load("sfx\music\title.mp3",True,False)
ac:Sound = sf.play( sx,sy )
Local t=0
Repeat
Cls
sx=MouseX()
sy=MouseY()
ac.position( sx,sy )
sfx.ex=320
sfx.ey=240
t=t+1
If t=20
sound.update()
t=0
EndIf
sfx.eyaw:-90
DrawLine 320,240,320+Cos(sfx.eyaw-45)*sfx.er,240+Sin(sfx.eyaw-45)*sfx.er
DrawLine 320,240,320+Cos(sfx.eyaw+45)*sfx.er,240+Sin(sfx.eyaw+45)*sfx.er
sfx.eyaw:+90
sfx.eyaw=MouseZ()*7
DrawRect sfx.ex-10,sfx.ey-10,20,20
DrawRect sx-10,sy-10,20,20
Delay 10
FlushMem
Flip
Until KeyDown(KEY_ESCAPE)
End Rem
|
| ||
| Ok, I can't seem to get this FMOD thing to work. I got the FMOD dlls and put them in same directory as the bmx file, but it still says "Require FMOD.DLL"...need to reinstall.... Did I miss a step? |
| ||
| One small error in Sveinung FMod Module: Function FSOUND_GetIsPlaying:Byte(channel:Int) should be Function FSOUND_IsPlaying:Byte(channel:int) |
| ||
| Yeah, HC I fixed that one already. Neuro, all I did was copy the lib Files into the fmod module folder, THEN compile mods, then copy teh .dll flder into my app dir. Worked fine. |
| ||
| How about updating the fmod thread in one place with the fixes? I think that will be a nice thing. Also they really should host user mods here at blitz research if they happen to be spectacular like FMOD |
| ||
| I'm still having problmes with this. This is what I did : - copied the fmod stuff into the pub.mod folder - compiled the mods - copied the the 2 fmod dlls (fmodex.dll) and (fmodexp.dll) into the same folder of my bmx app - run the app and still got the message. so i changed one of the dll file names to fmod.dll and then got some entry point error... Any other steps i should take? |
| ||
| @Nuero I think you need to Build Module (Alt + D on win32). You should allso put the libfmod.a in the lib folder in the blitzmax folder. Sveinung |
| ||
| New update... Check main Fmod tread Sveinung |
| ||
| I think you need to Build Module (Alt + D on win32). Can you clairify? I already ran the BMK tool to rebuild all the modules. Its when I'm running my test app, it tells me that fmod.dll is not found. The strange thing is that the only dlls that come with the fmod api are (fmodex.dll) and (fmodexp.dll). |