2013-09-07 4 views
3

녹음을 위해 오디오 대기열을 설정할 수 있으며 AudioQueueStart가 녹음을 시작하는 데 적합합니다.AudioQueueStop 이후 오디오 대기열을 다시 시작할 수 없습니다.

AudioQueueStop을 호출 한 후 동일한 오디오 대기열을 다시 시작할 수없는 대신 다른 녹음 대기열과 버퍼를 만들어야 다른 녹음 시작을 알 수 있습니다.

동일한 오디오 대기열을 중지 한 후 다시 사용할 수 있습니까?

감사합니다.

답변

0

동일한 문제가 발생합니다. 문서를주의 깊게 조사한 결과이 문제의 원인에 대한 단서는 밝혀지지 않았지만 샘플 코드를 보면 모든 녹음 대기열은 한 번만 사용되었습니다. 다시 사용할 수 있다는 표시가 없습니다.

설명서의 유일한 힌트는 AudioQueuePause를 사용하여 대기열을 일시 중지 한 후에 AudioQueueStart가 RESUME으로 사용된다는 것입니다.

녹화 대기열은 일회용으로 설계되었으며 마지막에 처리 (AudioQueueDispose)하고 다시 녹화해야합니다.

0

문서가 없어도이를 수행하는 방법이있는 것으로 보입니다.

AudioQueueStop을 비동기 적으로 호출 한 후에도 대기열에 남아있는 모든 데이터가 올바르게 처리되도록해야합니다.

그래서 녹음 중지에 대한 호출에서 상태 변수 (recordingState)가 발생하여 발생 상황을 추적합니다. 이 기능 및 콜백이 다른 스레드에서 실행 감안할 때, 우리는 (이 예에서는 Listener라고도 함) 현재의 클래스에 동기화하여 가능한 합병증을 피하려고 :

-(void) stopRecording 
{ 
    @synchronized(self) 
    { 
     if(self.recordingState != RecordingStateRunning) {return;} 

     self.recordingState = RecordingStateStopping; 
     AudioQueueStop(self.audioQueue, false); 
    } 
} 

실험이 보여 주었다 AudioQueueStop에 대한 비동기 호출 (후 매개 변수 inImmediatefalse으로 설정되면 콜백이 몇 번 더 호출되므로 정리할 기회가 있습니다.

static void AQInputCallback(void *inUserData, 
         AudioQueueRef inAQ, 
         AudioQueueBufferRef inBuffer, 
         const AudioTimeStamp *inStartTime, 
         UInt32 inNumberPacketDescriptions, 
         const AudioStreamPacketDescription *inPacketDescs) 
{ 
    Listener *listener = (__bridge Listener *) inUserData; 

    @synchronized(listener) 
    { 
     if(listener.recordingState == RecordingStateRunning) 
     { 
      // Do audio processing here. 
      // ... 
     } 
     else if(listener.recordingState == RecordingStateStopping) 
     { 
      listener.recordingState = RecordingStateStopped; 

      // Do tidying here. 
      // ... 
     } 

     AudioQueueEnqueueBuffer(listener.audioQueue, inBuffer, 0, NULL); 
    } 
} 
관련 문제