Обратный вызов AudioQueue в симуляторе, но не на устройстве - PullRequest
1 голос
/ 07 марта 2011

В настоящее время я работаю над приложением для обработки аудио на 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.

Так в чем же проблема, связанная с этим странным поведением?Любое понимание будет оценено.И, пожалуйста, дайте мне знать, если потребуется дополнительная информация.

Большое спасибо.

Приветствия,

Манка

1 Ответ

0 голосов
/ 10 апреля 2012

Вы должны инициализировать AudioSession и установить его режим Play & Record:

AudioSessionInitialize(NULL, NULL, NULL, NULL);
UInt32 category = kAudioSessionCategory_PlayAndRecord;  
int error = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(category), &category);
if (error) printf("Couldn't set audio category!");

См. awakeFromNib in SpeakHereController.mm из известного примера SpeakHere.

...