2013-12-07 72 views
0

我正在創建一個Mac OS X CoreAudio命令行程序,通過AudioUnits的方式將一些字母數字終端輸入的專有渲染轉換爲實時音頻信號,儘量保持簡單。所有的工作都很好,以匹配輸出採樣率。CoreAudio獲取輸出採樣率

作爲一個起點,我使用了Addisson Wesley的「Learning Core Audio」的第07章教程代碼CH07_AUGraphSineWave。

我初始化AudioComponent「經書」:

void CreateAndConnectOutputUnit (MyGenerator *generator) 
{ 

AudioComponentDescription theoutput = {0}; 

theoutput.componentType = kAudioUnitType_Output; 
theoutput.componentSubType = kAudioUnitSubType_DefaultOutput; 
theoutput.componentManufacturer = kAudioUnitManufacturer_Apple; 

AudioComponent comp = AudioComponentFindNext (NULL, &theoutput); 
if (comp == NULL) { 
    printf ("can't get output unit"); 
    exit (-1); 
} 
CheckError (AudioComponentInstanceNew(comp, &generator->outputUnit), 
      "Couldn't open component for outputUnit"); 
AURenderCallbackStruct input; 
input.inputProc = MyRenderProc; 
input.inputProcRefCon = generator; 
CheckError(AudioUnitSetProperty(generator->outputUnit, 
           kAudioUnitProperty_SetRenderCallback, 
           kAudioUnitScope_Input, 
           0, 
           &input, 
           sizeof(input)), 
      "AudioUnitSetProperty failed"); 

CheckError (AudioUnitInitialize(generator->outputUnit), 
      "Couldn't initialize output unit"); 

} 

我的主要問題是我不知道如何中檢索的輸出硬件採樣率渲染AURenderCallbackStruct ,因爲它確實在起着重要作用信號發生過程。我不能將採樣率硬編碼到渲染回調中,但知道這是最簡單的方法,因爲速率不匹配會導致信號以錯誤的音調播放。

有沒有辦法在這樣一個低級別的API上獲得默認輸出的採樣率? 有沒有辦法將它匹配,而不會過度複雜? 我錯過了什麼嗎?

在此先感謝。

問候,

湯姆

回答

1

的採樣率是所有AudioUnits的屬性 - 見kAudioUnitProperty_SampleRate(文檔here) - 雖然最終它的IO單元(RemoteIO iOS上或MacOSX上HAL單元),其在音頻接口驅動採樣率。這在回調結構中不可用;您需要在初始化代碼中使用AudioUnitGetProperty()讀取此屬性。

在你的情況,下面可能會做到這一點:

Float64 sampleRate; 
CheckError(AudioUnitGetProperty(generator->outputUnit, 
           kAudioUnitProperty_SampleRate, 
           kAudioUnitScope_Input, 
           0, 
           &sampleRate, 
           sizeof(sampleRate)), 

如果你的目標是iOS,您還需要與Audio Session互動。

1

當調用AudioUnitGetProperty時,第6個參數必須是一個指向變量的指針,該變量將獲得答案的大小。

Float64 sampleRate; 
UInt32 sampleRateSize; 
CheckError(AudioUnitGetProperty(generator->outputUnit, 
          kAudioUnitProperty_SampleRate, 
          kAudioUnitScope_Input, 
          0, 
          &sampleRate, 
          &sampleRateSize), 
"AudioUnitGetProperty failed"); 

然而,只要採樣率尚未確定,該函數不返回值(但也沒有錯誤!) 但是,您可以設定例如採樣率:

Float64 sampleRate = 48000; 

CheckError(AudioUnitSetProperty(generator->outputUnit, 
           kAudioUnitProperty_SampleRate, 
           kAudioUnitScope_Input, 
           0, 
           &sampleRate, 
           sizeof(sampleRate)), 
"AudioUnitGetProperty failed"); 

從現在開始,您還可以通過Get-call讀取值。 這不回答問題,默認值是什麼。據我所知,總是44100赫茲。