2017-02-24 116 views
0

需要:我有一个音频队列和两个AudioQueueBuffer。如何在AudioQueueBuffer中玩 NO.2 AudioQueueBuffer。 我试过AudioQueueStopAudioQueueReset。需要很长时间才能处理,玩得太晚。音频队列如何停止当前播放任务并立即开始播放另一个AudioQueueBuffer?

-(void)playBuffer:(AudioBuffer *)buffer format:(const AudioStreamBasicDescription *)format 
{ 
    AudioQueueStop(_audioQueue, YES);//this line consuming too much time 
    AudioQueueDispose(_audioQueue, YES); 
    AudioQueueRef newAudioQueue; 
    AudioQueueBufferRef queueBuffer; 
    AudioQueueNewOutput(format, audioQueueOutputCallback, (__bridge void*)self, 
         nil, nil, 0, &newAudioQueue); 
    OSStatus status; 
    status = AudioQueueAllocateBuffer(newAudioQueue, buffer->mDataByteSize, &queueBuffer); 

    memcpy(queueBuffer->mAudioData, buffer->mData, buffer->mDataByteSize); 
    queueBuffer->mAudioDataByteSize=buffer->mDataByteSize; 
    status = AudioQueueEnqueueBuffer(newAudioQueue, queueBuffer, 0, NULL); 

    Float32 gain=1.0; 
    AudioQueueSetParameter(newAudioQueue, kAudioQueueParam_Volume, gain); 
    AudioQueueStart(newAudioQueue, nil); 
    AudioQueueFreeBuffer(newAudioQueue, queueBuffer); 
    _audioQueue = newAudioQueue; 
} 

所以我的问题是:是否有可能audio queue播放下一个音频缓冲立即或audio queue不匹配这个任务,我需要一个替代方案?

+1

'AVAudioUnit'可能是一个不错的选择。 – ooOlly

回答

0

终于我只是异步处置audioQueue。但我认为AVAudioUint也许是我的情况更好的解决方案。

- (void)playBuffer:(AudioBuffer *)buffer format:(const AudioStreamBasicDescription *)format 
{ 
    oldAudioQueue = _audioQueue; 
    if (oldAudioQueue){ 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
      AudioQueuePause(oldAudioQueue); 
      //AudioQueueStop(oldAudioQueue, YES);//this line consuming too much time, will barries thread 
      AudioQueueDispose(oldAudioQueue, YES); 
      oldAudioQueue = nil; 
     }); 
    } 

    AudioQueueRef newAudioQueue; 
    AudioQueueBufferRef queueBuffer; 
    AudioQueueNewOutput(format, audioQueueOutputCallback, (__bridge void*)self, 
         nil, nil, 0, &newAudioQueue); 

    OSStatus status; 
    status = AudioQueueAllocateBuffer(newAudioQueue, buffer->mDataByteSize, &queueBuffer); 

    memcpy(queueBuffer->mAudioData, buffer->mData, buffer->mDataByteSize); 
    queueBuffer->mAudioDataByteSize=buffer->mDataByteSize; 
    status = AudioQueueEnqueueBuffer(newAudioQueue, queueBuffer, 0, NULL); 

    Float32 gain=1.0; 
    AudioQueueSetParameter(newAudioQueue, kAudioQueueParam_Volume, gain); 
    AudioQueueStart(newAudioQueue, nil); 
    AudioQueueFreeBuffer(newAudioQueue, queueBuffer); 
    _audioQueue = newAudioQueue; 
} 
+2

在我的情况下,我必须播放不同的'AudioBuffer',当新的'AudioBuffer'来临时,APP必须停止旧的音频并播放新的 – ooOlly

相关问题