private FMOD.RESULT VoiceEventCallback(EVENT_CALLBACK_TYPE callbackType, EventInstance eventInstance, IntPtr parameters) { IntPtr voiceStatePtr; FMOD.RESULT result = eventInstance.getUserData(out voiceStatePtr); if (result != FMOD.RESULT.OK) { Debug.LogError("FMOD error: " + result); } else { if (voiceStatePtr != IntPtr.Zero) { GCHandle voiceInfoHandle = GCHandle.FromIntPtr(voiceStatePtr); VoiceStateInfo voiceInfo = (VoiceStateInfo)voiceInfoHandle.Target; switch (callbackType) { case EVENT_CALLBACK_TYPE.START_FAILED: case EVENT_CALLBACK_TYPE.STOPPED: eventInstance.setUserData(IntPtr.Zero); eventInstance.setCallback(null); eventInstance.release(); voiceInfo.State = VoiceState.Silent; break; } } } return(FMOD.RESULT.OK); }
private void Start() { voiceCallback = new EVENT_CALLBACK(VoiceEventCallback); // create and pin voiceinfo in memory voiceInfo = new VoiceStateInfo(); voiceInfo.State = VoiceState.Silent; voiceInfoHandle = GCHandle.Alloc(voiceInfo, GCHandleType.Pinned); }