我剛剛開始學習Core Audio,並做了一個簡單的測試應用程序,播放三種不同的鋼琴音符。除了一件小事外,它看起來相當不錯。沒有聲音播放時核心音頻CPU利用率高
起初,應用程序使用大約7%左右的CPU(在活動監視器中可見),我認爲這是正常現象,因爲它正在運行AUGraph
。但是,隨着播放的音符越來越多,CPU使用率不斷增加,即使當時沒有聲音可能正在播放。
的這個下方的時間表:
- 啓動應用程序。低至無CPU使用率。
- 播放音符,中等CPU使用率。
- 注意事項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);
}
這是怎麼回事?我怎樣才能解決這個問題?
謝謝。
首先想到 - 檢查繁忙循環。順便說一句 - 無法找到源代碼在這個檔案 - 只有樹和目錄樹:) – Ulterior
什麼是繁忙的循環,我該如何檢查它們?嗯......它下載一個'zip'文件,當我點擊鏈接時。這是項目中的所有代碼。唯一的其他東西是UI,xcodeproj等。 – spudwaffle
你的代碼是否在一個線程中運行?如果是 - 當您不播放音頻時,情況如何。當它沒有播放時,嘗試在其中添加一些睡眠代碼。在另一個想法 - 檢查是否正確關閉所有手柄並停止播放機制。 – Ulterior