【发布时间】:2011-07-08 23:42:27
【问题描述】:
我刚刚开始学习 Core Audio,并制作了一个简单的测试应用程序来演奏三个不同的钢琴音符。除了一件小事之外,它似乎还不错。
起初,该应用程序使用了大约 7% 左右的 CPU(在活动监视器中可见),我认为这是正常的,因为它正在运行实时 AUGraph。然而,随着更多音符的播放,CPU 使用率不断增加,即使当时可能没有声音播放。
下面的时间线:
- 启动应用程序。 CPU 使用率几乎为零。
- 播放音符,中等 CPU 使用率。
- 笔记完成,没有声音播放,中等 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);
}
发生了什么事?我该如何解决这个问题?
谢谢。
【问题讨论】:
-
第一个想法 - 检查繁忙的循环。顺便说一句 - 在这个档案中找不到源代码 - 只有树和目录树:)
-
什么是忙循环以及如何检查它们?嗯...当我单击链接时,它会下载一个
zip文件。这就是项目中的所有代码。唯一的其他东西是 UI、xcodeproj 等。 -
您的代码是否在线程中运行?如果是 - 当您不播放音频时的情况是什么。当它不播放时,尝试在那里添加一些睡眠代码。另一方面 - 检查您是否正确关闭所有句柄并停止播放机制。
-
@spudwaffle:繁忙的循环只是代码中的一个循环(例如
for或while),尤其是一个运行大量时间的循环,它会消耗 CPU 时间并让你从快速返回运行循环。 -
您应该使用 Instruments 的 Time Profiler 工具来分析您的应用程序,并查看您的应用程序在其消耗的所有 CPU 时间中正在做什么。
标签: cocoa core-audio cpu-usage