녹음을 위해 오디오 대기열을 설정할 수 있으며 AudioQueueStart가 녹음을 시작하는 데 적합합니다.AudioQueueStop 이후 오디오 대기열을 다시 시작할 수 없습니다.
AudioQueueStop을 호출 한 후 동일한 오디오 대기열을 다시 시작할 수없는 대신 다른 녹음 대기열과 버퍼를 만들어야 다른 녹음 시작을 알 수 있습니다.
동일한 오디오 대기열을 중지 한 후 다시 사용할 수 있습니까?
감사합니다.
녹음을 위해 오디오 대기열을 설정할 수 있으며 AudioQueueStart가 녹음을 시작하는 데 적합합니다.AudioQueueStop 이후 오디오 대기열을 다시 시작할 수 없습니다.
AudioQueueStop을 호출 한 후 동일한 오디오 대기열을 다시 시작할 수없는 대신 다른 녹음 대기열과 버퍼를 만들어야 다른 녹음 시작을 알 수 있습니다.
동일한 오디오 대기열을 중지 한 후 다시 사용할 수 있습니까?
감사합니다.
동일한 문제가 발생합니다. 문서를주의 깊게 조사한 결과이 문제의 원인에 대한 단서는 밝혀지지 않았지만 샘플 코드를 보면 모든 녹음 대기열은 한 번만 사용되었습니다. 다시 사용할 수 있다는 표시가 없습니다.
설명서의 유일한 힌트는 AudioQueuePause를 사용하여 대기열을 일시 중지 한 후에 AudioQueueStart가 RESUME으로 사용된다는 것입니다.
녹화 대기열은 일회용으로 설계되었으며 마지막에 처리 (AudioQueueDispose)하고 다시 녹화해야합니다.
문서가 없어도이를 수행하는 방법이있는 것으로 보입니다.
AudioQueueStop
을 비동기 적으로 호출 한 후에도 대기열에 남아있는 모든 데이터가 올바르게 처리되도록해야합니다.
그래서 녹음 중지에 대한 호출에서 상태 변수 (recordingState
)가 발생하여 발생 상황을 추적합니다. 이 기능 및 콜백이 다른 스레드에서 실행 감안할 때, 우리는 (이 예에서는 Listener
라고도 함) 현재의 클래스에 동기화하여 가능한 합병증을 피하려고 :
-(void) stopRecording
{
@synchronized(self)
{
if(self.recordingState != RecordingStateRunning) {return;}
self.recordingState = RecordingStateStopping;
AudioQueueStop(self.audioQueue, false);
}
}
실험이 보여 주었다 AudioQueueStop
에 대한 비동기 호출 (후 매개 변수 inImmediate
이 false
으로 설정되면 콜백이 몇 번 더 호출되므로 정리할 기회가 있습니다.
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);
}
}