2009-12-21 45 views
1

能有人FMOD體驗,請從失去它阻止我。我無法獲得這些同步點的行爲。我有一些遊戲音樂,包括兩部分,一個介紹和一個循環。它們是獨立的聲音,並且在介紹結束之後,它開始循環部分,該部分永遠重複。我在介紹結尾處設置了一個同步點以啓動循環。它工作得很好,直到我嘗試停止並重新開始音樂(例如播放器死亡時)。不管如何,同步點堅持只要前奏重啓射擊,即使它設置爲前奏的結束。結果是,兩部分音樂都在同時播放,並且在單個頻道上播放,因爲我告訴它重新使用頻道。這甚至有可能嗎?下面是一些我的代碼(注意,系統介紹,循環,和渠道是成員變量):FMOD聲音庫 - 同步點使我瘋狂!

public void Play() 
{ 
    if (intro != null) 
    { 
     CHANNELINDEX index = (channel == null) ? CHANNELINDEX.FREE : CHANNELINDEX.REUSE; 
     system.playSound(index, intro, false, ref channel); 
     uint length = 0; 
     intro.getLength(ref length, TIMEUNIT.MS); 
     intro.addSyncPoint(length, TIMEUNIT.MS, "StartLoop", ref loopPtr); 
     channel.setCallback(callback); 
    } 
    else system.playSound(CHANNELINDEX.FREE, loop, false, ref channel); 
    Playing = true; 
} 

而這裏的同步點:

private FMOD.RESULT SyncCallback(IntPtr c, CHANNEL_CALLBACKTYPE type, IntPtr a, IntPtr b) 
{ 
    if (Playing) 
    { 
     RESULT result = intro.getSyncPoint(0, ref loopPtr); 
     intro.deleteSyncPoint(loopPtr); 
     system.playSound(CHANNELINDEX.REUSE, loop, false, ref channel); 
    } 
    return RESULT.OK; 
} 

至少,這是回調的一個版本。我已經嘗試了約20個人。注意我正在告訴它刪除同步點 - 當我檢查了返回時,它是確定的。我試過一個loop.deleteSyncPoint以防萬一。我也做了一個getsyncpointinfo,以確保它是我的StartLoop同步點擊。然而,它仍然火災時發揮被再次調用,調用後停止:

public void Stop() 
{ 
    Playing = false; 
    if (intro != null && loopPtr != IntPtr.Zero) 
    { 
     IntPtr ptr = IntPtr.Zero; 
     RESULT result = intro.getSyncPoint(0, ref ptr); 
     result = intro.deleteSyncPoint(ptr); 
     result = intro.getSyncPoint(0, ref ptr); 
     loopPtr = IntPtr.Zero; 
    } 
    channel.stop(); 
    channel.setPosition(0, TIMEUNIT.MS); 
} 

注意,停止()也試圖刪除同步點,但它沒有這樣做,以及(即使結果回來好)。我試圖在停止時將通道位置設置爲0,這使情況變得更糟。我試圖channel.stop()在我的同步點deletesyncpoint()調用後,然而,導致堆棧溢出,因爲它一直呼籲每個呼叫的同步點停止,儘管試圖將其刪除。我是否在給它一個錯誤的指針或什麼?我試着做了一些種類標誌的說法,只是沒有發揮環部分,但我不能,因爲它會在播放中間(套),並同步點播放後立即叫()完成後,在下次調用系統更新時。 FMOD是壞了還是我錯過了一些明顯的東西?或者一些真正晦澀和無證...

回答

5

我剛得到它,我希望這可以幫助別人,看到一個谷歌搜索「FMOD同步點」現在返回這是第一個結果。重複是因爲一些回調是用於同步點類型的,有些用於結束,因爲介紹部分已經結束。所以,我意識到我甚至不需要我自己的同步點。我只是用它的結尾作爲觸發器。更清晰的代碼,並完美地工作。