【问题标题】:AudioQueue callback in simulator but not on device模拟器中的 AudioQueue 回调,但不在设备上
【发布时间】:2011-03-07 10:10:53
【问题描述】:

我目前正在 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 示例代码相同。

那么与这种奇怪行为相关的问题是什么?任何见解将不胜感激。如果需要更多信息,请告诉我。

非常感谢。

干杯,

曼卡

【问题讨论】:

  • 您是否正在初始化音频会话并将其配置为播放和录制?
  • 是的,AudioSessionSetActive() 设置为 true,就像示例代码一样。

标签: iphone objective-c ios core-audio audioqueueservices


【解决方案1】:

您必须初始化AudioSession 并将其模式设置为播放和录制:

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!");

参见著名的 SpeakHere 示例中的 SpeakHereController.mm 中的 awakeFromNib

【讨论】:

    猜你喜欢
    • 2015-10-16
    • 2011-03-04
    • 2023-03-27
    • 2014-05-03
    • 1970-01-01
    • 2014-05-02
    • 2012-12-21
    • 2011-05-05
    • 1970-01-01
    相关资源
    最近更新 更多