Code archives/Audio/Realtime sound generation with fmod
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| This is a blitzmax port of the 'user generated sound' example from fmod, slightly modified. Requires Brucey's bah.fmod module. | |||||
SuperStrict
Framework BaH.FMOD
Import BRL.GLMax2d
Local system:TFMODSystem = New TFMODSystem.Create()
system.Init(32)
'Method CreateSound:TFMODSound(Mode:Int, exInfo:TFMODCreateSoundExInfo = Null)
Local channel:TFMODChannel=Null
Local result:Int=0
Local mode:Int=FMOD_2D|FMOD_OPENUSER|FMOD_LOOP_NORMAL|FMOD_HARDWARE
Local createsoundexinfo:TFMODCreateSoundExInfo=New TFMODCreateSoundExInfo
Local channels:Int=2
createsoundexinfo.SetDecodeBufferSize(44100) 'Chunk size of stream update in samples.This will be the amount of data passed To the user callback.
createsoundexinfo.SetLength(44100*channels*4*5) 'Length of PCM data in bytes of whole song (For Sound::getLength)
'4=length of short
createsoundexinfo.SetNumChannels(channels) 'Number of channels in the sound.
createsoundexinfo.SetDefaultFrequency(44100) 'Default playback rate of sound.
createsoundexinfo.SetFormat(FMOD_SOUND_FORMAT_PCM16) 'Data format of sound.
createsoundexinfo.SetPCMReadCallback (pcmreadcallback) 'User callback For reading.
createsoundexinfo.SetPCMSetPosCallback(pcmsetposcallback) 'User callback For seeking.
Local sound:TFMODSound=system.CreateSound(mode,createsoundexinfo)
If sound=Null
DebugLog "sound is null"
EndIf
Local key:Int=0
Local version:Int=0
'Play the sound
channel=system.PlaySound(FMOD_CHANNEL_FREE, sound, 0, Null)
Graphics 800, 600, 32
While Not KeyDown(KEY_ESCAPE)
Cls
DrawText "hello",100,100
system.Update()
Delay 10
Flip
Wend
system.Close()
system.SystemRelease()
End
Function pcmreadcallback:Int(sound:TFMODSound, data:Byte Ptr, dataLen:Int)
Local f1:Float=1600.0
Local f2:Float=2400.0
Local count:Int
Global f1phase:Float=0.0
Global f2phase:Float=0.0
Local stereo16bitbuffer:Short Ptr = Short Ptr (data);
For count=0 Until datalen Shr 2 ' shr2 = 16bit stereo (4 bytes per sample)
stereo16bitbuffer[count*2] = makeSignedShort( (Sin(f1phase) * 32767.0 ) ) 'Left channel
stereo16bitbuffer[count*2+1] = makeSignedShort( (Sin(f2phase) * 32767.0 ) ) 'Right channel
count:+1;
f1phase :+ 360.0*f1*(1.0/44100.0);
While f1phase>=360.0
f1phase:-360.0
Wend
f2phase :+ 360.0*f2*(1.0/44100.0);
While f2phase>=360.0
f2phase:-360.0
Wend
Next
Return FMOD_OK;
End Function
Function pcmsetposcallback:Int(sound:TFMODSound, subsound:Int, position:Int, posType:Int)
'This is useful If the user calls FMOD_Sound_SetPosition And you want To seek your data accordingly.
Return FMOD_OK;
End Function
Function makeSignedShort:Short(floatval:Float)
If (floatVal>0.0)
Return Short(floatVal)
Else
Return ( ~Short(Abs(floatval)) ) +Short(1)
EndIf
End Function |
Comments
| ||
| Hmmm...not sure what version of bah.fmod you're using, but I get an access violation at CreateSound (Line 28)... Local sound:TFMODSound=system.CreateSound(mode,createsoundexinfo) My bah.fmod is compiling and running fine and I just took it from the svn, so I should be up to date on it. I'm sure I'm missing to know something and I'm honestly pins'n'needles to learn. I, yet, havn't managed to get a smooth realtime buffer switch or roll with sound in blitzmax. Thanks in advance! You can't imagine how happy you'd make me! |
| ||
| Taron, Only just seen your post by chance because I am taking another look at streaming sound. Although I did get it working, there seemed to be a couple of seconds' latency even when I used a short buffer. I am revisiting this now, but I have done a reinstall and need to get things up and running myself. Let me know if you have had any success in the interim. Are you running in debug mode when you get this error? |
Code Archives Forum