gpt4 book ai didi

iphone - 模拟器中的 AudioQueue 回调,但不在设备上

转载 作者:行者123 更新时间:2023-11-28 17:47:05 26 4
gpt4 key购买 nike

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

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

非常感谢。

干杯,

曼卡

最佳答案

您必须初始化 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!");

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

关于iphone - 模拟器中的 AudioQueue 回调,但不在设备上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5218335/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com