播放和录制 - AudioSessionSetProperty ..?

时间:2012-03-20 09:56:48

标签: objective-c avaudioplayer core-audio audiounit

我们的应用程序使用remoteIO(音频单元)从麦克风和DSP上实时获取音频输入,它具有回调功能,可以为我提供缓冲区,并且我可以使用它。

与此同时,我们需要通过avAudioPlayer播放声音。

我把我的初始版本放入:(将声音传送到扬声器并播放并录制)

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

然后我看到了一些奇怪的东西。这些声音是从小型扬声器播放的 - 用于通话的耳机。

然后我做了一个技巧。 我已经看到,为了真正将声音传送到扬声器,我必须播放一些东西,同时执行上面的4行。 如果我这样做了一次,那么声音会回到扬声器永远。 我用一个调用方法的计时器做了这个,当这个方法执行它们时,我用avaudioPlayer播放声音,然后它修复它并向扬声器发出声音路径。

任何人对此有任何解决方案或解释吗? 我真的需要通过扬声器播放声音,没有技巧。

1 个答案:

答案 0 :(得分:3)

它永远播放的原因是麦克风拾取播放的声音并进入循环播放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

的底部或顶部发言人