Reference Monobehaviours from PCMReadCallback?

(Hayden Lee) #1

I have created a custom audio generator and want to play it through FMOD in Unity on Windows. However whenever I access a Monobehaviour from PCMReadCallback Unity freezes. So far I’ve worked out that the callback is run on a different thread (I’m assuming a thread spawned by FMOD for audio processing) and I’m guessing due to Unity’s lack of multithreading support this is causing issues. How can I get around this and get data from another object into the FMOD callback from an external generator?

Here’s an example of code snippet that I’d like to work.

(Nicholas Wilcox) #2

Although I’m not sure it will fix all your issues I’ve spotted a common flaw in your code.

exinfo.pcmreadcallback = pcmreadcallback;

is short hand for

var cb = new SOUND_PCMREADCALLBACK(pcmreadcallback);
exinfo.pcmreadcallback = cb;

and now you’ve passed a reference to FMOD of a managed object that is only in the local scope and will garbage collected some time after your FMODStreamPlayer.CreateStream method has finished.

You need initialise a SOUND_PCMREADCALLBACK (and also a SOUND_PCMSETPOSCALLBACK) class member variable that will stay around while FMOD is still issuing the callback.

(Hayden Lee) #3

This seemed to be causing the issue. Its working now and I can reference other components from the callback. There is still an issue with Unity sometimes crashing when I stop the editor however.

(Nicholas Wilcox) #4

Be very conservative in what managed objects you access. Try not to allocate any managed objects.