use*_*714 4 voip speakerphone pjsip speaker
在通话期间,我尝试使用pjsip 2.2库将语音从内置扬声器切换到iOS设备上的扬声器.它返回TRUE表示成功,但物理上它不会改变声音目标.
我使用下一个代码
- (BOOL)setLoud:(BOOL)loud {
if (loud) {
@try {
pjmedia_aud_dev_route route = PJMEDIA_AUD_DEV_ROUTE_LOUDSPEAKER;
pj_status_t pj_status = pjsua_snd_set_setting(PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE,
&route, PJ_TRUE);
if (pj_status == PJ_SUCCESS) {
return YES;
}
else
{
return NO;
}
}
@catch (NSException *exception) {
return NO;
}
} else {
@try {
pjmedia_aud_dev_route route = PJMEDIA_AUD_DEV_ROUTE_EARPIECE;
pj_status_t pj_status = pjsua_snd_set_setting(PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE,
&route, PJ_TRUE);
if (pj_status == PJ_SUCCESS) {
return YES;
}
else
{
return NO;
}
}
@catch (NSException *exception) {
return NO;
}
}
}
Run Code Online (Sandbox Code Playgroud)
你能建议我们怎样才能做到这一点?
小智 5
随着iOS 7的推出,您现在应该使用AVAudioSession来处理任何音频管理.我花了很长时间才终于开始工作,但我终于找到了为什么我的音频没有自动路由到我的iPhone扬声器的问题.问题是当你接听电话时,pjsip会自动覆盖我在接听电话之前正在执行的AVAudioSessionPortOverride.要解决此问题,您只需在接听电话后覆盖输出音频端口即可.
为了使我的VoIP应用程序在后台模式下高效工作,我决定在名为on_call_state的自定义回调方法中处理音频路由.当调用状态发生变化时,此方法on_call_state由pjsip调用.正如您可以在这里阅读的那样,http: //www.pjsip.org/pjsip/docs/html/group__PJSIP__INV.htm,当呼叫状态发生变化时,您可以检查许多不同的标志.我在此示例中使用的状态是PJSIP_INV_STATE_CONNECTING和PJSIP_INV_STATE_DISCONNECTED.
当音频呼叫连接到另一个对等体时,将调用PJSIP_INV_STATE_CONNECTING.
当音频呼叫以另一个对等方结束时,将调用PJSIP_INV_STATE_DISCONNECTED.
static void on_call_state(pjsua_call_id call_id, pjsip_event *e)
{
pjsua_call_info ci;
PJ_UNUSED_ARG(e);
pjsua_call_get_info(call_id, &ci);
PJ_LOG(3,(THIS_FILE, "Call %d state=%.*s", call_id,
(int)ci.state_text.slen,
ci.state_text.ptr));
if (ci.state == PJSIP_INV_STATE_CONNECTING) {
BOOL success;
AVAudioSession *session = [AVAudioSession sharedInstance];
NSError *error = nil;
success = [session setCategory:AVAudioSessionCategoryPlayAndRecord
withOptions:AVAudioSessionCategoryOptionMixWithOthers
error:&error];
if (!success) NSLog(@"AVAudioSession error setCategory: %@", [error localizedDescription]);
success = [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];
if (!success) NSLog(@"AVAudioSession error overrideOutputAudioPort: %@", [error localizedDescription]);
success = [session setActive:YES error:&error];
if (!success) NSLog(@"AVAudioSession error setActive: %@", [error localizedDescription]);
} else if (ci.state == PJSIP_INV_STATE_DISCONNECTED) {
BOOL success;
AVAudioSession *session = [AVAudioSession sharedInstance];
NSError *error = nil;
success = [session setActive:NO error:&error];
if (!success) NSLog(@"AVAudioSession error setActive: %@", [error localizedDescription]);
}
}
Run Code Online (Sandbox Code Playgroud)