static void call_ringing(SalOp *h){ LinphoneCore *lc=(LinphoneCore *)sal_get_user_pointer(sal_op_get_sal(h)); LinphoneCall *call=(LinphoneCall*)sal_op_get_user_pointer(h); SalMediaDescription *md; if (call==NULL) return; /*set privacy*/ call->current_params.privacy=(LinphonePrivacyMask)sal_op_get_privacy(call->op); if (lc->vtable.display_status) lc->vtable.display_status(lc,_("Remote ringing.")); md=sal_call_get_final_media_description(h); if (md==NULL){ linphone_core_stop_dtmf_stream(lc); if (lc->ringstream!=NULL) return;/*already ringing !*/ if (lc->sound_conf.play_sndcard!=NULL){ MSSndCard *ringcard=lc->sound_conf.lsd_card ? lc->sound_conf.lsd_card : lc->sound_conf.play_sndcard; if (call->localdesc->streams[0].max_rate>0) ms_snd_card_set_preferred_sample_rate(ringcard, call->localdesc->streams[0].max_rate); /*we release sound before playing ringback tone*/ if (call->audiostream) audio_stream_unprepare_sound(call->audiostream); lc->ringstream=ring_start(lc->sound_conf.remote_ring,2000,ringcard); } ms_message("Remote ringing..."); if (lc->vtable.display_status) lc->vtable.display_status(lc,_("Remote ringing...")); linphone_call_set_state(call,LinphoneCallOutgoingRinging,"Remote ringing"); }else{ /*accept early media */ if (call->audiostream && audio_stream_started(call->audiostream)){ /*streams already started */ ms_message("Early media already started."); return; } if (lc->vtable.show) lc->vtable.show(lc); if (lc->vtable.display_status) lc->vtable.display_status(lc,_("Early media.")); linphone_call_set_state(call,LinphoneCallOutgoingEarlyMedia,"Early media"); linphone_core_stop_ringing(lc); ms_message("Doing early media..."); linphone_core_update_streams(lc,call,md); } }
/* This function is used either on IOS to workaround the long time to initialize the Audio Unit or for ICE candidates gathering. */ void audio_stream_prepare_sound(AudioStream *stream, MSSndCard *playcard, MSSndCard *captcard){ audio_stream_unprepare_sound(stream); stream->dummy=ms_filter_new(MS_RTP_RECV_ID); rtp_session_set_payload_type(stream->ms.session,0); ms_filter_call_method(stream->dummy,MS_RTP_RECV_SET_SESSION,stream->ms.session); if (captcard && playcard){ #ifdef __ios stream->soundread=ms_snd_card_create_reader(captcard); stream->soundwrite=ms_snd_card_create_writer(playcard); ms_filter_link(stream->dummy,0,stream->soundwrite,0); #else stream->ms.voidsink=ms_filter_new(MS_VOID_SINK_ID); ms_filter_link(stream->dummy,0,stream->ms.voidsink,0); #endif } else { stream->ms.voidsink=ms_filter_new(MS_VOID_SINK_ID); ms_filter_link(stream->dummy,0,stream->ms.voidsink,0); } if (stream->ms.ticker == NULL) start_ticker(&stream->ms); ms_ticker_attach(stream->ms.ticker,stream->dummy); }