diff --git a/sflphone-gtk/src/Makefile.am b/sflphone-gtk/src/Makefile.am index 621b8f005c668a765a333b507043a86df4ad61f5..fa16c4c6678de1f98a0de82c2d0c4070caf87762 100644 --- a/sflphone-gtk/src/Makefile.am +++ b/sflphone-gtk/src/Makefile.am @@ -20,6 +20,7 @@ sflphone_gtk_SOURCES = \ mainwindow.c \ calllist.c \ dialpad.c \ + audioconf.c \ menus.c \ calltab.c \ calltree.c \ @@ -34,7 +35,7 @@ sflphone_gtk_SOURCES = \ codeclist.c \ timestamp.c -noinst_HEADERS = actions.h dbus.h sflnotify.h mainwindow.h calllist.h dialpad.h codeclist.h assistant.h\ +noinst_HEADERS = actions.h dbus.h sflnotify.h mainwindow.h calllist.h dialpad.h audioconf.h codeclist.h assistant.h\ callmanager-glue.h errors.h sflphone_const.h configurationmanager-glue.h instance-glue.h menus.h calltab.h calltree.h configwindow.h \ accountlist.h accountwindow.h marshaller.h sliders.h $(STATUSICON_HEADER) timestamp.h historyfilter.c diff --git a/sflphone-gtk/src/audioconf.c b/sflphone-gtk/src/audioconf.c new file mode 100644 index 0000000000000000000000000000000000000000..f54bb5f7b87ffad355af9e8804b14e67bb47d970 --- /dev/null +++ b/sflphone-gtk/src/audioconf.c @@ -0,0 +1,779 @@ +/* + * Copyright (C) 2008 Savoir-Faire Linux inc. + * Author: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <audioconf.h> + + +GtkListStore *pluginlist; +GtkListStore *outputlist; +GtkListStore *inputlist; + +GtkWidget *output; +GtkWidget *input; +GtkWidget *plugin; +GtkWidget *codecMoveUpButton; +GtkWidget *codecMoveDownButton; +GtkWidget *codecTreeView; // View used instead of store to get access to selection + +// Codec properties ID +enum { + COLUMN_CODEC_ACTIVE, + COLUMN_CODEC_NAME, + COLUMN_CODEC_FREQUENCY, + COLUMN_CODEC_BITRATE, + COLUMN_CODEC_BANDWIDTH, + CODEC_COLUMN_COUNT +}; + +/** + * Fills the tree list with supported codecs + */ + void +config_window_fill_codec_list() +{ + GtkListStore *codecStore; + GtkTreeIter iter; + + // Get model of view and clear it + codecStore = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(codecTreeView))); + gtk_list_store_clear(codecStore); + + // Insert codecs + int i; + for(i = 0; i < codec_list_get_size(); i++) + { + codec_t *c = codec_list_get_nth(i); + printf("%s\n", c->name); + if(c) + { + gtk_list_store_append(codecStore, &iter); + gtk_list_store_set(codecStore, &iter, + COLUMN_CODEC_ACTIVE, c->is_active, // Active + COLUMN_CODEC_NAME, c->name, // Name + COLUMN_CODEC_FREQUENCY, g_strdup_printf("%d kHz", c->sample_rate/1000), // Frequency (kHz) + COLUMN_CODEC_BITRATE, g_strdup_printf("%.1f kbps", c->_bitrate), // Bitrate (kbps) + COLUMN_CODEC_BANDWIDTH, g_strdup_printf("%.1f kbps", c->_bandwidth), // Bandwidth (kpbs) + -1); + } + } +} + +/** + * Fill store with output audio plugins + */ + void +config_window_fill_output_audio_plugin_list() +{ + GtkTreeIter iter; + gchar** list; + gchar* managerName; + + gtk_list_store_clear(pluginlist); + + // Call dbus to retreive list + list = dbus_get_output_audio_plugin_list(); + + // For each API name included in list + int c = 0; + for(managerName = list[c]; managerName != NULL; managerName = list[c]) + { + c++; + gtk_list_store_append(pluginlist, &iter); + gtk_list_store_set(pluginlist, &iter, 0 , managerName, -1); + } +} + +/** + * Fill output audio device store + */ + void +config_window_fill_output_audio_device_list() +{ + /* + GtkTreeIter iter; + gchar** list; + gchar** audioDevice; + int index; + + gtk_list_store_clear(outputlist); + + // Call dbus to retreive list + list = dbus_get_audio_output_device_list(); + + // For each device name included in list + int c = 0; + for(audioDevice = list; *list ; list++) + { + index = dbus_get_audio_device_index( *list ); + gtk_list_store_append(outputlist, &iter); + gtk_list_store_set(outputlist, &iter, 0, *list, 1, index, -1); + c++; + } + */ +} + +/** + * Select active output audio device + */ + void +select_active_output_audio_device() +{ + /* + GtkTreeModel* model; + GtkTreeIter iter; + gchar** devices; + int currentDeviceIndex; + int deviceIndex; + + // Select active output device on server + devices = dbus_get_current_audio_devices_index(); + currentDeviceIndex = atoi(devices[0]); + printf(_("audio device index for output = %d\n"), currentDeviceIndex); + model = gtk_combo_box_get_model(GTK_COMBO_BOX(output)); + + // Find the currently set output device + gtk_tree_model_get_iter_first(model, &iter); + do { + gtk_tree_model_get(model, &iter, 1, &deviceIndex, -1); + if(deviceIndex == currentDeviceIndex) + { + // Set current iteration the active one + gtk_combo_box_set_active_iter(GTK_COMBO_BOX(output), &iter); + return; + } + } while(gtk_tree_model_iter_next(model, &iter)); + + // No index was found, select first one + g_print("Warning : No active output device found"); + gtk_combo_box_set_active(GTK_COMBO_BOX(output), 0); + */ +} + +/** + * Fill input audio device store + */ + void +config_window_fill_input_audio_device_list() +{ + /* + GtkTreeIter iter; + gchar** list; + gchar** audioDevice; + int index ; + gtk_list_store_clear(inputAudioDeviceManagerStore); + + // Call dbus to retreive list + list = dbus_get_audio_input_device_list(); + + // For each device name included in list + //int c = 0; + for(audioDevice = list; *list; list++) + { + index = dbus_get_audio_device_index( *list ); + gtk_list_store_append(inputAudioDeviceManagerStore, &iter); + gtk_list_store_set(inputAudioDeviceManagerStore, &iter, 0, *list, 1, index, -1); + //c++; + } + */ +} + +/** + * Select active input audio device + */ + void +select_active_input_audio_device() +{ + /* + GtkTreeModel* model; + GtkTreeIter iter; + gchar** devices; + int currentDeviceIndex; + int deviceIndex; + + // Select active input device on server + devices = dbus_get_current_audio_devices_index(); + currentDeviceIndex = atoi(devices[1]); + model = gtk_combo_box_get_model(GTK_COMBO_BOX(input)); + + // Find the currently set input device + gtk_tree_model_get_iter_first(model, &iter); + do { + gtk_tree_model_get(model, &iter, 1, &deviceIndex, -1); + if(deviceIndex == currentDeviceIndex) + { + // Set current iteration the active one + gtk_combo_box_set_active_iter(GTK_COMBO_BOX(input), &iter); + return; + } + } while(gtk_tree_model_iter_next(model, &iter)); + + // No index was found, select first one + g_print("Warning : No active input device found"); + gtk_combo_box_set_active(GTK_COMBO_BOX(input), 0); + */ +} + +/** + * Select the output audio plugin by calling the server + */ + static void +select_output_audio_plugin(GtkComboBox* widget, gpointer data) +{ + GtkTreeModel* model; + GtkTreeIter iter; + int comboBoxIndex; + gchar* pluginName; + + comboBoxIndex = gtk_combo_box_get_active(widget); + + if(comboBoxIndex >= 0) + { + model = gtk_combo_box_get_model(widget); + gtk_combo_box_get_active_iter(widget, &iter); + gtk_tree_model_get(model, &iter, 0, &pluginName, -1); + dbus_set_output_audio_plugin(pluginName); + //update_combo_box( pluginName); + } +} + +/** + * Select active output audio plugin + */ + void +select_active_output_audio_plugin() +{ + GtkTreeModel* model; + GtkTreeIter iter; + gchar* plugin; + gchar* tmp; + + // Select active output device on server + plugin = dbus_get_current_audio_output_plugin(); + tmp = plugin; + model = gtk_combo_box_get_model(GTK_COMBO_BOX(plugin)); + + // Find the currently alsa plugin + gtk_tree_model_get_iter_first(model, &iter); + do { + gtk_tree_model_get(model, &iter, 0, &plugin , -1); + if( g_strcasecmp( tmp , plugin ) == 0 ) + { + // Set current iteration the active one + gtk_combo_box_set_active_iter(GTK_COMBO_BOX(plugin), &iter); + //update_combo_box( plugin ); + return; + } + } while(gtk_tree_model_iter_next(model, &iter)); + + // No index was found, select first one + g_print("Warning : No active output device found\n"); + gtk_combo_box_set_active(GTK_COMBO_BOX(plugin), 0); + //update_combo_box("default"); +} + + +/** + * Set the audio output device on the server with its index + */ + static void +select_audio_output_device(GtkComboBox* comboBox, gpointer data) +{ + GtkTreeModel* model; + GtkTreeIter iter; + int comboBoxIndex; + int deviceIndex; + + comboBoxIndex = gtk_combo_box_get_active(comboBox); + + if(comboBoxIndex >= 0) + { + model = gtk_combo_box_get_model(comboBox); + gtk_combo_box_get_active_iter(comboBox, &iter); + gtk_tree_model_get(model, &iter, 1, &deviceIndex, -1); + + dbus_set_audio_output_device(deviceIndex); + } +} + +/** + * Set the audio input device on the server with its index + */ + static void +select_audio_input_device(GtkComboBox* comboBox, gpointer data) +{ + GtkTreeModel* model; + GtkTreeIter iter; + int comboBoxIndex; + int deviceIndex; + + comboBoxIndex = gtk_combo_box_get_active(comboBox); + + if(comboBoxIndex >= 0) + { + model = gtk_combo_box_get_model(comboBox); + gtk_combo_box_get_active_iter(comboBox, &iter); + gtk_tree_model_get(model, &iter, 1, &deviceIndex, -1); + + dbus_set_audio_input_device(deviceIndex); + } +} + +/** + * Toggle move buttons on if a codec is selected, off elsewise + */ + static void +select_codec(GtkTreeSelection *selection, GtkTreeModel *model) +{ + GtkTreeIter iter; + + if(!gtk_tree_selection_get_selected(selection, &model, &iter)) + { + gtk_widget_set_sensitive(GTK_WIDGET(codecMoveUpButton), FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(codecMoveDownButton), FALSE); + } + else + { + gtk_widget_set_sensitive(GTK_WIDGET(codecMoveUpButton), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(codecMoveDownButton), TRUE); + } +} + +/** + * Toggle active value of codec on click and update changes to the deamon + * and in configuration files + */ + static void +codec_active_toggled(GtkCellRendererToggle *renderer, gchar *path, gpointer data) +{ + GtkTreeIter iter; + GtkTreePath *treePath; + GtkTreeModel *model; + gboolean active; + char* name; + + // Get path of clicked codec active toggle box + treePath = gtk_tree_path_new_from_string(path); + model = gtk_tree_view_get_model(GTK_TREE_VIEW(data)); + gtk_tree_model_get_iter(model, &iter, treePath); + + // Get active value and name at iteration + gtk_tree_model_get(model, &iter, + COLUMN_CODEC_ACTIVE, &active, + COLUMN_CODEC_NAME, &name, + -1); + + printf("%s\n", name); + + // Toggle active value + active = !active; + + // Store value + gtk_list_store_set(GTK_LIST_STORE(model), &iter, + COLUMN_CODEC_ACTIVE, active, + -1); + + gtk_tree_path_free(treePath); + + // Modify codec queue to represent change + if(active) + codec_set_active(name); + else + codec_set_inactive(name); + + // Perpetuate changes to the deamon + codec_list_update_to_daemon(); +} + + +/** + * Move codec in list depending on direction and selected codec and + * update changes in the daemon list and the configuration files + */ + static void +codec_move(gboolean moveUp, gpointer data) +{ + GtkTreeIter iter; + GtkTreeIter *iter2; + GtkTreeView *treeView; + GtkTreeModel *model; + GtkTreeSelection *selection; + GtkTreePath *treePath; + gchar *path; + + // Get view, model and selection of codec store + treeView = GTK_TREE_VIEW(data); + model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeView)); + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeView)); + + // Find selected iteration and create a copy + gtk_tree_selection_get_selected(GTK_TREE_SELECTION(selection), &model, &iter); + iter2 = gtk_tree_iter_copy(&iter); + + // Find path of iteration + path = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(model), &iter); + treePath = gtk_tree_path_new_from_string(path); + gint *indices = gtk_tree_path_get_indices(treePath); + gint indice = indices[0]; + + // Depending on button direction get new path + if(moveUp) + gtk_tree_path_prev(treePath); + else + gtk_tree_path_next(treePath); + gtk_tree_model_get_iter(model, &iter, treePath); + + // Swap iterations if valid + if(gtk_list_store_iter_is_valid(GTK_LIST_STORE(model), &iter)) + gtk_list_store_swap(GTK_LIST_STORE(model), &iter, iter2); + + // Scroll to new position + gtk_tree_view_scroll_to_cell(treeView, treePath, NULL, FALSE, 0, 0); + + // Free resources + gtk_tree_path_free(treePath); + gtk_tree_iter_free(iter2); + g_free(path); + + // Perpetuate changes in codec queue + if(moveUp) + codec_list_move_codec_up(indice); + else + codec_list_move_codec_down(indice); + + // Perpetuate changes to the deamon + codec_list_update_to_daemon(); +} + +/** + * Called from move up codec button signal + */ + static void +codec_move_up(GtkButton *button, gpointer data) +{ + // Change tree view ordering and get indice changed + codec_move(TRUE, data); +} + +/** + * Called from move down codec button signal + */ + static void +codec_move_down(GtkButton *button, gpointer data) +{ + // Change tree view ordering and get indice changed + codec_move(FALSE, data); +} + + int +is_ringtone_enabled( void ) +{ + return dbus_is_ringtone_enabled(); +} + + void +ringtone_enabled( void ) +{ + dbus_ringtone_enabled(); +} + + void +ringtone_changed( GtkFileChooser *chooser , GtkLabel *label) +{ + gchar* tone = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER( chooser )); + dbus_set_ringtone_choice( tone ); +} + + gchar* +get_ringtone_choice( void ) +{ + return dbus_get_ringtone_choice(); +} + + +GtkWidget* codecs_box() +{ + GtkWidget *ret; + GtkWidget *scrolledWindow; + GtkWidget *buttonBox; + + GtkListStore *codecStore; + GtkCellRenderer *renderer; + GtkTreeSelection *treeSelection; + GtkTreeViewColumn *treeViewColumn; + + ret = gtk_hbox_new(FALSE, 10); + gtk_container_set_border_width(GTK_CONTAINER(ret), 10); + + scrolledWindow = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledWindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledWindow), GTK_SHADOW_IN); + + gtk_box_pack_start(GTK_BOX(ret), scrolledWindow, TRUE, TRUE, 0); + codecStore = gtk_list_store_new(CODEC_COLUMN_COUNT, + G_TYPE_BOOLEAN, // Active + G_TYPE_STRING, // Name + G_TYPE_STRING, // Frequency + G_TYPE_STRING, // Bit rate + G_TYPE_STRING // Bandwith + ); + + // Create codec tree view with list store + codecTreeView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(codecStore)); + + // Get tree selection manager + treeSelection = gtk_tree_view_get_selection(GTK_TREE_VIEW(codecTreeView)); + g_signal_connect(G_OBJECT(treeSelection), "changed", + G_CALLBACK (select_codec), + codecStore); + + // Active column + renderer = gtk_cell_renderer_toggle_new(); + treeViewColumn = gtk_tree_view_column_new_with_attributes("", renderer, "active", COLUMN_CODEC_ACTIVE, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(codecTreeView), treeViewColumn); + + // Toggle codec active property on clicked + g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(codec_active_toggled), (gpointer)codecTreeView); + + // Name column + renderer = gtk_cell_renderer_text_new(); + treeViewColumn = gtk_tree_view_column_new_with_attributes(_("Name"), renderer, "markup", COLUMN_CODEC_NAME, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(codecTreeView), treeViewColumn); + + // Bit rate column + renderer = gtk_cell_renderer_text_new(); + treeViewColumn = gtk_tree_view_column_new_with_attributes(_("Frequency"), renderer, "text", COLUMN_CODEC_FREQUENCY, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(codecTreeView), treeViewColumn); + + // Bandwith column + renderer = gtk_cell_renderer_text_new(); + treeViewColumn = gtk_tree_view_column_new_with_attributes(_("Bitrate"), renderer, "text", COLUMN_CODEC_BITRATE, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(codecTreeView), treeViewColumn); + + // Frequency column + renderer = gtk_cell_renderer_text_new(); + treeViewColumn = gtk_tree_view_column_new_with_attributes(_("Bandwidth"), renderer, "text", COLUMN_CODEC_BANDWIDTH, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(codecTreeView), treeViewColumn); + + g_object_unref(G_OBJECT(codecStore)); + gtk_container_add(GTK_CONTAINER(scrolledWindow), codecTreeView); + + // Create button box + buttonBox = gtk_vbox_new(FALSE, 0); + gtk_container_set_border_width(GTK_CONTAINER(buttonBox), 10); + gtk_box_pack_start(GTK_BOX(ret), buttonBox, FALSE, FALSE, 0); + + codecMoveUpButton = gtk_button_new_from_stock(GTK_STOCK_GO_UP); + gtk_widget_set_sensitive(GTK_WIDGET(codecMoveUpButton), FALSE); + gtk_box_pack_start(GTK_BOX(buttonBox), codecMoveUpButton, FALSE, FALSE, 0); + g_signal_connect(G_OBJECT(codecMoveUpButton), "clicked", G_CALLBACK(codec_move_up), codecTreeView); + + codecMoveDownButton = gtk_button_new_from_stock(GTK_STOCK_GO_DOWN); + gtk_widget_set_sensitive(GTK_WIDGET(codecMoveDownButton), FALSE); + gtk_box_pack_start(GTK_BOX(buttonBox), codecMoveDownButton, FALSE, FALSE, 0); + g_signal_connect(G_OBJECT(codecMoveDownButton), "clicked", G_CALLBACK(codec_move_down), codecTreeView); + + config_window_fill_codec_list(); + + return ret; +} + +GtkWidget* api_box() +{ + GtkWidget *ret; + GtkWidget *alsa; + GtkWidget *pulse; + + ret = gtk_hbox_new(FALSE, 10); + gtk_widget_show( ret ); + + pulse = gtk_radio_button_new_with_mnemonic( NULL , _("Pulseaudio")); + gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(pulse), TRUE ); + gtk_box_pack_start( GTK_BOX(ret) , pulse , TRUE , TRUE , 1); + alsa = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(pulse), _("ALSA")); + gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(alsa), FALSE ); + gtk_box_pack_end( GTK_BOX(ret) , alsa , TRUE , TRUE , 1); + + gtk_widget_show_all(ret); + + return ret; +} + +GtkWidget* alsa_box() +{ + GtkWidget *ret; + GtkWidget *table; + GtkWidget *item; + GtkCellRenderer *renderer; + + ret = gtk_hbox_new(FALSE, 10); + gtk_widget_show( ret ); + + table = gtk_table_new(4, 3, FALSE); + gtk_table_set_col_spacing(GTK_TABLE(table), 0, 40); + gtk_box_pack_start( GTK_BOX(ret) , table , TRUE , TRUE , 1); + gtk_widget_show(table); + + item = gtk_label_new(_("ALSA plugin")); + gtk_misc_set_alignment(GTK_MISC(item), 0, 0.5); + gtk_table_attach(GTK_TABLE(table), item, 1, 2, 1, 2, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0); + gtk_widget_show( item ); + // Set choices of audio managers + pluginlist = gtk_list_store_new(1, G_TYPE_STRING); + config_window_fill_output_audio_plugin_list(); + plugin = gtk_combo_box_new_with_model(GTK_TREE_MODEL(pluginlist)); + //select_active_output_audio_plugin(); + gtk_label_set_mnemonic_widget(GTK_LABEL(item), plugin); + //g_signal_connect(G_OBJECT(plugin), "changed", G_CALLBACK(select_output_audio_plugin), plugin); + + // Set rendering + renderer = gtk_cell_renderer_text_new(); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(plugin), renderer, TRUE); + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(plugin), renderer, "text", 0, NULL); + gtk_table_attach(GTK_TABLE(table), plugin, 2, 3, 1, 2, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0); + gtk_widget_show(plugin); + + // Device : Output device + // Create title label + item = gtk_label_new(_("Output")); + gtk_misc_set_alignment(GTK_MISC(item), 0, 0.5); + gtk_table_attach(GTK_TABLE(table), item, 1, 2, 2, 3, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0); + gtk_widget_show(item); + // Set choices of output devices + outputlist = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT); + config_window_fill_output_audio_device_list(); + output = gtk_combo_box_new_with_model(GTK_TREE_MODEL(outputlist)); + //select_active_output_audio_device(); + gtk_label_set_mnemonic_widget(GTK_LABEL(item), output); + //g_signal_connect(G_OBJECT(output), "changed", G_CALLBACK(select_audio_output_device), output); + + // Set rendering + renderer = gtk_cell_renderer_text_new(); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(output), renderer, TRUE); + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(output), renderer, "text", 0, NULL); + gtk_table_attach(GTK_TABLE(table), output, 2, 3, 2, 3, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0); + gtk_widget_show(output); + + // Device : Input device + // Create title label + item = gtk_label_new(_("Input")); + gtk_misc_set_alignment(GTK_MISC(item), 0, 0.5); + gtk_table_attach(GTK_TABLE(table), item, 1, 2, 3, 4, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0); + gtk_widget_show(item); + // Set choices of output devices + inputlist = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT); + config_window_fill_input_audio_device_list(); + input = gtk_combo_box_new_with_model(GTK_TREE_MODEL(inputlist)); + //select_active_input_audio_device(); + gtk_label_set_mnemonic_widget(GTK_LABEL(item), input); + //g_signal_connect(G_OBJECT(input), "changed", G_CALLBACK(select_audio_input_device), input); + + // Set rendering + renderer = gtk_cell_renderer_text_new(); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(input), renderer, TRUE); + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(input), renderer, "text", 0, NULL); + gtk_table_attach(GTK_TABLE(table), input, 2, 3, 3, 4, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0); + gtk_widget_show(input); + + gtk_widget_show_all(ret); + + return ret; +} + +GtkWidget* ringtones_box() +{ + GtkWidget *ret; + GtkWidget *enableTone; + GtkWidget *fileChooser; + + // check button to enable ringtones + ret = gtk_hbox_new( TRUE , 1); + enableTone = gtk_check_button_new_with_mnemonic( _("_Enable ringtones")); + gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(enableTone), dbus_is_ringtone_enabled() ); + gtk_box_pack_start( GTK_BOX(ret) , enableTone , TRUE , TRUE , 1); + g_signal_connect(G_OBJECT( enableTone) , "clicked" , G_CALLBACK( ringtone_enabled ) , NULL); + // file chooser button + fileChooser = gtk_file_chooser_button_new(_("Choose a ringtone"), GTK_FILE_CHOOSER_ACTION_OPEN); + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER( fileChooser) , g_get_home_dir()); + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER( fileChooser) , get_ringtone_choice()); + g_signal_connect( G_OBJECT( fileChooser ) , "selection_changed" , G_CALLBACK( ringtone_changed ) , NULL ); + GtkFileFilter *filter = gtk_file_filter_new(); + gtk_file_filter_set_name( filter , _("Audio Files") ); + gtk_file_filter_add_pattern(filter , "*.wav" ); + gtk_file_filter_add_pattern(filter , "*.ul" ); + gtk_file_filter_add_pattern(filter , "*.au" ); + gtk_file_chooser_add_filter( GTK_FILE_CHOOSER( fileChooser ) , filter); + gtk_box_pack_start( GTK_BOX(ret) , fileChooser , TRUE , TRUE , 1); + + return ret; +} + + +GtkWidget* create_audio_configuration() +{ + // Main widget + GtkWidget *ret; + // Main frames + GtkWidget *sound_conf; + GtkWidget *alsa_conf; + GtkWidget *codecs_conf; + GtkWidget *ringtones_conf; + // Sub boxes + GtkWidget *box; + + ret = gtk_vbox_new(FALSE, 10); + gtk_container_set_border_width(GTK_CONTAINER(ret), 10); + + // Box for the audio manager selection + sound_conf = gtk_frame_new(_("Sound Manager")); + gtk_box_pack_start(GTK_BOX(ret), sound_conf, FALSE, FALSE, 0); + gtk_widget_show( sound_conf ); + box = api_box(); + gtk_container_add( GTK_CONTAINER(sound_conf) , box ); + + // Box for the ALSA configuration + alsa_conf = gtk_frame_new(_("ALSA configuration")); + gtk_box_pack_start(GTK_BOX(ret), alsa_conf, FALSE, FALSE, 0); + gtk_widget_show( alsa_conf ); + box = alsa_box(); + gtk_container_add( GTK_CONTAINER(alsa_conf) , box ); + + // Box for the codecs + codecs_conf = gtk_frame_new(_("Codecs")); + gtk_box_pack_start(GTK_BOX(ret), codecs_conf, FALSE, FALSE, 0); + gtk_widget_show( codecs_conf ); + box = codecs_box(); + gtk_container_add( GTK_CONTAINER(codecs_conf) , box ); + + // Box for the codecs + ringtones_conf = gtk_frame_new(_("Ringtones")); + gtk_box_pack_start(GTK_BOX(ret), ringtones_conf, FALSE, FALSE, 0); + gtk_widget_show( ringtones_conf ); + box = ringtones_box(); + gtk_container_add( GTK_CONTAINER(ringtones_conf) , box ); + + gtk_widget_show_all(ret); + + return ret; +} + +gboolean get_api() +{ + return gtk_widget_get_active() +} + diff --git a/sflphone-gtk/src/audioconf.h b/sflphone-gtk/src/audioconf.h new file mode 100644 index 0000000000000000000000000000000000000000..ab1f8411be29fa0494d9535e129ded2421ee2466 --- /dev/null +++ b/sflphone-gtk/src/audioconf.h @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2008 Savoir-Faire Linux inc. + * Author: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __AUDIO_CONF_H +#define __AUDIO_CONF_H + +#include <actions.h> + +GtkWidget* create_audio_configuration(); + +GtkWidget* api_box(); +GtkWidget* alsa_box(); +GtkWidget* codecs_box(); +GtkWidget* ringtone_box(); + +gboolean get_api( ); + +#endif // __AUDIO_CONF_H diff --git a/sflphone-gtk/src/configwindow.c b/sflphone-gtk/src/configwindow.c index 17db576770d29b6d547245597e5c1f9e4462cdd1..471dcb1b58e36cbd12bb343aa1c47bc65a5b4498 100644 --- a/sflphone-gtk/src/configwindow.c +++ b/sflphone-gtk/src/configwindow.c @@ -19,17 +19,19 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include <gtk/gtk.h> + #include <accountlist.h> #include <accountwindow.h> #include <actions.h> #include <config.h> #include <dbus.h> #include <mainwindow.h> +#include <audioconf.h> #include <stdlib.h> #include <stdio.h> -#include <gtk/gtk.h> /** * Local variables @@ -38,13 +40,7 @@ gboolean dialogOpen = FALSE; gboolean ringtoneEnabled = TRUE; GtkListStore *accountStore; -GtkWidget *codecTreeView; // View used instead of store to get access to selection // instead of keeping selected codec as a variable -GtkListStore *inputAudioPluginStore; -GtkListStore *outputAudioPluginStore; -GtkListStore *outputAudioDeviceManagerStore; -GtkListStore *inputAudioDeviceManagerStore; - GtkWidget *addButton; GtkWidget *editButton; GtkWidget *deleteButton; @@ -52,13 +48,6 @@ GtkWidget *restoreButton; GtkWidget *accountMoveDownButton; GtkWidget *accountMoveUpButton; -GtkWidget *outputDeviceComboBox; -GtkWidget *inputDeviceComboBox; -GtkWidget *pluginComboBox; - -GtkWidget *codecMoveUpButton; -GtkWidget *codecMoveDownButton; - GtkWidget* status; account_t *selectedAccount; @@ -73,15 +62,6 @@ enum { COLUMN_ACCOUNT_COUNT }; -// Codec properties ID -enum { - COLUMN_CODEC_ACTIVE, - COLUMN_CODEC_NAME, - COLUMN_CODEC_FREQUENCY, - COLUMN_CODEC_BITRATE, - COLUMN_CODEC_BANDWIDTH, - CODEC_COLUMN_COUNT -}; /** * Fills the treelist with accounts @@ -117,332 +97,6 @@ config_window_fill_account_list() } } -/** - * Fills the tree list with supported codecs -*/ -void -config_window_fill_codec_list() -{ - if(dialogOpen) - { - GtkListStore *codecStore; - GtkTreeIter iter; - - // Get model of view and clear it - codecStore = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(codecTreeView))); - gtk_list_store_clear(codecStore); - - // Insert codecs - int i; - for(i = 0; i < codec_list_get_size(); i++) - { - codec_t *c = codec_list_get_nth(i); - printf("%s\n", c->name); - if(c) - { - gtk_list_store_append(codecStore, &iter); - gtk_list_store_set(codecStore, &iter, - COLUMN_CODEC_ACTIVE, c->is_active, // Active - COLUMN_CODEC_NAME, c->name, // Name - COLUMN_CODEC_FREQUENCY, g_strdup_printf("%d kHz", c->sample_rate/1000), // Frequency (kHz) - COLUMN_CODEC_BITRATE, g_strdup_printf("%.1f kbps", c->_bitrate), // Bitrate (kbps) - COLUMN_CODEC_BANDWIDTH, g_strdup_printf("%.1f kbps", c->_bandwidth), // Bandwidth (kpbs) - -1); - } - } - } -} - -/** - * Fill store with input audio plugins - */ -void -config_window_fill_input_audio_plugin_list() -{ - GtkTreeIter iter; - gchar** list; - gchar* managerName; - - gtk_list_store_clear(inputAudioPluginStore); - - // Call dbus to retreive list - list = dbus_get_input_audio_plugin_list(); - - // For each API name included in list - int c = 0; - for(managerName = list[c]; managerName != NULL; managerName = list[c]) - { - c++; - gtk_list_store_append(inputAudioPluginStore, &iter); - gtk_list_store_set(inputAudioPluginStore, &iter, 0 , managerName, -1); - } -} - -/** - * Fill store with output audio plugins - */ -void -config_window_fill_output_audio_plugin_list() -{ - GtkTreeIter iter; - gchar** list; - gchar* managerName; - - gtk_list_store_clear(outputAudioPluginStore); - - // Call dbus to retreive list - list = dbus_get_output_audio_plugin_list(); - - // For each API name included in list - int c = 0; - for(managerName = list[c]; managerName != NULL; managerName = list[c]) - { - c++; - gtk_list_store_append(outputAudioPluginStore, &iter); - gtk_list_store_set(outputAudioPluginStore, &iter, 0 , managerName, -1); - } -} -/** - * Fill output audio device store - */ -void -config_window_fill_output_audio_device_list() -{ - GtkTreeIter iter; - gchar** list; - gchar** audioDevice; - int index; - - gtk_list_store_clear(outputAudioDeviceManagerStore); - - // Call dbus to retreive list - list = dbus_get_audio_output_device_list(); - - // For each device name included in list - int c = 0; - for(audioDevice = list; *list ; list++) - { - index = dbus_get_audio_device_index( *list ); - gtk_list_store_append(outputAudioDeviceManagerStore, &iter); - gtk_list_store_set(outputAudioDeviceManagerStore, &iter, 0, *list, 1, index, -1); - c++; - } -} - -/** - * Select active output audio device - */ -void -select_active_output_audio_device() -{ - GtkTreeModel* model; - GtkTreeIter iter; - gchar** devices; - int currentDeviceIndex; - int deviceIndex; - - // Select active output device on server - devices = dbus_get_current_audio_devices_index(); - currentDeviceIndex = atoi(devices[0]); - printf(_("audio device index for output = %d\n"), currentDeviceIndex); - model = gtk_combo_box_get_model(GTK_COMBO_BOX(outputDeviceComboBox)); - - // Find the currently set output device - gtk_tree_model_get_iter_first(model, &iter); - do { - gtk_tree_model_get(model, &iter, 1, &deviceIndex, -1); - if(deviceIndex == currentDeviceIndex) - { - // Set current iteration the active one - gtk_combo_box_set_active_iter(GTK_COMBO_BOX(outputDeviceComboBox), &iter); - return; - } - } while(gtk_tree_model_iter_next(model, &iter)); - - // No index was found, select first one - g_print("Warning : No active output device found"); - gtk_combo_box_set_active(GTK_COMBO_BOX(outputDeviceComboBox), 0); -} - -/** - * Fill input audio device store - */ -void -config_window_fill_input_audio_device_list() -{ - GtkTreeIter iter; - gchar** list; - gchar** audioDevice; - int index ; - gtk_list_store_clear(inputAudioDeviceManagerStore); - - // Call dbus to retreive list - list = dbus_get_audio_input_device_list(); - - // For each device name included in list - //int c = 0; - for(audioDevice = list; *list; list++) - { - index = dbus_get_audio_device_index( *list ); - gtk_list_store_append(inputAudioDeviceManagerStore, &iter); - gtk_list_store_set(inputAudioDeviceManagerStore, &iter, 0, *list, 1, index, -1); - //c++; - } -} - -/** - * Select active input audio device - */ -void -select_active_input_audio_device() -{ - GtkTreeModel* model; - GtkTreeIter iter; - gchar** devices; - int currentDeviceIndex; - int deviceIndex; - - // Select active input device on server - devices = dbus_get_current_audio_devices_index(); - currentDeviceIndex = atoi(devices[1]); - model = gtk_combo_box_get_model(GTK_COMBO_BOX(inputDeviceComboBox)); - - // Find the currently set input device - gtk_tree_model_get_iter_first(model, &iter); - do { - gtk_tree_model_get(model, &iter, 1, &deviceIndex, -1); - if(deviceIndex == currentDeviceIndex) - { - // Set current iteration the active one - gtk_combo_box_set_active_iter(GTK_COMBO_BOX(inputDeviceComboBox), &iter); - return; - } - } while(gtk_tree_model_iter_next(model, &iter)); - - // No index was found, select first one - g_print("Warning : No active input device found"); - gtk_combo_box_set_active(GTK_COMBO_BOX(inputDeviceComboBox), 0); -} - -void -update_combo_box( gchar* plugin ) -{ - // set insensitive the devices widget if the selected plugin is default - if( g_strcasecmp( plugin , "default" ) == 0) - { - //gtk_widget_set_sensitive( GTK_WIDGET ( outputDeviceComboBox ) , FALSE ); - //gtk_widget_set_sensitive( GTK_WIDGET ( inputDeviceComboBox ) , FALSE ); - } - else - { - //gtk_widget_set_sensitive( GTK_WIDGET ( outputDeviceComboBox ) , TRUE ); - //gtk_widget_set_sensitive( GTK_WIDGET ( inputDeviceComboBox ) , TRUE ); - } -} -/** - * Select the output audio plugin by calling the server - */ -static void -select_output_audio_plugin(GtkComboBox* widget, gpointer data) -{ - GtkTreeModel* model; - GtkTreeIter iter; - int comboBoxIndex; - gchar* pluginName; - - comboBoxIndex = gtk_combo_box_get_active(widget); - - if(comboBoxIndex >= 0) - { - model = gtk_combo_box_get_model(widget); - gtk_combo_box_get_active_iter(widget, &iter); - gtk_tree_model_get(model, &iter, 0, &pluginName, -1); - dbus_set_output_audio_plugin(pluginName); - //update_combo_box( pluginName); - } -} - -/** - * Select active output audio plugin - */ -void -select_active_output_audio_plugin() -{ - GtkTreeModel* model; - GtkTreeIter iter; - gchar* plugin; - gchar* tmp; - - // Select active output device on server - plugin = dbus_get_current_audio_output_plugin(); - tmp = plugin; - model = gtk_combo_box_get_model(GTK_COMBO_BOX(pluginComboBox)); - - // Find the currently alsa plugin - gtk_tree_model_get_iter_first(model, &iter); - do { - gtk_tree_model_get(model, &iter, 0, &plugin , -1); - if( g_strcasecmp( tmp , plugin ) == 0 ) - { - // Set current iteration the active one - gtk_combo_box_set_active_iter(GTK_COMBO_BOX(pluginComboBox), &iter); - //update_combo_box( plugin ); - return; - } - } while(gtk_tree_model_iter_next(model, &iter)); - - // No index was found, select first one - g_print("Warning : No active output device found\n"); - gtk_combo_box_set_active(GTK_COMBO_BOX(pluginComboBox), 0); - //update_combo_box("default"); -} - - -/** - * Set the audio output device on the server with its index - */ -static void -select_audio_output_device(GtkComboBox* comboBox, gpointer data) -{ - GtkTreeModel* model; - GtkTreeIter iter; - int comboBoxIndex; - int deviceIndex; - - comboBoxIndex = gtk_combo_box_get_active(comboBox); - - if(comboBoxIndex >= 0) - { - model = gtk_combo_box_get_model(comboBox); - gtk_combo_box_get_active_iter(comboBox, &iter); - gtk_tree_model_get(model, &iter, 1, &deviceIndex, -1); - - dbus_set_audio_output_device(deviceIndex); - } -} - -/** - * Set the audio input device on the server with its index - */ -static void -select_audio_input_device(GtkComboBox* comboBox, gpointer data) -{ - GtkTreeModel* model; - GtkTreeIter iter; - int comboBoxIndex; - int deviceIndex; - - comboBoxIndex = gtk_combo_box_get_active(comboBox); - - if(comboBoxIndex >= 0) - { - model = gtk_combo_box_get_model(comboBox); - gtk_combo_box_get_active_iter(comboBox, &iter); - gtk_tree_model_get(model, &iter, 1, &deviceIndex, -1); - - dbus_set_audio_input_device(deviceIndex); - } -} /** * Refresh all audio settings @@ -492,12 +146,6 @@ add_account(GtkWidget *widget, gpointer data) show_account_window(NULL); } -int -is_ringtone_enabled( void ) -{ - return dbus_is_ringtone_enabled(); -} - void start_hidden( void ) { @@ -534,25 +182,6 @@ clean_history( void ) call_list_clean_history(); } -void -ringtone_enabled( void ) -{ - dbus_ringtone_enabled(); -} - -void -ringtone_changed( GtkFileChooser *chooser , GtkLabel *label) -{ - gchar* tone = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER( chooser )); - dbus_set_ringtone_choice( tone ); -} - -gchar* -get_ringtone_choice( void ) -{ - return dbus_get_ringtone_choice(); -} - /** * Call back when the user click on an account in the list */ @@ -586,72 +215,6 @@ select_account(GtkTreeSelection *selection, GtkTreeModel *model) g_print("select"); } -/** - * Toggle move buttons on if a codec is selected, off elsewise - */ -static void -select_codec(GtkTreeSelection *selection, GtkTreeModel *model) -{ - GtkTreeIter iter; - - if(!gtk_tree_selection_get_selected(selection, &model, &iter)) - { - gtk_widget_set_sensitive(GTK_WIDGET(codecMoveUpButton), FALSE); - gtk_widget_set_sensitive(GTK_WIDGET(codecMoveDownButton), FALSE); - } - else - { - gtk_widget_set_sensitive(GTK_WIDGET(codecMoveUpButton), TRUE); - gtk_widget_set_sensitive(GTK_WIDGET(codecMoveDownButton), TRUE); - } -} - -/** - * Toggle active value of codec on click and update changes to the deamon - * and in configuration files - */ -static void -codec_active_toggled(GtkCellRendererToggle *renderer, gchar *path, gpointer data) -{ - GtkTreeIter iter; - GtkTreePath *treePath; - GtkTreeModel *model; - gboolean active; - char* name; - - // Get path of clicked codec active toggle box - treePath = gtk_tree_path_new_from_string(path); - model = gtk_tree_view_get_model(GTK_TREE_VIEW(data)); - gtk_tree_model_get_iter(model, &iter, treePath); - - // Get active value and name at iteration - gtk_tree_model_get(model, &iter, - COLUMN_CODEC_ACTIVE, &active, - COLUMN_CODEC_NAME, &name, - -1); - - printf("%s\n", name); - - // Toggle active value - active = !active; - - // Store value - gtk_list_store_set(GTK_LIST_STORE(model), &iter, - COLUMN_CODEC_ACTIVE, active, - -1); - - gtk_tree_path_free(treePath); - - // Modify codec queue to represent change - if(active) - codec_set_active(name); - else - codec_set_inactive(name); - - // Perpetuate changes to the deamon - codec_list_update_to_daemon(); -} - static void enable_account(GtkCellRendererToggle *rend , gchar* path, gpointer data ) { @@ -685,65 +248,6 @@ enable_account(GtkCellRendererToggle *rend , gchar* path, gpointer data ) dbus_send_register( acc->accountID , enable ); } -/** - * Move codec in list depending on direction and selected codec and - * update changes in the daemon list and the configuration files - */ -static void -codec_move(gboolean moveUp, gpointer data) -{ - GtkTreeIter iter; - GtkTreeIter *iter2; - GtkTreeView *treeView; - GtkTreeModel *model; - GtkTreeSelection *selection; - GtkTreePath *treePath; - gchar *path; - - // Get view, model and selection of codec store - treeView = GTK_TREE_VIEW(data); - model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeView)); - selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeView)); - - // Find selected iteration and create a copy - gtk_tree_selection_get_selected(GTK_TREE_SELECTION(selection), &model, &iter); - iter2 = gtk_tree_iter_copy(&iter); - - // Find path of iteration - path = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(model), &iter); - treePath = gtk_tree_path_new_from_string(path); - gint *indices = gtk_tree_path_get_indices(treePath); - gint indice = indices[0]; - - // Depending on button direction get new path - if(moveUp) - gtk_tree_path_prev(treePath); - else - gtk_tree_path_next(treePath); - gtk_tree_model_get_iter(model, &iter, treePath); - - // Swap iterations if valid - if(gtk_list_store_iter_is_valid(GTK_LIST_STORE(model), &iter)) - gtk_list_store_swap(GTK_LIST_STORE(model), &iter, iter2); - - // Scroll to new position - gtk_tree_view_scroll_to_cell(treeView, treePath, NULL, FALSE, 0, 0); - - // Free resources - gtk_tree_path_free(treePath); - gtk_tree_iter_free(iter2); - g_free(path); - - // Perpetuate changes in codec queue - if(moveUp) - codec_list_move_codec_up(indice); - else - codec_list_move_codec_down(indice); - - // Perpetuate changes to the deamon - codec_list_update_to_daemon(); -} - /** * Move account in list depending on direction and selected account */ @@ -799,26 +303,6 @@ account_move(gboolean moveUp, gpointer data) account_list_move_down(indice); } -/** - * Called from move up codec button signal - */ -static void -codec_move_up(GtkButton *button, gpointer data) -{ - // Change tree view ordering and get indice changed - codec_move(TRUE, data); -} - -/** - * Called from move down codec button signal - */ -static void -codec_move_down(GtkButton *button, gpointer data) -{ - // Change tree view ordering and get indice changed - codec_move(FALSE, data); -} - /** * Called from move up account button signal */ @@ -839,93 +323,7 @@ account_move_down(GtkButton *button, gpointer data) account_move(FALSE, data); } -GtkWidget* -create_codec_table() -{ - GtkWidget *ret; - GtkWidget *scrolledWindow; - GtkWidget *buttonBox; - - GtkListStore *codecStore; - GtkCellRenderer *renderer; - GtkTreeSelection *treeSelection; - GtkTreeViewColumn *treeViewColumn; - - ret = gtk_hbox_new(FALSE, 10); - gtk_container_set_border_width(GTK_CONTAINER(ret), 10); - - scrolledWindow = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledWindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledWindow), GTK_SHADOW_IN); - - gtk_box_pack_start(GTK_BOX(ret), scrolledWindow, TRUE, TRUE, 0); - codecStore = gtk_list_store_new(CODEC_COLUMN_COUNT, - G_TYPE_BOOLEAN, // Active - G_TYPE_STRING, // Name - G_TYPE_STRING, // Frequency - G_TYPE_STRING, // Bit rate - G_TYPE_STRING // Bandwith - ); - - // Create codec tree view with list store - codecTreeView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(codecStore)); - - // Get tree selection manager - treeSelection = gtk_tree_view_get_selection(GTK_TREE_VIEW(codecTreeView)); - g_signal_connect(G_OBJECT(treeSelection), "changed", - G_CALLBACK (select_codec), - codecStore); - - // Active column - renderer = gtk_cell_renderer_toggle_new(); - treeViewColumn = gtk_tree_view_column_new_with_attributes("", renderer, "active", COLUMN_CODEC_ACTIVE, NULL); - gtk_tree_view_append_column(GTK_TREE_VIEW(codecTreeView), treeViewColumn); - // Toggle codec active property on clicked - g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(codec_active_toggled), (gpointer)codecTreeView); - - // Name column - renderer = gtk_cell_renderer_text_new(); - treeViewColumn = gtk_tree_view_column_new_with_attributes(_("Name"), renderer, "markup", COLUMN_CODEC_NAME, NULL); - gtk_tree_view_append_column(GTK_TREE_VIEW(codecTreeView), treeViewColumn); - - // Bit rate column - renderer = gtk_cell_renderer_text_new(); - treeViewColumn = gtk_tree_view_column_new_with_attributes(_("Frequency"), renderer, "text", COLUMN_CODEC_FREQUENCY, NULL); - gtk_tree_view_append_column(GTK_TREE_VIEW(codecTreeView), treeViewColumn); - - // Bandwith column - renderer = gtk_cell_renderer_text_new(); - treeViewColumn = gtk_tree_view_column_new_with_attributes(_("Bitrate"), renderer, "text", COLUMN_CODEC_BITRATE, NULL); - gtk_tree_view_append_column(GTK_TREE_VIEW(codecTreeView), treeViewColumn); - - // Frequency column - renderer = gtk_cell_renderer_text_new(); - treeViewColumn = gtk_tree_view_column_new_with_attributes(_("Bandwidth"), renderer, "text", COLUMN_CODEC_BANDWIDTH, NULL); - gtk_tree_view_append_column(GTK_TREE_VIEW(codecTreeView), treeViewColumn); - - g_object_unref(G_OBJECT(codecStore)); - gtk_container_add(GTK_CONTAINER(scrolledWindow), codecTreeView); - - // Create button box - buttonBox = gtk_vbox_new(FALSE, 0); - gtk_container_set_border_width(GTK_CONTAINER(buttonBox), 10); - gtk_box_pack_start(GTK_BOX(ret), buttonBox, FALSE, FALSE, 0); - - codecMoveUpButton = gtk_button_new_from_stock(GTK_STOCK_GO_UP); - gtk_widget_set_sensitive(GTK_WIDGET(codecMoveUpButton), FALSE); - gtk_box_pack_start(GTK_BOX(buttonBox), codecMoveUpButton, FALSE, FALSE, 0); - g_signal_connect(G_OBJECT(codecMoveUpButton), "clicked", G_CALLBACK(codec_move_up), codecTreeView); - - codecMoveDownButton = gtk_button_new_from_stock(GTK_STOCK_GO_DOWN); - gtk_widget_set_sensitive(GTK_WIDGET(codecMoveDownButton), FALSE); - gtk_box_pack_start(GTK_BOX(buttonBox), codecMoveDownButton, FALSE, FALSE, 0); - g_signal_connect(G_OBJECT(codecMoveDownButton), "clicked", G_CALLBACK(codec_move_down), codecTreeView); - - config_window_fill_codec_list(); - - return ret; -} /** * Account settings tab @@ -1050,7 +448,7 @@ create_accounts_tab() GtkWidget* create_audio_tab () { - GtkWidget *ret; +/* GtkWidget *ret; GtkWidget *deviceFrame; GtkWidget *deviceBox; @@ -1090,7 +488,7 @@ create_audio_tab () // Device : Audio manager // Create title label - /* + titleLabel = gtk_label_new("Alsa plug-IN:"); gtk_misc_set_alignment(GTK_MISC(titleLabel), 0, 0.5); gtk_table_attach(GTK_TABLE(deviceTable), titleLabel, 0, 1, 0, 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0); @@ -1109,7 +507,7 @@ create_audio_tab () gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(comboBox), renderer, "text", 0, NULL); gtk_table_attach(GTK_TABLE(deviceTable), comboBox, 1, 2, 0, 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0); gtk_widget_show(comboBox); - */ + // Create title label titleLabel = gtk_label_new(_("ALSA plugin")); gtk_misc_set_alignment(GTK_MISC(titleLabel), 0, 0.5); @@ -1142,7 +540,7 @@ create_audio_tab () outputDeviceComboBox = gtk_combo_box_new_with_model(GTK_TREE_MODEL(outputAudioDeviceManagerStore)); select_active_output_audio_device(); gtk_label_set_mnemonic_widget(GTK_LABEL(titleLabel), outputDeviceComboBox); - g_signal_connect(G_OBJECT(outputDeviceComboBox), "changed", G_CALLBACK(select_audio_output_device), outputDeviceComboBox); + //g_signal_connect(G_OBJECT(outputDeviceComboBox), "changed", G_CALLBACK(select_audio_output_device), outputDeviceComboBox); // Set rendering renderer = gtk_cell_renderer_text_new(); @@ -1163,7 +561,7 @@ create_audio_tab () inputDeviceComboBox = gtk_combo_box_new_with_model(GTK_TREE_MODEL(inputAudioDeviceManagerStore)); select_active_input_audio_device(); gtk_label_set_mnemonic_widget(GTK_LABEL(titleLabel), inputDeviceComboBox); - g_signal_connect(G_OBJECT(inputDeviceComboBox), "changed", G_CALLBACK(select_audio_input_device), inputDeviceComboBox); + //g_signal_connect(G_OBJECT(inputDeviceComboBox), "changed", G_CALLBACK(select_audio_input_device), inputDeviceComboBox); // Set rendering renderer = gtk_cell_renderer_text_new(); @@ -1195,31 +593,12 @@ create_audio_tab () gtk_widget_set_size_request(GTK_WIDGET(codecTable), -1, 150); gtk_box_pack_start(GTK_BOX(codecBox), codecTable, TRUE, TRUE, 0); gtk_widget_show(codecTable); +*/ - // check button to enable ringtones - GtkWidget* box = gtk_hbox_new( TRUE , 1); - gtk_box_pack_start( GTK_BOX(ret) , box , FALSE , FALSE , 1); - enableTone = gtk_check_button_new_with_mnemonic( _("_Enable ringtones")); - gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(enableTone), dbus_is_ringtone_enabled() ); - gtk_box_pack_start( GTK_BOX(box) , enableTone , TRUE , TRUE , 1); - g_signal_connect(G_OBJECT( enableTone) , "clicked" , G_CALLBACK( ringtone_enabled ) , NULL); - // file chooser button - fileChooser = gtk_file_chooser_button_new(_("Choose a ringtone"), GTK_FILE_CHOOSER_ACTION_OPEN); - gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER( fileChooser) , g_get_home_dir()); - gtk_file_chooser_set_filename(GTK_FILE_CHOOSER( fileChooser) , get_ringtone_choice()); - g_signal_connect( G_OBJECT( fileChooser ) , "selection_changed" , G_CALLBACK( ringtone_changed ) , NULL ); - GtkFileFilter *filter = gtk_file_filter_new(); - gtk_file_filter_set_name( filter , _("Audio Files") ); - gtk_file_filter_add_pattern(filter , "*.wav" ); - gtk_file_filter_add_pattern(filter , "*.ul" ); - gtk_file_filter_add_pattern(filter , "*.au" ); - gtk_file_chooser_add_filter( GTK_FILE_CHOOSER( fileChooser ) , filter); - gtk_box_pack_start( GTK_BOX(box) , fileChooser , TRUE , TRUE , 1); - - // Show all - gtk_widget_show_all(ret); + // Show all + //gtk_widget_show_all(ret); - return ret; + //return ret; } GtkWidget* @@ -1353,7 +732,8 @@ show_config_window () gtk_notebook_page_num(GTK_NOTEBOOK(notebook), tab); // Audio tab - tab = create_audio_tab(); + //tab = create_audio_tab(); + tab = create_audio_configuration(); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), tab, gtk_label_new(_("Audio Settings"))); gtk_notebook_page_num(GTK_NOTEBOOK(notebook), tab); @@ -1389,7 +769,7 @@ show_accounts_window( void ) // Set window properties gtk_dialog_set_has_separator(dialog, FALSE); - gtk_window_set_default_size(GTK_WINDOW(dialog), 400, 400); + gtk_window_set_default_size(GTK_WINDOW(dialog), 500, 500); gtk_container_set_border_width(GTK_CONTAINER(dialog), 0); accountFrame = gtk_frame_new( _("Accounts previously setup")); diff --git a/src/audio/alsalayer.cpp b/src/audio/alsalayer.cpp index 1003709b01a2fd5b5184e9542ef03c96f72de6dd..794328d742f0011fe8138beb6d9ff863acaa0281 100644 --- a/src/audio/alsalayer.cpp +++ b/src/audio/alsalayer.cpp @@ -454,6 +454,15 @@ AlsaLayer::read( void* buffer, int toCopy) } + + int +AlsaLayer::putMain(void* buffer, int toCopy) +{} + + int +AlsaLayer::putInCache( char code, void *buffer, int toCopy ) +{} + void AlsaLayer::handle_xrun_capture( void ) { diff --git a/src/audio/alsalayer.h b/src/audio/alsalayer.h index 05f5ebd79470ee1b542b8f1060aa6de886e683c2..f92bbfc6fc06bcecb6d20e676f52f137bd5f0e3d 100644 --- a/src/audio/alsalayer.h +++ b/src/audio/alsalayer.h @@ -179,6 +179,9 @@ class AlsaLayer : public AudioLayer { */ std::string getAudioPlugin( void ) { return _audioPlugin; } + int putInCache( char code, void *buffer, int toCopy ); + int putMain(void* buffer, int toCopy); + private: /** diff --git a/src/audio/pulselayer.cpp b/src/audio/pulselayer.cpp index 97bad9027246f888038773c96c5721b8abeb782e..1a4a054cabb481150a29d09ef768721a042ff407 100644 --- a/src/audio/pulselayer.cpp +++ b/src/audio/pulselayer.cpp @@ -25,7 +25,6 @@ static pa_volume_t volume; */ int framesPerBuffer = 2048; -const pa_buffer_attr *a; PulseLayer::PulseLayer(ManagerImpl* manager) : AudioLayer( manager , PULSEAUDIO ) @@ -104,7 +103,7 @@ PulseLayer::createStreams( pa_context* c ) record = new AudioStream(c, CAPTURE_STREAM, "SFLphone in"); pa_stream_set_read_callback( record->pulseStream() , audioCallback, this); //pa_stream_set_underflow_callback( record , underflow , this); - //cache = new AudioStream(c, UPLOAD_STREAM, "Cache samples"); + cache = new AudioStream(c, UPLOAD_STREAM, "Cache samples"); pa_threaded_mainloop_signal(m , 0); } diff --git a/src/audio/pulselayer.h b/src/audio/pulselayer.h index 5e7038cbd25da813c1d3524695f3a260d2705b86..8c1e95506b279170368334d20496ec2c29f922b9 100644 --- a/src/audio/pulselayer.h +++ b/src/audio/pulselayer.h @@ -146,10 +146,7 @@ class PulseLayer : public AudioLayer { AudioStream* playback; AudioStream* record; - //AudioStream* cache; - - //pa_stream* playback; - //pa_stream* record; + AudioStream* cache; }; #endif // _PULSE_LAYER_H_ diff --git a/src/managerimpl.cpp b/src/managerimpl.cpp index 8053c79da38c2de7755b5f7f58e6177591fbcf54..a1aa8046f33a9b1783d106a686550071f2970d08 100644 --- a/src/managerimpl.cpp +++ b/src/managerimpl.cpp @@ -1160,9 +1160,13 @@ ManagerImpl::getInputAudioPluginList(void) std::vector<std::string> v; _debug("Get input audio plugin list"); - v.push_back("default"); + /*v.push_back("default"); v.push_back("surround40"); v.push_back("plug:hw"); + */ + + v.push_back("alsa"); + v.push_back("pulseaudio"); return v; } @@ -1176,10 +1180,12 @@ ManagerImpl::getOutputAudioPluginList(void) std::vector<std::string> v; _debug("Get output audio plugin list"); - v.push_back( PCM_DEFAULT ); - v.push_back( PCM_PLUGHW ); - v.push_back( PCM_DMIX ); - v.push_back( PCM_PULSE ); + //v.push_back( PCM_DEFAULT ); + //v.push_back( PCM_PLUGHW ); + //v.push_back( PCM_DMIX ); + //v.push_back( PCM_PULSE ); + v.push_back("alsa"); + v.push_back("pulseaudio"); return v; } @@ -1500,7 +1506,7 @@ ManagerImpl::initAudioDriver(void) { _debugInit("AudioLayer Creation"); //_audiodriver = new AlsaLayer( this ); - _audiodriver = new PulseLayer( this ); + _audiodriver = new AlsaLayer( this ); if (_audiodriver == 0) { _debug("Init audio driver error\n"); } else { @@ -1543,15 +1549,16 @@ ManagerImpl::selectAudioDriver (void) } #if CHECK_INTERFACE( layer , ALSA ) - _debug("No good\n"); - _debugInit(" AudioLayer Opening Device"); + _debugInit(" ALSA audio driver \n"); _audiodriver->setErrorMessage(-1); _audiodriver->openDevice( numCardIn , numCardOut, sampleRate, frameSize, SFL_PCM_BOTH, alsaPlugin ); if( _audiodriver -> getErrorMessage() != -1 ) notifyErrClient( _audiodriver -> getErrorMessage()); #else - _debug("Good\n"); + delete _audiodriver; + _audiodriver = new PulseLayer( this ); _debug(" Pulse audio driver \n"); + _audiodriver->setErrorMessage(-1); _audiodriver->openDevice( numCardIn , numCardOut, sampleRate, frameSize, SFL_PCM_BOTH, alsaPlugin ); if( _audiodriver -> getErrorMessage() != -1 ) notifyErrClient( _audiodriver -> getErrorMessage());