Commit 99252460 authored by François Grisez's avatar François Grisez

Create a C++ interface in order to abstract conference systems

The actual conference system has been transposed as an
implementation of the freshly created interface
parent b5e52a00
......@@ -73,7 +73,6 @@ set(LINPHONE_SOURCE_FILES_C
call_params.c
chat.c
chat_file_transfer.c
conference.c
contactprovider.c
content.c
dict.c
......@@ -111,7 +110,7 @@ set(LINPHONE_SOURCE_FILES_C
xmlrpc.c
vtables.c
)
set(LINPHONE_SOURCE_FILES_CXX )
set(LINPHONE_SOURCE_FILES_CXX conference.cc)
if(ENABLE_TUNNEL)
list(APPEND LINPHONE_SOURCE_FILES_CXX
......
This diff is collapsed.
/*******************************************************************************
* conference.cc
*
* Thu Nov 26, 2015
* Copyright 2015 Belledonne Communications
* Author: Linphone's team
* Email info@belledonne-communications.com
******************************************************************************/
/*
* 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.
*/
#ifndef CONFERENCE_H
#define CONFERENCE_H
#include "linphonecore.h"
typedef enum _LinphoneConferenceType {
LinphoneConferenceTypeUnknown = 0,
LinphoneConferenceTypeMedia = 1,
LinphoneConferenceTypeTransport = 2
} LinphoneConferenceType;
typedef void LinphoneConference;
LinphoneConference *linphone_conference_make(LinphoneCore *core, LinphoneConferenceType type);
void linphone_conference_free(LinphoneConference *obj);
int linphone_conference_add_call(LinphoneConference *obj, LinphoneCall *call);
int linphone_conference_remove_call(LinphoneConference *obj, LinphoneCall *call);
int linphone_conference_terminate(LinphoneConference *obj);
int linphone_conference_add_local_participant(LinphoneConference *obj);
int linphone_conference_remove_local_participant(LinphoneConference *obj);
bool_t linphone_conference_local_participant_is_in(const LinphoneConference *obj);
AudioStream *linphone_conference_get_audio_stream(const LinphoneConference *obj);
int linphone_conference_mute_microphone(LinphoneConference *obj, bool_t val);
bool_t linphone_conference_microphone_is_muted(const LinphoneConference *obj);
float linphone_conference_get_input_volume(const LinphoneConference *obj);
int linphone_conference_get_participant_count(const LinphoneConference *obj);
LinphoneConferenceType linphone_conference_get_method(const LinphoneConference *obj);
int linphone_conference_start_recording(LinphoneConference *obj, const char *path);
int linphone_conference_stop_recording(LinphoneConference *obj);
void linphone_conference_on_call_stream_starting(LinphoneConference *obj, LinphoneCall *call, bool_t is_paused_by_remote);
void linphone_conference_on_call_stream_stopping(LinphoneConference *obj, LinphoneCall *call);
void linphone_conference_on_call_terminating(LinphoneConference *obj, LinphoneCall *call);
#endif // CONFERENCE_H
......@@ -1424,7 +1424,7 @@ static void linphone_call_set_terminated(LinphoneCall *call){
if (linphone_core_del_call(lc,call) != 0){
ms_error("Could not remove the call from the list !!!");
}
linphone_core_conference_check_uninit(lc);
if(lc->conf_ctx) linphone_conference_on_call_terminating(lc->conf_ctx, call);
if (call->ringing_beep){
linphone_core_stop_dtmf(lc);
call->ringing_beep=FALSE;
......@@ -3091,7 +3091,7 @@ static void linphone_call_start_audio_stream(LinphoneCall *call, LinphoneCallSta
if (call->params->in_conference){
/*transform the graph to connect it to the conference filter */
mute = stream->dir==SalStreamRecvOnly;
linphone_call_add_to_conf(call, mute);
linphone_conference_on_call_stream_starting(lc->conf_ctx, call, mute);
}
call->current_params->in_conference=call->params->in_conference;
call->current_params->low_bandwidth=call->params->low_bandwidth;
......@@ -3575,6 +3575,7 @@ static void update_rtp_stats(LinphoneCall *call, int stream_index) {
}
static void linphone_call_stop_audio_stream(LinphoneCall *call) {
LinphoneCore *lc = call->core;
if (call->audiostream!=NULL) {
linphone_reporting_update_media_info(call, LINPHONE_CALL_STATS_AUDIO);
media_stream_reclaim_sessions(&call->audiostream->ms,&call->sessions[call->main_audio_stream_index]);
......@@ -3590,7 +3591,7 @@ static void linphone_call_stop_audio_stream(LinphoneCall *call) {
audio_stream_get_local_rtp_stats(call->audiostream,&call->log->local_stats);
linphone_call_log_fill_stats (call->log,(MediaStream*)call->audiostream);
if (call->endpoint){
linphone_call_remove_from_conf(call);
linphone_conference_on_call_stream_stopping(lc->conf_ctx, call);
}
update_rtp_stats(call, call->main_audio_stream_index);
audio_stream_stop(call->audiostream);
......@@ -4851,4 +4852,3 @@ void linphone_call_refresh_sockets(LinphoneCall *call){
}
}
}
......@@ -4853,8 +4853,7 @@ void linphone_core_mute_mic(LinphoneCore *lc, bool_t val){
const MSList *elem;
if (linphone_core_is_in_conference(lc)){
lc->conf_ctx.local_muted=val;
linphone_core_mute_audio_stream(lc, lc->conf_ctx.local_participant, val);
linphone_conference_mute_microphone(lc->conf_ctx, val);
}
list = linphone_core_get_calls(lc);
for (elem = list; elem != NULL; elem = elem->next) {
......@@ -4867,7 +4866,7 @@ void linphone_core_mute_mic(LinphoneCore *lc, bool_t val){
bool_t linphone_core_is_mic_muted(LinphoneCore *lc) {
LinphoneCall *call=linphone_core_get_current_call(lc);
if (linphone_core_is_in_conference(lc)){
return lc->conf_ctx.local_muted;
return linphone_conference_microphone_is_muted(lc->conf_ctx);
}else if (call==NULL){
ms_warning("linphone_core_is_mic_muted(): No current call !");
return FALSE;
......@@ -5896,7 +5895,7 @@ static MSFilter *get_audio_resource(LinphoneCore *lc, LinphoneAudioResourceType
if (call){
stream=call->audiostream;
}else if (linphone_core_is_in_conference(lc)){
stream=lc->conf_ctx.local_participant;
stream=linphone_conference_get_audio_stream(lc->conf_ctx);
}
if (stream){
if (rtype==LinphoneToneGenerator) return stream->dtmfgen;
......@@ -7397,3 +7396,80 @@ const char *linphone_stream_type_to_string(const LinphoneStreamType type) {
}
return "INVALID";
}
int linphone_core_add_to_conference(LinphoneCore *lc, LinphoneCall *call) {
const char *conf_method_name;
LinphoneConferenceType method;
if(lc->conf_ctx == NULL) {
conf_method_name = lp_config_get_string(lc->config, "misc", "conference_method", "media");
if(strcasecmp(conf_method_name, "media") == 0) {
method = LinphoneConferenceTypeMedia;
} else if(strcasecmp(conf_method_name, "transport") == 0) {
method = LinphoneConferenceTypeTransport;
} else {
ms_error("'%s' is not a valid conference method", conf_method_name);
return -1;
}
lc->conf_ctx = linphone_conference_make(lc, method);
}
return linphone_conference_add_call(lc->conf_ctx, call);
}
int linphone_core_add_all_to_conference(LinphoneCore *lc) {
MSList *calls=lc->calls;
while (calls) {
LinphoneCall *call=(LinphoneCall*)calls->data;
calls=calls->next;
linphone_core_add_to_conference(lc, call);
}
linphone_core_enter_conference(lc);
return 0;
}
int linphone_core_remove_from_conference(LinphoneCore *lc, LinphoneCall *call) {
if(lc->conf_ctx) return linphone_conference_remove_call(lc->conf_ctx, call);
else return -1;
}
int linphone_core_terminate_conference(LinphoneCore *lc) {
if(lc->conf_ctx == NULL) return -1;
linphone_conference_terminate(lc->conf_ctx);
linphone_conference_free(lc->conf_ctx);
lc->conf_ctx = NULL;
return 0;
}
int linphone_core_enter_conference(LinphoneCore *lc) {
if(lc->conf_ctx) return linphone_conference_add_local_participant(lc->conf_ctx);
else return -1;
}
int linphone_core_leave_conference(LinphoneCore *lc) {
if(lc->conf_ctx) return linphone_conference_remove_local_participant(lc->conf_ctx);
else return -1;
}
bool_t linphone_core_is_in_conference(const LinphoneCore *lc) {
if(lc->conf_ctx) return linphone_conference_local_participant_is_in(lc->conf_ctx);
else return FALSE;
}
int linphone_core_get_conference_size(LinphoneCore *lc) {
if(lc->conf_ctx) return linphone_conference_get_participant_count(lc->conf_ctx);
return 0;
}
float linphone_core_get_conference_local_input_volume(LinphoneCore *lc) {
if(lc->conf_ctx) return linphone_conference_get_input_volume(lc->conf_ctx);
else return -1.0;
}
int linphone_core_start_conference_recording(LinphoneCore *lc, const char *path) {
if(lc->conf_ctx) return linphone_conference_start_recording(lc->conf_ctx, path);
return -1;
}
int linphone_core_stop_conference_recording(LinphoneCore *lc) {
if(lc->conf_ctx) return linphone_conference_stop_recording(lc->conf_ctx);
return -1;
}
......@@ -32,6 +32,7 @@ extern "C" {
#include "linphonefriend.h"
#include "linphone_tunnel.h"
#include "linphonecore_utils.h"
#include "conference.h"
#include "sal/sal.h"
#include "sipsetup.h"
#include "quality_reporting.h"
......@@ -783,16 +784,6 @@ 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;
MSAudioEndpoint *record_endpoint;
RtpProfile *local_dummy_profile;
bool_t local_muted;
bool_t terminated;
};
typedef struct _LinphoneToneDescription{
LinphoneReason reason;
......@@ -807,7 +798,6 @@ void linphone_core_play_call_error_tone(LinphoneCore *lc, LinphoneReason reason)
void _linphone_core_set_tone(LinphoneCore *lc, LinphoneReason reason, LinphoneToneID id, const char *audiofile);
const char *linphone_core_get_tone_file(const LinphoneCore *lc, LinphoneToneID id);
int _linphone_core_accept_call_update(LinphoneCore *lc, LinphoneCall *call, const LinphoneCallParams *params, LinphoneCallState next_state, const char *state_info);
typedef struct _LinphoneConference LinphoneConference;
typedef struct _LinphoneTaskList{
MSList *hooks;
......@@ -869,7 +859,7 @@ struct _LinphoneCore
time_t netup_time; /*time when network went reachable */
struct _EcCalibrator *ecc;
LinphoneTaskList hooks; /*tasks periodically executed in linphone_core_iterate()*/
LinphoneConference conf_ctx;
LinphoneConference *conf_ctx;
char* zrtp_secrets_cache;
char* user_certificates_path;
LinphoneVideoPolicy video_policy;
......@@ -1000,13 +990,6 @@ int _linphone_core_pause_call(LinphoneCore *lc, LinphoneCall *call);
/*conferencing subsystem*/
void _post_configure_audio_stream(AudioStream *st, LinphoneCore *lc, bool_t muted);
/* When a conference participant pause the conference he may send a music.
* We don't want to hear that music or to send it to the other participants.
* Use muted=yes to handle this case.
*/
void linphone_call_add_to_conf(LinphoneCall *call, bool_t muted);
void linphone_call_remove_from_conf(LinphoneCall *call);
void linphone_core_conference_check_uninit(LinphoneCore *lc);
bool_t linphone_core_sound_resources_available(LinphoneCore *lc);
void linphone_core_notify_refer_state(LinphoneCore *lc, LinphoneCall *referer, LinphoneCall *newcall);
unsigned int linphone_core_get_audio_features(LinphoneCore *lc);
......
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