3 votes

Jouer plusieurs chansons de la bibliothèque de l'iPod sur l'iPhone en même temps avec des effets de pitch bending et d'autres effets

Cela fait deux semaines que je suis dans cette situation et cela me rend fou. J'ai posé cette question il y a quelques jours ( Extraire des échantillons PCM bruts de la bibliothèque de l'iPod et jouer avec des effets sonores ) et bien que la réponse m'ait permis de faire la moitié du chemin, je suis toujours bloqué.

Ce que j'essaie de faire, c'est de charger plusieurs chansons de la bibliothèque de l'iPod pour les lire avec des effets tels que le pitch bend, les effets d'égalisation, etc...

J'ai opté pour AVPlayer et AVAudioPlayer qui sont trop simples. Le seul framework que j'ai vu qui peut jouer de l'audio avec ces effets est OpenAL. J'ai essayé quelques wrappers Objective C (Finch et ObjectAL). Finch ne lit pas l'audio compressé tandis qu'ObjectAL ne le convertit pour moi que si je lui passe une URL pour le fichier (ce que je ne peux pas faire car je n'ai qu'une URL incompatible pour la bibliothèque de l'iPod).

Voici un exemple d'application qui fait magnifiquement ce que je veux Tap DJ . Il peut charger rapidement les morceaux de la bibliothèque de l'iPod (contrairement à TouchDJ et les joue avec toutes sortes d'effets.

Toute aide serait très appréciée.

5voto

Karl Points 3346

Si vous pouvez obtenir les données audio dans le format PCM brut qu'OpenAL apprécie, vous pouvez les charger dans ObjectAL.

Ce qu'il vous faut, c'est

  • Les données audio
  • La taille en octets des données
  • Le format des données (AL_FORMAT_MONO16 ou AL_FORMAT_STEREO16)
  • La fréquence d'échantillonnage

Vous aurez également besoin d'un ALSource pour jouer le tampon. Si vous utilisez ceci en même temps que OALSimpleAudio (ce qui est recommandé puisqu'il gère les périphériques et les contextes pour vous), vous devrez lui dire de ne pas prendre toutes les sources disponibles :

[OALSimpleAudio sharedInstance].reservedSources = 20; // or some number < 32

Créer la source (devrait le faire dans init) :

mySource = [[ALSource source] retain];

Vous pouvez créer un ALBuffer avec vos données personnalisées comme suit :

ALBuffer* myBuffer = [ALBuffer bufferWithName:someName
                           data:myAudioData
                           size:audioDataSizeInBytes
                         format:audioFormat
                      frequency:sampleRateInHz];

Vous pouvez maintenant jouer :

[mySource play:myBuffer];

Edit : ALBuffer prend en charge la gestion des données audio et appelle free() lorsqu'elles sont désallouées. Attention donc à ne pas faire de double libération :)

Edit 2 : Je viens d'ajouter la propriété "freeDataOnDestroy" à ALBuffer afin que vous puissiez contrôler si les données sont libérées ou non (la valeur par défaut est YES).

Edit 3 : On s'en fout. Je suis allé aussi loin, autant aller jusqu'au bout. Ajout de la méthode "playBuffer" à OALSimpleAudio.

Vous pouvez donc maintenant rester dans OALSimpleAudio pour tout le reste :

myBuffer = [[ALBuffer bufferWithName:someName
                           data:myAudioData
                           size:audioDataSizeInBytes
                         format:audioFormat
                      frequency:sampleRateInHz] retain];

...

id<ALSoundSource> source = [[OALSimpleAudio sharedInstance] playBuffer:myBuffer
                                                                volume:1.0
                                                                 pitch:1.0
                                                                   pan:0
                                                                  loop:NO];

[source pitchTo:2.0
       duration:5.0
         target:nil
       selector:nil];
// And so on...

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