2011-04-12 24 views
4

我正在編寫一個需要託管音頻單元的Objective-C++框架。如果我嘗試使用Apple的默認單位(如DLS合成器和各種效果),一切正常。但是,我的應用程序似乎無法找到任何第三方音頻單元(in/Library/Audio/Plug-Ins/Components)。音頻單元主機需要做些什麼才能使用非Apple音頻單元?

例如,下面的代碼片段...

CAComponentDescription tInstrumentDesc = 
    CAComponentDescription('aumu','dls ','appl'); 

AUGraphAddNode(mGraph, &tInstrumentDesc, &mInstrumentNode); 

AUGraphOpen(mGraph); 

...工作得很好。但是,如果我用'aumu', 'NiMa', '-Ni-'(對於Native Instruments的Massive Synth的說明)初始化tInstrumentDesc,則AUGraphOpen()將返回OSStatus錯誤badComponentType,並且AUGraph將無法打開。這適用於我所有的第三方音頻單元。

下面的代碼,從Audacity源代碼中修改,對這個問題略有提及。它循環遍歷某種類型的所有可用音頻單元並打印出其名稱。

ComponentDescription d; 

d.componentType = 'aumu'; 
d.componentSubType = 0; 
d.componentManufacturer = 0; 
d.componentFlags = 0; 
d.componentFlagsMask = 0; 

Component c = FindNextComponent(NULL, &d); 
while(c != NULL) 
{ 
    ComponentDescription found; 

    Handle nameHandle = NewHandle(0); 

    GetComponentInfo(c, &found, nameHandle, 0, 0); 

    printf((*nameHandle)+1); 
    printf("\n"); 

    c = FindNextComponent(c, &d); 
} 

這段代碼運行之後,唯一的輸出是Apple: DLSMusicDevice(其是音頻單元嵌合上面的描述'aumu', 'dls ', 'appl')。

這似乎不是單位本身的問題,因爲蘋果的auval工具列出了我的第三方單位(他們也驗證)。

我試過運行我的測試應用程序sudo,我正在處理的自定義框架位於/ Library/Frameworks中。

回答

3

原來,問題是由於編譯爲64位。切換到32位後,一切都開始按照廣告的方式工作。我猜想沒有太多的解決方案,但你有它。

爲了澄清,我的意思是將XCode Build Setting ARCHS更改爲「32位Intel」,而不是默認的「標準32/64位Intel」。

0

首先,我假設你通過調用NewAUGraph(&mGraph)來初始化mGraph,而不是隻聲明它,然後嘗試打開它。除此之外,我懷疑這裏的問題在於你的AU圖,而不是AudioUnits本身。但是可以肯定的是,您應該嘗試手動加載AudioUnit(即,在圖表之外)並查看是否以這種方式得到任何錯誤。

+0

感謝您的回覆。我正在初始化mGraph,並在我發佈的代碼片段之外完成所有合適的工作。原來,這個問題是由於編譯爲64位。由於成爲新用戶,我無法發佈解決方案。 – admsyn 2011-04-13 14:39:32