Hello. I hope someone can help me out.
We are using the RMS values from voice events to automate the mouth movements of some simple characters. We have no problem getting this to function; the code seems good, and it works wonderfully.
However, if you turn down the in game volume such that the voices are no longer audible, then the mouths no longer animate. The volume settings drive global parameters which, in turn, drive gains on the sfx, ambience, music, voice & master busses. So, to be clear, the volume of the events themselves are not being touched, so the signal is (or should be) still present along the entire instance dsp chain.
I suspect that it is to do with virtualisation; presumably these events are being virtualized immediately since they are not actually producing any audio (by the time it reaches the mixer) - so have ~0 audibility perhaps? Checking the event’s isVirtual flag always returns false, though I may be checking the wrong thing?
I need the player to be able to turn down the voices without it disrupting the mouth animations - any idea how I can achieve this? Can I set a flag to stop instance’s being virtualized? And how can I verify if this is indeed the cause?
Thanks for your time folks,
Damion.
1 Like
Hi,
Could I please grab your Unity and FMOD Integration versions?
How are you retrieving the RMS values? We could do something like this: Unity Integration | Examples Dsp Capture and rather than placing the DSP on the master bus we could put it on either specific character master tracks or on a character VO bus.
Using the FMOD Studio | Event Macro Controls Reference - Priority system, setting VO events to Highest priority will stop them from ever being made virtual.
Setting the priority of the events that actually contained the instruments (which were referenced events) to highest worked! Thanks 
But responding to the rest:
Unity: 6.3
FMOD: 2.03.09
We aren’t using the mixer. We are grabbing the value from event instances. Code for getting the values is as follows. There are multiple chars talking at once so bus is no good as a solution. In any case, like I said, it functions great.
private void EnableMetering()
{
_dsp = GetMeteredHeadDSP(_sound.FMODInstance);
}
private void DisableMetering()
{
_dsp.setMeteringEnabled(false, false);
_dsp.release();
}
private static DSP GetMeteredHeadDSP(EventInstance instance)
{
if (instance.getChannelGroup(out var channelGroup) != RESULT.OK)
{
return new DSP();
}
channelGroup.getDSP(CHANNELCONTROL_DSP_INDEX.HEAD, out var dsp);
dsp.setMeteringEnabled(false, true);
return dsp;
}
private float GetRMS(DSP dsp)
{
dsp.getMeteringEnabled(out _, out var enabled);
if (!enabled)
{
EnableMetering();
return 0f;
}
dsp.getMeteringInfo(IntPtr.Zero, out var meteringInfo);
var rms = (meteringInfo.rmslevel[0] + meteringInfo.rmslevel[1]) / 2f;
return rms;
}
The link you gave seems to do with audio capture, not RMS reading?
In any case, thanks again!
1 Like
Ah it seems I’m not getting this error every time one of these sound plays:
[FMOD] DSPI::release : WARNING. Failed to release because unit is still attached. Use removeDSP function first.
I haven’t added any DSPs? So unsure what this means…
Thank you for the info and the code.
With the following settings:
would it be possible the share the full logs:

If you revert our changes do you still get the errors?