2011-07-08 120 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