1 /*
2 linphone, gtk-glade interface.
3 Copyright (C) 2008  Simon MORLAT (simon.morlat@linphone.org)
4 
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public License
7 as published by the Free Software Foundation; either version 2
8 of the License, or (at your option) any later version.
9 
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU General Public License for more details.
14 
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
18 */
19 
20 #include <glib/gstdio.h>
21 
22 #include "linphone.h"
23 #include "linphone/core_utils.h"
24 #include "mediastreamer2/mediastream.h"
25 #include "mediastreamer2/msvolume.h"
26 
27 static GtkWidget *audio_assistant=NULL;
28 static void prepare(GtkAssistant *w);
29 
get_widget_from_assistant(const char * name)30 GtkWidget *get_widget_from_assistant(const char *name){
31 	return (GtkWidget *)g_object_get_data(G_OBJECT(audio_assistant),name);
32 }
33 
set_widget_to_assistant(const char * name,GtkWidget * w)34 static void set_widget_to_assistant(const char *name,GtkWidget *w){
35 	g_object_set_data(G_OBJECT(audio_assistant),name,w);
36 }
37 
update_record_button(gboolean is_visible)38 static void update_record_button(gboolean is_visible){
39 	GtkWidget *rec_button = get_widget_from_assistant("rec_button");
40 	gtk_widget_set_sensitive(rec_button,is_visible);
41 }
42 
43 #if 0
44 static void activate_record_button(gboolean is_active){
45 	GtkWidget *rec_button = get_widget_from_assistant("rec_button");
46 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rec_button),is_active);
47 }
48 #endif
49 
update_play_button(gboolean is_visible)50 static void update_play_button(gboolean is_visible){
51 	GtkWidget *play_button = get_widget_from_assistant("play_button");
52 	gtk_widget_set_sensitive(play_button,is_visible);
53 }
54 
activate_play_button(gboolean is_active)55 static void activate_play_button(gboolean is_active){
56 	GtkWidget *play_button = get_widget_from_assistant("play_button");
57 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(play_button),is_active);
58 }
59 
deactivate_play_button(void)60 static gboolean deactivate_play_button(void){
61 	activate_play_button(FALSE);
62 	return FALSE;
63 }
64 
get_record_file(void)65 static gchar *get_record_file(void){
66 	char filename[256]={0};
67 	char date[64]={0};
68 	time_t curtime=time(NULL);
69 	struct tm loctime;
70 
71 	#ifdef _WIN32
72 		loctime=*localtime(&curtime);
73 	#else
74 		localtime_r(&curtime,&loctime);
75 	#endif
76 		snprintf(date,sizeof(date)-1,"%i%02i%02i-%02i%02i%2i",loctime.tm_year+1900,loctime.tm_mon+1,loctime.tm_mday, loctime.tm_hour, loctime.tm_min, loctime.tm_sec);
77 
78 	snprintf(filename,sizeof(filename)-1,"record-%s.wav",date);
79 	return g_build_path(G_DIR_SEPARATOR_S,g_get_tmp_dir(),filename,NULL);;
80 }
81 
audio_stream_get_record_volume(AudioStream * st)82 static float audio_stream_get_record_volume(AudioStream *st){
83 	if (st && st->volsend){
84 		float vol=0;
85 		ms_filter_call_method(st->volsend,MS_VOLUME_GET,&vol);
86 		return vol;
87 	}
88 	return LINPHONE_VOLUME_DB_LOWEST;
89 }
90 
audio_stream_get_max_volume(AudioStream * st)91 static float audio_stream_get_max_volume(AudioStream *st){
92 	if (st && st->volsend){
93 		float vol=0;
94 		ms_filter_call_method(st->volsend,MS_VOLUME_GET_MAX,&vol);
95 		return vol;
96 	}
97 	return LINPHONE_VOLUME_DB_LOWEST;
98 }
99 
update_audio_label(volume_ctx_t * ctx)100 static gboolean update_audio_label(volume_ctx_t *ctx){
101 	float volume_db=ctx->get_volume(ctx->data);
102 	gchar *result;
103 	if (volume_db < -20) result = _("No voice detected");
104 	else if (volume_db <= -10) result = _("Too low");
105 	else if (volume_db < -6) result = _("Good");
106 	else result = _("Too loud");
107 	g_message("volume_max_db=%f, text=%s",volume_db,result);
108 	gtk_label_set_text(GTK_LABEL(ctx->widget),result);
109 	return TRUE;
110 }
111 
on_audio_label_destroy(guint task_id)112 static void on_audio_label_destroy(guint task_id){
113 	g_source_remove(task_id);
114 }
115 
linphone_gtk_init_audio_label(GtkWidget * w,get_volume_t get_volume,void * data)116 void linphone_gtk_init_audio_label(GtkWidget *w, get_volume_t get_volume, void *data){
117 	guint task_id=GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"task_id_t"));
118 	if (task_id==0){
119 		volume_ctx_t *ctx=g_new(volume_ctx_t,1);
120 		ctx->widget=w;
121 		ctx->get_volume=get_volume;
122 		ctx->data=data;
123 		ctx->last_value=0;
124 		g_object_set_data_full(G_OBJECT(w),"ctx_t",ctx,g_free);
125 		task_id=g_timeout_add(200,(GSourceFunc)update_audio_label,ctx);
126 		g_object_set_data_full(G_OBJECT(w),"task_id_t",GINT_TO_POINTER(task_id),(GDestroyNotify)on_audio_label_destroy);
127 	}
128 }
129 
linphone_gtk_uninit_audio_label(GtkWidget * w)130 void linphone_gtk_uninit_audio_label(GtkWidget *w){
131 	guint task_id=GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"task_id_t"));
132 	if (task_id!=0){
133 		g_object_set_data(G_OBJECT(w),"ctx_t",NULL);
134 		g_object_set_data(G_OBJECT(w),"task_id_t",NULL);
135 	}
136 }
137 
playback_device_changed(GtkWidget * w)138 static void playback_device_changed(GtkWidget *w){
139 	gchar *sel=gtk_combo_box_get_active_text(GTK_COMBO_BOX(w));
140 	linphone_core_set_playback_device(linphone_gtk_get_core(),sel);
141 	g_free(sel);
142 }
143 
capture_device_changed(GtkWidget * capture_device)144 static void capture_device_changed(GtkWidget *capture_device){
145 	gchar *sel;
146 	GtkWidget *mic_audiolevel;
147 	GtkWidget *label_audiolevel;
148 	GtkWidget *assistant=gtk_widget_get_toplevel(capture_device);
149 	AudioStream *audio_stream;
150 
151 	mic_audiolevel = get_widget_from_assistant("mic_audiolevel");
152 	label_audiolevel = get_widget_from_assistant("label_audiolevel");
153 	audio_stream = (AudioStream *) g_object_get_data(G_OBJECT(assistant),"stream");
154 	sel = gtk_combo_box_get_active_text(GTK_COMBO_BOX(capture_device));
155 	linphone_core_set_capture_device(linphone_gtk_get_core(),sel);
156 	linphone_gtk_uninit_audio_meter(mic_audiolevel);
157 	linphone_gtk_uninit_audio_label(label_audiolevel);
158 	audio_stream_stop(audio_stream);
159 	g_free(sel);
160 	/*now restart the audio stream*/
161 	prepare(GTK_ASSISTANT(assistant));
162 }
163 
dialog_click(GtkWidget * dialog,guint response_id,GtkWidget * page)164 static void dialog_click(GtkWidget *dialog, guint response_id, GtkWidget *page){
165 	switch(response_id){
166 		case GTK_RESPONSE_YES:
167 			 gtk_assistant_set_page_complete(GTK_ASSISTANT(audio_assistant),page,TRUE);
168 		break;
169 		default:
170 			break;
171 	}
172 	gtk_widget_destroy(dialog);
173 }
174 
calibration_finished(LinphoneCore * lc,LinphoneEcCalibratorStatus status,int delay,void * data)175 static void calibration_finished(LinphoneCore *lc, LinphoneEcCalibratorStatus status, int delay, void *data){
176 	GtkWidget * dialog;
177 	GtkWidget *speaker_page;
178 	ms_message("echo calibration finished %s.",status==LinphoneEcCalibratorDone ? "successfully" : "with faillure");
179 	if (status==LinphoneEcCalibratorDone) ms_message("Measured delay is %i",delay);
180 
181 	speaker_page = get_widget_from_assistant("speaker_page");
182 
183 	dialog = gtk_message_dialog_new (
184 			GTK_WINDOW(audio_assistant),
185 			GTK_DIALOG_DESTROY_WITH_PARENT,
186 			GTK_MESSAGE_QUESTION,
187 			GTK_BUTTONS_YES_NO,
188 			"%s",_("Did you hear three beeps ?"));
189 
190 	g_signal_connect(G_OBJECT (dialog), "response",
191 			G_CALLBACK (dialog_click),speaker_page);
192 	gtk_widget_show(dialog);
193 }
194 
linphone_gtk_start_sound(GtkWidget * w)195 void linphone_gtk_start_sound(GtkWidget *w){
196 	LinphoneCore *lc = linphone_gtk_get_core();
197 	linphone_core_start_echo_calibration(lc,calibration_finished,NULL,NULL,NULL);
198 }
199 
linphone_gtk_stop_record(gpointer data)200 static gboolean linphone_gtk_stop_record(gpointer data){
201 	AudioStream *stream = (AudioStream *)g_object_get_data(G_OBJECT(audio_assistant),"record_stream");
202 	if(stream != NULL){
203 		audio_stream_stop(stream);
204 		g_object_set_data(G_OBJECT(audio_assistant),"record_stream",NULL);
205 	}
206 	update_record_button(FALSE);
207 	update_play_button(TRUE);
208 	return FALSE;
209 }
210 
211 
linphone_gtk_start_record_sound(GtkWidget * w,gpointer data)212 void linphone_gtk_start_record_sound(GtkWidget *w, gpointer data){
213 	LinphoneCore *lc = linphone_gtk_get_core();
214 	MSFactory *factory = linphone_core_get_ms_factory(lc);
215 	AudioStream *stream = NULL;
216 	MSSndCardManager *manager = ms_factory_get_snd_card_manager(factory);
217 	gboolean active=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w));
218 	gint timeout_id;
219 
220 	if(active){
221 		gchar *path = get_record_file();
222 		stream=audio_stream_new(factory, 8888, 8889, FALSE);
223 		if(stream != NULL){
224 			audio_stream_start_full(stream,&av_profile,"127.0.0.1",8888,"127.0.0.1",8889,0,0,NULL,
225 				path,NULL,ms_snd_card_manager_get_card(manager,linphone_core_get_capture_device(lc)),FALSE);
226 			g_object_set_data(G_OBJECT(audio_assistant),"record_stream",stream);
227 		}
228 		timeout_id = gtk_timeout_add(6000,(GtkFunction)linphone_gtk_stop_record,NULL);
229 		g_object_set_data(G_OBJECT(audio_assistant),"timeout_id",GINT_TO_POINTER(timeout_id));
230 		g_object_set_data(G_OBJECT(audio_assistant),"path",path);
231 	} else {
232 		stream = (AudioStream *)g_object_get_data(G_OBJECT(audio_assistant),"record_stream");
233 		timeout_id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(audio_assistant),"timeout_id"));
234 		gtk_timeout_remove(timeout_id);
235 		if(stream != NULL){
236 			audio_stream_stop(stream);
237 			g_object_set_data(G_OBJECT(audio_assistant),"record_stream",NULL);
238 		}
239 		update_record_button(FALSE);
240 		update_play_button(TRUE);
241 	}
242 }
243 
endoffile_cb(void * ud,MSFilter * f,unsigned int ev,void * arg)244 static void endoffile_cb(void *ud, MSFilter *f, unsigned int ev,void * arg){
245 	switch (ev) {
246 		case MS_PLAYER_EOF: {
247 			ms_message("EndOfFile received");
248 			/*workaround for a mediastreamer2 bug. Don't deactivate the play button, because it will stop the graph from the end of file callback,
249 			 * which is sometimes crashing. On master branch it is fixed in mediastreamer2, the workaround is only valid in 3.8.x branch*/
250 			g_timeout_add(0, (GSourceFunc)deactivate_play_button, NULL);
251 			break;
252 		}
253 		break;
254 	}
255 }
256 
linphone_gtk_start_play_record_sound(GtkWidget * w,gpointer data)257 void linphone_gtk_start_play_record_sound(GtkWidget *w,gpointer data){
258 	LinphoneCore *lc = linphone_gtk_get_core();
259 	MSFactory *factory = linphone_core_get_ms_factory(lc);
260 	gboolean active=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w));
261 	AudioStream *stream = NULL;
262 	MSSndCardManager *manager = ms_factory_get_snd_card_manager(factory);
263 
264 	if(active){
265 		gchar *path = g_object_get_data(G_OBJECT(audio_assistant),"path");
266 		stream=audio_stream_new(factory, 8888, 8889, FALSE);
267 		if(path != NULL){
268 			audio_stream_start_full(stream,&av_profile,"127.0.0.1",8888,"127.0.0.1",8889,0,0,path,
269 				NULL,ms_snd_card_manager_get_card(manager,linphone_core_get_playback_device(lc)),NULL,FALSE);
270 			ms_filter_add_notify_callback(stream->soundread,endoffile_cb,stream,FALSE);
271 			g_object_set_data(G_OBJECT(audio_assistant),"play_stream",stream);
272 		}
273 	} else {
274 		stream = (AudioStream *)g_object_get_data(G_OBJECT(audio_assistant),"play_stream");
275 		if(stream != NULL){
276 			audio_stream_stop(stream);
277 			g_object_set_data(G_OBJECT(audio_assistant),"play_stream",NULL);
278 		}
279 	}
280 }
281 
display_popup(GtkMessageType type,const gchar * message)282 void display_popup(GtkMessageType type,const gchar *message){
283 	GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW(audio_assistant),
284                                   GTK_DIALOG_DESTROY_WITH_PARENT,
285                                   type,
286                                   GTK_BUTTONS_CLOSE,
287                                   "%s",
288                                   (const gchar*)message);
289 	/* Destroy the dialog when the user responds to it (e.g. clicks a button) */
290 	g_signal_connect_swapped (G_OBJECT (dialog), "response",
291                    G_CALLBACK (gtk_widget_destroy),
292                    G_OBJECT (dialog));
293 	gtk_widget_show(dialog);
294 }
295 
open_mixer(void)296 static void open_mixer(void){
297 	GError *error = NULL;
298 
299 #ifdef _WIN32
300 	if(!g_spawn_command_line_async("control mmsys.cpl",&error)){
301 		display_popup(GTK_MESSAGE_WARNING,_("Sound preferences not found "));
302 		g_error_free(error);
303 	}
304 #elif __APPLE__
305 	if(!g_spawn_command_line_async("open /System/Library/PreferencePanes/Sound.prefPane",&error)){
306 		display_popup(GTK_MESSAGE_WARNING,_("Sound preferences not found "));
307 		g_error_free(error);
308 	}
309 #else
310 	if(!g_spawn_command_line_async("gnome-volume-control",&error)){
311 		if(!g_spawn_command_line_async("gnome-control-center sound",&error)){
312 			if(!g_spawn_command_line_async("kmix",&error)){
313 				if(!g_spawn_command_line_async("mate-volume-control",&error)){
314 					if(!g_spawn_command_line_async("xterm alsamixer",&error)){
315 						display_popup(GTK_MESSAGE_WARNING,_("Cannot launch system sound control "));
316 						g_error_free(error);
317 					}
318 				}
319 			}
320 		}
321 	}
322 #endif
323 }
324 
create_intro(void)325 static GtkWidget *create_intro(void){
326 	GtkWidget *vbox=gtk_vbox_new(FALSE,2);
327 	GtkWidget *label=gtk_label_new(_("Welcome!\nThis assistant will help you to configure audio settings for Linphone"));
328 	gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 2);
329 	gtk_widget_show_all(vbox);
330 	return vbox;
331 }
332 
create_mic_page(void)333 static GtkWidget *create_mic_page(void){
334 	GtkWidget *vbox=gtk_table_new(3,2,FALSE);
335 	LinphoneCore *lc=linphone_gtk_get_core();
336 	const char **sound_devices;
337 	GtkWidget *labelMicChoice=gtk_label_new(_("Capture device"));
338 	GtkWidget *labelMicLevel=gtk_label_new(_("Recorded volume"));
339 	GtkWidget *mic_audiolevel=gtk_progress_bar_new();
340 	GtkWidget *capture_device=gtk_combo_box_new();
341 	GtkWidget *box = gtk_vbox_new(FALSE,0);
342 	GtkWidget *label_audiolevel=gtk_label_new(_("No voice"));
343 	GtkWidget *mixer_button=gtk_button_new_with_label(_("System sound preferences"));
344 	GtkWidget *image;
345 
346 	image=gtk_image_new_from_stock(GTK_STOCK_PREFERENCES,GTK_ICON_SIZE_MENU);
347 	gtk_button_set_image(GTK_BUTTON(mixer_button),image);
348 
349 	gtk_box_pack_start(GTK_BOX(box),mic_audiolevel,TRUE,TRUE,1);
350 	gtk_box_pack_start(GTK_BOX(box),label_audiolevel,FALSE,FALSE,1);
351 
352 	gtk_table_attach_defaults(GTK_TABLE(vbox), labelMicChoice, 0, 1, 0, 1);
353 	gtk_table_attach_defaults(GTK_TABLE(vbox), capture_device, 1, 2, 0, 1);
354 	gtk_table_attach_defaults(GTK_TABLE(vbox), labelMicLevel, 0, 1, 1, 2);
355 	gtk_table_attach_defaults(GTK_TABLE(vbox), box, 1, 2, 1, 2);
356 	gtk_table_attach(GTK_TABLE(vbox),  mixer_button, 0, 2, 2, 3, GTK_SHRINK, GTK_SHRINK, 0,0);
357 
358 	gtk_table_set_row_spacings(GTK_TABLE(vbox),10);
359 
360 	set_widget_to_assistant("mic_audiolevel",mic_audiolevel);
361 	set_widget_to_assistant("label_audiolevel",label_audiolevel);
362 
363 	sound_devices=linphone_core_get_sound_devices(lc);
364 	linphone_gtk_fill_combo_box(capture_device, sound_devices,
365 					linphone_core_get_capture_device(lc), CAP_CAPTURE);
366 	gtk_widget_show_all(vbox);
367 
368 	g_signal_connect(G_OBJECT(capture_device),"changed",(GCallback)capture_device_changed,capture_device);
369 	g_signal_connect(G_OBJECT(mixer_button),"clicked",(GCallback)open_mixer,vbox);
370 
371 	return vbox;
372 }
373 
create_speaker_page(void)374 static GtkWidget *create_speaker_page(void){
375 	GtkWidget *vbox=gtk_table_new(3,2,FALSE);
376 	LinphoneCore *lc=linphone_gtk_get_core();
377 
378 	GtkWidget *labelSpeakerChoice=gtk_label_new(_("Playback device"));
379 	GtkWidget *labelSpeakerLevel=gtk_label_new(_("Play three beeps"));
380 	GtkWidget *spk_button=gtk_button_new_from_stock(GTK_STOCK_MEDIA_PLAY);
381 	GtkWidget *playback_device=gtk_combo_box_new();
382 	GtkWidget *mixer_button=gtk_button_new_with_label(_("System sound preferences"));
383 	GtkWidget *image;
384 	const char **sound_devices;
385 
386 	image=gtk_image_new_from_stock(GTK_STOCK_PREFERENCES,GTK_ICON_SIZE_MENU);
387 	gtk_button_set_image(GTK_BUTTON(mixer_button),image);
388 
389 	gtk_table_attach_defaults(GTK_TABLE(vbox), labelSpeakerChoice, 0, 1, 0, 1);
390 	gtk_table_attach(GTK_TABLE(vbox), playback_device, 1, 2, 0, 1, GTK_SHRINK, GTK_SHRINK, 0,0);
391 	gtk_table_attach_defaults(GTK_TABLE(vbox), labelSpeakerLevel, 0, 1, 1, 2);
392 	gtk_table_attach(GTK_TABLE(vbox), spk_button, 1, 2, 1, 2, GTK_SHRINK, GTK_SHRINK, 0,0);
393 	gtk_table_attach(GTK_TABLE(vbox), mixer_button, 0, 2, 2, 3, GTK_SHRINK, GTK_SHRINK, 0,0);
394 
395 	gtk_table_set_row_spacings(GTK_TABLE(vbox),10);
396 
397 	sound_devices=linphone_core_get_sound_devices(lc);
398 	linphone_gtk_fill_combo_box(playback_device, sound_devices,
399 					linphone_core_get_playback_device(lc),CAP_PLAYBACK);
400 	gtk_widget_show_all(vbox);
401 
402 	set_widget_to_assistant("speaker_page",vbox);
403 	g_signal_connect(G_OBJECT(playback_device),"changed",(GCallback)playback_device_changed,playback_device);
404 	g_signal_connect(G_OBJECT(spk_button),"clicked",(GCallback)linphone_gtk_start_sound,vbox);
405 	g_signal_connect(G_OBJECT(mixer_button),"clicked",(GCallback)open_mixer,vbox);
406 
407 	return vbox;
408 }
409 
create_play_record_page(void)410 static GtkWidget *create_play_record_page(void){
411 	GtkWidget *vbox=gtk_table_new(2,2,FALSE);
412 	GtkWidget *labelRecord=gtk_label_new(_("Press the record button and say some words"));
413 	GtkWidget *labelPlay=gtk_label_new(_("Listen to your record voice"));
414 	GtkWidget *rec_button=gtk_toggle_button_new_with_label(_("Record"));
415 	GtkWidget *play_button=gtk_toggle_button_new_with_label(_("Play"));
416 	GtkWidget *image;
417 
418 	image=gtk_image_new_from_stock(GTK_STOCK_MEDIA_RECORD,GTK_ICON_SIZE_MENU);
419 	gtk_button_set_image(GTK_BUTTON(rec_button),image);
420 
421 	image=gtk_image_new_from_stock(GTK_STOCK_MEDIA_PLAY,GTK_ICON_SIZE_MENU);
422 	gtk_button_set_image(GTK_BUTTON(play_button),image);
423 	gtk_widget_set_sensitive(play_button,FALSE);
424 
425 	gtk_table_attach_defaults(GTK_TABLE(vbox), labelRecord, 0, 1, 0, 1);
426 	gtk_table_attach(GTK_TABLE(vbox), rec_button, 1, 2, 0, 1, GTK_SHRINK, GTK_SHRINK, 0,0);
427 	gtk_table_attach_defaults(GTK_TABLE(vbox), labelPlay, 0, 1, 1, 2);
428 	gtk_table_attach(GTK_TABLE(vbox),  play_button, 1, 2, 1, 2, GTK_SHRINK, GTK_SHRINK, 0,0);
429 
430 	gtk_widget_show_all(vbox);
431 
432 	set_widget_to_assistant("rec_button",rec_button);
433 	set_widget_to_assistant("play_button",play_button);
434 	g_signal_connect(G_OBJECT(rec_button),"toggled",(GCallback)linphone_gtk_start_record_sound,vbox);
435 	g_signal_connect(G_OBJECT(play_button),"toggled",(GCallback)linphone_gtk_start_play_record_sound,vbox);
436 
437 	return vbox;
438 }
439 
create_end_page(void)440 static GtkWidget *create_end_page(void){
441 	GtkWidget *vbox=gtk_vbox_new(FALSE,2);
442 	GtkWidget *label=gtk_label_new(_("Let's start Linphone now"));
443 	gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 2);
444 	gtk_widget_show_all(vbox);
445 	return vbox;
446 }
447 
prepare(GtkAssistant * w)448 static void prepare(GtkAssistant *w){
449 	AudioStream *audio_stream = NULL;
450 	LinphoneCore *lc=linphone_gtk_get_core();
451 	MSFactory *factory = linphone_core_get_ms_factory(lc);
452 	int page = gtk_assistant_get_current_page(w);
453 	GtkWidget *mic_audiolevel = get_widget_from_assistant("mic_audiolevel");
454 	GtkWidget *label_audiolevel = get_widget_from_assistant("label_audiolevel");
455 
456 	//Speaker page
457 	if(page == 1){
458 		MSSndCardManager *manager =  ms_factory_get_snd_card_manager(factory);
459 		audio_stream = audio_stream_start_with_sndcards(factory, &av_profile,9898,"127.0.0.1",19898,0,0,ms_snd_card_manager_get_card(manager,linphone_core_get_playback_device(lc)),ms_snd_card_manager_get_card(manager,linphone_core_get_capture_device(lc)),FALSE);
460 		if (mic_audiolevel != NULL && audio_stream != NULL){
461 			g_object_set_data(G_OBJECT(audio_assistant),"stream",audio_stream);
462 			linphone_gtk_init_audio_meter(mic_audiolevel,(get_volume_t)audio_stream_get_record_volume,audio_stream);
463 			linphone_gtk_init_audio_label(label_audiolevel,(get_volume_t)audio_stream_get_max_volume,audio_stream);
464 		}
465 	} else if(page == 2 || page == 0){
466 		if(mic_audiolevel != NULL && label_audiolevel != NULL){
467 			audio_stream = (AudioStream *)g_object_get_data(G_OBJECT(audio_assistant),"stream");
468 			if(audio_stream != NULL){
469 				linphone_gtk_uninit_audio_meter(mic_audiolevel);
470 				linphone_gtk_uninit_audio_label(label_audiolevel);
471 				audio_stream_stop(audio_stream);
472 				g_object_set_data(G_OBJECT(audio_assistant),"stream",NULL);
473 			}
474 		}
475 	}
476 }
477 
linphone_gtk_close_audio_assistant(GtkWidget * w)478 void linphone_gtk_close_audio_assistant(GtkWidget *w){
479 	gchar *path;
480 	AudioStream *stream;
481 
482 	path = g_object_get_data(G_OBJECT(audio_assistant),"path");
483 	if(path != NULL){
484 		g_unlink(path);
485 	}
486 	stream = (AudioStream *)g_object_get_data(G_OBJECT(audio_assistant), "stream");
487 	if(stream) {
488 		audio_stream_stop(stream);
489 	}
490 	gtk_widget_destroy(w);
491 	if(linphone_gtk_get_audio_assistant_option()){
492 		gtk_main_quit();
493 	}
494 	audio_assistant = NULL;
495 }
496 
linphone_gtk_audio_assistant_apply(GtkWidget * w)497 void linphone_gtk_audio_assistant_apply(GtkWidget *w){
498 	linphone_gtk_close_audio_assistant(w);
499 }
500 
linphone_gtk_show_audio_assistant(void)501 void linphone_gtk_show_audio_assistant(void){
502 	GtkWidget *w;
503 	GtkWidget *welcome;
504 	GtkWidget *mic_page;
505 	GtkWidget *speaker_page;
506 	GtkWidget *play_record_page;
507 	GtkWidget *end_page;
508 	if(audio_assistant!=NULL)
509 		return;
510 	w=audio_assistant=linphone_gtk_create_window("audio_assistant", linphone_gtk_get_main_window());
511 
512 	gtk_window_set_resizable (GTK_WINDOW(w), FALSE);
513 	gtk_window_set_title(GTK_WINDOW(w),_("Audio Assistant"));
514 
515 	welcome=create_intro();
516 	mic_page=create_mic_page();
517 	speaker_page=create_speaker_page();
518 	play_record_page=create_play_record_page();
519 	end_page=create_end_page();
520 
521 	gtk_assistant_append_page(GTK_ASSISTANT(w),welcome);
522 	gtk_assistant_set_page_type(GTK_ASSISTANT(w),welcome,GTK_ASSISTANT_PAGE_INTRO);
523 	gtk_assistant_set_page_title(GTK_ASSISTANT(w),welcome,_("Audio assistant"));
524 	gtk_assistant_set_page_complete(GTK_ASSISTANT(w),welcome,TRUE);
525 
526 	gtk_assistant_append_page(GTK_ASSISTANT(w),mic_page);
527 	gtk_assistant_set_page_type(GTK_ASSISTANT(w),mic_page,GTK_ASSISTANT_PAGE_CONTENT);
528 	gtk_assistant_set_page_title(GTK_ASSISTANT(w),mic_page,_("Mic Gain calibration"));
529 	gtk_assistant_set_page_complete(GTK_ASSISTANT(w),mic_page,TRUE);
530 
531 	gtk_assistant_append_page(GTK_ASSISTANT(w),speaker_page);
532 	gtk_assistant_set_page_type(GTK_ASSISTANT(w),speaker_page,GTK_ASSISTANT_PAGE_CONTENT);
533 	gtk_assistant_set_page_complete(GTK_ASSISTANT(w),speaker_page,FALSE);
534 	gtk_assistant_set_page_title(GTK_ASSISTANT(w),speaker_page,_("Speaker volume calibration"));
535 
536 	gtk_assistant_append_page(GTK_ASSISTANT(w),play_record_page);
537 	gtk_assistant_set_page_type(GTK_ASSISTANT(w),play_record_page,GTK_ASSISTANT_PAGE_CONTENT);
538 	gtk_assistant_set_page_complete(GTK_ASSISTANT(w),play_record_page,TRUE);
539 	gtk_assistant_set_page_title(GTK_ASSISTANT(w),play_record_page,_("Record and Play"));
540 
541 	gtk_assistant_append_page(GTK_ASSISTANT(w),end_page);
542 	gtk_assistant_set_page_type(GTK_ASSISTANT(w),end_page,GTK_ASSISTANT_PAGE_SUMMARY);
543 	gtk_assistant_set_page_complete(GTK_ASSISTANT(w),end_page,TRUE);
544 	gtk_assistant_set_page_title(GTK_ASSISTANT(w),end_page,_("Terminating"));
545 
546  	g_signal_connect(G_OBJECT(w),"close",(GCallback)linphone_gtk_close_audio_assistant,w);
547  	g_signal_connect(G_OBJECT(w),"cancel",(GCallback)linphone_gtk_close_audio_assistant,w);
548  	g_signal_connect(G_OBJECT(w),"prepare",(GCallback)prepare,NULL);
549 
550 	gtk_widget_show(w);
551 }
552