2013-12-16 3 views
0

입력 및 출력용 콜백을 구현했습니다. 내 앱에서 오디오를 수신하고 재생 중입니다. 입력과 출력간에 지연이 발생할 수 있습니까? AudioBufferList 구조체에는 식별자가 없으므로 어떻게되는지 모르겠습니다. 메모리 주소는 모든 버퍼에 동일합니다. 답변 감사합니다!코어 오디오에서 오디오 입력과 출력 사이의 대기 시간은 어떻게 결정합니까?

static void inputCallback(id receiver, 
         AEAudioController *audioController, 
         void *source, 
         const AudioTimeStamp *time, 
         UInt32 frames, 
         AudioBufferList *audio) { 
AEPlaythroughChannel *THIS = receiver; 
. 
. 
. 
} 

출력

static OSStatus renderCallback(id channel, 
          AEAudioController *audioController, 
          const AudioTimeStamp *time, 
          UInt32 frames, 
          AudioBufferList *audio) { 
. 
. 
. 
} 
+1

의미 : 입력 및 출력 사이의 대기 시간을 어떻게 결정합니까? –

+0

네, 그게 무슨 뜻입니까 –

+0

그냥 버퍼 크기를 사용할 수 없습니까? 그것은 표본의 양입니다. 실행중인 샘플 속도가 얼마인지 알 수 있으므로 초 단위로 변환 할 수 있습니다. –

답변

1

당신이 선호하는 대기 시간을 초 단위로 크기와 일치 하나에 버퍼 크기를 설정하려고합니다

Float32 aBufferLength = 0.005; // In seconds 
OSStatus err = AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(aBufferLength), &aBufferLength); 

if (noErr != err) { 
    NSLog(@"Cannot set preferred audio buffer duration"); 
} 

을 설정할 수 있습니다. 대기 시간은 대략이 크기와 비슷할 것입니다.

1

사용 된 실제 버퍼 지속 시간을 원할 수 있습니다. 버퍼 지속 시간을 설정하면 원하는 값에 대한 제안 일뿐입니다. 오디오 시스템은 일반적으로 사용자가 설정 한 값에 가까운 것을 선택합니다. 항상 듣지 않는 이유는 선택한 값이 일반적으로 2의 제곱과 샘플 속도를 기반으로하기 때문입니다. 0.005로 설정했기 때문에 실제로 0.005를 사용한다는 의미는 아닙니다. 원하는 값을 설정 한 후 사용 된 실제 값을 질의하십시오.

// set your preferred duration 
Float32 aBufferLength = 0.005; // In seconds 
OSStatus err = AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(aBufferLength), &aBufferLength); 


// now get the actual duration used 
UInt32 size; 
Float32 bufferDuration; 
size = sizeof(bufferDuration); 
err = AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareIOBufferDuration,&size, &bufferDuration); 
NSLog(@"The actual buffer duration used is %f",bufferDuration); 
관련 문제