2011-07-08 110 views
0

我剛剛開始學習Core Audio,並做了一個簡單的測試應用程序,播放三種不同的鋼琴音符。除了一件小事外,它看起來相當不錯。沒有聲音播放時核心音頻CPU利用率高

起初,應用程序使用大約7%左右的CPU(在活動監視器中可見),我認爲這是正常現象,因爲它正在運行AUGraph。但是,隨着播放的音符越來越多,CPU使用率不斷增加,即使當時沒有聲音可能正在播放。

的這個下方的時間表:

  1. 啓動應用程序。低至無CPU使用率。
  2. 播放音符,中等CPU使用率。
  3. 注意事項finish &無聲音播放,CPU使用率中等。

代碼:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    // Insert code here to initialize your application 

    NewAUGraph(&audioGraph); 

    AudioComponentDescription cd; 
    AUNode outputNode; 
    AudioUnit outputUnit; 

    cd.componentManufacturer = kAudioUnitManufacturer_Apple; 
    cd.componentFlags = 0; 
    cd.componentFlagsMask = 0; 
    cd.componentType = kAudioUnitType_Output; 
    cd.componentSubType = kAudioUnitSubType_DefaultOutput; 

    //AUGraphNewNode(audioGraph, &cd, 0, NULL, &outputNode); 
    AUGraphAddNode(audioGraph, &cd, &outputNode); 
    //AUGraphGetNodeInfo(audioGraph, outputNode, 0, 0, 0, &outputUnit); 
    AUGraphNodeInfo(audioGraph, outputNode, &cd, &outputUnit); 

    AUNode mixerNode; 
    AudioUnit mixerUnit; 

    cd.componentManufacturer = kAudioUnitManufacturer_Apple; 
    cd.componentFlags = 0; 
    cd.componentFlagsMask = 0; 
    cd.componentType = kAudioUnitType_Mixer; 
    cd.componentSubType = kAudioUnitSubType_StereoMixer; 

    AUGraphAddNode(audioGraph, &cd, &mixerNode); 
    AUGraphNodeInfo(audioGraph, mixerNode, &cd, &mixerUnit); 

    AUGraphConnectNodeInput(audioGraph, mixerNode, 0, outputNode, 0); 

    AUGraphOpen(audioGraph); 
    AUGraphInitialize(audioGraph); 
    AUGraphStart(audioGraph); 

    AUNode synthNode; 


    cd.componentManufacturer = kAudioUnitManufacturer_Apple; 
    cd.componentFlags = 0; 
    cd.componentFlagsMask = 0; 
    cd.componentType = kAudioUnitType_MusicDevice; 
    cd.componentSubType = kAudioUnitSubType_DLSSynth; 

    AUGraphAddNode(audioGraph, &cd, &synthNode); 
    AUGraphNodeInfo(audioGraph, synthNode, &cd, &synthUnit); 

    AUGraphConnectNodeInput(audioGraph, synthNode, 0, mixerNode, 0); 

    AUGraphUpdate(audioGraph, NULL); 
    CAShow(audioGraph); 

} 

- (IBAction)playMusic:(id)sender { 
    MusicDeviceMIDIEvent(synthUnit, 0x90, 60, 127, 0); 
    sleep(1); 
    MusicDeviceMIDIEvent(synthUnit, 0x90, 62, 127, 0); 
    sleep(1); 
    MusicDeviceMIDIEvent(synthUnit, 0x90, 64, 127, 0); 
} 

- (void)one:(id)sender { 
    MusicDeviceMIDIEvent(synthUnit, 0x90, 60, 127, 0); 
} 

- (void)two:(id)sender { 
    MusicDeviceMIDIEvent(synthUnit, 0x90, 62, 127, 0); 
} 

- (void)three:(id)sender { 
    MusicDeviceMIDIEvent(synthUnit, 0x90, 64, 127, 0); 
} 

這是怎麼回事?我怎樣才能解決這個問題?

謝謝。

+0

首先想到 - 檢查繁忙循環。順便說一句 - 無法找到源代碼在這個檔案 - 只有樹和目錄樹:) – Ulterior

+0

什麼是繁忙的循環,我該如何檢查它們?嗯......它下載一個'zip'文件,當我點擊鏈接時。這是項目中的所有代碼。唯一的其他東西是UI,xcodeproj等。 – spudwaffle

+0

你的代碼是否在一個線程中運行?如果是 - 當您不播放音頻時,情況如何。當它沒有播放時,嘗試在其中添加一些睡眠代碼。在另一個想法 - 檢查是否正確關閉所有手柄並停止播放機制。 – Ulterior

回答

1

嗯,我想通了!

基本上,我只是忘了停止播放音符,雖然他們漸漸變得沉默,但他們仍然在玩和使電腦工作。

可以通過以速度設置爲0再次播放音符來修復此問題。所以,代碼應該是這樣的:

- (IBAction)playMusic:(id)sender { 
    MusicDeviceMIDIEvent(synthUnit, 0x90, 60, 127, 0); 
    MusicDeviceMIDIEvent(synthUnit, 0x90, 60, 0, 0); 
    sleep(1); 
    MusicDeviceMIDIEvent(synthUnit, 0x90, 62, 127, 0); 
    MusicDeviceMIDIEvent(synthUnit, 0x90, 62, 0, 0); 
    sleep(1); 
    MusicDeviceMIDIEvent(synthUnit, 0x90, 64, 127, 0); 
    MusicDeviceMIDIEvent(synthUnit, 0x90, 64, 0, 0); 
} 

- (void)one:(id)sender { 
    MusicDeviceMIDIEvent(synthUnit, 0x90, 60, 127, 0); 
    MusicDeviceMIDIEvent(synthUnit, 0x90, 60, 0, 0); 
} 

- (void)two:(id)sender { 
    MusicDeviceMIDIEvent(synthUnit, 0x90, 62, 127, 0); 
    MusicDeviceMIDIEvent(synthUnit, 0x90, 62, 0, 0); 
} 

- (void)three:(id)sender { 
    MusicDeviceMIDIEvent(synthUnit, 0x90, 64, 127, 0); 
    MusicDeviceMIDIEvent(synthUnit, 0x90, 64, 0, 0); 
} 

我想,如果我想說明打長,就可以啓動和停止的音符之間的等待時間。

感謝您的幫助:@ user757808 @Peter Hosey @mbykov

+1

你真的不應該發送停止消息嗎? 0x80? – drewish

+1

MusicDeviceMIDIEvent(synthUnit,0x80,60,127,0); – drewish

+0

@drewish這會更有意義!謝謝。 – spudwaffle

0

代碼中CPU佔用最多的部分是AudioUnit處理過程。嘗試爲用於減少CPU負載的媒體播放硬件設置相同的採樣率。

AudioSessionSetProperty (kAudioSessionProperty_PreferredHardwareSampleRate, size, &float64); 

只有一種方法可以阻止AudioUnit處理 - AUGraphStop。

我什麼都試過,從活動監控器退出,關閉所有系統聲音,只出了什麼幫助是:

  1. 對(安全啓動)
  2. 又將iTunes上移啓動

如果你有時間,或者完全重新格式化HD並重新安裝Lion。

+0

我忘了提及我在Mac上。這看起來只能在iOS上使用。 – spudwaffle