2012-03-20 32 views
1

我们的应用程序使用remoteIO(音频单元)从麦克风和其上的DSP实时获取音频输入,它具有一个回调函数,它为我提供了缓冲区,并且我正在处理它。播放并录音 - AudioSessionSetProperty ..?

同时,我们需要在avAudioPlayer上播放声音。

我把我的init这样的:(路线的声音扬声器,让它播放和录制)

UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord; 
     AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory); 
     UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; 
     AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride); 

但后来我看到了一些奇怪的事情。这些声音是从小型扬声器播放的,也就是您用来打电话的耳朵。

然后我做了一个小把戏。 我已经看到,为了真正将声音发送给扬声器,我必须演奏一些东西,同时执行上面的4行。 如果我这样做了1次,那么声音会永远回到扬声器。 我用一个调用该方法的计时器来做到这一点,当这个方法执行它们的时候,我用avaudioPlayer播放声音,然后 - 它修复了它和声音路径。

任何人有任何解决方案,或解释有关的东西? 我真的需要通过扬声器播放声音,没有任何窍门。

回答

3

为什么它扮演永远的原因是,麦克风拾取的声音发挥它进入一个循环AKA的Larsen effect

您可以强制声音底部扬声器与

-(void)setSpeaker 
{ 
    OSStatus error; 
    UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; 
    error = AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute, sizeof (audioRouteOverride), &audioRouteOverride); 
    if (error) NSLog(@"Couldn't route audio to speaker"); 
} 

你可以还向用户呈现用户界面来选择底部或顶部扬声器与MPVolumeView