## 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 Library General Public License for more details.
+## 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
endif
LOCAL_C_INCLUDES += $(LIBLINPHONE_EXTENDED_C_INCLUDES)
-LOCAL_STATIC_LIBRARIES += $(LIBLINPHONE_EXTENDED_STATIC_LIBS)
+LOCAL_WHOLE_STATIC_LIBRARIES += $(LIBLINPHONE_EXTENDED_STATIC_LIBS)
LOCAL_SRC_FILES += $(LIBLINPHONE_EXTENDED_SRC_FILES)
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
/*try adding domain part from default current proxy*/
LinphoneAddress * id=linphone_address_new(linphone_core_get_identity(lc));
if (id!=NULL){
+ linphone_address_set_display_name(id,NULL);
linphone_address_set_username(id,uri);
*result=linphone_address_as_string(id);
linphone_address_destroy(id);
}
#endif
+LinphoneCore *linphone_call_get_core(const LinphoneCall *call){
+ return call->core;
+}
+
static const char* get_hexa_zrtp_identifier(LinphoneCore *lc){
const char *confZid=lp_config_get_string(lc->config,"rtp","zid",NULL);
if (confZid != NULL) {
**/
float linphone_call_get_play_volume(LinphoneCall *call){
AudioStream *st=call->audiostream;
- if (st && st->volsend){
+ if (st && st->volrecv){
float vol=0;
- ms_filter_call_method(st->volsend,MS_VOLUME_GET,&vol);
+ ms_filter_call_method(st->volrecv,MS_VOLUME_GET,&vol);
return vol;
}
**/
float linphone_call_get_record_volume(LinphoneCall *call){
AudioStream *st=call->audiostream;
- if (st && st->volrecv){
+ if (st && st->volsend && !call->audio_muted && call->state==LinphoneCallStreamsRunning){
float vol=0;
- ms_filter_call_method(st->volrecv,MS_VOLUME_GET,&vol);
+ ms_filter_call_method(st->volsend,MS_VOLUME_GET,&vol);
return vol;
}
linphone_core_assign_payload_type(lc,&payload_type_speex_wb,111,"vbr=on");
linphone_core_assign_payload_type(lc,&payload_type_speex_uwb,112,"vbr=on");
linphone_core_assign_payload_type(lc,&payload_type_telephone_event,101,"0-11");
+ linphone_core_assign_payload_type(lc,&payload_type_g722,9,NULL);
#if defined(ANDROID) || defined (__IPHONE_OS_VERSION_MIN_REQUIRED)
/*shorten the DNS lookup time and send more retransmissions on mobiles:
int error;
char ipstring [INET6_ADDRSTRLEN];
+ if (lc->net_conf.nat_address==NULL) return NULL;
+
if (parse_hostname_to_addr (lc->net_conf.nat_address, &ss, &ss_len)<0) {
return lc->net_conf.nat_address;
}
const char *linphone_call_state_to_string(LinphoneCallState cs);
-
+LinphoneCore *linphone_call_get_core(const LinphoneCall *call);
LinphoneCallState linphone_call_get_state(const LinphoneCall *call);
bool_t linphone_call_asked_to_autoanswer(LinphoneCall *call);
const LinphoneAddress * linphone_core_get_current_call_remote_address(struct _LinphoneCore *lc);
if (up==NULL){
jobj=env->NewObject(callClass,callCtrId,(jlong)call);
+ jobj=env->NewGlobalRef(jobj);
linphone_call_set_user_pointer(call,(void*)jobj);
- //env->NewGlobalRef(jobj);
linphone_call_ref(call);
}else{
jobj=(jobject)up;
static void callStateChange(LinphoneCore *lc, LinphoneCall* call,LinphoneCallState state,const char* message) {
JNIEnv *env = 0;
jint result = jvm->AttachCurrentThread(&env,NULL);
+ jobject jcall;
if (result != 0) {
ms_error("cannot attach VM\n");
return;
env->CallVoidMethod(lcData->listener
,lcData->callStateId
,lcData->core
- ,lcData->getCall(env,call)
+ ,(jcall=lcData->getCall(env,call))
,env->CallStaticObjectMethod(lcData->callStateClass,lcData->callStateFromIntId,(jint)state),
message ? env->NewStringUTF(message) : NULL);
+ if (state==LinphoneCallReleased){
+ linphone_call_set_user_pointer(call,NULL);
+ env->DeleteGlobalRef(jcall);
+ }
}
static void callEncryptionChange(LinphoneCore *lc, LinphoneCall* call, bool_t encrypted,const char* authentication_token) {
JNIEnv *env = 0;
,jlong lc) {
linphone_core_iterate((LinphoneCore*)lc);
}
-extern "C" jlong Java_org_linphone_core_LinphoneCoreImpl_invite( JNIEnv* env
+extern "C" jobject Java_org_linphone_core_LinphoneCoreImpl_invite( JNIEnv* env
,jobject thiz
,jlong lc
,jstring juri) {
const char* uri = env->GetStringUTFChars(juri, NULL);
+ LinphoneCoreData *lcd=(LinphoneCoreData*)linphone_core_get_user_data((LinphoneCore*)lc);
LinphoneCall* lCall = linphone_core_invite((LinphoneCore*)lc,uri);
env->ReleaseStringUTFChars(juri, uri);
- return (jlong)lCall;
+ return lcd->getCall(env,lCall);
}
-extern "C" jlong Java_org_linphone_core_LinphoneCoreImpl_inviteAddress( JNIEnv* env
+extern "C" jobject Java_org_linphone_core_LinphoneCoreImpl_inviteAddress( JNIEnv* env
,jobject thiz
,jlong lc
,jlong to) {
- return (jlong) linphone_core_invite_address((LinphoneCore*)lc,(LinphoneAddress*)to);
+ LinphoneCoreData *lcd=(LinphoneCoreData*)linphone_core_get_user_data((LinphoneCore*)lc);
+ return lcd->getCall(env, linphone_core_invite_address((LinphoneCore*)lc,(LinphoneAddress*)to));
}
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_terminateCall( JNIEnv* env
extern "C" void Java_org_linphone_core_LinphoneCallImpl_finalize(JNIEnv* env
,jobject thiz
,jlong ptr) {
- LinphoneCall *call=(LinphoneCall*)ptr;
- jobject jobj=(jobject)linphone_call_get_user_pointer(call);
- if (jobj==thiz){
- //env->DeleteGlobalRef(jobj);
- }else{
- ms_error("Call being destroyed is inconsistent: thiz=%lu, jobj=%lu",(unsigned long)thiz,(unsigned long)jobj);
- }
- linphone_call_set_user_pointer(call,NULL);
+ LinphoneCall *call=(LinphoneCall*)ptr;
linphone_call_unref(call);
}
return linphone_call_echo_limiter_enabled((LinphoneCall*)ptr);
}
-extern "C" jlong Java_org_linphone_core_LinphoneCallImpl_getReplacedCall( JNIEnv* env
+extern "C" jobject Java_org_linphone_core_LinphoneCallImpl_getReplacedCall( JNIEnv* env
,jobject thiz
,jlong ptr) {
- return (jlong)linphone_call_get_replaced_call((LinphoneCall*)ptr);
+ LinphoneCoreData *lcd=(LinphoneCoreData*)linphone_core_get_user_data(linphone_call_get_core((LinphoneCall*)ptr));
+ return lcd->getCall(env,linphone_call_get_replaced_call((LinphoneCall*)ptr));
}
extern "C" jfloat Java_org_linphone_core_LinphoneCallImpl_getCurrentQuality( JNIEnv* env
linphone_call_camera_enabled((LinphoneCall *)lc);
}
-extern "C" jlong Java_org_linphone_core_LinphoneCoreImpl_inviteAddressWithParams(JNIEnv *env, jobject thiz, jlong lc, jlong addr, jlong params){
- return (jlong) linphone_core_invite_address_with_params((LinphoneCore *)lc, (const LinphoneAddress *)addr, (const LinphoneCallParams *)params);
+extern "C" jobject Java_org_linphone_core_LinphoneCoreImpl_inviteAddressWithParams(JNIEnv *env, jobject thiz, jlong lc, jlong addr, jlong params){
+ LinphoneCoreData *lcd=(LinphoneCoreData*)linphone_core_get_user_data((LinphoneCore*)lc);
+ return lcd->getCall(env,linphone_core_invite_address_with_params((LinphoneCore *)lc, (const LinphoneAddress *)addr, (const LinphoneCallParams *)params));
}
extern "C" jint Java_org_linphone_core_LinphoneCoreImpl_updateAddressWithParams(JNIEnv *env, jobject thiz, jlong lc, jlong call, jlong params){
if (op->base.local_media) sdp_process(op);
}
eXosip_call_build_ack(ev->did,&msg);
+ if (msg==NULL) {
+ ms_warning("This call has been already terminated.");
+ eXosip_lock();
+ eXosip_call_terminate(ev->cid,ev->did);
+ eXosip_unlock();
+ return ;
+ }
contact=sal_op_get_contact(op);
if (contact) {
_osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
unstarred=g_object_get_data(G_OBJECT(entry),"unstarred_icon");
if (is_known && (active==unstarred)){
gtk_entry_set_icon_from_pixbuf(entry,GTK_ENTRY_ICON_SECONDARY,starred);
+ gtk_entry_set_icon_tooltip_text(GTK_ENTRY(entry),GTK_ENTRY_ICON_SECONDARY,NULL);
}else if ((!is_known) && (active==starred)){
+ gtk_entry_set_icon_tooltip_text(GTK_ENTRY(entry),GTK_ENTRY_ICON_SECONDARY,_("Add to addressbook"));
gtk_entry_set_icon_from_pixbuf(entry,GTK_ENTRY_ICON_SECONDARY,unstarred);
}
}
return TRUE;
}
+typedef float (*get_volume_t)(void *data);
+
+typedef struct _volume_ctx{
+ GtkWidget *widget;
+ get_volume_t get_volume;
+ void *data;
+ float last_value;
+}volume_ctx_t;
+
+#define UNSIGNIFICANT_VOLUME (-26)
+#define SMOOTH 0.15
+
+static gboolean update_audio_meter(volume_ctx_t *ctx){
+ float volume_db=ctx->get_volume(ctx->data);
+ float frac=(volume_db-UNSIGNIFICANT_VOLUME)/(float)(-UNSIGNIFICANT_VOLUME+3.0);
+ if (frac<0) frac=0;
+ if (frac>1.0) frac=1.0;
+ if (frac<ctx->last_value){
+ frac=(frac*SMOOTH)+(ctx->last_value*(1-SMOOTH));
+ }
+ ctx->last_value=frac;
+ //g_message("volume_db=%f, frac=%f",volume_db,frac);
+ gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(ctx->widget),frac);
+ return TRUE;
+}
+
+static void on_audio_meter_destroy(guint task_id){
+ g_source_remove(task_id);
+}
+
+void linphone_gtk_init_audio_meter(GtkWidget *w, get_volume_t get_volume, void *data){
+ guint task_id=GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"task_id"));
+ if (task_id==0){
+ volume_ctx_t *ctx=g_new(volume_ctx_t,1);
+ ctx->widget=w;
+ ctx->get_volume=get_volume;
+ ctx->data=data;
+ ctx->last_value=0;
+ g_object_set_data_full(G_OBJECT(w),"ctx",ctx,g_free);
+ task_id=g_timeout_add(50,(GSourceFunc)update_audio_meter,ctx);
+ g_object_set_data_full(G_OBJECT(w),"task_id",GINT_TO_POINTER(task_id),(GDestroyNotify)on_audio_meter_destroy);
+ }
+}
+
+void linphone_gtk_in_call_view_enable_audio_view(LinphoneCall *call){
+ GtkWidget *callview=(GtkWidget*)linphone_call_get_user_pointer(call);
+ GtkWidget *audio_view=linphone_gtk_get_widget(callview,"incall_audioview");
+ //GtkWidget *mic=linphone_gtk_get_widget(callview,"incall_mic_icon");
+ GtkWidget *spk=linphone_gtk_get_widget(callview,"incall_spk_icon");
+ GtkWidget *mic_level=linphone_gtk_get_widget(callview,"mic_audiolevel");
+ GtkWidget *spk_level=linphone_gtk_get_widget(callview,"spk_audiolevel");
+ GdkPixbuf *pbuf;
+ //gtk_image_set_from_pixbuf(GTK_IMAGE(mic),(pbuf=create_pixbuf("mic_active.png")));
+ //g_object_unref(pbuf);
+ gtk_image_set_from_pixbuf(GTK_IMAGE(spk),(pbuf=create_pixbuf("speaker.png")));
+ g_object_unref(pbuf);
+ linphone_gtk_init_audio_meter(mic_level,(get_volume_t)linphone_call_get_record_volume,call);
+ linphone_gtk_init_audio_meter(spk_level,(get_volume_t)linphone_call_get_play_volume,call);
+ gtk_widget_show_all(audio_view);
+}
+
void linphone_gtk_in_call_view_set_in_call(LinphoneCall *call){
GtkWidget *callview=(GtkWidget*)linphone_call_get_user_pointer(call);
GtkWidget *status=linphone_gtk_get_widget(callview,"in_call_status");
taskid=g_timeout_add(250,(GSourceFunc)linphone_gtk_in_call_view_refresh,call);
g_object_set_data(G_OBJECT(callview),"taskid",GINT_TO_POINTER(taskid));
}
+ linphone_gtk_in_call_view_enable_audio_view(call);
}
void linphone_gtk_in_call_view_set_paused(LinphoneCall *call){
linphone_gtk_get_ui_config("stop_call_icon","stopcall-red.png"),FALSE);
gtk_widget_hide(linphone_gtk_get_widget(callview,"answer_decline_panel"));
+ gtk_widget_hide(linphone_gtk_get_widget(callview,"incall_audioview"));
linphone_gtk_enable_mute_button(
GTK_BUTTON(linphone_gtk_get_widget(callview,"incall_mute")),FALSE);
linphone_gtk_enable_hold_button(call,FALSE,TRUE);
g_object_set_data(G_OBJECT(button),"active",GINT_TO_POINTER(active));
if (active){
GtkWidget *image=create_pixmap("mic_muted.png");
- gtk_button_set_label(GTK_BUTTON(button),_("Unmute"));
+ /*gtk_button_set_label(GTK_BUTTON(button),_("Unmute"));*/
if (image!=NULL) {
gtk_button_set_image(GTK_BUTTON(button),image);
gtk_widget_show(image);
}
}else{
GtkWidget *image=create_pixmap("mic_active.png");
- gtk_button_set_label(GTK_BUTTON(button),_("Mute"));
+ /*gtk_button_set_label(GTK_BUTTON(button),_("Mute"));*/
if (image!=NULL) {
gtk_button_set_image(GTK_BUTTON(button),image);
gtk_widget_show(image);
void linphone_gtk_enable_mute_button(GtkButton *button, gboolean sensitive)
{
- gtk_widget_set_sensitive(GTK_WIDGET(button),sensitive);
+ /*gtk_widget_set_sensitive(GTK_WIDGET(button),sensitive);*/
+ gtk_widget_set_visible(GTK_WIDGET(button),sensitive);
linphone_gtk_draw_mute_button(button,FALSE);
}
g_return_if_fail(callview!=NULL);
button=linphone_gtk_get_widget(callview,"hold_call");
gtk_widget_set_sensitive(GTK_WIDGET(button),sensitive);
+ gtk_widget_set_visible(GTK_WIDGET(button),sensitive);
linphone_gtk_draw_hold_button(GTK_BUTTON(button),!holdon);
}
return NULL;
}
g_object_set_data(G_OBJECT(w),"builder",builder);
+ g_signal_connect_swapped(G_OBJECT(w),"destroy",(GCallback)g_object_unref,builder);
gtk_builder_connect_signals(builder,w);
return w;
}
static void linphone_gtk_quit(void){
linphone_gtk_uninit_instance();
- gdk_threads_leave();
linphone_gtk_destroy_log_window();
linphone_core_destroy(the_core);
linphone_gtk_log_uninit();
#ifdef HAVE_NOTIFY
notify_uninit();
#endif
+ gdk_threads_leave();
}
#ifdef HAVE_GTK_OSX
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
- <object class="GtkHBox" id="in_call_animation">
+ <object class="GtkHBox" id="incall_hbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
- <placeholder/>
+ <object class="GtkVBox" id="in_call_animation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="in_call_uri">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">label</property>
+ <property name="justify">center</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
</child>
</object>
<packing>
</packing>
</child>
<child>
- <object class="GtkLabel" id="in_call_uri">
- <property name="visible">True</property>
+ <object class="GtkHBox" id="incall_audioview">
<property name="can_focus">False</property>
- <property name="label" translatable="yes">label</property>
- <property name="justify">center</property>
+ <child>
+ <object class="GtkButton" id="incall_mute">
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <property name="relief">half</property>
+ <signal name="clicked" handler="linphone_gtk_mute_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkProgressBar" id="mic_audiolevel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkImage" id="incall_spk_icon">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-missing-image</property>
+ <property name="icon-size">1</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkProgressBar" id="spk_audiolevel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
</object>
<packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<property name="position">2</property>
</packing>
</child>
- <child>
- <object class="GtkHButtonBox" id="incall_hbuttonbox1">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <child>
- <object class="GtkButton" id="incall_mute">
- <property name="label" translatable="yes">Mute</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>
- <signal name="clicked" handler="linphone_gtk_mute_clicked" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">3</property>
- </packing>
- </child>
<child>
<object class="GtkHButtonBox" id="mute_pause_buttons">
<property name="visible">True</property>
<child>
<object class="GtkButton" id="hold_call">
<property name="label" translatable="yes">Pause</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>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
- <property name="position">4</property>
+ <property name="position">3</property>
</packing>
</child>
</object>
-Subproject commit 3ebe0396cbdb8cd49c0bbf262a87a9160bd13e64
+Subproject commit 5d342746830a6cc2aec1d3abb2d9abb898925292
-Subproject commit 5b231b8e0b9d82ccb93463ef4c2c28e15d68ba76
+Subproject commit a56d7f752717bea7d92cf63a6d187c2f6361d38b
status-offline.png \
contact-orange.png dialer-orange.png history-orange.png\
startcall-green.png stopcall-red.png addcall-green.png linphone.icns \
-contact_starred.png contact_unstarred.png
+contact_starred.png contact_unstarred.png \
+speaker.png
EXTRA_DIST=$(pixmap_DATA)