【发布时间】:2013-10-26 09:31:54
【问题描述】:
我正在尝试从文件功能中进行简单的播放,但似乎从未调用过我的回调函数。这实际上没有任何意义,因为所有 OSStatuse 都返回 0 并且其他数字也都显示正确(例如来自 AudioFileReadPackets 的输出数据包读取指针)。
设置如下:
OSStatus stat;
stat = AudioFileOpenURL(
(CFURLRef)urlpath, kAudioFileReadPermission, 0, &aStreamData->aFile
);
UInt32 dsze = 0;
stat = AudioFileGetPropertyInfo(
aStreamData->aFile, kAudioFilePropertyDataFormat, &dsze, 0
);
stat = AudioFileGetProperty(
aStreamData->aFile, kAudioFilePropertyDataFormat, &dsze, &aStreamData->aDescription
);
stat = AudioQueueNewOutput(
&aStreamData->aDescription, bufferCallback, aStreamData, NULL, NULL, 0, &aStreamData->aQueue
);
aStreamData->pOffset = 0;
for(int i = 0; i < NUM_BUFFERS; i++) {
stat = AudioQueueAllocateBuffer(
aStreamData->aQueue, aStreamData->aDescription.mBytesPerPacket, &aStreamData->aBuffer[i]
);
bufferCallback(aStreamData, aStreamData->aQueue, aStreamData->aBuffer[i]);
}
stat = AudioQueuePrime(aStreamData->aQueue, 0, NULL);
stat = AudioQueueStart(aStreamData->aQueue, NULL);
(未显示的是我在函数之间检查stat 的值,它只是恢复正常。)
还有回调函数:
void bufferCallback(void *uData, AudioQueueRef queue, AudioQueueBufferRef buffer) {
UInt32 bread = 0;
UInt32 pread = buffer->mAudioDataBytesCapacity / player->aStreamData->aDescription.mBytesPerPacket;
OSStatus stat;
stat = AudioFileReadPackets(
player->aStreamData->aFile, false, &bread, NULL, player->aStreamData->pOffset, &pread, buffer->mAudioData
);
buffer->mAudioDataByteSize = bread;
stat = AudioQueueEnqueueBuffer(queue, buffer, 0, NULL);
player->aStreamData->pOffset += pread;
}
aStreamData 是我的用户数据结构(类型定义,因此我可以将其用作类属性),而 player 是控制 Objective-C 类的静态实例。如果需要任何其他代码,请告诉我。我有点不知所措。打印此处涉及的任何数字都会产生正确的结果,包括我在分配循环中自己调用 bufferCallback 中的函数。此后它永远不会被调用。启动方法返回,没有任何反应。
另外,我正在使用外围设备(MBox Pro 3)播放 CoreAudio 仅在即将输出时才会启动的声音。 IE 如果我启动 iTunes 或其他东西,扬声器会发出微弱的爆裂声,并且有一个 LED 从闪烁变为常亮。设备像它一样启动,所以 CA 肯定在做某事。 (当然,我也尝试过在没有设备的情况下使用板载 Macbook 声音。)
我已经阅读了其他听起来相似但不起作用的问题的解决方案。诸如使用多个缓冲区之类的东西,我现在正在这样做,但似乎没有任何区别。
我基本上假设我在某种程度上做了一些明显错误的事情,但不确定它可能是什么。我已经阅读了相关文档,查看了可用的代码示例并在网上搜索了一些答案,看来这就是我需要做的所有事情,应该就可以了。
至少,我还有什么可以调查的吗?
【问题讨论】:
-
我不知道为什么它不起作用。但是,你为什么不使用 AudioUnit?
-
@AliaksandrAndrashuk AudioUnits 不只是用于效果吗?使用它们从文件流式传输是否合理?
-
是的。您可以设置 AUFilePlayer -> RemoteIO (in AUGraph) 来播放文件。
-
尝试手动设置(大)缓冲区大小
标签: objective-c macos callback core-audio audioqueue