В настоящее время я работаю над приложением для обработки аудио на iPhone.он основан на примере кода Apple SpeakHere и предназначен для обработки и воспроизведения звука в режиме реального времени.Код хорошо работает в симуляторе, но не обратный вызов при тестировании на устройстве.
Функция обратного вызова выглядит следующим образом:
void AQPlayer::AQBufferCallback(void * inUserData,
AudioQueueRef inAQ,
AudioQueueBufferRef inCompleteAQBuffer)
{
AQPlayer *THIS = (AQPlayer *)inUserData;
if (THIS->mIsDone) return;
UInt32 numBytes;
UInt32 nPackets = THIS->GetNumPacketsToRead();
OSStatus result = AudioFileReadPackets(THIS->GetAudioFileID(), false, &numBytes, inCompleteAQBuffer->mPacketDescriptions, THIS->GetCurrentPacket(), &nPackets,
inCompleteAQBuffer->mAudioData);
if (result)
printf("AudioFileReadPackets failed: %d", (int)result);
if (nPackets > 0) {
inCompleteAQBuffer->mAudioDataByteSize = numBytes;
inCompleteAQBuffer->mPacketDescriptionCount = nPackets;
//Buffer Modification
SInt16 *testBuffer = (SInt16*)inCompleteAQBuffer->mAudioData;
for (int i = inCompleteAQBuffer->mAudioDataByteSize/sizeof(SInt16); i > 0; i --)
{
//printf("before modification %d", (int)*testBuffer);
*testBuffer = *testBuffer/2; //Simplest processing
//printf("after modification %d", (int)*testBuffer);
testBuffer++;
}
//Enqueue Buffer
AudioQueueEnqueueBuffer(inAQ, inCompleteAQBuffer, 0, NULL);
THIS->mCurrentPacket = (THIS->GetCurrentPacket() + nPackets);
}
Остальные части остаются такими же, как в примере кода SpeakHere.
Так в чем же проблема, связанная с этим странным поведением?Любое понимание будет оценено.И, пожалуйста, дайте мне знать, если потребуется дополнительная информация.
Большое спасибо.
Приветствия,
Манка