3 votes

Impossible de supprimer le bufer d'OpenAL

J'utilise XCode 4.5 pour iPhone et OpenAL. Le problème est que je ne peux pas supprimer les tampons sonores, après avoir joué un son : alSourcePlay(). Si je ne joue pas la source - les tampons sont supprimés et la mémoire vive est libérée sans problème.

Chargement du son :

alGenBuffers(1, &bufferID);

// Loading awaiting data blob into buffer.
alBufferData(bufferID, format, outData, size, freq);

// Getting source ID from OpenAL.
alGenSources(1, &sourceID);

// Attacing buffer to source.
alSourcei(sourceID, AL_BUFFER, bufferID);

//playing sound (if i comment this line, the problem dissapears)
alSourcePlay(soundId);

Libérer le son :

//detaching buffer
alSourcei(sourceID, AL_BUFFER, bufferID);
//deleting source
alDeleteSources(1, &sourceID);
//deleting buffer
alDeleteBuffers(1, &bufferID);

La suppression des tampons n'entraîne pas d'erreur, mais ils ne sont pas libérés de la mémoire. J'utilise Instruments pour surveiller la mémoire.

J'ai passé une semaine à chercher une solution et à lire la documentation d'OpenAL.

Si vous avez de l'expérience dans OpenAL, aidez-nous !

Merci !

3voto

rraallvv Points 1298

Dans la documentation :

alDeleteBuffers

Description : Cette fonction supprime un ou plusieurs tampons, libérant les ressources utilisées par le tampon. Les tampons qui sont attachés à une source ne peuvent pas être supprimés. Voir alSourcei et alSourceUnqueueBuffers pour des informations sur la façon de détacher un tampon de d'une source.

alSourcei

Remarques : Le nom de tampon zéro est réservé comme un "NULL Buffer" et est accepté par alSourcei(..., AL_BUFFER, ...) comme un tampon valide de longueur nulle. longueur. Le tampon NULL est extrêmement utile pour détacher des tampons de source qui ont été attachés en utilisant cet appel ou avec alSourceQueueBuffers.

Cela devrait fonctionner :

//detaching buffer
alSourcei(sourceID, AL_BUFFER, 0); //<-- detach using NULL buffer
//deleting source
alDeleteSources(1, &sourceID);
//deleting buffer
alDeleteBuffers(1, &bufferID);

1voto

George Phillips Points 2433

Lorsque vous relâchez le son, l'appel doit être :

alSourcei(sourceID, AL_BUFFER, 0);

Ceci est conforme au Guide du programmeur d'OpenAL :

http://connect.creativelabs.com/openal/Documentation/OpenAL_Programmers_Guide.pdf

0voto

Mayoneez Points 186

Je ne sais pas si cette information est encore pertinente pour vous mais j'ai rencontré le même problème et je l'ai résolu en supprimant le tampon 1 seconde après avoir supprimé la source. Donc, quand il est temps de supprimer, je stocke le tampon dans un dictionnaire avec un horodatage qui indique quand il doit être supprimé et ensuite je supprime le tampon avec un appel à

alDeleteBuffers(1, &bufferID);

ailleurs une fois que le timestamp a été dépassé. Le raisonnement derrière cela est que iOS OpenAL est exécuté dans un autre thread et que vous devez lui laisser le temps de traiter la suppression de la source.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X