static void linphone_conference_server_call_state_changed(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState cstate, const char *msg) { LinphoneCoreVTable *vtable = linphone_core_get_current_vtable(lc); LinphoneConferenceServer *conf_srv = (LinphoneConferenceServer *)vtable->user_data; switch(cstate) { case LinphoneCallIncomingReceived: linphone_core_accept_call(lc, call); break; case LinphoneCallStreamsRunning: if(linphone_call_get_conference(call) == NULL) { linphone_core_add_to_conference(lc, call); linphone_core_leave_conference(lc); if(conf_srv->first_call == NULL) conf_srv->first_call = call; } break; case LinphoneCallEnd: if(call == conf_srv->first_call) { linphone_core_terminate_conference(lc); conf_srv->first_call = NULL; } break; default: break; } }
/** * Add all calls into a conference. * @param lc the linphone core * * Merge all established calls (either in LinphoneCallStreamsRunning or LinphoneCallPaused) into a conference. * * @returns 0 if successful, -1 otherwise **/ int linphone_core_add_all_to_conference(LinphoneCore *lc) { MSList *calls=lc->calls; while (calls) { LinphoneCall *call=(LinphoneCall*)calls->data; calls=calls->next; if (!call->current_params.in_conference) { linphone_core_add_to_conference(lc, call); } } linphone_core_enter_conference(lc); return 0; }