Беседа с FMOD для разработки игр на С#, и я на мгновение попал в ловушку, и я не могу обойтись. Я хочу сделать некоторые ветвящиеся звуковые файлы и синхронизировать некоторые действия с геймплеем и так, поэтому я попытался добавить синхронизирующие точки к своим музыкальным трекам. Здесь код:
public class Music
{
private Sound music;
private Channel channel;
private IntPtr syncPtr;
public string File { get; private set; }
public Music(string file)
{
File = file;
}
public void Load()
{
music = new Sound();
Audio.System.createSound(File, MODE.HARDWARE, ref music);
}
public void Unload()
{
music.release();
}
public virtual void Play()
{
Audio.System.playSound(channel == null ? CHANNELINDEX.FREE : CHANNELINDEX.REUSE, music, false, ref channel);
music.addSyncPoint(500, TIMEUNIT.MS, "wooo", ref syncPtr);
channel.setCallback(channelCallback);
}
private RESULT channelCallback(IntPtr channelraw, CHANNEL_CALLBACKTYPE type, IntPtr commanddata1, IntPtr commanddata2)
{
if (type == CHANNEL_CALLBACKTYPE.SYNCPOINT)
Console.WriteLine("sync!");
return RESULT.OK;
}
}
И затем...
m = new Music(MUS_TUTORIAL); //m is static
m.Load();
m.Play();
Песня загружается и воспроизводится отлично... пока она не ударит, что добавила 500 точек синхронизации. На этом этапе VС# выплевывает следующую ошибку изнутри FMOD.EventSystem.update():
Обратный вызов был сделан на собранном делегатом мусора типа "Игра! FMOD.CHANNEL_CALLBACK:: Invoke. Это может привести к сбоям приложений, коррупции и потери данных. При передаче делегатам неуправляемого кода они должны быть управляемое приложение, пока не будет гарантировано, что они никогда не будут вызваны.
Итак, как-то FMOD проигрывает делегату, который я ему передал. Экземпляр Music, который содержит делегат, не был собран мусором - я сохраняю его в статической переменной на данный момент, но я пробовал со статическим методом тоже безрезультатно. Если я отключу CallbackOnCollectedDelegate MDA, ошибка станет пустым ссылкой, поэтому MDA не ошибается. Я предполагаю, что я просто не могу полностью понять, что здесь делает FMOD.
Есть ли у С# + FMOD гуру возможность увидеть мою ошибку?