Commit 98c4a9bb authored by Simon Morlat's avatar Simon Morlat

wip - conferencing

parent 1caf08c5
......@@ -36,7 +36,8 @@ liblinphone_la_SOURCES=\
sipsetup.c sipsetup.h \
siplogin.c \
lsd.c linphonecore_utils.h \
ec-calibrator.c
ec-calibrator.c \
conference.c
liblinphone_la_LDFLAGS= -version-info $(LIBLINPHONE_SO_VERSION) -no-undefined
......
/***************************************************************************
* conference.c
*
* Mon Sep 12, 2011
* Copyright 2011 Belledonne Communications
* Author: Simon Morlat
* Email simon dot morlat at linphone dot org
****************************************************************************/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "private.h"
static void conference_check_init(LinphoneConference *ctx){
if (ctx->conf==NULL){
ctx->conf=ms_audio_conference_new();
}
}
static void conference_check_uninit(LinphoneConference *ctx){
if (ctx->conf){
if (ctx->conf->nmembers==0){
ms_audio_conference_destroy(ctx->conf);
ctx->conf=NULL;
}
}
}
void linphone_call_add_to_conf(LinphoneCall *call){
LinphoneCore *lc=call->core;
LinphoneConference *conf=&lc->conf_ctx;
MSAudioEndpoint *ep;
ep=ms_audio_endpoint_get_from_stream(call->audiostream,TRUE);
ms_audio_conference_add_member(conf->conf,ep);
call->endpoint=ep;
}
void linphone_call_remove_from_conf(LinphoneCall *call){
LinphoneCore *lc=call->core;
LinphoneConference *conf=&lc->conf_ctx;
ms_audio_conference_remove_member(conf->conf,call->endpoint);
ms_audio_endpoint_release_from_stream(call->endpoint);
call->endpoint=NULL;
conference_check_uninit(conf);
}
int linphone_core_add_to_conference(LinphoneCore *lc, LinphoneCall *call){
LinphoneCallParams params;
if (call->current_params.in_conference){
ms_error("Already in conference");
return -1;
}
conference_check_init(&lc->conf_ctx);
call->params.in_conference=TRUE;
call->params.has_video=FALSE;
params=call->params;
if (call->state==LinphoneCallPaused)
linphone_core_resume_call(lc,call);
else if (call->state==LinphoneCallStreamsRunning){
/*this will trigger a reINVITE that will later redraw the streams */
linphone_core_update_call(lc,call,&params);
}else{
ms_error("Call is in state %s, it cannot be added to the conference.",linphone_call_state_to_string(call->state));
return -1;
}
return 0;
}
int linphone_core_remove_from_conference(LinphoneCore *lc, LinphoneCall *call){
if (!call->current_params.in_conference){
if (call->params.in_conference){
ms_warning("Not (yet) in conference, be patient");
return -1;
}else{
ms_error("Not in a conference.");
return -1;
}
}
call->params.in_conference=FALSE;
return linphone_core_pause_call(lc,call);
}
int linphone_core_pause_conference(LinphoneCore *lc){
return 0;
}
int linphone_core_resume_conference(LinphoneCore *lc){
return 0;
}
This diff is collapsed.
......@@ -2219,13 +2219,20 @@ bool_t linphone_core_inc_invite_pending(LinphoneCore*lc){
int linphone_core_update_call(LinphoneCore *lc, LinphoneCall *call, const LinphoneCallParams *params){
int err=0;
if (params!=NULL){
const char *subject;
call->params=*params;
update_local_media_description(lc,call,&call->localdesc);
call->camera_active=params->has_video;
if (params->in_conference){
subject="Conference";
}else{
subject="Media change";
}
if (lc->vtable.display_status)
lc->vtable.display_status(lc,_("Modifying call parameters..."));
sal_call_set_local_media_description (call->op,call->localdesc);
err=sal_call_update(call->op,"Media parameters update");
err=sal_call_update(call->op,subject);
}else{
#ifdef VIDEO_ENABLED
if (call->videostream!=NULL){
......@@ -2486,8 +2493,7 @@ int linphone_core_pause_call(LinphoneCore *lc, LinphoneCall *the_call)
ms_error("No reason to pause this call, it is already paused or inactive.");
return -1;
}
if (sal_call_update(call->op,subject) != 0)
{
if (sal_call_update(call->op,subject) != 0){
if (lc->vtable.display_warning)
lc->vtable.display_warning(lc,_("Could not pause the call"));
}
......@@ -2524,6 +2530,7 @@ int linphone_core_resume_call(LinphoneCore *lc, LinphoneCall *the_call)
{
char temp[255]={0};
LinphoneCall *call = the_call;
const char *subject="Call resuming";
if(call->state!=LinphoneCallPaused ){
ms_warning("we cannot resume a call that has not been established and paused before");
......@@ -2537,7 +2544,8 @@ int linphone_core_resume_call(LinphoneCore *lc, LinphoneCall *the_call)
}
ms_message("Resuming call %p",call);
sal_media_description_set_dir(call->localdesc,SalStreamSendRecv);
if(sal_call_update(call->op,"Call resuming") != 0){
if (call->params.in_conference) subject="Resuming conference";
if(sal_call_update(call->op,subject) != 0){
return -1;
}
linphone_call_set_state (call,LinphoneCallResuming,"Resuming");
......
......@@ -1023,7 +1023,10 @@ bool_t linphone_call_are_all_streams_encrypted(LinphoneCall *call);
const char* linphone_call_get_authentication_token(LinphoneCall *call);
bool_t linphone_call_get_authentication_token_verified(LinphoneCall *call);
int linphone_core_add_to_conference(LinphoneCore *lc, LinphoneCall *call);
int linphone_core_remove_from_conference(LinphoneCore *lc, LinphoneCall *call);
int linphone_core_pause_conference(LinphoneCore *lc);
int linphone_core_resume_conference(LinphoneCore *lc);
#ifdef __cplusplus
......
......@@ -33,6 +33,7 @@
#include "config.h"
#endif
#include "mediastreamer2/mediastream.h"
#include "mediastreamer2/msconference.h"
#ifndef LIBLINPHONE_VERSION
#define LIBLINPHONE_VERSION LINPHONE_VERSION
......@@ -62,7 +63,8 @@ struct _LinphoneCallParams{
int audio_bw; /* bandwidth limit for audio stream */
bool_t has_video;
bool_t real_early_media; /*send real media even during early media (for outgoing calls)*/
bool_t pad[2];
bool_t in_conference; /*in conference mode */
bool_t pad;
};
struct _LinphoneCall
......@@ -87,6 +89,7 @@ struct _LinphoneCall
int video_port;
struct _AudioStream *audiostream; /**/
struct _VideoStream *videostream;
MSAudioEndpoint *endpoint; /*used for conferencing*/
char *refer_to;
LinphoneCallParams params;
LinphoneCallParams current_params;
......@@ -99,12 +102,13 @@ struct _LinphoneCall
bool_t all_muted; /*this flag is set during early medias*/
bool_t playing_ringbacktone;
bool_t owns_call_log;
bool_t pad;
OrtpEvQueue *audiostream_app_evq;
bool_t audiostream_encrypted;
char *auth_token;
bool_t auth_token_verified;
OrtpEvQueue *videostream_app_evq;
bool_t videostream_encrypted;
bool_t audiostream_encrypted;
bool_t auth_token_verified;
};
......@@ -388,6 +392,13 @@ typedef struct autoreplier_config
const char *message; /* the path of the file to be played */
}autoreplier_config_t;
struct _LinphoneConference{
MSAudioConference *conf;
AudioStream *local_participant;
MSAudioEndpoint *local_endpoint;
};
typedef struct _LinphoneConference LinphoneConference;
struct _LinphoneCore
{
......@@ -439,6 +450,8 @@ struct _LinphoneCore
time_t netup_time; /*time when network went reachable */
struct _EcCalibrator *ecc;
MSList *hooks;
LinphoneConference conf_ctx;
char* zrtp_secrets_cache;
bool_t use_files;
bool_t apply_nat_settings;
bool_t initial_subscribes_sent;
......@@ -448,7 +461,6 @@ struct _LinphoneCore
bool_t network_reachable;
bool_t use_preview_window;
bool_t ringstream_autorelease;
char* zrtp_secrets_cache;
};
bool_t linphone_core_can_we_add_call(LinphoneCore *lc);
......@@ -493,6 +505,10 @@ void ec_calibrator_destroy(EcCalibrator *ecc);
void linphone_call_background_tasks(LinphoneCall *call, bool_t one_second_elapsed);
/*conferencing subsystem*/
void linphone_call_add_to_conf(LinphoneCall *call);
void linphone_call_remove_from_conf(LinphoneCall *call);
#define HOLD_OFF (0)
#define HOLD_ON (1)
......
mediastreamer2 @ a8ca8f20
Subproject commit a82dcdbf8a4e8364bdcaa6f6fb88ca087f48a780
Subproject commit a8ca8f204ca57d18f6e1c0515adaf7edb0c905dd
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment