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