Мне кажется, я понял @Hans и правильно его реализовал (не могу воспроизвести ошибку). Надеюсь, это кому-нибудь поможет.

ился с FMOD для разработки игр на C #, и я рано наткнулся на загадку, которую никак не могу обойти. Я хочу сделать некоторые разветвленные аудиофайлы и синхронизировать некоторые игровые действия с ритмами и тому подобным, поэтому я попытался добавить точки синхронизации к своим музыкальным трекам. Вот код:

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-миллисекундной синхронизации, которую я добавил. На этом этапе VC # выдает следующую ошибку из FMOD.EventSystem.update ():

Был выполнен обратный вызов делегата со сборщиком мусора типа «Game! FMOD.CHANNEL_CALLBACK :: Invoke». Это может вызвать сбои приложения, повреждение и потерю данных. При передаче делегатов в неуправляемый код управляемое приложение должно поддерживать их работу до тех пор, пока не будет гарантировано, что они никогда не будут вызваны.

Так или иначе, FMOD теряет след делегата, я передал это. Экземпляр Music, который содержит делегат, не был собран сборщиком мусора - я сейчас храню его в статической переменной - но я тоже пытался использовать статический метод, но безрезультатно. Если я отключаю CallbackOnCollectedDelegate MDA, ошибка становится исключением из нулевой ссылки, поэтому MDA не ошибается. Полагаю, я просто не до конца понимаю, что здесь делает FMOD.

Могут ли какие-нибудь гуру C # + FMOD увидеть мою ошибку?

Ответы на вопрос(2)

Ваш ответ на вопрос