Hmm, I see what you mean, it’s very difficult to get a smooth fade in by setting the transceiver’s gain since it’s locked to the Studio System’s update rate.
You could potentially create a temporary DSP to handle the fade for you. Here is an example in C++ to demonstrate:
struct RAMP_DATA
{
float target = 1.0f;
float alpha = 0.00001f;
float gainVal = 0.0f;
};
FMOD_DSP_DESCRIPTION fadeInDesc = { 0 };
fadeInDesc.numinputbuffers = 1;
fadeInDesc.numoutputbuffers = 1;
fadeInDesc.create = [](FMOD_DSP_STATE *dsp_state)
{
RAMP_DATA *data = new RAMP_DATA;
dsp_state->plugindata = (void *)data;
return FMOD_OK;
};
fadeInDesc.release = [](FMOD_DSP_STATE *dsp_state)
{
RAMP_DATA *data = (RAMP_DATA*)dsp_state->plugindata;
delete data;
return FMOD_OK;
};
fadeInDesc.process = [](FMOD_DSP_STATE* dsp_state, unsigned int length, const FMOD_DSP_BUFFER_ARRAY* inbufferarray, FMOD_DSP_BUFFER_ARRAY* outbufferarray, FMOD_BOOL inputsidle, FMOD_DSP_PROCESS_OPERATION op)
{
RAMP_DATA *data = (RAMP_DATA*)dsp_state->plugindata;
if (op == FMOD_DSP_PROCESS_QUERY)
{
if (data->target - data->gainVal < 0.1f)
{
// Fading done, skip processing
return FMOD_ERR_DSP_DONTPROCESS;
}
outbufferarray->bufferchannelmask = inbufferarray->bufferchannelmask;
outbufferarray->buffernumchannels = inbufferarray->buffernumchannels;
outbufferarray->speakermode = inbufferarray->speakermode;
return FMOD_OK;
}
float *in = inbufferarray->buffers[0];
float *out = outbufferarray->buffers[0];
while (length--)
{
// Fade in the signal with a gain modifier
*out++ = *in++ * data->gainVal;
// Exponential fade to target gain of 1.0f
data->gainVal = data->alpha * data->target + (1 - data->alpha) * data->gainVal;
}
return FMOD_OK;
};
channel1->addDSP(FMOD_CHANNELCONTROL_DSP_FADER, transceiver);
system->createDSP(&fadeInDesc, &fadeInDSP);
For Unity, you could pretty much copy the DSP Capture scripting example and ramp in the buffer instead of just copying it across.
I will let the dev team know about this though and see if we can get rid of this clicking- thank you for bringing this to our attention!