2017-02-24 17 views
0

必要:オーディオキューと2つのAudioQueueBufferがあります。 NO.1 AudioQueueBufferの再生中にすぐにどのようにして NO.2 AudioQueueBufferを再生できますか? AudioQueueStopまたはAudioQueueResetを試しました。処理に時間がかかる、NO.2 AudioQueueBuffer再生が遅すぎる。Audio Queueは現在の再生タスクを停止し、すぐに別の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