2017-02-24 112 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

相關問題