我刚刚开始学习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