add call recording feature to conference

fix broken gtk conference interface.
This commit is contained in:
Simon Morlat 2013-02-22 17:21:50 +01:00
parent 1136049cf0
commit 08eb7e6fbe
13 changed files with 523 additions and 860 deletions

View file

@ -55,22 +55,38 @@ static void remove_local_endpoint(LinphoneConference *ctx){
}
}
static int linphone_conference_get_size(LinphoneConference *conf){
if (conf->conf == NULL) {
return 0;
}
return ms_audio_conference_get_size(conf->conf) - (conf->record_endpoint ? 1 : 0);
}
static int remote_participants_count(LinphoneConference *ctx) {
if (!ctx->conf || ms_audio_conference_get_size(ctx->conf)==0) return 0;
if (!ctx->local_participant) return ms_audio_conference_get_size(ctx->conf);
return ms_audio_conference_get_size(ctx->conf) -1;
int count=linphone_conference_get_size(ctx);
if (count==0) return 0;
if (!ctx->local_participant) return count;
return count -1;
}
void linphone_core_conference_check_uninit(LinphoneCore *lc){
LinphoneConference *ctx=&lc->conf_ctx;
if (ctx->conf){
ms_message("conference_check_uninit(): nmembers=%i",ms_audio_conference_get_size(ctx->conf));
if (remote_participants_count(ctx)==1){
int remote_count=remote_participants_count(ctx);
ms_message("conference_check_uninit(): size=%i",linphone_conference_get_size(ctx));
if (remote_count==1){
convert_conference_to_call(lc);
}
if (ms_audio_conference_get_size(ctx->conf)==1 && ctx->local_participant!=NULL){
remove_local_endpoint(ctx);
if (remote_count==0){
if (ctx->local_participant!=NULL)
remove_local_endpoint(ctx);
if (ctx->record_endpoint){
ms_audio_conference_remove_member(ctx->conf,ctx->record_endpoint);
ms_audio_endpoint_destroy(ctx->record_endpoint);
ctx->record_endpoint=NULL;
}
}
if (ms_audio_conference_get_size(ctx->conf)==0){
ms_audio_conference_destroy(ctx->conf);
ctx->conf=NULL;
@ -381,10 +397,37 @@ int linphone_core_terminate_conference(LinphoneCore *lc) {
* @returns the number of participants to the conference
**/
int linphone_core_get_conference_size(LinphoneCore *lc) {
if (lc->conf_ctx.conf == NULL) {
return 0;
LinphoneConference *conf=&lc->conf_ctx;
return linphone_conference_get_size(conf);
}
int linphone_core_start_conference_recording(LinphoneCore *lc, const char *path){
LinphoneConference *conf=&lc->conf_ctx;
if (conf->conf == NULL) {
ms_warning("linphone_core_start_conference_recording(): no conference now.");
return -1;
}
return ms_audio_conference_get_size(lc->conf_ctx.conf);
if (conf->record_endpoint==NULL){
conf->record_endpoint=ms_audio_endpoint_new_recorder();
ms_audio_conference_add_member(conf->conf,conf->record_endpoint);
}
ms_audio_recorder_endpoint_start(conf->record_endpoint,path);
return 0;
}
int linphone_core_stop_conference_recording(LinphoneCore *lc){
LinphoneConference *conf=&lc->conf_ctx;
if (conf->conf == NULL) {
ms_warning("linphone_core_stop_conference_recording(): no conference now.");
return -1;
}
if (conf->record_endpoint==NULL){
ms_warning("linphone_core_stop_conference_recording(): no record active.");
return -1;
}
ms_audio_recorder_endpoint_stop(conf->record_endpoint);
return 0;
}
/**

View file

@ -92,12 +92,7 @@ int lc_callback_obj_invoke(LCCallbackObj *obj, LinphoneCore *lc){
/*prevent a gcc bug with %c*/
static size_t my_strftime(char *s, size_t max, const char *fmt, const struct tm *tm){
#if !defined(_WIN32_WCE)
return strftime(s, max, fmt, tm);
#else
return 0;
/*FIXME*/
#endif /*_WIN32_WCE*/
}
static void set_call_log_date(LinphoneCallLog *cl, time_t start_time){
@ -120,7 +115,7 @@ LinphoneCallLog * linphone_call_log_new(LinphoneCall *call, LinphoneAddress *fro
set_call_log_date(cl,cl->start_date_time);
cl->from=from;
cl->to=to;
cl->status=LinphoneCallAborted; /*default status*/
cl->status=LinphoneCallAborted; /*default status*/
return cl;
}

View file

@ -1368,6 +1368,8 @@ float linphone_core_get_conference_local_input_volume(LinphoneCore *lc);
int linphone_core_terminate_conference(LinphoneCore *lc);
int linphone_core_get_conference_size(LinphoneCore *lc);
int linphone_core_start_conference_recording(LinphoneCore *lc, const char *path);
int linphone_core_stop_conference_recording(LinphoneCore *lc);
int linphone_core_get_max_calls(LinphoneCore *lc);
void linphone_core_set_max_calls(LinphoneCore *lc, int max);

View file

@ -530,6 +530,7 @@ struct _LinphoneConference{
MSAudioConference *conf;
AudioStream *local_participant;
MSAudioEndpoint *local_endpoint;
MSAudioEndpoint *record_endpoint;
RtpProfile *local_dummy_profile;
bool_t local_muted;
};

View file

@ -1,179 +1,22 @@
<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.24"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkDialog" id="call_statistics">
<property name="can_focus">False</property>
<property name="border_width">5</property>
<property name="title" translatable="yes">Call statistics</property>
<property name="type_hint">dialog</property>
<signal name="response" handler="linphone_gtk_call_statistics_closed"/>
<signal name="response" handler="linphone_gtk_call_statistics_closed" swapped="no"/>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">2</property>
<child>
<object class="GtkFrame" id="frame1">
<property name="visible">True</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
<property name="left_padding">12</property>
<child>
<object class="GtkTable" id="table1">
<property name="visible">True</property>
<property name="n_rows">6</property>
<property name="n_columns">2</property>
<property name="homogeneous">True</property>
<child>
<object class="GtkLabel" id="audio_codec_label">
<property name="visible">True</property>
<property name="label" translatable="yes">Audio codec</property>
</object>
<packing>
<property name="x_options"></property>
</packing>
</child>
<child>
<object class="GtkLabel" id="video_codec_label">
<property name="visible">True</property>
<property name="label" translatable="yes">Video codec</property>
</object>
<packing>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options"></property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label3">
<property name="visible">True</property>
<property name="label" translatable="yes">Audio IP bandwidth usage</property>
</object>
<packing>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options"></property>
</packing>
</child>
<child>
<object class="GtkLabel" id="audio_codec">
<property name="visible">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="video_codec">
<property name="visible">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="audio_bandwidth_usage">
<property name="visible">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label4">
<property name="visible">True</property>
<property name="label" translatable="yes">Audio Media connectivity</property>
</object>
<packing>
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
<property name="x_options"></property>
</packing>
</child>
<child>
<object class="GtkLabel" id="audio_media_connectivity">
<property name="visible">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="label" translatable="yes">Video IP bandwidth usage</property>
</object>
<packing>
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
<property name="x_options"></property>
</packing>
</child>
<child>
<object class="GtkLabel" id="video_bandwidth_usage">
<property name="visible">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label2">
<property name="visible">True</property>
<property name="label" translatable="yes">Video Media connectivity</property>
</object>
<packing>
<property name="top_attach">5</property>
<property name="bottom_attach">6</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="video_media_connectivity">
<property name="visible">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">5</property>
<property name="bottom_attach">6</property>
</packing>
</child>
</object>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="call_statistics_label">
<property name="visible">True</property>
<property name="label" translatable="yes">&lt;b&gt;Call statistics and information&lt;/b&gt;</property>
<property name="use_markup">True</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="dialog-action_area1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<placeholder/>
@ -184,6 +27,7 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
</object>
<packing>
@ -195,10 +39,210 @@
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFrame" id="frame1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="left_padding">12</property>
<child>
<object class="GtkTable" id="table1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="n_rows">7</property>
<property name="n_columns">2</property>
<property name="homogeneous">True</property>
<child>
<object class="GtkLabel" id="audio_codec_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Audio codec</property>
</object>
<packing>
<property name="x_options"></property>
</packing>
</child>
<child>
<object class="GtkLabel" id="video_codec_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Video codec</property>
</object>
<packing>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options"></property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Audio IP bandwidth usage</property>
</object>
<packing>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options"></property>
</packing>
</child>
<child>
<object class="GtkLabel" id="audio_codec">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="video_codec">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="audio_bandwidth_usage">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Audio Media connectivity</property>
</object>
<packing>
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
<property name="x_options"></property>
</packing>
</child>
<child>
<object class="GtkLabel" id="audio_media_connectivity">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Video IP bandwidth usage</property>
</object>
<packing>
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
<property name="x_options"></property>
</packing>
</child>
<child>
<object class="GtkLabel" id="video_bandwidth_usage">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Video Media connectivity</property>
</object>
<packing>
<property name="top_attach">5</property>
<property name="bottom_attach">6</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="video_media_connectivity">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">5</property>
<property name="bottom_attach">6</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label5">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Round trip time</property>
</object>
<packing>
<property name="top_attach">6</property>
<property name="bottom_attach">7</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="round_trip_time">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">6</property>
<property name="bottom_attach">7</property>
</packing>
</child>
</object>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="call_statistics_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">&lt;b&gt;Call statistics and information&lt;/b&gt;</property>
<property name="use_markup">True</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<action-widgets>

View file

@ -27,6 +27,11 @@
#define PADDING_PIXELS 4
/*
* conferencee_box = a vbox where participants are added or removed
* conf_frame = the conference tab
*/
static GtkWidget *create_conference_label(void){
GtkWidget *box=gtk_hbox_new(FALSE,0);
gtk_box_pack_start(GTK_BOX(box),gtk_image_new_from_stock(GTK_STOCK_ADD,GTK_ICON_SIZE_MENU),FALSE,FALSE,0);
@ -46,34 +51,21 @@ static void init_local_participant(GtkWidget *participant){
linphone_gtk_init_audio_meter(sound_meter, (get_volume_t) linphone_core_get_conference_local_input_volume, linphone_gtk_get_core());
}
static GtkWidget *get_conference_tab(GtkWidget *mw){
GtkWidget *box=(GtkWidget*)g_object_get_data(G_OBJECT(mw),"conference_tab");
GtkWidget *conf_frame=(GtkWidget*)g_object_get_data(G_OBJECT(mw),"conf_frame");
if(conf_frame!=NULL){
if (box==NULL){
GtkWidget *conf_box=linphone_gtk_get_widget(conf_frame,"conf_box");
box=gtk_vbox_new(FALSE,0);
GtkWidget *participant=linphone_gtk_create_widget("main","callee_frame");
gtk_box_set_homogeneous(GTK_BOX(box),TRUE);
init_local_participant(participant);
gtk_box_pack_start(GTK_BOX(box),participant,FALSE,FALSE,PADDING_PIXELS);
gtk_widget_show(box);
g_object_set_data(G_OBJECT(mw),"conference_tab",box);
gtk_box_pack_start(GTK_BOX(conf_box),box,FALSE,FALSE,PADDING_PIXELS);
}
}
static GtkWidget *get_conferencee_box(GtkWidget *mw){
GtkWidget *box=(GtkWidget*)g_object_get_data(G_OBJECT(mw),"conferencee_box");
return box;
}
static GtkWidget *find_conferencee_from_call(LinphoneCall *call){
GtkWidget *mw=linphone_gtk_get_main_window();
get_conference_tab(mw);
GtkWidget *conf_frame=(GtkWidget *)g_object_get_data(G_OBJECT(mw),"conf_frame");
GtkWidget *conf_box=linphone_gtk_get_widget(conf_frame,"conf_box");
GtkWidget *conferencee_box=get_conferencee_box(mw);
GList *elem;
GtkWidget *ret=NULL;
if (conferencee_box==NULL) return NULL;
if (call!=NULL){
GList *l=gtk_container_get_children(GTK_CONTAINER(conf_box));
GList *l=gtk_container_get_children(GTK_CONTAINER(conferencee_box));
for(elem=l;elem!=NULL;elem=elem->next){
GtkWidget *frame=(GtkWidget*)elem->data;
if (call==g_object_get_data(G_OBJECT(frame),"call")){
@ -87,28 +79,53 @@ static GtkWidget *find_conferencee_from_call(LinphoneCall *call){
return ret;
}
static GtkWidget * create_conference_panel(void){
GtkWidget *mw=linphone_gtk_get_main_window();
GtkWidget *conf_frame=linphone_gtk_create_widget("main","conf_frame");
GtkWidget *conf_box=linphone_gtk_get_widget(conf_frame,"conf_box");
GtkWidget *button_conf=linphone_gtk_get_widget(conf_frame,"terminate_conf");
GtkWidget *image=create_pixmap("stopcall-small.png");
GtkWidget *box;
GtkWidget *viewswitch=linphone_gtk_get_widget(mw,"viewswitch");
gtk_button_set_image(GTK_BUTTON(button_conf),image);
g_signal_connect_swapped(G_OBJECT(button_conf),"clicked",(GCallback)linphone_gtk_terminate_call,NULL);
g_object_set_data(G_OBJECT(mw),"conf_frame",(gpointer)conf_frame);
box=gtk_vbox_new(FALSE,0);
GtkWidget *participant=linphone_gtk_create_widget("main","callee_frame");
gtk_widget_show(participant);
gtk_box_set_homogeneous(GTK_BOX(box),TRUE);
init_local_participant(participant);
gtk_box_pack_start(GTK_BOX(box),participant,FALSE,FALSE,PADDING_PIXELS);
gtk_widget_show(box);
g_object_set_data(G_OBJECT(mw),"conferencee_box",box);
gtk_box_pack_start(GTK_BOX(conf_box),box,FALSE,FALSE,PADDING_PIXELS);
gtk_notebook_append_page(GTK_NOTEBOOK(viewswitch),conf_frame,
create_conference_label());
return conf_frame;
}
void linphone_gtk_set_in_conference(LinphoneCall *call){
GtkWidget *mw=linphone_gtk_get_main_window();
GtkWidget *viewswitch=linphone_gtk_get_widget(mw,"viewswitch");
GtkWidget *conf_frame=(GtkWidget *)g_object_get_data(G_OBJECT(mw),"conf_frame");
g_object_set_data(G_OBJECT(mw),"is_conf",GINT_TO_POINTER(TRUE));
GtkWidget *viewswitch=linphone_gtk_get_widget(mw,"viewswitch");
if(conf_frame==NULL){
conf_frame=linphone_gtk_create_widget("main","conf_frame");
GtkWidget *button_conf=linphone_gtk_get_widget(conf_frame,"terminate_conf");
GtkWidget *image=create_pixmap("stopcall-small.png");
gtk_button_set_image(GTK_BUTTON(button_conf),image);
g_signal_connect_swapped(G_OBJECT(button_conf),"clicked",(GCallback)linphone_gtk_terminate_call,NULL);
g_object_set_data(G_OBJECT(mw),"conf_frame",(gpointer)conf_frame);
gtk_notebook_append_page(GTK_NOTEBOOK(viewswitch),conf_frame,
create_conference_label());
conf_frame=create_conference_panel();
}
GtkWidget *participant=find_conferencee_from_call(call);
GtkWidget *conf_box=linphone_gtk_get_widget(conf_frame,"conf_box");
GtkWidget *participant=find_conferencee_from_call(call);
if (participant==NULL){
const LinphoneAddress *addr=linphone_call_get_remote_address(call);
participant=linphone_gtk_create_widget("main","callee_frame");
/*create and add it */
GtkWidget *conferencee_box=get_conferencee_box(mw);
GtkWidget *sound_meter;
const LinphoneAddress *addr=linphone_call_get_remote_address(call);
gchar *markup;
participant=linphone_gtk_create_widget("main","callee_frame");
gtk_widget_show(participant);
if (linphone_address_get_display_name(addr)!=NULL){
markup=g_strdup_printf("<b>%s</b>",linphone_address_get_display_name(addr));
}else{
@ -119,11 +136,11 @@ void linphone_gtk_set_in_conference(LinphoneCall *call){
gtk_label_set_markup(GTK_LABEL(linphone_gtk_get_widget(participant,"callee_name_label")),markup);
g_free(markup);
sound_meter=linphone_gtk_get_widget(participant,"sound_indicator");
linphone_gtk_init_audio_meter(sound_meter, (get_volume_t) linphone_call_get_play_volume, call);
gtk_box_pack_start(GTK_BOX(conf_box),participant,FALSE,FALSE,PADDING_PIXELS);
linphone_gtk_init_audio_meter(sound_meter, (get_volume_t) linphone_call_get_play_volume, call);
gtk_box_pack_start(GTK_BOX(conferencee_box),participant,FALSE,FALSE,PADDING_PIXELS);
g_object_set_data_full(G_OBJECT(participant),"call",linphone_call_ref(call),(GDestroyNotify)linphone_call_unref);
gtk_notebook_set_current_page(GTK_NOTEBOOK(viewswitch),
gtk_notebook_page_num(GTK_NOTEBOOK(viewswitch),conf_frame));
gtk_notebook_page_num(GTK_NOTEBOOK(viewswitch),conf_frame));
}
}
@ -135,24 +152,26 @@ void linphone_gtk_terminate_conference_participant(LinphoneCall *call){
}
void linphone_gtk_unset_from_conference(LinphoneCall *call){
GtkWidget *mw=linphone_gtk_get_main_window();
GtkWidget *conf_frame=(GtkWidget *)g_object_get_data(G_OBJECT(mw),"conf_frame");
GtkWidget *conf_box=linphone_gtk_get_widget(conf_frame,"conf_box");
GtkWidget *frame;
if (conf_box==NULL) return; /*conference tab already destroyed*/
frame=find_conferencee_from_call(call);
GList *children;
GtkWidget *frame=find_conferencee_from_call(call);
if (frame){
GtkWidget *mw=linphone_gtk_get_main_window();
GtkWidget *conf_frame=(GtkWidget *)g_object_get_data(G_OBJECT(mw),"conf_frame");
GtkWidget *conferencee_box=g_object_get_data(G_OBJECT(mw),"conferencee_box");
GList *children;
g_message("Removing a participant from conference");
gtk_widget_destroy(frame);
children=gtk_container_get_children(GTK_CONTAINER(conferencee_box));
if (g_list_length(children)==1){ /* only local participant */
/*the conference is terminated */
g_message("The conference is terminated");
g_object_set_data(G_OBJECT(mw),"conferencee_box",NULL);
gtk_widget_destroy(conf_frame);
g_object_set_data(G_OBJECT(mw),"conf_frame",NULL);
}
g_list_free(children);
}
children=gtk_container_get_children(GTK_CONTAINER(conf_box));
if (g_list_length(children)==2){
/*the conference is terminated */
gtk_widget_destroy(conf_box);
g_object_set_data(G_OBJECT(mw),"conference_tab",NULL);
}
gtk_widget_destroy(conf_frame);
g_list_free(children);
g_object_set_data(G_OBJECT(mw),"is_conf",GINT_TO_POINTER(FALSE));
g_object_set_data(G_OBJECT(mw),"conf_frame",NULL);
}

View file

@ -50,7 +50,8 @@ LinphoneCall *linphone_gtk_get_currently_displayed_call(gboolean *is_conf){
if (page!=NULL){
LinphoneCall *call=(LinphoneCall*)g_object_get_data(G_OBJECT(page),"call");
if (call==NULL){
if (GPOINTER_TO_INT(g_object_get_data(G_OBJECT(main_window),"is_conf"))){
GtkWidget *conf_frame=(GtkWidget *)g_object_get_data(G_OBJECT(main_window),"conf_frame");
if (conf_frame==page){
if (is_conf)
*is_conf=TRUE;
return NULL;
@ -75,25 +76,28 @@ static GtkWidget *make_tab_header(int number){
}
void update_tab_header(LinphoneCall *call,gboolean pause){
GtkWidget *w=(GtkWidget*)linphone_call_get_user_pointer(call);
GtkWidget *main_window=linphone_gtk_get_main_window();
GtkNotebook *notebook=GTK_NOTEBOOK(linphone_gtk_get_widget(main_window,"viewswitch"));
gint call_index=GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"call_index"));
GtkWidget *new_label=gtk_hbox_new (FALSE,0);
GtkWidget *i=NULL;
if(pause){
i=gtk_image_new_from_stock(GTK_STOCK_MEDIA_PAUSE,GTK_ICON_SIZE_SMALL_TOOLBAR);
} else {
i=create_pixmap ("startcall-small.png");
}
GtkWidget *w=(GtkWidget*)linphone_call_get_user_pointer(call);
GtkWidget *main_window=linphone_gtk_get_main_window();
GtkNotebook *notebook=GTK_NOTEBOOK(linphone_gtk_get_widget(main_window,"viewswitch"));
gint call_index=GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"call_index"));
GtkWidget *new_label=gtk_hbox_new (FALSE,0);
GtkWidget *i=NULL;
GtkWidget *l;
gchar *text=g_strdup_printf(_("Call #%i"),call_index);
gchar *text;
if(pause){
i=gtk_image_new_from_stock(GTK_STOCK_MEDIA_PAUSE,GTK_ICON_SIZE_SMALL_TOOLBAR);
} else {
i=create_pixmap ("startcall-small.png");
}
text=g_strdup_printf(_("Call #%i"),call_index);
l=gtk_label_new (text);
gtk_box_pack_start (GTK_BOX(new_label),i,FALSE,FALSE,0);
gtk_box_pack_end(GTK_BOX(new_label),l,TRUE,TRUE,0);
gtk_notebook_set_tab_label(notebook,w,new_label);
gtk_widget_show_all(new_label);
gtk_notebook_set_tab_label(notebook,w,new_label);
gtk_widget_show_all(new_label);
}
static void linphone_gtk_in_call_set_animation_image(GtkWidget *callview, const char *image_name, gboolean is_stock){
@ -157,8 +161,7 @@ void transfer_button_clicked(GtkWidget *button, gpointer call_ref){
g_signal_connect_swapped(G_OBJECT(menu_item),"activate",(GCallback)linphone_gtk_transfer_call,other_call);
}
}
gtk_menu_popup(GTK_MENU(menu),NULL,NULL,NULL,NULL,0,
gtk_get_current_event_time());
gtk_menu_popup(GTK_MENU(menu),NULL,NULL,NULL,NULL,0,gtk_get_current_event_time());
gtk_widget_show(menu);
}
@ -178,7 +181,6 @@ static void conference_button_clicked(GtkWidget *button, gpointer call_ref){
gtk_widget_set_sensitive(button,FALSE);
g_object_set_data(G_OBJECT(linphone_gtk_get_main_window()),"conf_frame",NULL);
linphone_core_add_all_to_conference(linphone_gtk_get_core());
//linphone_core_add_to_conference(linphone_gtk_get_core(),(LinphoneCall*)call_ref);
}
@ -202,7 +204,6 @@ static void show_used_codecs(GtkWidget *callstats, LinphoneCall *call){
GtkWidget *acodec_ui=linphone_gtk_get_widget(callstats,"audio_codec");
GtkWidget *vcodec_ui=linphone_gtk_get_widget(callstats,"video_codec");
if (acodec){
char tmp[64]={0};
snprintf(tmp,sizeof(tmp)-1,"%s/%i/%i",acodec->mime_type,acodec->clock_rate,acodec->channels);
gtk_label_set_label(GTK_LABEL(acodec_ui),tmp);
@ -252,28 +253,40 @@ static const char *upnp_state_to_string(LinphoneUpnpState ice_state){
static void _refresh_call_stats(GtkWidget *callstats, LinphoneCall *call){
const LinphoneCallStats *as=linphone_call_get_audio_stats(call);
const LinphoneCallStats *vs=linphone_call_get_video_stats(call);
const char *audio_media_connectivity = _("Direct");
const char *video_media_connectivity = _("Direct");
const char *audio_media_connectivity = _("Direct or through server");
const char *video_media_connectivity = _("Direct or through server");
gboolean has_video=linphone_call_params_video_enabled(linphone_call_get_current_params(call));
gchar *tmp=g_strdup_printf(_("download: %f\nupload: %f (kbit/s)"),
as->download_bandwidth,as->upload_bandwidth);
gtk_label_set_markup(GTK_LABEL(linphone_gtk_get_widget(callstats,"audio_bandwidth_usage")),tmp);
g_free(tmp);
tmp=g_strdup_printf(_("download: %f\nupload: %f (kbit/s)"),
vs->download_bandwidth,vs->upload_bandwidth);
if (has_video)
tmp=g_strdup_printf(_("download: %f\nupload: %f (kbit/s)"),vs->download_bandwidth,vs->upload_bandwidth);
else tmp=NULL;
gtk_label_set_markup(GTK_LABEL(linphone_gtk_get_widget(callstats,"video_bandwidth_usage")),tmp);
g_free(tmp);
if (tmp) g_free(tmp);
if(as->upnp_state != LinphoneUpnpStateNotAvailable && as->upnp_state != LinphoneUpnpStateIdle) {
audio_media_connectivity = upnp_state_to_string(as->upnp_state);
} else if(as->ice_state != LinphoneIceStateNotActivated) {
audio_media_connectivity = ice_state_to_string(as->ice_state);
}
gtk_label_set_text(GTK_LABEL(linphone_gtk_get_widget(callstats,"audio_media_connectivity")),audio_media_connectivity);
if(vs->upnp_state != LinphoneUpnpStateNotAvailable && vs->upnp_state != LinphoneUpnpStateIdle) {
video_media_connectivity = upnp_state_to_string(vs->upnp_state);
} else if(vs->ice_state != LinphoneIceStateNotActivated) {
video_media_connectivity = ice_state_to_string(vs->ice_state);
}
if (has_video){
if(vs->upnp_state != LinphoneUpnpStateNotAvailable && vs->upnp_state != LinphoneUpnpStateIdle) {
video_media_connectivity = upnp_state_to_string(vs->upnp_state);
} else if(vs->ice_state != LinphoneIceStateNotActivated) {
video_media_connectivity = ice_state_to_string(vs->ice_state);
}
}else video_media_connectivity=NULL;
gtk_label_set_text(GTK_LABEL(linphone_gtk_get_widget(callstats,"video_media_connectivity")),video_media_connectivity);
if (as->round_trip_delay>0){
tmp=g_strdup_printf(_("%.3f seconds"),as->round_trip_delay);
gtk_label_set_text(GTK_LABEL(linphone_gtk_get_widget(callstats,"round_trip_time")),tmp);
g_free(tmp);
}
}
static gboolean refresh_call_stats(GtkWidget *callstats){
@ -689,6 +702,9 @@ void linphone_gtk_in_call_view_set_in_call(LinphoneCall *call){
if (in_conf){
linphone_gtk_set_in_conference(call);
gtk_widget_set_sensitive(linphone_gtk_get_widget(callview,"incall_mute"),FALSE);
}else{
linphone_gtk_unset_from_conference(call); /*in case it was previously*/
gtk_widget_set_sensitive(linphone_gtk_get_widget(callview,"incall_mute"),TRUE);
}
gtk_widget_show_all(linphone_gtk_get_widget(callview,"buttons_panel"));
if (!in_conf) gtk_widget_show_all(linphone_gtk_get_widget(callview,"record_hbox"));
@ -857,18 +873,46 @@ void linphone_gtk_call_statistics_closed(GtkWidget *call_stats){
void linphone_gtk_record_call_toggled(GtkWidget *button){
gboolean active=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button));
LinphoneCall *call=linphone_gtk_get_currently_displayed_call(NULL);
GtkWidget *callview=(GtkWidget*)linphone_call_get_user_pointer (call);
const LinphoneCallParams *params=linphone_call_get_current_params(call);
const char *filepath=linphone_call_params_get_record_file(params);
gchar *message=g_strdup_printf(_("<small><i>Recording into %s %s</i></small>"),filepath,active ? "" : _("(Paused)"));
gboolean is_conf=FALSE;
const char *filepath;
gchar *message;
LinphoneCore *lc=linphone_gtk_get_core();
LinphoneCall *call=linphone_gtk_get_currently_displayed_call(&is_conf);
GtkWidget *callview;
GtkWidget *label;
if (call){
callview=(GtkWidget*)linphone_call_get_user_pointer (call);
const LinphoneCallParams *params=linphone_call_get_current_params(call);
filepath=linphone_call_params_get_record_file(params);
label=linphone_gtk_get_widget(callview,"record_status");
}else if (is_conf){
GtkWidget *mw=linphone_gtk_get_main_window();
callview=(GtkWidget *)g_object_get_data(G_OBJECT(linphone_gtk_get_main_window()),"conf_frame");
label=linphone_gtk_get_widget(callview,"conf_record_status");
filepath=(const char*)g_object_get_data(G_OBJECT(mw),"conf_record_path");
if (filepath==NULL){
filepath=linphone_gtk_get_record_path(NULL,TRUE);
g_object_set_data_full(G_OBJECT(mw),"conf_record_path",(char*)filepath,g_free);
}
}else{
g_warning("linphone_gtk_record_call_toggled(): bug.");
return;
}
message=g_strdup_printf(_("<small><i>Recording into\n%s %s</i></small>"),filepath,active ? "" : _("(Paused)"));
if (active){
linphone_call_start_recording(call);
if (call)
linphone_call_start_recording(call);
else
linphone_core_start_conference_recording(lc,filepath);
}else {
linphone_call_stop_recording(call);
if (call)
linphone_call_stop_recording(call);
else
linphone_core_stop_conference_recording(lc);
}
gtk_label_set_markup(GTK_LABEL(linphone_gtk_get_widget(callview,"record_status")),message);
gtk_label_set_markup(GTK_LABEL(label),message);
g_free(message);
}

View file

@ -149,3 +149,5 @@ void linphone_gtk_uninit_instance(void);
void linphone_gtk_monitor_usb(void);
void linphone_gtk_unmonitor_usb(void);
gchar *linphone_gtk_get_record_path(const LinphoneAddress *address, gboolean is_conference);

View file

@ -750,14 +750,35 @@ static void linphone_gtk_update_call_buttons(LinphoneCall *call){
}
}
gchar *linphone_gtk_get_call_record_path(LinphoneAddress *address){
gchar *linphone_gtk_get_record_path(const LinphoneAddress *address, gboolean is_conference){
const char *dir=g_get_user_special_dir(G_USER_DIRECTORY_MUSIC);
const char *id=linphone_address_get_username(address);
const char *id="unknown";
char filename[256]={0};
if (id==NULL) id=linphone_address_get_domain(address);
snprintf(filename,sizeof(filename)-1,"%s-%lu-%s-record.wav",
linphone_gtk_get_ui_config("title","Linphone"),
(unsigned long)time(NULL),id);
char date[64]={0};
time_t curtime=time(NULL);
struct tm loctime;
#ifdef WIN32
loctime=*localtime(&curtime);
#else
localtime_r(&curtime,&loctime);
#endif
snprintf(date,sizeof(date)-1,"%i%02i%02i-%02i%02i",loctime.tm_year+1900,loctime.tm_mon+1,loctime.tm_mday, loctime.tm_hour, loctime.tm_min);
if (address){
id=linphone_address_get_username(address);
if (id==NULL) id=linphone_address_get_domain(address);
}
if (is_conference){
snprintf(filename,sizeof(filename)-1,"%s-conference-%s.wav",
linphone_gtk_get_ui_config("title","Linphone"),
date);
}else{
snprintf(filename,sizeof(filename)-1,"%s-call-%s-%s.wav",
linphone_gtk_get_ui_config("title","Linphone"),
date,
id);
}
return g_build_filename(dir,filename,NULL);
}
@ -768,7 +789,7 @@ static gboolean linphone_gtk_start_call_do(GtkWidget *uri_bar){
if (addr!=NULL){
LinphoneCallParams *params=linphone_core_create_default_call_parameters(lc);
gchar *record_file=linphone_gtk_get_call_record_path(addr);
gchar *record_file=linphone_gtk_get_record_path(addr,FALSE);
linphone_call_params_set_record_file(params,record_file);
linphone_core_invite_address_with_params(lc,addr,params);
completion_add_text(GTK_ENTRY(uri_bar),entered);
@ -781,24 +802,34 @@ static gboolean linphone_gtk_start_call_do(GtkWidget *uri_bar){
return FALSE;
}
static void accept_incoming_call(LinphoneCall *call){
LinphoneCore *lc=linphone_gtk_get_core();
LinphoneCallParams *params=linphone_core_create_default_call_parameters(lc);
gchar *record_file=linphone_gtk_get_record_path(linphone_call_get_remote_address(call),FALSE);
linphone_call_params_set_record_file(params,record_file);
linphone_core_accept_call_with_params(lc,call,params);
linphone_call_params_destroy(params);
}
static gboolean linphone_gtk_auto_answer(LinphoneCall *call){
if (linphone_call_get_state(call)==LinphoneCallIncomingReceived){
linphone_core_accept_call (linphone_gtk_get_core(),call);
LinphoneCallState state=linphone_call_get_state(call);
if (state==LinphoneCallIncomingReceived || state==LinphoneCallIncomingEarlyMedia){
accept_incoming_call(call);
linphone_call_unref(call);
}
return FALSE;
}
void linphone_gtk_start_call(GtkWidget *w){
LinphoneCore *lc=linphone_gtk_get_core();
LinphoneCall *call;
LinphoneCall *call=linphone_gtk_get_currently_displayed_call(NULL);
/*change into in-call mode, then do the work later as it might block a bit */
GtkWidget *mw=gtk_widget_get_toplevel(w);
GtkWidget *uri_bar=linphone_gtk_get_widget(mw,"uribar");
LinphoneCallState state= call ? linphone_call_get_state(call) : LinphoneCallIdle;
call=linphone_gtk_get_currently_displayed_call(NULL);
if (call!=NULL && linphone_call_get_state(call)==LinphoneCallIncomingReceived){
linphone_core_accept_call(lc,call);
if (state == LinphoneCallIncomingReceived || state == LinphoneCallIncomingEarlyMedia){
accept_incoming_call(call);
}else{
/*immediately disable the button and delay a bit the execution the linphone_core_invite()
so that we don't freeze the button. linphone_core_invite() might block for some hundreds of milliseconds*/
@ -831,7 +862,7 @@ void linphone_gtk_decline_clicked(GtkWidget *button){
void linphone_gtk_answer_clicked(GtkWidget *button){
LinphoneCall *call=linphone_gtk_get_currently_displayed_call(NULL);
if (call){
linphone_core_accept_call(linphone_gtk_get_core(),call);
accept_incoming_call(call);
linphone_gtk_show_main_window(); /* useful when the button is clicked on a notification */
}
}

View file

@ -215,9 +215,6 @@
<object class="GtkVBox" id="conf_box">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<placeholder/>
</child>
<child>
<object class="GtkHButtonBox" id="button_conf">
<property name="visible">True</property>
@ -242,9 +239,53 @@
<property name="expand">True</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="conf_record_hbox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkToggleButton" id="conf_record_button">
<property name="label">gtk-media-record</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
<signal name="toggled" handler="linphone_gtk_record_call_toggled" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="conf_record_status">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="wrap">True</property>
<property name="wrap_mode">char</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</object>
</child>
</object>

View file

@ -972,7 +972,8 @@ static void linphone_gtk_show_media_encryption(GtkWidget *pb){
}
g_signal_connect(G_OBJECT(combo),"changed",(GCallback)linphone_gtk_media_encryption_changed,NULL);
}
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"media_encryption_mandatory")),linphone_core_is_media_encryption_mandatory(lc));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"media_encryption_mandatory")),
linphone_core_is_media_encryption_mandatory(lc));
g_object_unref(G_OBJECT(model));
}
@ -1015,10 +1016,8 @@ void linphone_gtk_show_parameters(void){
if (pb==NULL) {
pb=linphone_gtk_create_window("parameters");
g_object_set_data(G_OBJECT(mw),"parameters",pb);
ms_error("linphone_gtk_show_paramters: create");
}else {
gtk_widget_show(pb);
ms_error("linphone_gtk_show_parameters: show");
return;
}
codec_list=linphone_gtk_get_widget(pb,"codec_list");
@ -1028,21 +1027,21 @@ void linphone_gtk_show_parameters(void){
linphone_core_ipv6_enabled(lc));
linphone_core_get_sip_transports(lc,&tr);
if (tr.tcp_port > 0) {
gtk_combo_box_set_active(GTK_COMBO_BOX(linphone_gtk_get_widget(pb,"proto_combo")), 1);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"proto_port")),
if (tr.tcp_port > 0) {
gtk_combo_box_set_active(GTK_COMBO_BOX(linphone_gtk_get_widget(pb,"proto_combo")), 1);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"proto_port")),
tr.tcp_port);
}
else if (tr.tls_port > 0) {
gtk_combo_box_set_active(GTK_COMBO_BOX(linphone_gtk_get_widget(pb,"proto_combo")), 2);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"proto_port")),
}
else if (tr.tls_port > 0) {
gtk_combo_box_set_active(GTK_COMBO_BOX(linphone_gtk_get_widget(pb,"proto_combo")), 2);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"proto_port")),
tr.tls_port);
}
else {
gtk_combo_box_set_active(GTK_COMBO_BOX(linphone_gtk_get_widget(pb,"proto_combo")), 0);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"proto_port")),
}
else {
gtk_combo_box_set_active(GTK_COMBO_BOX(linphone_gtk_get_widget(pb,"proto_combo")), 0);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"proto_port")),
tr.udp_port);
}
}
linphone_core_get_audio_port_range(lc, &min_port, &max_port);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb, "audio_min_rtp_port")), min_port);

0
gtk/update.c Executable file → Normal file
View file

View file

@ -1,558 +0,0 @@
<?xml version = '1.0'?>
<kdevelop>
<general>
<author>Simon Morlat</author>
<email>simon.morlat@linphone.org</email>
<version>[3.1.2]</version>
<projectmanagement>KDevCustomProject</projectmanagement>
<primarylanguage>C</primarylanguage>
<ignoreparts/>
<projectname>linphone</projectname>
<projectdirectory>.</projectdirectory>
<absoluteprojectpath>false</absoluteprojectpath>
<description/>
<defaultencoding/>
</general>
<kdevcustomproject>
<run>
<directoryradio>executable</directoryradio>
<mainprogram>gtk-glade/linphone</mainprogram>
<programargs/>
<globaldebugarguments/>
<globalcwd/>
<useglobalprogram>false</useglobalprogram>
<terminal>false</terminal>
<autocompile>false</autocompile>
<autoinstall>false</autoinstall>
<autokdesu>false</autokdesu>
<envvars/>
</run>
<filetypes>
<filetype>*.java</filetype>
<filetype>*.h</filetype>
<filetype>*.H</filetype>
<filetype>*.hh</filetype>
<filetype>*.hxx</filetype>
<filetype>*.hpp</filetype>
<filetype>*.c</filetype>
<filetype>*.C</filetype>
<filetype>*.cc</filetype>
<filetype>*.cpp</filetype>
<filetype>*.c++</filetype>
<filetype>*.cxx</filetype>
</filetypes>
<blacklist>
<path>config.h</path>
<path>exosip</path>
<path>exosip/eXosip2.h</path>
<path>exosip/eXosip.c</path>
<path>exosip/eXosip_cfg.h</path>
<path>exosip/eXosip.h</path>
<path>exosip/eXutils.c</path>
<path>exosip/jauth.c</path>
<path>exosip/jcallback.c</path>
<path>exosip/jcall.c</path>
<path>exosip/jdialog.c</path>
<path>exosip/jevents.c</path>
<path>exosip/jfreinds.c</path>
<path>exosip/jidentity.c</path>
<path>exosip/jnotify.c</path>
<path>exosip/jpipe.c</path>
<path>exosip/jpipe.h</path>
<path>exosip/jpublish.c</path>
<path>exosip/jreg.c</path>
<path>exosip/jrequest.c</path>
<path>exosip/jresponse.c</path>
<path>exosip/jsubscribe.c</path>
<path>exosip/jsubscribers.c</path>
<path>exosip/misc.c</path>
<path>exosip/sdp_offans.c</path>
<path>exosip/udp.c</path>
<path>gnome</path>
<path>gnome/addressbook.c</path>
<path>gnome/addressbook.h</path>
<path>gnome/applet.c</path>
<path>gnome/callbacks.c</path>
<path>gnome/callbacks.h</path>
<path>gnome/friends.c</path>
<path>gnome/friends.h</path>
<path>gnome/gui_utils.c</path>
<path>gnome/gui_utils.h</path>
<path>gnome/interface.c</path>
<path>gnome/interface.h</path>
<path>gnome/linphone.c</path>
<path>gnome/linphone.h</path>
<path>gnome/main.c</path>
<path>gnome/presence.c</path>
<path>gnome/presence.h</path>
<path>gnome/propertybox.c</path>
<path>gnome/propertybox.h</path>
<path>gnome/support.c</path>
<path>gnome/support.h</path>
<path>gsmlib</path>
<path>gsmlib/code.c</path>
<path>gsmlib/config.h</path>
<path>gsmlib/debug.c</path>
<path>gsmlib/decode.c</path>
<path>gsmlib/gsmadd.c</path>
<path>gsmlib/gsm_create.c</path>
<path>gsmlib/gsm_decode.c</path>
<path>gsmlib/gsm_destroy.c</path>
<path>gsmlib/gsm_encode.c</path>
<path>gsmlib/gsm_explode.c</path>
<path>gsmlib/gsm.h</path>
<path>gsmlib/gsm_implode.c</path>
<path>gsmlib/gsm_option.c</path>
<path>gsmlib/gsm_print.c</path>
<path>gsmlib/gsm_wrapper.c</path>
<path>gsmlib/gsm_wrapper.h</path>
<path>gsmlib/long_term.c</path>
<path>gsmlib/lpc.c</path>
<path>gsmlib/preprocess.c</path>
<path>gsmlib/private.h</path>
<path>gsmlib/proto.h</path>
<path>gsmlib/rpe.c</path>
<path>gsmlib/short_term.c</path>
<path>gsmlib/table.c</path>
<path>gsmlib/toast.h</path>
<path>gsmlib/unproto.h</path>
<path>gtk</path>
<path>gtk/addressbook.c</path>
<path>gtk/addressbook.h</path>
<path>gtk/applet.c</path>
<path>gtk/callbacks.c</path>
<path>gtk/callbacks.h</path>
<path>gtk/friends.c</path>
<path>gtk/friends.h</path>
<path>gtk/gui_utils.c</path>
<path>gtk/gui_utils.h</path>
<path>gtk/interface.c</path>
<path>gtk/interface.h</path>
<path>gtk/linphone.c</path>
<path>gtk/linphone.h</path>
<path>gtk/main.c</path>
<path>gtk/presence.c</path>
<path>gtk/presence.h</path>
<path>gtk/propertybox.c</path>
<path>gtk/propertybox.h</path>
<path>gtk/support.c</path>
<path>gtk/support.h</path>
<path>intl</path>
<path>intl/bindtextdom.c</path>
<path>intl/cat-compat.c</path>
<path>intl/dcgettext.c</path>
<path>intl/dgettext.c</path>
<path>intl/explodename.c</path>
<path>intl/finddomain.c</path>
<path>intl/gettext.c</path>
<path>intl/gettext.h</path>
<path>intl/gettextP.h</path>
<path>intl/hash-string.h</path>
<path>intl/intl-compat.c</path>
<path>intl/l10nflist.c</path>
<path>intl/libgettext.h</path>
<path>intl/loadinfo.h</path>
<path>intl/loadmsgcat.c</path>
<path>intl/localealias.c</path>
<path>intl/textdomain.c</path>
<path>lpc10-1.5</path>
<path>lpc10-1.5/analys.c</path>
<path>lpc10-1.5/bitio.c</path>
<path>lpc10-1.5/bsynz.c</path>
<path>lpc10-1.5/chanwr.c</path>
<path>lpc10-1.5/dcbias.c</path>
<path>lpc10-1.5/decode.c</path>
<path>lpc10-1.5/deemp.c</path>
<path>lpc10-1.5/difmag.c</path>
<path>lpc10-1.5/dyptrk.c</path>
<path>lpc10-1.5/encode.c</path>
<path>lpc10-1.5/energy.c</path>
<path>lpc10-1.5/f2c.h</path>
<path>lpc10-1.5/f2clib.c</path>
<path>lpc10-1.5/ham84.c</path>
<path>lpc10-1.5/hp100.c</path>
<path>lpc10-1.5/invert.c</path>
<path>lpc10-1.5/irc2pc.c</path>
<path>lpc10-1.5/ivfilt.c</path>
<path>lpc10-1.5/lpc10.h</path>
<path>lpc10-1.5/lpc10_wrapper.c</path>
<path>lpc10-1.5/lpc10_wrapper.h</path>
<path>lpc10-1.5/lpcdec.c</path>
<path>lpc10-1.5/lpcenc.c</path>
<path>lpc10-1.5/lpcini.c</path>
<path>lpc10-1.5/lpfilt.c</path>
<path>lpc10-1.5/median.c</path>
<path>lpc10-1.5/mload.c</path>
<path>lpc10-1.5/onset.c</path>
<path>lpc10-1.5/pitsyn.c</path>
<path>lpc10-1.5/placea.c</path>
<path>lpc10-1.5/placev.c</path>
<path>lpc10-1.5/preemp.c</path>
<path>lpc10-1.5/prepro.c</path>
<path>lpc10-1.5/random.c</path>
<path>lpc10-1.5/rcchk.c</path>
<path>lpc10-1.5/synths.c</path>
<path>lpc10-1.5/tbdm.c</path>
<path>lpc10-1.5/voicin.c</path>
<path>lpc10-1.5/vparms.c</path>
<path>media_api</path>
<path>media_api/apitest.c</path>
<path>media_api/apitest.h</path>
<path>media_api/basiccall.c</path>
<path>media_api/basiccall.h</path>
<path>media_api/callmember.c</path>
<path>media_api/callmember.h</path>
<path>media_api/common.h</path>
<path>media_api/media_api.c</path>
<path>media_api/media_api.h</path>
<path>media_api/mediaflow.c</path>
<path>media_api/mediaflow.h</path>
<path>mediastreamer</path>
<path>mediastreamer/affine.c</path>
<path>mediastreamer/affine.h</path>
<path>mediastreamer/alsacard.c</path>
<path>mediastreamer/alsacard.h</path>
<path>mediastreamer/audiostream.c</path>
<path>mediastreamer/g711common.h</path>
<path>mediastreamer/hpuxsndcard.c</path>
<path>mediastreamer/jackcard.c</path>
<path>mediastreamer/jackcard.h</path>
<path>mediastreamer/mediastream.c</path>
<path>mediastreamer/mediastream.h</path>
<path>mediastreamer/msAlawdec.c</path>
<path>mediastreamer/msAlawdec.h</path>
<path>mediastreamer/msAlawenc.c</path>
<path>mediastreamer/msAlawenc.h</path>
<path>mediastreamer/msavdecoder.c</path>
<path>mediastreamer/msavdecoder.h</path>
<path>mediastreamer/msavencoder.c</path>
<path>mediastreamer/msavencoder.h</path>
<path>mediastreamer/msbuffer.c</path>
<path>mediastreamer/msbuffer.h</path>
<path>mediastreamer/ms.c</path>
<path>mediastreamer/mscodec.c</path>
<path>mediastreamer/mscodec.h</path>
<path>mediastreamer/mscopy.c</path>
<path>mediastreamer/mscopy.h</path>
<path>mediastreamer/msfdispatcher.c</path>
<path>mediastreamer/msfdispatcher.h</path>
<path>mediastreamer/msfifo.c</path>
<path>mediastreamer/msfifo.h</path>
<path>mediastreamer/msfilter.c</path>
<path>mediastreamer/msfilter.h</path>
<path>mediastreamer/msGSMdecoder.c</path>
<path>mediastreamer/msGSMdecoder.h</path>
<path>mediastreamer/msGSMencoder.c</path>
<path>mediastreamer/msGSMencoder.h</path>
<path>mediastreamer/ms.h</path>
<path>mediastreamer/msLPC10decoder.c</path>
<path>mediastreamer/msLPC10decoder.h</path>
<path>mediastreamer/msLPC10encoder.c</path>
<path>mediastreamer/msLPC10encoder.h</path>
<path>mediastreamer/msMUlawdec.c</path>
<path>mediastreamer/msMUlawdec.h</path>
<path>mediastreamer/msMUlawenc.c</path>
<path>mediastreamer/msMUlawenc.h</path>
<path>mediastreamer/msnosync.c</path>
<path>mediastreamer/msnosync.h</path>
<path>mediastreamer/msossread.c</path>
<path>mediastreamer/msossread.h</path>
<path>mediastreamer/msosswrite.c</path>
<path>mediastreamer/msosswrite.h</path>
<path>mediastreamer/msqdispatcher.c</path>
<path>mediastreamer/msqdispatcher.h</path>
<path>mediastreamer/msqueue.c</path>
<path>mediastreamer/msqueue.h</path>
<path>mediastreamer/msread.c</path>
<path>mediastreamer/msread.h</path>
<path>mediastreamer/msringplayer.c</path>
<path>mediastreamer/msringplayer.h</path>
<path>mediastreamer/msrtprecv.c</path>
<path>mediastreamer/msrtprecv.h</path>
<path>mediastreamer/msrtpsend.c</path>
<path>mediastreamer/msrtpsend.h</path>
<path>mediastreamer/mssdlout.c</path>
<path>mediastreamer/mssdlout.h</path>
<path>mediastreamer/mssmpeg.c</path>
<path>mediastreamer/mssmpeg.h</path>
<path>mediastreamer/mssoundread.c</path>
<path>mediastreamer/mssoundread.h</path>
<path>mediastreamer/mssoundwrite.c</path>
<path>mediastreamer/mssoundwrite.h</path>
<path>mediastreamer/msspeexdec.c</path>
<path>mediastreamer/msspeexdec.h</path>
<path>mediastreamer/msspeexenc.c</path>
<path>mediastreamer/msspeexenc.h</path>
<path>mediastreamer/mssync.c</path>
<path>mediastreamer/mssync.h</path>
<path>mediastreamer/mstcpclient.c</path>
<path>mediastreamer/mstcpclient.h</path>
<path>mediastreamer/mstcpserv.c</path>
<path>mediastreamer/mstcpserv.h</path>
<path>mediastreamer/mstimer.c</path>
<path>mediastreamer/mstimer.h</path>
<path>mediastreamer/mstruespeechdecoder.c</path>
<path>mediastreamer/mstruespeechdecoder.h</path>
<path>mediastreamer/mstruespeechencoder.c</path>
<path>mediastreamer/mstruespeechencoder.h</path>
<path>mediastreamer/msutils.h</path>
<path>mediastreamer/msv4l.c</path>
<path>mediastreamer/msv4l.h</path>
<path>mediastreamer/msvideooutput.c</path>
<path>mediastreamer/msvideooutput.h</path>
<path>mediastreamer/msvideosource.c</path>
<path>mediastreamer/msvideosource.h</path>
<path>mediastreamer/mswrite.c</path>
<path>mediastreamer/mswrite.h</path>
<path>mediastreamer/msxine.c</path>
<path>mediastreamer/msxine.h</path>
<path>mediastreamer/osscard.c</path>
<path>mediastreamer/osscard.h</path>
<path>mediastreamer/rfc2429.h</path>
<path>mediastreamer/ring_test.c</path>
<path>mediastreamer/sndcard.c</path>
<path>mediastreamer/sndcard.h</path>
<path>mediastreamer/test_alaw.c</path>
<path>mediastreamer/test.c</path>
<path>mediastreamer/test_gsm.c</path>
<path>mediastreamer/test_lpc10.c</path>
<path>mediastreamer/test_mulaw.c</path>
<path>mediastreamer/test_rtprecv.c</path>
<path>mediastreamer/test_smpeg.c</path>
<path>mediastreamer/test_speex.c</path>
<path>mediastreamer/test_truespeech.c</path>
<path>mediastreamer/test_v4l.c</path>
<path>mediastreamer/test_videostream.c</path>
<path>mediastreamer/test_xine.c</path>
<path>mediastreamer/videoclient.c</path>
<path>mediastreamer/videoserver.c</path>
<path>mediastreamer/videostream.c</path>
<path>mediastreamer/waveheader.h</path>
<path>po</path>
<path>po/cat-id-tbl.c</path>
<path>win32acm</path>
<path>win32acm/afl.c</path>
<path>win32acm/com.h</path>
<path>win32acm/config.h</path>
<path>win32acm/cpudetect.c</path>
<path>win32acm/cpudetect.h</path>
<path>win32acm/cputable.h</path>
<path>win32acm/driver.c</path>
<path>win32acm/driver.h</path>
<path>win32acm/elfdll.c</path>
<path>win32acm/ext.c</path>
<path>win32acm/ext.h</path>
<path>win32acm/ldt_keeper.c</path>
<path>win32acm/ldt_keeper.h</path>
<path>win32acm/loader.h</path>
<path>win32acm/module.c</path>
<path>win32acm/mp_msg.c</path>
<path>win32acm/mp_msg.h</path>
<path>win32acm/pe_image.c</path>
<path>win32acm/pe_resource.c</path>
<path>win32acm/registry.c</path>
<path>win32acm/registry.h</path>
<path>win32acm/resource.c</path>
<path>win32acm/test_truespeech.c</path>
<path>win32acm/win32.c</path>
<path>win32acm/win32codec.c</path>
<path>win32acm/win32codec.h</path>
<path>win32acm/win32.h</path>
<path>win32acm/wine</path>
<path>win32acm/wine/basetsd.h</path>
<path>win32acm/wine/debugtools.h</path>
<path>win32acm/wine/driver.h</path>
<path>win32acm/wine/elfdll.h</path>
<path>win32acm/wine/heap.h</path>
<path>win32acm/wine/ldt.h</path>
<path>win32acm/wine/mmreg.h</path>
<path>win32acm/wine/module.h</path>
<path>win32acm/wine/msacmdrv.h</path>
<path>win32acm/wine/msacm.h</path>
<path>win32acm/wine/ntdef.h</path>
<path>win32acm/wine/pe_image.h</path>
<path>win32acm/wine/poppack.h</path>
<path>win32acm/wine/pshpack1.h</path>
<path>win32acm/wine/pshpack2.h</path>
<path>win32acm/wine/pshpack4.h</path>
<path>win32acm/wine/pshpack8.h</path>
<path>win32acm/wine/vfw.h</path>
<path>win32acm/wine/winbase.h</path>
<path>win32acm/wine/windef.h</path>
<path>win32acm/wine/windows.h</path>
<path>win32acm/wine/winerror.h</path>
<path>win32acm/wine/winestring.h</path>
<path>win32acm/wine/winnt.h</path>
<path>win32acm/wine/winreg.h</path>
<path>win32acm/wine/winuser.h</path>
<path>win32acm/wineacm.h</path>
<path>win32acm/wrapper.h</path>
<path>builddate.h</path>
</blacklist>
<build>
<buildtool>make</buildtool>
<builddir/>
</build>
<other>
<prio>0</prio>
<otherbin/>
<defaulttarget/>
<otheroptions/>
<selectedenvironment>default</selectedenvironment>
<environments>
<default/>
</environments>
</other>
<make>
<abortonerror>true</abortonerror>
<numberofjobs>0</numberofjobs>
<prio>0</prio>
<dontact>false</dontact>
<makebin/>
<defaulttarget/>
<makeoptions/>
<selectedenvironment>default</selectedenvironment>
<environments>
<default/>
</environments>
</make>
</kdevcustomproject>
<kdevdebugger>
<general>
<dbgshell/>
<gdbpath/>
<configGdbScript/>
<runShellScript/>
<runGdbScript/>
<breakonloadinglibs>true</breakonloadinglibs>
<separatetty>false</separatetty>
<floatingtoolbar>false</floatingtoolbar>
<raiseGDBOnStart>false</raiseGDBOnStart>
</general>
<display>
<staticmembers>false</staticmembers>
<demanglenames>true</demanglenames>
<outputradix>10</outputradix>
</display>
</kdevdebugger>
<kdevdoctreeview>
<ignoretocs>
<toc>ada</toc>
<toc>ada_bugs_gcc</toc>
<toc>bash</toc>
<toc>bash_bugs</toc>
<toc>clanlib</toc>
<toc>fortran_bugs_gcc</toc>
<toc>gnome1</toc>
<toc>gnustep</toc>
<toc>gtk</toc>
<toc>gtk_bugs</toc>
<toc>haskell</toc>
<toc>haskell_bugs_ghc</toc>
<toc>java_bugs_gcc</toc>
<toc>java_bugs_sun</toc>
<toc>kde2book</toc>
<toc>libstdc++</toc>
<toc>opengl</toc>
<toc>pascal_bugs_fp</toc>
<toc>php</toc>
<toc>php_bugs</toc>
<toc>perl</toc>
<toc>perl_bugs</toc>
<toc>python</toc>
<toc>python_bugs</toc>
<toc>qt-kdev3</toc>
<toc>ruby</toc>
<toc>ruby_bugs</toc>
<toc>sdl</toc>
<toc>stl</toc>
<toc>sw</toc>
<toc>w3c-dom-level2-html</toc>
<toc>w3c-svg</toc>
<toc>w3c-uaag10</toc>
<toc>wxwidgets_bugs</toc>
</ignoretocs>
<ignoreqt_xml>
<toc>Guide to the Qt Translation Tools</toc>
<toc>Qt Assistant Manual</toc>
<toc>Qt Designer Manual</toc>
<toc>Qt Reference Documentation</toc>
<toc>qmake User Guide</toc>
</ignoreqt_xml>
<ignoredoxygen>
<toc>KDE Libraries (Doxygen)</toc>
</ignoredoxygen>
</kdevdoctreeview>
<kdevfilecreate>
<filetypes/>
<useglobaltypes>
<type ext="c" />
<type ext="h" />
</useglobaltypes>
</kdevfilecreate>
<kdevcppsupport>
<qt>
<used>false</used>
<version>3</version>
<includestyle>3</includestyle>
<root></root>
<designerintegration>EmbeddedKDevDesigner</designerintegration>
<qmake></qmake>
<designer></designer>
<designerpluginpaths/>
</qt>
<references/>
<codecompletion>
<automaticCodeCompletion>false</automaticCodeCompletion>
<automaticArgumentsHint>true</automaticArgumentsHint>
<automaticHeaderCompletion>true</automaticHeaderCompletion>
<codeCompletionDelay>250</codeCompletionDelay>
<argumentsHintDelay>400</argumentsHintDelay>
<headerCompletionDelay>250</headerCompletionDelay>
<showOnlyAccessibleItems>false</showOnlyAccessibleItems>
<completionBoxItemOrder>0</completionBoxItemOrder>
<howEvaluationContextMenu>true</howEvaluationContextMenu>
<showCommentWithArgumentHint>true</showCommentWithArgumentHint>
<statusBarTypeEvaluation>false</statusBarTypeEvaluation>
<namespaceAliases>std=_GLIBCXX_STD;__gnu_cxx=std</namespaceAliases>
<processPrimaryTypes>true</processPrimaryTypes>
<processFunctionArguments>false</processFunctionArguments>
<preProcessAllHeaders>false</preProcessAllHeaders>
<parseMissingHeadersExperimental>false</parseMissingHeadersExperimental>
<resolveIncludePathsUsingMakeExperimental>false</resolveIncludePathsUsingMakeExperimental>
<alwaysParseInBackground>true</alwaysParseInBackground>
<usePermanentCaching>true</usePermanentCaching>
<alwaysIncludeNamespaces>false</alwaysIncludeNamespaces>
<includePaths>.;</includePaths>
</codecompletion>
<creategettersetter>
<prefixGet/>
<prefixSet>set</prefixSet>
<prefixVariable>m_,_</prefixVariable>
<parameterName>theValue</parameterName>
<inlineGet>true</inlineGet>
<inlineSet>true</inlineSet>
</creategettersetter>
<splitheadersource>
<enabled>false</enabled>
<synchronize>true</synchronize>
<orientation>Vertical</orientation>
</splitheadersource>
</kdevcppsupport>
<kdevfileview>
<groups>
<hidenonprojectfiles>false</hidenonprojectfiles>
<hidenonlocation>false</hidenonlocation>
</groups>
<tree>
<hidepatterns>*.o,*.lo,CVS</hidepatterns>
<hidenonprojectfiles>false</hidenonprojectfiles>
</tree>
</kdevfileview>
<cppsupportpart>
<filetemplates>
<interfacesuffix>.h</interfacesuffix>
<implementationsuffix>.cpp</implementationsuffix>
</filetemplates>
</cppsupportpart>
</kdevelop>