Мы разрабатываем Voip-приложение для Android с использованием Pjsip-Framework (версия 2.8 с openssl). На некоторых устройствах мы сталкиваемся со следующей проблемой:
После успешного установления глотка участники не могут слышать друг друга. Всякий раз, когда это происходит, в журнале появляется следующее сообщение:
sound_port.c EC suspended because of inactivity
На устройствах, где участники могут слышать друг друга, за этим сообщением следует:
sound_port.c EC activated
Это сообщение не появляется на затронутых устройствах или оно появляется, но с задержкой на минуту или даже больше.
Для активации звукового порта мы используем следующий код, который является тем же кодом, который используется в PjSip Sampleapp:
@Override
public void onCallMediaState(OnCallMediaStateParam prm) {
CallInfo ci;
try {
ci = getInfo();
} catch (Exception e) {
return;
}
CallMediaInfoVector cmiv = ci.getMedia();
for (int i = 0; i < cmiv.size(); i++) {
CallMediaInfo cmi = cmiv.get(i);
if (cmi.getType() == pjmedia_type.PJMEDIA_TYPE_AUDIO &&
(cmi.getStatus() == pjsua_call_media_status.PJSUA_CALL_MEDIA_ACTIVE || cmi.getStatus() == pjsua_call_media_status.PJSUA_CALL_MEDIA_REMOTE_HOLD)) {
// unfortunately, on Java too, the returned Media cannot be
// downcasted to AudioMedia
Media m = getMedia(i);
AudioMedia am = AudioMedia.typecastFromMedia(m);
// connect ports
try {
MyApp.ep.audDevManager().getCaptureDevMedia().
startTransmit(am);
am.startTransmit(MyApp.ep.audDevManager().
getPlaybackDevMedia());
} catch (Exception e) {
continue;
}
} else if (cmi.getType() == pjmedia_type.PJMEDIA_TYPE_VIDEO &&
cmi.getStatus() == pjsua_call_media_status.PJSUA_CALL_MEDIA_ACTIVE && cmi.getVideoIncomingWindowId() != pjsua2.INVALID_ID) {
vidWin = new VideoWindow(cmi.getVideoIncomingWindowId());
vidPrev = new VideoPreview(cmi.getVideoCapDev());
}
}
MyApp.observer.notifyCallMediaState(this);
}
Как я уже говорил, этот код, похоже, работает на некоторых устройствах, а на других - к сожалению, не работает (надежно). Любая помощь приветствуется !!