FMOD Studio API module for LÖVE
This module adds support for the FMOD Studio API 2.01.01 (x64) in LÖVE (x64). Works with Windows and macOS for now. Pull requests are welcome.
Note: FMOD is not free, visit https://www.fmod.com/licensing for more info.
Download the fmodlove.dll/libfmodlove.dylib file and add it to the directory containing the main.lua file. Download the FMOD Studio API (2.01.01 / x64) and also add fmodstudio.dll/libfmodstudio.dylib /and fmod.dll/libfmod.dll to your game folder.
This project uses SCons. Navigate to the folder containing the SConstruct file and run:
scons platform=windows target=release fmod_api="C:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows"
Replace platform (windows, osx) and the fmod_api path with the path of your FMOD API installation.
fmod = require("fmodlove") // "libfmodlove" for macOS
to load the library. Make sure to add:
package.cpath = package.cpath .. ";?.dylib"
for macOS.
fmod.init(outputType, realChannels, virtualChannels,
studioInitFlags)
will create and initialize the Studio System. outputType
expects an integer, 0 should be fine in most cases. Change Real and Virtual Channels to your liking. Setting studioInitFlags to 1 will enable live update (check docs)
Returns false
if failed, true
if succeded.
fmod.update()
To update the Studio System (call it in love.update).
Returns false
if failed, true
if succeded.
fmod.setNumListeners(numOfListeners)
Returns false
if failed, true
if succeded.
fmod.setListener3DPosition(listenerIndex, posX, posY, posZ, dirX, dirY, dirZ, oX, oY, oZ)
If you have one listener the listenerIndex
is 0. dirX
dirY
dirZ
is the forward vector, oX
oY
oZ
the up vector.
Returns false
if failed, true
if succeded.
fmod.loadBank(bankPath, flags)
bankPath
is the path to the bank file. flags
(int) can be:
- FMOD_STUDIO_LOAD_BANK_NORMAL (0)
- FMOD_STUDIO_LOAD_BANK_NONBLOCKING (1)
- FMOD_STUDIO_LOAD_BANK_DECOMPRESS_SAMPLES (2)
- FMOD_STUDIO_LOAD_BANK_UNENCRYPTED (4)
Will return an index value to the bank.
Returns -1
if failed.
Use the returned value to unload the bank if necessary:
fmod.unloadBank(index)
Returns false
if failed, true
if succeded.
fmod.createInstance(eventPath)
Returns an index value to the EventInstance.
Returns -1
if failed. Use the index value to start the instance:
fmod.startIntance(index)
Returns false
if failed, true
if succeded.
fmod.stopInstance(index, stopMode)
stopMode
can be:
- FMOD_STUDIO_STOP_ALLOWFADEOUT (0)
- FMOD_STUDIO_STOP_IMMEDIATE (1)
Returns false
if failed, true
if succeded.
fmod.releaseInstance(index)
Returns false
if failed, true
if succeded. This will remove the instance from the index.
fmod.set3DAttributes(index, posX, posY, posZ, dirX, dirY, dirZ, oX, oY, oZ)
dirX
dirY
dirZ
is the forward vector, oX
oY
oZ
the up vector.
Returns false
if failed, true
if succeded.
fmod.playOneShot2D(eventPath)
Will automatically call EventInstance::release after starting. No need to take care of the instance.
Returns false
if failed, true
if succeded.
fmod.playOneShot3D(eventPath, posX, posY, posZ, dirX, dirY, dirZ, oX, oY, oZ)
It will automatically call EventInstance::release after playing. dirX
dirY
dirZ
is the forward vector, oX
oY
oZ
the up vector.
Returns false
if failed, true
if succeded.
fmod.setInstanceVolume(index, volume)
Returns false
if failed, true
if succeded.
fmod.isPlaying(index)
Returns false
if failed or not playing, true
if playing.
fmod.setInstancePaused(index, pauseState)
pauseState
should be true
or false
.
fmod.setInstancePitch(index, pitch)
Returns false
if failed, true
if succeded.
fmod.getTimelinePosition(index)
Returns the timeline position (int).
Returns -1
if failed.
fmod.setTimelinePosition(index, position)
Returns false
if failed, true
if succeded.
fmod.getInstanceRms(index)
Returns the RMS value of an instance.
Returns -1
if failed.
fmod.getGlobalParameterByName(parameterName)
Takes the parameter name and returns the parameter value.
Returns -1
if failed.
fmod.setGlobalParameterByName(parameterName, value, ignoreSeekSpeed)
ignoreSeekSpeed can be true or false.
Returns false
if failed, true
if succeded.
fmod.getParameterByName(instanceIndex, parameterName)
Takes the instance index and the parameter name and returns its value.
Returns -1
if failed.
fmod.setParameterByName(instanceIndex, parameterName, value, ignoreSeekSpeed)
Returns false
if failed, true
if succeded.
fmod.getBus(busPath)
Takes the bus path and returns an index to that bus. Use it to get or set the bus volume.
Returns -1
if failed.
fmod.getBusVolume(index)
Returns the bus volume.
Returns -1
if failed.
fmod.setBusVolume(index, volume)
Returns false
if failed, true
if succeded.
fmod.getVCA(vcaPath)
Takes the VCA path and returns an index value to that VCA. Use it to get or set the VCA volume.
Returns -1
if failed.
fmod.getVCAVolume(index)
Returns the VCA volume.
Returns -1
if failed.
fmod.setVCAVolume(index, volume)
Returns false
if failed, true
if succeded.
fmod = require("fmod_love")
function love.load()
initResult = fmod.init(0, 32, 128, 1)
bankIndex1 = fmod.loadBank("Desktop/Master.bank", 0)
bankIndex2 = fmod.loadBank("Desktop/Master.strings.bank", 0)
end
instance = fmod.createInstance("event:/OneShot")
fmod.set3DAttributes(instance, love.mouse.getX(), love.mouse.getY(), 0, 0,
-1, 0, 0, 0, 1)
fmod.startInstance(instance)
fmod.releaseInstance(instance)
fmod.playOneShot2D("event:/Player/OneShot")