2009-12-21 2 views
1

Est-ce que quelqu'un avec l'expérience de FMOD peut m'empêcher de le perdre. Je ne peux pas obtenir ces points de synchronisation pour se comporter. J'ai de la musique de jeu composée de deux morceaux, une intro et une boucle. Ils sont des sons séparés, et après l'intro finit, il commence la section de boucle qui se répète pour toujours. J'ai mis un point de synchronisation à la fin de l'intro pour déclencher la boucle. Cela fonctionne très bien, jusqu'à ce que j'essaie d'arrêter et de redémarrer la musique (par exemple quand le joueur meurt). Quoi qu'il en soit, le syncpoint insiste sur le déclenchement dès que l'intro est relancée, même si elle est réglée pour la fin de l'intro. L'effet est que les deux parties de la musique jouent simultanément - et sur un seul canal il semble, puisque je lui dis de réutiliser la chaîne. Est-ce que c'est possible? Voici quelques-uns de mon code (notez que le système, intro, boucle, et le canal sont des variables membres):Bibliothèque de sons FMOD - les syncpoints me rendent fou!

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; 
} 

Et voici le syncpoint:

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; 
} 

Au moins, c'est une version de la fonction de rappel. J'ai essayé environ 20 autres. Notez que je lui dis de supprimer le point de synchronisation - et quand j'ai vérifié le retour c'était OK. J'ai essayé un loop.deleteSyncPoint aussi bien au cas où. J'ai aussi fait un getsyncpointinfo dessus pour m'assurer que c'était mon point de synchronisation StartLoop qui tirait. Pourtant, encore il se déclenche lorsque le jeu est appelé à nouveau, après un appel à arrêter:

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); 
} 

Notez que Stop() tente également de retirer le syncpoint, mais il ne parvient pas à faire de même (même si le résultat revient D'ACCORD). J'ai essayé de régler la position du canal sur 0 à l'arrêt, ce qui a aggravé la situation. J'ai essayé channel.stop() dans mon point de synchronisation après l'appel deletesyncpoint(), et pourtant cela a provoqué un débordement de pile, car il a continué à appeler le point de synchronisation sur chaque appel à arrêter, malgré la tentative de le supprimer. Est-ce que je lui donne le mauvais pointeur ou quelque chose? J'ai essayé de créer une sorte de drapeau pour dire de ne pas jouer la section de boucle, mais je ne peux pas car il serait placé au milieu de Play(), et le point de synchronisation est appelé juste après que Play() se termine, au prochain appel à la mise à jour du système. Est-ce que FMOD est cassé ou est-ce que quelque chose me manque? Ou quelque chose de vraiment obscur et non documenté ...

Répondre

5

Je viens de l'avoir, et j'espère que cela aide quelqu'un d'autre, car une recherche google pour "fmod syncpoint" renvoie maintenant cela comme premier résultat. Les doublons étaient parce que certains des rappels étaient pour le type de point de synchronisation, et certains étaient pour la fin, parce que la section d'introduction avait fini. Donc avec ça, j'ai réalisé que je n'avais même pas besoin de mes propres syncpoints. Je l'ai juste en utilisant la fin de l'intro comme déclencheur. Code plus propre, et fonctionne parfaitement.