2017-02-24 3 views
0

필요 : 오디오 대기열이 있고 두 개가 AudioQueueBuffer입니다. NO.1 AudioQueueBuffer 연주 중에 즉시 NO.2 AudioQueueBuffer을 어떻게 연주 할 수 있습니까? AudioQueueStop 또는 AudioQueueReset을 사용해 보았습니다. 처리하는 데 오랜 시간이 걸리므로 NO.가 너무 늦게 재생됩니다.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

관련 문제