2010-09-17 5 views
0

J'essaie de trier la différence entre Sound.readData et Sound.lock dans la bibliothèque FMOD (je suis en programmation en C#/C++ mais je vais prendre la réponse dans n'importe quelle langue!). L'objectif final est de créer une vue de la forme d'onde, ce que je comprends ne peut pas être fait (facilement) avec Channel.getWaveData.Différence de FMOD entre Sound.readData et Sound.lock?

J'ai pu obtenir à la fois l'approche Sound.readData et Sound.lock pour renvoyer les mêmes données avec createStream et createSound, respectivement (je ne sais pas si c'est valide - par exemple décodé - données pour le moment). Je voudrais utiliser l'approche de flux si possible pour minimiser l'empreinte de la mémoire, mais je ne suis pas vraiment sûr de ce que je lis maintenant et la documentation n'est pas tout à fait claire.

Répondre

1

Essentiellement la différence entre les deux est ce que vous accédez. Avec Sound :: lock, vous verrouillez le tampon d'échantillonnage du son. Lorsque vous chargez avec createSound, il décompresse le fichier en PCM et le place dans le tampon d'échantillonnage. Vous utilisez cette fonction pour accéder directement à ce tampon (vous verrouillez la partie que vous voulez). Si vous êtes sur une console, les données peuvent être un format compressé natif. En guise de remarque, l'idée de "verrouiller" un son vient pour l'API DirectSound où vous "verrouiller" un tampon pour en empêcher l'accès pendant que vous lisez ou écrivez dessus, lorsque vous avez fini de débloquer l'accès donné au système audio. Sound :: readData est une façon plus progressive d'extraire (streamer) des données PCM du son, ici vous décodez réellement les données compressées en PCM avec chaque appel readData. Vous le faites en plus petits blocs et vous obtenez toujours les données PCM décodées finales. Cette approche est plus flexible et efficace en termes de mémoire.

Par exemple, vous pouvez charger un fichier MP3 de 10 Mo en tant que flux puis le décoder en PCM en utilisant Sound :: readData en morceaux. Sinon, vous devrez le charger en tant qu'échantillon (qui le décode en PCM à l'heure createSound) puis verrouiller un tampon massif pour obtenir le PCM. GetWaveData est utilisé pour afficher la forme d'onde à l'heure actuelle de la lecture, il ne devrait pas être utilisé pour décoder une forme d'onde complète du fichier. En fonction de la fréquence des appels à getWaveData, vous pouvez obtenir le même bloc de données plusieurs fois que s'il s'agit d'un seul instantané.

0

Après plus de recherches, je suis assez sûr qu'il n'y a pas de différence significative entre les deux. Je vais probablement utiliser readData car il semble être un peu plus facile, plus flexible. En outre, lock est un nom confus pour cette méthode :).