Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
音频队列iOS对象_Ios_Core Audio - Fatal编程技术网

音频队列iOS对象

音频队列iOS对象,ios,core-audio,Ios,Core Audio,我正在尝试使用Objective CAudioToolbox/AudioQueue.h中的音频队列来实时录制和播放声音。我可以让每一个单独工作,但当两个并排运行时,我会遇到问题 如果在输入队列之后启动输出队列,则输入逻辑工作正常,并从麦克风接收数据。调用AudioQueueStart时,输出逻辑失败,OSStatus代码为560034163(!aqs)。这是什么意思?我在网上找不到任何文件,这很令人沮丧 如果在输入队列之前启动输出队列,则输出队列上的AudioQueueStart调用成功。但是,

我正在尝试使用Objective C
AudioToolbox/AudioQueue.h中的音频队列来实时录制和播放声音。我可以让每一个单独工作,但当两个并排运行时,我会遇到问题

如果在输入队列之后启动输出队列,则输入逻辑工作正常,并从麦克风接收数据。调用
AudioQueueStart
时,输出逻辑失败,
OSStatus代码为560034163(!aqs)
。这是什么意思?我在网上找不到任何文件,这很令人沮丧

如果在输入队列之前启动输出队列,则输出队列上的
AudioQueueStart
调用成功。但是,输入队列的行为异常,其回调接收所有缓冲区的0数据(如
AudioQueueBufferRef->mAudioDataByteSize==0
所示)。我的代码重新调用这些缓冲区,但再也不会收到任何回调


为什么我的输入和输出音频队列会发生这样的冲突?

经过多次尝试,我找到了一些答案(至少出于我的目的)

!aqs错误

!aqs
错误似乎与线程有关,或者可能是音频队列API中的通用最后一个错误

防止
!aqs
如上所述,我必须确保以同步方式完全设置每个音频队列。以前,我在不同的线程中同时初始化这两个线程;API似乎不是线程安全的,所以按顺序初始化每个API

必须进行完全初始化,例如,对于输出队列,我单独执行以下步骤(我不允许一次执行多个线程):

  • AudioQueueNewOutput

  • AudioQueueAllocateBuffer
    (适用于所有缓冲区)

  • audioqueuenbuffer
    :必须将数据加载到所有缓冲区中;我试图初始化为0字节(mAudioDataByteSize),但这会导致命令失败。我的应用程序没有可以直接输出的有效数据,所以现在我只是用数据初始化,以避免产生噪音

  • AudioQueuePrime

  • AudioQueueStart
    :请注意,如果没有缓冲区排队,这可能无法正常工作(我发现情况就是这样)

  • 输入音频队列回调问题

    正如我在最初的问题中所描述的,我看到输入音频缓冲区返回时没有数据,然后在某些情况下,回调再也没有调用过

    我发现,如果我在调用输出音频队列上的
    AudioQueueStart
    之前调用输入音频队列上的
    AudioQueueStart
    ,那么我不会遇到问题。这显然是一个需求,以可选顺序调用它们(先输出)会触发我描述的问题。从哪个线程调用
    AudioQueueStart
    似乎无关紧要。对于初始化音频队列所涉及的其他步骤,线程也是如此。调用
    AudioQueueStart
    (即使是10秒)之间的时间也没有影响

    摘要

    我想第一个问题是“足够公平”;但我看不到任何不好的地方有记录在案

    第二个问题似乎是一个巨大的缺陷,它可能已经并且可能会引起大规模的混乱

    从概念上讲,我希望输入和输出音频队列是不相交的,不会受到这些问题的影响;但显然情况并非如此