/* mediastreamer2 library - modular sound and video processing and streaming Copyright (C) 2011 Belledonne Communications SARL Author: Simon MORLAT (simon.morlat@linphone.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. */ /* * Convenient API to create and manage audio conferences. */ #ifndef msconference_h #define msconference_h #include "mediastreamer2/mediastream.h" /** * @addtogroup mediastreamer2_audio_conference * @{ */ /** * Structure that holds audio conference parameters **/ struct _MSAudioConferenceParams{ int samplerate; /**< Conference audio sampling rate in Hz: 8000, 16000 ...*/ }; /** * Typedef to structure that holds conference parameters **/ typedef struct _MSAudioConferenceParams MSAudioConferenceParams; /** * The MSAudioConference is the object representing an audio conference. * * First, the conference has to be created with ms_audio_conference_new(), with parameters supplied. * Then, participants to the conference can be added with ms_audio_conference_add_member(). * The MSAudioConference takes in charge the mixing and dispatching of the audio to the participants. * If participants (MSAudioEndpoint) are using sampling rate different from the conference, then sample rate converters are automatically added * and configured. * Participants can be removed from the conference with ms_audio_conference_remove_member(). * The conference processing is performed in a new thread run by a MSTicker object, which is owned by the conference. * When all participants are removed, the MSAudioConference object can then be safely destroyed with ms_audio_conference_destroy(). **/ typedef struct _MSAudioConference MSAudioConference; /** * The MSAudioEndpoint represents a participant in the conference. * It can be constructed from an existing AudioStream object with * ms_audio_endpoint_get_from_stream(). **/ typedef struct _MSAudioEndpoint MSAudioEndpoint; #ifdef __cplusplus extern "C" { #endif /** * Creates a conference. * @param params a MSAudioConferenceParams structure, containing conference parameters. * @returns a MSAudioConference object. **/ MS2_PUBLIC MSAudioConference * ms_audio_conference_new(const MSAudioConferenceParams *params); /** * Gets conference's current parameters. * @param obj the conference. * @returns a read-only pointer to the conference parameters. **/ MS2_PUBLIC const MSAudioConferenceParams *ms_audio_conference_get_params(MSAudioConference *obj); /** * Adds a participant to the conference. * @param obj the conference * @param ep the participant, represented as a MSAudioEndpoint object **/ MS2_PUBLIC void ms_audio_conference_add_member(MSAudioConference *obj, MSAudioEndpoint *ep); /** * Removes a participant from the conference. * @param obj the conference * @param ep the participant, represented as a MSAudioEndpoint object **/ MS2_PUBLIC void ms_audio_conference_remove_member(MSAudioConference *obj, MSAudioEndpoint *ep); /** * Mutes or unmutes a participant. * * @param obj the conference * @param ep the participant, represented as a MSAudioEndpoint object * * By default all participants are unmuted. **/ MS2_PUBLIC void ms_audio_conference_mute_member(MSAudioConference *obj, MSAudioEndpoint *ep, bool_t muted); /** * Returns the size (ie the number of participants) of a conference. * @param obj the conference **/ MS2_PUBLIC int ms_audio_conference_get_size(MSAudioConference *obj); /** * Destroys a conference. * @param obj the conference * All participants must have been removed before destroying the conference. **/ MS2_PUBLIC void ms_audio_conference_destroy(MSAudioConference *obj); /** * Creates an MSAudioEndpoint from an existing AudioStream. * * In order to create graphs for audio processing of each participant, the AudioStream object is used, because * this object already handles all the processing for volume control, encoding, decoding, etc... * * The construction of the participants depends whether it is a remote participant, that is somebody in the network * sending and receiving audio through RTP, or a local participant, that is somebody using the local soundcard to capture * and play audio. * * To create a remote participant, first create and start an AudioStream for the participant with audio_stream_new() and * audio_stream_start_with_files(), given NULL arguments as input and output files. * This participant does not interact with soundcards, this is why we suggest to use audio_stream_start_full() to avoid * holding any reference to the sound system. * Then, create a MSAudioEndpoint representing this participant by calling ms_audio_endpoint_get_from_stream() with * is_remote=TRUE. * * To create a local participant, first create and start an AudioStream with audio_stream_new() and audio_stream_start_full(), * with real soundcard arguments. * Arguments controlling RTP should be filled with placeholders value and will not be used for conferencing. * Then, create a MSAudioEndpoint representing this local participant by calling ms_audio_endpoint_get_from_stream() * with the audiostream and is_remote=FALSE.
* For example:
*
 * AudioStream *st=audio_stream_new(65000,65001,FALSE);
 * audio_stream_start_full(st, conf->local_dummy_profile,
 *				"127.0.0.1",
 *				65000,
 *				"127.0.0.1",
 *				65001,
 *				0,
 *				40,
 *				NULL,
 *				NULL,
 *				playcard,
 *				captcard,
 *				needs_echocancellation,
 *				);
 * MSAudioEndpoint *local_endpoint=ms_audio_endpoint_get_from_stream(st,FALSE);
 * 
**/ MS2_PUBLIC MSAudioEndpoint * ms_audio_endpoint_get_from_stream(AudioStream *st, bool_t is_remote); /** * Destroys a MSAudioEndpoint that was created from an AudioStream with ms_audio_endpoint_get_from_stream(). * The AudioStream can then be destroyed if needed. **/ MS2_PUBLIC void ms_audio_endpoint_release_from_stream(MSAudioEndpoint *obj); #ifdef __cplusplus } #endif /** * @} */ #endif