Iphone AudioQueue输出回调仅激发3次(nBuffers次)

Iphone AudioQueue输出回调仅激发3次(nBuffers次),iphone,audioqueue,Iphone,Audioqueue,当我使用AudioQueueStart(out.queue,nil)启动音频输出进程时,输出回调仅触发3次(即分配的缓冲区数) 以下是我的输出回调代码: static void AQOutputCallback(void* aqr, AudioQueueRef outQ, AudioQueueBufferRef outQB) { AQCallbackStruct *aqc =

当我使用
AudioQueueStart(out.queue,nil)
启动音频输出进程时,输出回调仅触发3次(即分配的缓冲区数)

以下是我的输出回调代码:

static void AQOutputCallback(void* aqr,
                             AudioQueueRef outQ,
                             AudioQueueBufferRef outQB)
{
  AQCallbackStruct *aqc = (AQCallbackStruct *) aqr;

  NSLog(@"Out");

  // Check if AudioQueue is stopped
  if (!aqc->run) {
    NSLog(@"Stopped");
    return;
  }

  // Processing data

  // Check enqueue error
  int err = AudioQueueEnqueueBuffer(outQ, outQB, 0, NULL);
  if (err != noErr) NSLog(@"OutputCallback AudioQueueEnqueueBuffer() %d ", err);
  NSLog(@"Enqueued");
}
我认为这是由于缺少缓冲区,但我的输出是:

Out
Enqueued
Out
Enqueued
Out
Enqueued
因此,第一个缓冲区在AudioQueue开始填充第三个缓冲区之前排队,它不应该耗尽缓冲区

这里发生了什么

编辑:设置代码
#定义音频缓冲区3
typedef结构AQCallbackStruct{
AudioStreamBasicDescription mDataFormat;
AudioQueueRef队列;
AudioQueueBufferRef Mbuffer[音频缓冲区];
无符号长帧大小;
BOOL*run;
}AQCallbackStruct;
//以某种方式
AQCallbackStruct out;
out.mDataFormat
out.mDataFormat.mFormatID=kAudioFormatLinearPCM;
out.mDataFormat.mSampleRate=44100.0;
out.mDataFormat.mChannelsPerFrame=2;
out.mDataFormat.mBitsPerChannel=16;
out.mDataFormat.mBytesPerPacket=
out.mDataFormat.mBytesPerFrame=
out.mDataFormat.mChannelsPerFrame*sizeof(短int);
out.mDataFormat.mFramesPerPacket=1;
out.mDataFormat.mFormatFlags=
KlineArcFormatFlagisBigendian
|kLinearPCMFormatFlagIsSignedInteger
|KlinearpCMFormatFlagspacked;
out.frameSize=735;
INTERR;
err=AudioQueueNewOutput(&out.mDataFormat),
AQOutputCallback,
&出去,,
CFRunLoopGetCurrent(),
kCFRunLoopCommonModes,
0,
&排队);
如果(err!=noErr)NSLog(@“AudioQueueNewOutput()错误:%d”,err);
对于(int i=0;iAudioDataByteSize=out.frameSize;
err=audioqueuenbuffer(out.queue,out.mBuffers[i],0,NULL);
如果(err!=noErr)NSLog(@“Output AudioQueuenBuffer()错误:%d”,err);
}
AudioQueueStart(out.queue,nil);

请查看此页面:


其中的BleepMachine示例代码是我开始使用它的原因。

我终于找到了问题所在:


然而,输出回调是在模拟器中正确启动的,但不是在我的设备上启动的,我仍然不知道AudioSession设置中存在差异的确切原因。

这能解决我的问题吗?我说的是缓冲区用完,而不是从音频合成开始…你能提供更多信息吗?什么如果不是音频合成器的话,是不是你正在尝试完成?可能是你没有正确地进行设置;你使用的是什么设置代码?我用设置代码更新了我的问题。我只是想把一些东西输出到我的iPhone扬声器,但我认为这与此无关,因为即使没有声音处理代码,它也无法工作。我看了看在您添加的初始化代码中,我看到了与我的两个不同之处,但不确定它们之间的相关性:(1)在对AudioQueueNewOutput的调用中,我传递NULL而不是CFRunLoopGetCurrent(),以及(2)在对AudioQueueAllocateBuffer的调用中,在第二个参数(大小)中,我传递代码中的内容:frameSize*out.mDataFormat.mBytesPerFrame(因为您所谓的“frameSize”是指缓冲区中的帧数)我尝试在缓冲区分配过程中放置
NULL
,而不是
CFRunLoopGetCurrent()
,以及
frameSize*out.mDataFormat.mBytesPerFrame
,但它没有改变任何内容。我卡住了:(
#define AUDIO_BUFFERS 3

typedef struct AQCallbackStruct {
  AudioStreamBasicDescription mDataFormat;
  AudioQueueRef queue;
  AudioQueueBufferRef mBuffers[AUDIO_BUFFERS];
  unsigned long frameSize;
  BOOL *run;
} AQCallbackStruct;

// In some method
AQCallbackStruct out;

out.mDataFormat
out.mDataFormat.mFormatID = kAudioFormatLinearPCM;
out.mDataFormat.mSampleRate = 44100.0;
out.mDataFormat.mChannelsPerFrame = 2;
out.mDataFormat.mBitsPerChannel = 16;
out.mDataFormat.mBytesPerPacket =
  out.mDataFormat.mBytesPerFrame =
    out.mDataFormat.mChannelsPerFrame * sizeof(short int);
out.mDataFormat.mFramesPerPacket = 1;
out.mDataFormat.mFormatFlags =
    kLinearPCMFormatFlagIsBigEndian
  | kLinearPCMFormatFlagIsSignedInteger
  | kLinearPCMFormatFlagIsPacked;

out.frameSize = 735;

int err;
err = AudioQueueNewOutput(&out.mDataFormat,
                          AQOutputCallback,
                          &out,
                          CFRunLoopGetCurrent(),
                          kCFRunLoopCommonModes,
                          0,
                          &out.queue);

if (err != noErr) NSLog(@"AudioQueueNewOutput() error: %d", err);


for (int i=0; i<AUDIO_BUFFERS; i++) {         
  err = AudioQueueAllocateBuffer(out.queue, out.frameSize, &out.mBuffers[i]);
  if (err != noErr) NSLog(@"Output AudioQueueAllocateBuffer() error: %d", err);
  out.mBuffers[i]->mAudioDataByteSize = out.frameSize;

  err = AudioQueueEnqueueBuffer(out.queue, out.mBuffers[i], 0, NULL);
  if (err != noErr) NSLog(@"Output AudioQueueEnqueueBuffer() error: %d", err);
}

AudioQueueStart(out.queue, nil);