2013-12-16 55 views
0

我剛剛實現了輸入和輸出回調。我的應用程序正在接收和播放音頻。我能在輸入和輸出之間得到延遲嗎?我不知道這是因爲AudioBufferList結構中沒有標識符。每個緩衝區的內存地址相同。感謝您的回覆!如何確定Core Audio中音頻輸入和輸出之間的延遲?

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);