2010-11-11 13 views
1

J'écris une application iPhone dans laquelle je joue des fichiers mp3 mono en utilisant Audio Queue Services. En jouant, j'entends seulement le son sur une chaîne. J'ai cherché un exemple de comment obtenir les fichiers à jouer sur les deux canaux, sans succès. Ce que je fais est assez simple en ce moment. J'installe ma file d'attente audio comme ceci:Comment faire pour lire un fichier mono en stéréo dans l'application iPhone en utilisant les services de file d'attente audio

AudioStreamBasicDescription queueASBD; 
AudioQueueRef audioQueue; 
queueASBD.mSampleRate = 44100.0; 
queueASBD.mFormatID = kAudioFormatLinearPCM; 
queueASBD.mFormatFlags = kAudioFormatFlagsNativeEndian | AudioFormatFlagIsPacked | kAudioFormatFlagIsSignedInteger; 
queueASBD.mBytesPerPacket = 4; 
queueASBD.mFramesPerPacket = 1; 
queueASBD.mBytesPerFrame = 4; 
queueASBD.mChannelsPerFrame = 2; 
queueASBD.mBitsPerChannel = 16; 
queueASBD.mReserved = 0; 
AudioQueueNewOutput(&queueASBD, AudioQueueCallback, NULL, CFRunLoopGetCurrent(), kCFRunLoopCommonModes, 0, &audioQueue); 

j'ouvrir le fichier mp3 comme celui-ci (contrôle d'erreur et comme enlevé par souci de concision):

ExtAudioFileRef audioFile; 
ExtAudioFileOpenURL(url, &audioFile); 
ExtAudioFileSetProperty(audioFile, kExtAudioFileProperty_ClientDataFormat, sizeof(queueASBD), &queueASBD); 

Et de faire la queue un tampon, je quelque chose comme ceci:

AudioQueueBufferRef buffers; // previously allocated 
AudioBufferList abl; 
UInt32 length = (UInt32)queueASBD.mSampleRate/BUFFERS_PER_SECOND; 
abl.mNumberBuffers = 1; 
abl.mBuffers[0].mDataByteSize = (UInt32)(queueASBD.mSampleRate * queueASBD.mBytesPerPacket/BUFFERS_PER_SECOND); 
abl.mBuffers[0].mNumberChannels = queueASBD.mChannelsPerFrame; 
abl.mBuffers[0].mData = buffer->mAudioData; 
ExtAudioFileRead(audioFile, &length, &abl); 
UInt32 byte_length = length * (UInt32)queueASBD.mBytesPerPacket; 
buffer->mAudioDataByteSize = byte_length; 
AudioQueueEnqueueBuffer(audioQueue, buffer, 0, NULL); 

y at-il un moyen d'obtenir le fichier à lire en stéréo sans totalement Recodification (par exemple en utilisant les API Audio Unit)? Un convertisseur audio pourrait-il aider ici? Y a-t-il un autre moyen? Merci pour toute aide.

Répondre

1

Essayez d'ouvrir la file d'attente audio avec un seul canal par image (par exemple, mono) et le nombre correspondant d'octets par paquet et par image (probablement 2).

+0

Oui, ça l'a fait. Je me suis dit qu'il y avait quelque chose de simple qui me manquait. Merci! –