diff --git a/configure.ac b/configure.ac index 8116192347c43f39788666ac9507a64d7b45e44c..bdb9a3480d194d8800a9a292c237767f5e6903f7 100644 --- a/configure.ac +++ b/configure.ac @@ -35,7 +35,6 @@ AC_CONFIG_FILES([libs/Makefile \ AC_CONFIG_FILES([src/Makefile \ src/sflphone \ src/audio/Makefile \ - src/audio/gsm/Makefile \ src/config/Makefile \ src/dbus/Makefile \ src/zeroconf/Makefile]) @@ -151,6 +150,11 @@ PKG_CHECK_MODULES([libosip2], [libosip2 >= ${LIBOSIP2_OSIPLISTNOPOINTER_MIN_VERS SIP_CFLAGS="$SIP_CFLAGS $LIBOSIP2_CFLAGS"; AC_SUBST(SIP_CFLAGS) +dnl LIBGSM1_MIN_VERSION=1.10 +dnl PKG_CHECK_MODULES(gsm, gsm >= ${LIBGSM1_MIN_VERSION}) +dnl SFLPHONE_CFLAGS="$SFLPHONE_CFLAGS $libgsm1_CFLAGS" +dnl SFLPHONE_LIBS="$SFLPHONE_LIBS $libgsm1_LIBS" + LIBSAMPLERATE_MIN_VERSION=0.1.1 PKG_CHECK_MODULES(samplerate, samplerate >= ${LIBSAMPLERATE_MIN_VERSION}) SFLPHONE_CFLAGS="$SFLPHONE_CFLAGS $samplerate_CFLAGS" diff --git a/doc/Dependencies.txt b/doc/Dependencies.txt index a167beae7c96740ca4706d17c20b6abee300fdca..7abaaeb2ca2cf1b18d16d8eb8cc39742f6c8ed02 100644 --- a/doc/Dependencies.txt +++ b/doc/Dependencies.txt @@ -7,7 +7,7 @@ Dependencies to compile SFLphone daemon `--------------------`----------`----------------------------------------------------- Program Version Notes -------------------------------------------------------------------------------------- -libiax2 0.2.3 http://svncommunity.digium.com/view/libiax2/trunk/[svn repos] SFLphone maintains it's own copy +libiax2 0.2.3 http://svncommunity.digium.com/view/libiax2/trunk/[svn repos] Source code included in the git repository. Common C++2 1.3.21 http://sourceforge.net/projects/cplusplus/[website] ccRTP 1.3.5 http://sourceforge.net/projects/cplusplus/[website] libeXosip2 ** 2.2.2 http://savannah.nongnu.org/projects/exosip/[website] @@ -16,7 +16,7 @@ portaudio v19 http://www.portaudio.com/[website] portaudio C++ binds. http://www.portaudio.com/archives/pa_snapshot_v19.tar.gz[archive] libsamplerate 0.1.2 http://www.mega-nerd.com/SRC/[website] libdbus-glib 0.73 Packaged with your favorite distribution. -dbus-c++-1 0.5 See Build notes. +dbus-c++-1 0.5 Source code included in the git repository. See Build notes. libexpat1 1.95.8 Packaged with your favorite distribution. -------------------------------------------------------------------------------------- @@ -34,3 +34,11 @@ dbus-glib 0.35 gnome-common -------------------------------------------------------------------------------------- +Dependencies to use audio codecs +------------------------------------ + +`--------------------`----------`----------------------------------------------------- +Program Version Notes +-------------------------------------------------------------------------------------- +libgsm1 1.0.10 Standard package - Necessary to use GSM codec +-------------------------------------------------------------------------------------- diff --git a/sflphone-gtk/src/actions.c b/sflphone-gtk/src/actions.c index bcb1e78d3701330f81f52d61c253cbcbd9a41070..36af50798445c507429f6db182702f927d91f0e9 100644 --- a/sflphone-gtk/src/actions.c +++ b/sflphone-gtk/src/actions.c @@ -165,7 +165,7 @@ sflphone_init() sflphone_hang_up() { call_t * selectedCall = call_get_selected(); - main_window_callinfo(FALSE, selectedCall); + //main_window_callinfo(FALSE, selectedCall); if(selectedCall) { switch(selectedCall->state) @@ -197,7 +197,7 @@ sflphone_pick_up() { call_t * selectedCall = call_get_selected(); //printf("full name: %s\n",g_hash_table_lookup(selectedCall->properties, ACCOUNT_IAX_FULL_NAME)); - main_window_callinfo(TRUE, selectedCall); + //main_window_callinfo(TRUE, selectedCall); if(selectedCall) { switch(selectedCall->state) @@ -207,6 +207,7 @@ sflphone_pick_up() printf("accountID=%s\n",selectedCall->accountID); break; case CALL_STATE_INCOMING: + printf("CALL ID = %s\n", selectedCall->callID); dbus_accept (selectedCall); break; case CALL_STATE_HOLD: @@ -268,7 +269,7 @@ sflphone_fail( call_t * c ) c->state = CALL_STATE_FAILURE; update_call_tree(c); update_menus(); - main_window_callinfo(FALSE, c); + //main_window_callinfo(FALSE, c); } void @@ -333,7 +334,7 @@ sflphone_hung_up (call_t * c ) call_list_remove(c->callID); update_call_tree_remove(c); update_menus(); - main_window_callinfo(FALSE, c); + //main_window_callinfo(FALSE, c); } void process_dialing(call_t * c, guint keyval, gchar * key) diff --git a/sflphone-gtk/src/configwindow.c b/sflphone-gtk/src/configwindow.c index acb2334afef59fcf6f347dee28228b06b72c55f5..223c95f8542ebc1d74ba4c353e138fffc9202dab 100644 --- a/sflphone-gtk/src/configwindow.c +++ b/sflphone-gtk/src/configwindow.c @@ -2,20 +2,21 @@ * Copyright (C) 2007 Savoir-Faire Linux inc. * Author: Pierre-Luc Beaudoin <pierre-luc@squidy.info> * Author: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> - * + * Author: Guillaume Carmel-Archambault <guillaume.carmel-archambault@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. + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <accountlist.h> @@ -27,44 +28,52 @@ #include <gtk/gtk.h> -/** Local variables */ +/** + * Local variables + */ gboolean dialogOpen = FALSE; -GtkListStore * account_store; -GtkListStore * codec_store; -GtkListStore * rate_store; + +GtkListStore * accountStore; +GtkListStore * codecStore; +GtkListStore * audioManagerStore; +GtkListStore * outputAudioDeviceManagerStore; +GtkListStore * inputAudioDeviceManagerStore; + GtkWidget * addButton; GtkWidget * editButton; GtkWidget * deleteButton; GtkWidget * defaultButton; GtkWidget * restoreButton; -GtkWidget * combo_box; account_t * selectedAccount; -/** Fills the treelist with accounts */ - void -config_window_fill_account_list () +//GtkListStore * rate_store; +//GtkWidget * combo_box; + +/** + * Fills the treelist with accounts + */ +void +config_window_fill_account_list() { if(dialogOpen) { GtkTreeIter iter; - gtk_list_store_clear(account_store); + gtk_list_store_clear(accountStore); int i; - for( i = 0; i < account_list_get_size(); i++) + for(i = 0; i < account_list_get_size(); i++) { - account_t * a = account_list_get_nth (i); + account_t * a = account_list_get_nth (i); if (a) { - gtk_list_store_append (account_store, &iter); - - gtk_list_store_set(account_store, &iter, + gtk_list_store_append (accountStore, &iter); + gtk_list_store_set(accountStore, &iter, 0, g_hash_table_lookup(a->properties, ACCOUNT_ALIAS), // Name 1, g_hash_table_lookup(a->properties, ACCOUNT_TYPE), // Protocol 2, account_state_name(a->state), // Status 3, a, // Pointer -1); - } } @@ -74,32 +83,41 @@ config_window_fill_account_list () } } +/** + * Fills the tree list with supported codecs + */ void config_window_fill_codec_list() { - if(dialogOpen) - { - GtkTreeIter iter; - int i; - gtk_list_store_clear(codec_store); - gchar * description = "Select a codec:"; - //gtk_list_store_append(codec_store, &iter); - //gtk_list_store_set(codec_store, &iter, 0, description, -1); - 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 (codec_store, &iter); - gtk_list_store_set(codec_store, &iter,0,c->name,-1); - } - } - } - gtk_combo_box_set_active(combo_box, 0); + if(dialogOpen) + { + GtkTreeIter iter; + int i; + gtk_list_store_clear(codecStore); + + 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, + 0, c->is_active, // Active + 1, c->name, // Name + 2, c->sample_rate, // Sample rate + 3, "bandwith", // Bandwith + 4, "frequency", // Frequency + -1); + } + } + } } -void +/** + * SEE deprecated + */ +/*void config_window_fill_rate_list() { if(dialogOpen) @@ -115,13 +133,31 @@ config_window_fill_rate_list() i++; } } +}*/ + +/** + * TODO + */ +void +config_window_fill_output_audio_device_list() +{ + +} + +/** + * TODO + */ +void +config_window_fill_input_audio_device_list() +{ + } /** * Delete an account */ - static void -delete_account( GtkWidget *widget, gpointer data ) +static void +delete_account(GtkWidget *widget, gpointer data) { if(selectedAccount) { @@ -132,8 +168,8 @@ delete_account( GtkWidget *widget, gpointer data ) /** * Edit an account */ - static void -edit_account( GtkWidget *widget, gpointer data ) +static void +edit_account(GtkWidget *widget, gpointer data) { if(selectedAccount) { @@ -144,8 +180,8 @@ edit_account( GtkWidget *widget, gpointer data ) /** * Add an account */ - static void -add_account( GtkWidget *widget, gpointer data ) +static void +add_account(GtkWidget *widget, gpointer data) { show_account_window(NULL); } @@ -156,57 +192,107 @@ add_account( GtkWidget *widget, gpointer data ) void default_account(GtkWidget *widget, gpointer data) { - // set account as default + // set account as default if(selectedAccount) { account_list_set_default(selectedAccount->accountID); dbus_set_default_account(selectedAccount->accountID); - } + } } -/* Call back when the user click on an account in the list */ -static void -select_account(GtkTreeSelection *sel, GtkTreeModel *model) +/** + * Call back when the user click on an account in the list + */ +static void +select_account(GtkTreeSelection *selection, GtkTreeModel *model) { - GtkTreeIter iter; + GtkTreeIter iter; GValue val; - if (! gtk_tree_selection_get_selected (sel, &model, &iter)) + if (!gtk_tree_selection_get_selected(selection, &model, &iter)) { selectedAccount = NULL; return; } val.g_type = G_TYPE_POINTER; - gtk_tree_model_get_value (model, &iter, 3, &val); + gtk_tree_model_get_value(model, &iter, 3, &val); - selectedAccount = (account_t*) g_value_get_pointer(&val); + selectedAccount = (account_t*)g_value_get_pointer(&val); g_value_unset(&val); if(selectedAccount) { - gtk_widget_set_sensitive( GTK_WIDGET(editButton), TRUE); + gtk_widget_set_sensitive( GTK_WIDGET(editButton), TRUE); gtk_widget_set_sensitive( GTK_WIDGET(deleteButton), TRUE); gtk_widget_set_sensitive( GTK_WIDGET(defaultButton), TRUE); } g_print("select"); +} +static void +codec_active_toggled(GtkCellRendererToggle * renderer, gchar * path, GtkListStore * store) +{ + GtkTreeIter iter; + GValue val; } +/** + * TODO Change for tree model and tree selection as in precedent function + */ static void -select_codec( GtkComboBox* wid) +select_codec(GtkTreeSelection * selection, GtkTreeModel * model) { - guint item = gtk_combo_box_get_active(wid); + GtkTreeIter iter; + + if(!gtk_tree_selection_get_selected(selection, &model, &iter)) + { + return; + } + //guint item = gtk_combo_box_get_active(wid); /* now we want this selected codec to be used as the preferred codec */ /* ie first in the list in the user config */ - codec_set_prefered_order(item); - dbus_set_prefered_codec(codec_list_get_nth(0)->name); + //codec_set_prefered_order(item); + //dbus_set_prefered_codec(codec_list_get_nth(0)->name); +} + +/** + * Move codec in list depending on direction and selected codec + */ +static void +moveCodec(gboolean moveUp, GtkListStore * codecListStore) +{ + // TODO + printf("Button pressed"); +} + +/** + * Called from move up codec button signal + */ +static void +moveCodecUp(GtkListStore * codecListStore) +{ + moveCodec(TRUE, codecListStore); + printf("Button pressed"); +} + +/** + * Called from move up codec button signal + */ +static void +moveCodecDown(GtkListStore * codecListStore) +{ + moveCodec(FALSE, codecListStore); + printf("Button pressed"); } +/** + * Select default account that is rendered in bold + */ void -bold_if_default_account(GtkTreeViewColumn *col, - GtkCellRenderer *rend, - GtkTreeModel *tree_model, +bold_if_default_account(GtkTreeViewColumn *col, + GtkCellRenderer *rend, + GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data) { @@ -215,57 +301,159 @@ bold_if_default_account(GtkTreeViewColumn *col, gtk_tree_model_get_value(tree_model, iter, 3, &val); account_t* current = (account_t*) g_value_get_pointer(&val); g_value_unset(&val); - if(g_strcasecmp(current->accountID,account_list_get_default())==0) - g_object_set (G_OBJECT(rend),"weight",800 ,NULL); + if(g_strcasecmp(current->accountID, account_list_get_default()) == 0) + g_object_set(G_OBJECT(rend), "weight", 800, NULL); else g_object_set(G_OBJECT(rend), "weight", 400, NULL); - } +/** + * TODO + */ void default_codecs(GtkWidget* widget, gpointer data) { - int i=0; - int j=0; - gint * new_order; - gchar ** default_list = (gchar**)dbus_default_codec_list(); - while(default_list[i] != NULL) - {printf("%s\n", default_list[i]); - i++;} - i=0; - while(default_list[i] != NULL) - { - if(g_strcasecmp(codec_list_get_nth(0)->name ,default_list[i])==0){ - printf("%s %s\n",codec_list_get_nth(0)->name, default_list[i]); - new_order[i]=0; - } - else if(g_strcasecmp(codec_list_get_nth(1)->name ,default_list[i])==0){ - printf("%s %s\n",codec_list_get_nth(0)->name, default_list[0]); - new_order[i] = 1;} - else{ - printf("%s %s\n",codec_list_get_nth(0)->name, default_list[0]); - new_order[i] = 2;} - printf("new_order[%i]=%i\n", i,j); - i++; - } - gtk_list_store_reorder(codec_store, new_order); + int i = 0; + int j = 0; + gint * new_order; + gchar ** default_list = (gchar**)dbus_default_codec_list(); + + while(default_list[i] != NULL) + { + printf("%s\n", default_list[i]); + i++; + } + i = 0; + while(default_list[i] != NULL) + { + if(g_strcasecmp(codec_list_get_nth(0)->name, default_list[i]) == 0) + { + printf("%s %s\n",codec_list_get_nth(0)->name, default_list[i]); + new_order[i] = 0; + } + else if(g_strcasecmp(codec_list_get_nth(1)->name, default_list[i]) == 0) + { + printf("%s %s\n",codec_list_get_nth(0)->name, default_list[0]); + new_order[i] = 1; + } + else + { + printf("%s %s\n",codec_list_get_nth(0)->name, default_list[0]); + new_order[i] = 2; + } + printf("new_order[%i]=%i\n", i,j); + i++; + } + gtk_list_store_reorder(codecStore, new_order); } - GtkWidget * +/** + * Create table widget for codecs + */ +GtkWidget* +create_codec_table() +{ + GtkWidget * ret; + GtkWidget * scrolledWindow; + GtkWidget * buttonBox; + GtkWidget * moveUpButton; + GtkWidget * moveDownButton; + + GtkWidget * treeView; + GtkCellRenderer * renderer; + GtkTreeSelection * treeSelection; + GtkTreeViewColumn * treeViewColumn; + GtkTreeIter iter; + + 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(5, + G_TYPE_BOOLEAN, // Active + G_TYPE_STRING, // Name + G_TYPE_INT, // Bit rate + G_TYPE_STRING, // Bandwith + G_TYPE_STRING // Frequency + ); + + treeView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(codecStore)); + + treeSelection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeView)); + g_signal_connect(G_OBJECT(treeSelection), "changed", + G_CALLBACK (select_codec), + codecStore); // TODO ONLY for disabling or enabling move buttons + + // Active column + renderer = gtk_cell_renderer_toggle_new(); + treeViewColumn = gtk_tree_view_column_new_with_attributes("", renderer, "active", 0, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeView), treeViewColumn); + g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(codec_active_toggled), codecStore); + + // TODO toggle on clicked + + // Name column + renderer = gtk_cell_renderer_text_new(); + treeViewColumn = gtk_tree_view_column_new_with_attributes("Name", renderer, "markup", 1, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeView), treeViewColumn); + + // Bit rate column + renderer = gtk_cell_renderer_text_new(); + treeViewColumn = gtk_tree_view_column_new_with_attributes("Bit rate", renderer, "text", 2, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeView), treeViewColumn); + + // Bandwith column + renderer = gtk_cell_renderer_text_new(); + treeViewColumn = gtk_tree_view_column_new_with_attributes("Bandwith", renderer, "text", 3, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeView), treeViewColumn); + + // Frequency column + renderer = gtk_cell_renderer_text_new(); + treeViewColumn = gtk_tree_view_column_new_with_attributes("Frequency", renderer, "text", 4, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeView), treeViewColumn); + + g_object_unref(G_OBJECT(codecStore)); + gtk_container_add(GTK_CONTAINER(scrolledWindow), treeView); + + // 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); + + moveUpButton = gtk_button_new_with_label("Move up"); + gtk_box_pack_start(GTK_BOX(buttonBox), moveUpButton, FALSE, FALSE, 0); + g_signal_connect(G_OBJECT(moveUpButton), "clicked", G_CALLBACK(moveCodecUp), codecStore); + + moveDownButton = gtk_button_new_with_label("Move down"); + gtk_box_pack_start(GTK_BOX(buttonBox), moveDownButton, FALSE, FALSE, 0); + g_signal_connect(G_OBJECT(moveDownButton), "clicked", G_CALLBACK(moveCodecDown), codecStore); + + config_window_fill_codec_list(); + + return ret; +} + +/** + * Account settings tab + */ +GtkWidget * create_accounts_tab() { GtkWidget *ret; - GtkWidget *sw; - GtkWidget *view; - GtkWidget *bbox; - GtkCellRenderer *rend; - GtkTreeViewColumn *col; - GtkTreeSelection *sel; + GtkWidget *scrolledWindow; + GtkWidget *treeView; + GtkWidget *buttonBox; + GtkCellRenderer *renderer; + GtkTreeViewColumn *treeViewColumn; + GtkTreeSelection *treeSelection; GtkWidget *label; - GtkTreeIter iter; - GValue val; - val.g_type = G_TYPE_POINTER; + GValue val; + val.g_type = G_TYPE_POINTER; selectedAccount = NULL; @@ -274,90 +462,90 @@ create_accounts_tab() label = gtk_label_new("This is the list of accounts previously setup."); - gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); + gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); - gtk_box_pack_start(GTK_BOX(ret), label, FALSE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(ret), label, FALSE, FALSE, 0); gtk_widget_show(label); - sw = gtk_scrolled_window_new(NULL,NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN); + 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); - gtk_box_pack_start(GTK_BOX(ret), sw, TRUE, TRUE, 0); - account_store = gtk_list_store_new (4, + accountStore = gtk_list_store_new(4, G_TYPE_STRING, // Name G_TYPE_STRING, // Protocol G_TYPE_STRING, // Status G_TYPE_POINTER // Pointer to the Object ); - view = gtk_tree_view_new_with_model (GTK_TREE_MODEL(account_store)); + treeView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(accountStore)); - sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (view)); - g_signal_connect (G_OBJECT (sel), "changed", + treeSelection = gtk_tree_view_get_selection(GTK_TREE_VIEW (treeView)); + g_signal_connect(G_OBJECT (treeSelection), "changed", G_CALLBACK (select_account), - account_store); + accountStore); - gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(account_store), + gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(accountStore), 2, GTK_SORT_ASCENDING); - rend = gtk_cell_renderer_text_new(); - col = gtk_tree_view_column_new_with_attributes ("Alias", - rend, + renderer = gtk_cell_renderer_text_new(); + treeViewColumn = gtk_tree_view_column_new_with_attributes ("Alias", + renderer, "markup", 0, NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW(view), col); - gtk_tree_view_column_set_cell_data_func(col, rend, bold_if_default_account, NULL,NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeView), treeViewColumn); + gtk_tree_view_column_set_cell_data_func(treeViewColumn, renderer, bold_if_default_account, NULL,NULL); - rend = gtk_cell_renderer_text_new(); - col = gtk_tree_view_column_new_with_attributes ("Protocol", - rend, + renderer = gtk_cell_renderer_text_new(); + treeViewColumn = gtk_tree_view_column_new_with_attributes ("Protocol", + renderer, "markup", 1, NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW(view), col); - gtk_tree_view_column_set_cell_data_func(col, rend, bold_if_default_account, NULL,NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeView), treeViewColumn); + gtk_tree_view_column_set_cell_data_func(treeViewColumn, renderer, bold_if_default_account, NULL,NULL); - rend = gtk_cell_renderer_text_new(); - col = gtk_tree_view_column_new_with_attributes ("Status", - rend, + renderer = gtk_cell_renderer_text_new(); + treeViewColumn = gtk_tree_view_column_new_with_attributes ("Status", + renderer, "markup", 2, NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW(view), col); - gtk_tree_view_column_set_cell_data_func(col, rend, bold_if_default_account, NULL,NULL); - g_object_unref(G_OBJECT(account_store)); - gtk_container_add(GTK_CONTAINER(sw), view); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeView), treeViewColumn); + gtk_tree_view_column_set_cell_data_func(treeViewColumn, renderer, bold_if_default_account, NULL,NULL); + g_object_unref(G_OBJECT(accountStore)); + gtk_container_add(GTK_CONTAINER(scrolledWindow), treeView); /* The buttons to press! */ - bbox = gtk_hbutton_box_new(); - gtk_box_set_spacing(GTK_BOX(bbox), 10); //GAIM_HIG_BOX_SPACE - gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_START); - gtk_box_pack_start(GTK_BOX(ret), bbox, FALSE, FALSE, 0); - gtk_widget_show (bbox); + buttonBox = gtk_hbutton_box_new(); + gtk_box_set_spacing(GTK_BOX(buttonBox), 10); //GAIM_HIG_BOX_SPACE + gtk_button_box_set_layout(GTK_BUTTON_BOX(buttonBox), GTK_BUTTONBOX_START); + gtk_box_pack_start(GTK_BOX(ret), buttonBox, FALSE, FALSE, 0); + gtk_widget_show (buttonBox); addButton = gtk_button_new_from_stock (GTK_STOCK_ADD); g_signal_connect_swapped(G_OBJECT(addButton), "clicked", G_CALLBACK(add_account), NULL); - gtk_box_pack_start(GTK_BOX(bbox), addButton, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(buttonBox), addButton, FALSE, FALSE, 0); gtk_widget_show(addButton); editButton = gtk_button_new_from_stock (GTK_STOCK_EDIT); g_signal_connect_swapped(G_OBJECT(editButton), "clicked", G_CALLBACK(edit_account), NULL); - gtk_box_pack_start(GTK_BOX(bbox), editButton, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(buttonBox), editButton, FALSE, FALSE, 0); gtk_widget_show(editButton); deleteButton = gtk_button_new_from_stock (GTK_STOCK_REMOVE); g_signal_connect_swapped(G_OBJECT(deleteButton), "clicked", G_CALLBACK(delete_account), NULL); - gtk_box_pack_start(GTK_BOX(bbox), deleteButton, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(buttonBox), deleteButton, FALSE, FALSE, 0); gtk_widget_show(deleteButton); defaultButton = gtk_button_new_with_mnemonic("Set as Default"); g_signal_connect_swapped(G_OBJECT(defaultButton), "clicked", G_CALLBACK(default_account), NULL); - gtk_box_pack_start(GTK_BOX(bbox), defaultButton, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(buttonBox), defaultButton, FALSE, FALSE, 0); gtk_widget_show(defaultButton); gtk_widget_show_all(ret); @@ -367,28 +555,173 @@ create_accounts_tab() return ret; } +/** + * Audio settings tab + */ GtkWidget* create_audio_tab () +{ + GtkWidget * ret; + + GtkWidget * deviceLabel; + GtkWidget * deviceBox; + GtkWidget * deviceTable; + GtkWidget * codecLabel; + GtkWidget * codecBox; + + GtkWidget * attributeBox; + GtkWidget * titleLabel; + GtkWidget * comboBox; + GtkWidget * refreshButton; + GtkCellRenderer * renderer; + GtkTreeIter iter; + + // Main widget + ret = gtk_vbox_new(FALSE, 10); + gtk_container_set_border_width(GTK_CONTAINER(ret), 10); + + // Device section label + deviceLabel = gtk_label_new("Devices"); + gtk_label_set_line_wrap(GTK_LABEL(deviceLabel), TRUE); + gtk_misc_set_alignment(GTK_MISC(deviceLabel), 0, 0.5); + gtk_label_set_justify(GTK_LABEL(deviceLabel), GTK_JUSTIFY_LEFT); + gtk_box_pack_start(GTK_BOX(ret), deviceLabel, FALSE, FALSE, 0); + gtk_widget_show(deviceLabel); + + // Main device widget + deviceBox = gtk_hbox_new(FALSE, 10); + gtk_box_pack_start(GTK_BOX(ret), deviceBox, FALSE, FALSE, 0); + gtk_widget_show(codecBox); + + // TODO Create margin instead of column + + // Main device widget + deviceTable = gtk_table_new(4, 3, FALSE); + gtk_table_set_col_spacing(GTK_TABLE(deviceTable), 0, 40); + gtk_box_set_spacing(GTK_BOX(deviceTable), 0); // SEE GAIM_HIG_BOX_SPACE + gtk_box_pack_start(GTK_BOX(deviceBox), deviceTable, TRUE, TRUE, 0); + gtk_widget_show(deviceTable); + + // Device : Audio manager + // Create title label + titleLabel = gtk_label_new("Audio manager:"); + gtk_misc_set_alignment(GTK_MISC(titleLabel), 0, 0.5); + gtk_table_attach(GTK_TABLE(deviceTable), titleLabel, 1, 2, 0, 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0); + gtk_widget_show(titleLabel); + // Set choices of audio managers + audioManagerStore = gtk_list_store_new(1, G_TYPE_STRING); + gtk_list_store_append(audioManagerStore, &iter); + gtk_list_store_set(audioManagerStore, &iter, 0 , "ALSA", -1); + comboBox = gtk_combo_box_new_with_model(GTK_TREE_MODEL(audioManagerStore)); + gtk_combo_box_set_active(GTK_COMBO_BOX(comboBox), 0); + gtk_label_set_mnemonic_widget(GTK_LABEL(titleLabel), comboBox); + // Set rendering + renderer = gtk_cell_renderer_text_new(); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(comboBox), renderer, TRUE); + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(comboBox), renderer, "text", 0, NULL); + gtk_table_attach(GTK_TABLE(deviceTable), comboBox, 2, 3, 0, 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0); + gtk_widget_show(comboBox); + // Create refresh button + refreshButton = gtk_button_new_from_stock(GTK_STOCK_REFRESH); + gtk_table_attach(GTK_TABLE(deviceTable), refreshButton, 3, 4, 0, 1, GTK_EXPAND, GTK_SHRINK, 0, 0); + gtk_widget_show(refreshButton); + + // Device : Output device + // Create title label + titleLabel = gtk_label_new("Output peripheral:"); + gtk_misc_set_alignment(GTK_MISC(titleLabel), 0, 0.5); + gtk_table_attach(GTK_TABLE(deviceTable), titleLabel, 1, 2, 1, 2, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0); + gtk_widget_show(titleLabel); + // Set choices of output devices + outputAudioDeviceManagerStore = gtk_list_store_new(1, G_TYPE_STRING); + gtk_list_store_append(outputAudioDeviceManagerStore, &iter); + gtk_list_store_set(outputAudioDeviceManagerStore, &iter, 0 , "Default", -1); + comboBox = gtk_combo_box_new_with_model(GTK_TREE_MODEL(outputAudioDeviceManagerStore)); + gtk_combo_box_set_active(GTK_COMBO_BOX(comboBox), 0); + gtk_label_set_mnemonic_widget(GTK_LABEL(titleLabel), comboBox); + // Set rendering + renderer = gtk_cell_renderer_text_new(); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(comboBox), renderer, TRUE); + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(comboBox), renderer, "text", 0, NULL); + gtk_table_attach(GTK_TABLE(deviceTable), comboBox, 2, 3, 1, 2, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0); + gtk_widget_show(comboBox); + // Create refresh button + refreshButton = gtk_button_new_from_stock(GTK_STOCK_REFRESH); + gtk_table_attach(GTK_TABLE(deviceTable), refreshButton, 3, 4, 1, 2, GTK_EXPAND, GTK_SHRINK, 0, 0); + + // Device : Input device + // Create title label + titleLabel = gtk_label_new("Input peripheral:"); + gtk_misc_set_alignment(GTK_MISC(titleLabel), 0, 0.5); + gtk_table_attach(GTK_TABLE(deviceTable), titleLabel, 1, 2, 2, 3, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0); + gtk_widget_show(titleLabel); + // Set choices of output devices + inputAudioDeviceManagerStore = gtk_list_store_new(1, G_TYPE_STRING); + gtk_list_store_append(inputAudioDeviceManagerStore, &iter); + gtk_list_store_set(inputAudioDeviceManagerStore, &iter, 0 , "Default", -1); + comboBox = gtk_combo_box_new_with_model(GTK_TREE_MODEL(inputAudioDeviceManagerStore)); + gtk_combo_box_set_active(GTK_COMBO_BOX(comboBox), 0); + gtk_label_set_mnemonic_widget(GTK_LABEL(titleLabel), comboBox); + // Set rendering + renderer = gtk_cell_renderer_text_new(); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(comboBox), renderer, TRUE); + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(comboBox), renderer, "text", 0, NULL); + gtk_table_attach(GTK_TABLE(deviceTable), comboBox, 2, 3, 2, 3, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0); + gtk_widget_show(comboBox); + // Create refresh button + refreshButton = gtk_button_new_from_stock(GTK_STOCK_REFRESH); + gtk_table_attach(GTK_TABLE(deviceTable), refreshButton, 3, 4, 2, 3, GTK_EXPAND, GTK_SHRINK, 0, 0); + + // Codec section label + codecLabel = gtk_label_new("Codecs"); + gtk_label_set_line_wrap(GTK_LABEL(codecLabel), TRUE); + gtk_misc_set_alignment(GTK_MISC(codecLabel), 0, 0.5); + gtk_label_set_justify(GTK_LABEL(codecLabel), GTK_JUSTIFY_LEFT); + gtk_box_pack_start(GTK_BOX(ret), codecLabel, FALSE, FALSE, 0); + gtk_widget_show(codecLabel); + + // Main codec widget + codecBox = gtk_hbox_new(FALSE, 10); + gtk_box_pack_start(GTK_BOX(ret), codecBox, FALSE, FALSE, 0); + gtk_widget_show(codecBox); + + // Codec : List + GtkWidget * codecTable; + codecTable = create_codec_table(); + gtk_box_pack_start(GTK_BOX(codecBox), codecTable, TRUE, TRUE, 0); + gtk_widget_show(codecTable); + + // Show all + gtk_widget_show_all(ret); + + return ret; +} + +/** + * Main video tab creation + * Temporary code that was in audio tab before + */ +/*GtkWidget* +create_video_tab () { GtkWidget * ret; GtkWidget * label; GtkWidget * codecBox; GtkWidget * rate_box; - GtkWidget * image; + //GtkWidget * image; GtkWidget * hbox1; - GtkTreeIter iter; + //GtkTreeIter iter; GtkCellRenderer *renderer; - ret = gtk_vbox_new(FALSE, 10); - gtk_container_set_border_width (GTK_CONTAINER (ret), 10); + gtk_container_set_border_width (GTK_CONTAINER (ret), 10); - label = gtk_label_new("Set your audio preferences."); - gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); - gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); - gtk_box_pack_start(GTK_BOX(ret), label, FALSE, FALSE, 0); - gtk_widget_show(label); + label = gtk_label_new("Set your video preferences."); + gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); + gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); + gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); + gtk_box_pack_start(GTK_BOX(ret), label, FALSE, FALSE, 0); + gtk_widget_show(label); codecBox = gtk_hbutton_box_new(); gtk_box_set_spacing(GTK_BOX(codecBox), 10); //GAIM_HIG_BOX_SPACE @@ -397,7 +730,7 @@ create_audio_tab () gtk_widget_show (codecBox); hbox1 = gtk_label_new("Codec:"); - gtk_misc_set_alignment(GTK_MISC(hbox1), 0, 0.5); + gtk_misc_set_alignment(GTK_MISC(hbox1), 0, 0.5); gtk_box_pack_start(GTK_BOX(codecBox), hbox1, FALSE, FALSE, 0); gtk_widget_show(hbox1); codec_store = gtk_list_store_new(1, G_TYPE_STRING); @@ -453,14 +786,16 @@ create_audio_tab () gtk_widget_show_all(ret); config_window_fill_codec_list(); config_window_fill_rate_list(); - gtk_combo_box_set_active(rate_box, 0); + gtk_combo_box_set_active(GTK_COMBO_BOX(rate_box), 0); + //gtk_combo_box_set_active(rate_box, 0); return ret; - -} - +}*/ - void +/** + * Show configuration window with tabs + */ +void show_config_window () { GtkDialog * dialog; @@ -477,15 +812,15 @@ show_config_window () NULL)); gtk_dialog_set_has_separator(dialog, FALSE); - gtk_window_set_default_size( GTK_WINDOW(dialog), 400, 400); - gtk_container_set_border_width (GTK_CONTAINER(dialog), 0); + gtk_window_set_default_size(GTK_WINDOW(dialog), 400, 400); + gtk_container_set_border_width(GTK_CONTAINER(dialog), 0); - notebook = gtk_notebook_new (); - gtk_box_pack_start (GTK_BOX (dialog->vbox), notebook, TRUE, TRUE, 0); - gtk_container_set_border_width (GTK_CONTAINER(notebook), 10); + notebook = gtk_notebook_new(); + gtk_box_pack_start(GTK_BOX (dialog->vbox), notebook, TRUE, TRUE, 0); + gtk_container_set_border_width(GTK_CONTAINER(notebook), 10); gtk_widget_show(notebook); - /* Create tabs */ + /* Create tabs */ // Accounts tab tab = create_accounts_tab(); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), tab, gtk_label_new("Accounts")); @@ -494,12 +829,16 @@ show_config_window () // Audio tab tab = create_audio_tab(); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), tab, gtk_label_new("Audio Settings")); - gtk_notebook_page_num(GTK_NOTEBOOK(notebook), tab); + gtk_notebook_page_num(GTK_NOTEBOOK(notebook), tab); - gtk_dialog_run (dialog); + // Video tab +/* tab = create_video_tab(); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), tab, gtk_label_new("Video Settings")); + gtk_notebook_page_num(GTK_NOTEBOOK(notebook), tab); +*/ + gtk_dialog_run(dialog); dialogOpen = FALSE; - gtk_widget_destroy (GTK_WIDGET(dialog)); + gtk_widget_destroy(GTK_WIDGET(dialog)); } - diff --git a/src/audio/Makefile.am b/src/audio/Makefile.am index d30ca7c765e3807ef70de1d9a26c2997ff9ec77d..ea2038f50a32e28a44bce998302ebdbd127d00a4 100644 --- a/src/audio/Makefile.am +++ b/src/audio/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = gsm +#SUBDIRS = gsm noinst_LTLIBRARIES = libaudio.la @@ -12,18 +12,18 @@ SPEEX_FLAG= SPEEX_LIB= endif -libaudio_la_SOURCES = alaw.cpp audiofile.cpp g711.cpp tonelist.cpp \ -audiortp.cpp dtmf.cpp tone.cpp audiocodec.cpp audiolayer.cpp audiodevice.cpp dtmfgenerator.cpp gsmcodec.cpp \ -tonegenerator.cpp ulaw.cpp codecDescriptor.cpp \ +libaudio_la_SOURCES = audiofile.cpp tonelist.cpp \ +audiortp.cpp dtmf.cpp tone.cpp audiolayer.cpp audiodevice.cpp dtmfgenerator.cpp \ +tonegenerator.cpp codecDescriptor.cpp \ audioloop.cpp ringbuffer.cpp $(SPEEX_SOURCES_CPP) -AM_CXXFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/libs $(libccext2_CFLAGS) $(libdbuscpp_CFLAGS) $(libccrtp1_CFLAGS) $(USER_INCLUDES) -libaudio_la_LIBADD = gsm/libgsm.la $(SPEEX_LIB) +AM_CXXFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/libs $(libccext2_CFLAGS) $(libdbuscpp_CFLAGS) $(libccrtp1_CFLAGS) $(USER_INCLUDES) +#libaudio_la_LIBADD = gsm/libgsm.la $(SPEEX_LIB) libaudio_la_CPPFLAGS = $(SPEEX_FLAG) -noinst_HEADERS = audioloop.h common.h ringbuffer.h alaw.h audiofile.h g711.h \ +noinst_HEADERS = audioloop.h common.h ringbuffer.h audiofile.h \ tonelist.h audiortp.h audiocodec.h audiolayer.h audiodevice.h \ - dtmfgenerator.h gsmcodec.h tonegenerator.h ulaw.h \ + dtmfgenerator.h tonegenerator.h \ codecDescriptor.h dtmf.h tone.h \ CodecSpeex.h diff --git a/src/audio/alaw.cpp b/src/audio/alaw.cpp index 3d2480bc9dab1aab847f992eebaf6b4e4cb167b1..680590d05a0ea935bde25e6c26a1bb21ebc914b3 100644 --- a/src/audio/alaw.cpp +++ b/src/audio/alaw.cpp @@ -18,32 +18,113 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include "g711.h" -#include "alaw.h" +#include "common.h" +#include "audiocodec.h" + +class Alaw : public AudioCodec { +public: // 8 PCMA A 8000 1 [RFC3551] -Alaw::Alaw(int payload) + Alaw(int payload=0) : AudioCodec(payload, "PCMA") { - _description = "G711a"; + //_description = "G711a"; _clockRate = 8000; _channel = 1; } -Alaw::~Alaw (void) + +virtual int codecDecode (short *dst, unsigned char *src, unsigned int size) { + int16* end = dst+size; + while(dst<end) + *dst++ = ALawDecode(*src++); + return size<<1; } -int -Alaw::codecDecode (short *dst, unsigned char *src, unsigned int size) +int ALawDecode(uint8 alaw) { - return G711::ALawDecode (dst, src, size); + alaw ^= 0x55; // A-law has alternate bits inverted for transmission + + uint sign = alaw&0x80; + + int linear = alaw&0x1f; + linear <<= 4; + linear += 8; // Add a 'half' bit (0x08) to place PCM value in middle of range + + alaw &= 0x7f; + if(alaw>=0x20) + { + linear |= 0x100; // Put in MSB + uint shift = (alaw>>4)-1; + linear <<= shift; + } + + if(!sign) + return -linear; + else + return linear; } -int -Alaw::codecEncode (unsigned char *dst, short *src, unsigned int size) +virtual int codecEncode (unsigned char *dst, short *src, unsigned int size) { - return G711::ALawEncode (dst, src, size); + size >>= 1; + uint8* end = dst+size; + while(dst<end) + *dst++ = ALawEncode(*src++); + return size; +} + + +uint8 ALawEncode (int16 pcm16) +{ + int p = pcm16; + uint u; // u-law value we are forming + + if(p<0) + { + p = ~p; + u = 0x80^0x10^0xff; // Sign bit = 1 (^0x10 because this will get inverted later) ^0xff ^0xff to invert final u-Law code + } + else + { + //+ve value + u = 0x00^0x10^0xff; + } + + p += 0x84; // Add uLaw bias + + if(p>0x7f00) + p = 0x7f00; // Clip to 15 bits + p >>= 3; // Shift down to 13bit + if(p>=0x100) + { + p >>= 4; + u ^= 0x40; + } + if(p>=0x40) + { + p >>= 2; + u ^= 0x20; + } + if(p>=0x20) + { + p >>= 1; + u ^= 0x10; + } + u ^= p; // u now equal to encoded u-law value (with all bits inverted) + + return u; +} +}; + +// the class factories +extern "C" AudioCodec* create() { + return new Alaw(8); +} + +extern "C" void destroy(AudioCodec* a) { + delete a; } diff --git a/src/audio/alaw.h b/src/audio/alaw.h index 72180216a98c6ced1e374370bbfe6868bb1ad703..5952da08f1baa48c156fb98bc89435e758c1ed97 100644 --- a/src/audio/alaw.h +++ b/src/audio/alaw.h @@ -34,6 +34,7 @@ public: int codecDecode (short *, unsigned char *, unsigned int); int codecEncode (unsigned char *, short *, unsigned int); + void test () ; }; #endif // __ULAW_H__ diff --git a/src/audio/audiocodec.h b/src/audio/audiocodec.h index 596014953210d0262df4e76bb74cc4698f405744..6289a0626815cd2a10a9a8ca5f2291a48a955a1c 100644 --- a/src/audio/audiocodec.h +++ b/src/audio/audiocodec.h @@ -1,46 +1,44 @@ -/* - * Copyright (C) 2004-2005 Savoir-Faire Linux inc. - * Author: Yan Morin <yan.morin@savoirfairelinux.com> - * Author: Laurielle Lea <laurielle.lea@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 _CODEC_AUDIO_H +#define _CODEC_AUDIO_H -#ifndef __CODEC_AUDIO_H__ -#define __CODEC_AUDIO_H__ +#include <string> +#include <iostream> +#include <dlfcn.h> -#include <string> - -/** - * Abstract audio codec class. - * A codec can be decode, encode - * Each codec have a payload, clock rate and a codec name - */ class AudioCodec { +protected: + /** Holds SDP-compliant codec name */ + std::string _codecName; // what we put inside sdp + + /** Clock rate or sample rate of the codec, in Hz */ + unsigned int _clockRate; + + /** Number of channel 1 = mono, 2 = stereo */ + unsigned int _channel; + +private: + //bool _active; + int _payload; + bool _hasDynamicPayload; + public: - AudioCodec(int payload, const std::string &codecName); - virtual ~AudioCodec(void); + AudioCodec(int payload, const std::string &codecName) + : _codecName(codecName) { + _payload = payload; + _clockRate = 8000; // default + _channel = 1; // default + // _active = false; + + _hasDynamicPayload = (_payload >= 96 && _payload <= 127) ? true : false; +} - /** - * @return the number of bytes decoded - */ - virtual int codecDecode(short *, unsigned char *, unsigned int) = 0; - virtual int codecEncode(unsigned char *, short *, unsigned int) = 0; + virtual ~AudioCodec() {} - /** Returns description for GUI usage */ - std::string getDescription() { return _description; } + /** + * @return the number of bytes decoded + */ + virtual int codecDecode(short *, unsigned char *, unsigned int) = 0; + virtual int codecEncode(unsigned char *, short *, unsigned int) = 0; /** Value used for SDP negotiation */ std::string getCodecName() { return _codecName; } @@ -48,29 +46,14 @@ public: bool hasDynamicPayload() { return _hasDynamicPayload; } unsigned int getClockRate() { return _clockRate; } unsigned int getChannel() { return _channel; } - bool isActive() { return _active; } - void setActive(bool active) { _active = active; } + //bool isActive() { return _active; } + //void setActive(bool active) { _active = active; } + -protected: - /** Holds SDP-compliant codec name */ - std::string _codecName; // what we put inside sdp - /** Holds the GUI-style codec description */ - std::string _description; // what we display to the user - - /** - * Clock rate or sample rate of the codec, in Hz - */ - unsigned int _clockRate; - - /** - * Number of channel 1 = mono, 2 = stereo - */ - unsigned int _channel; - -private: - bool _active; - int _payload; - bool _hasDynamicPayload; }; -#endif // __CODEC_AUDIO_H__ +// the types of the class factories +typedef AudioCodec* create_t(); +typedef void destroy_t(AudioCodec*); + +#endif diff --git a/src/audio/audiofile.cpp b/src/audio/audiofile.cpp index bae4379c42f6b5d8446059b6dbe2e24a62403ed7..d96dc3852e0fbc15011c14e626d9f68251cf4f30 100644 --- a/src/audio/audiofile.cpp +++ b/src/audio/audiofile.cpp @@ -25,20 +25,40 @@ #include <fstream> #include <math.h> #include <samplerate.h> - +#include <dlfcn.h> AudioFile::AudioFile() : AudioLoop() { // could vary later... - _ulaw = new Ulaw(PAYLOAD_CODEC_ULAW); + //_ulaw = new Ulaw(PAYLOAD_CODEC_ULAW); _start = false; + + using std::cout; + using std::cerr; + void* codec = dlopen("codec_ulaw.so", RTLD_LAZY); + if(!codec){ + cerr<<"cannot load library: "<< dlerror() <<'\n'; + } + dlerror(); + create_t* create_codec = (create_t*)dlsym(codec, "create"); + const char* dlsym_error = dlerror(); + if(dlsym_error){ + cerr << "Cannot load symbol create: " << dlsym_error << '\n'; + } + destroy_t* destroy_codec = (destroy_t*) dlsym(codec, "destroy"); + dlsym_error = dlerror(); + if(dlsym_error){ + cerr << "Cannot load symbol destroy" << dlsym_error << '\n'; + } + + _ulaw = create_codec(); } AudioFile::~AudioFile() { - delete _ulaw; + delete _ulaw; } // load file in mono format @@ -82,6 +102,7 @@ AudioFile::loadFile(const std::string& filename, unsigned int sampleRate=8000) file.read (fileBuffer,length); file.close(); + // Decode file.ul // expandedsize is the number of bytes, not the number of int // expandedsize should be exactly two time more, else failed @@ -145,7 +166,7 @@ AudioFile::loadFile(const std::string& filename, unsigned int sampleRate=8000) _buffer = bufferTmp; // just send the buffer pointer; bufferTmp = 0; } - + return true; } diff --git a/src/audio/audiofile.h b/src/audio/audiofile.h index 25773ad62e3d0d0224523eefd88a52035d8c5bb1..e476fe98ffed6759124e3530ae2012dcecf25480 100644 --- a/src/audio/audiofile.h +++ b/src/audio/audiofile.h @@ -24,7 +24,7 @@ #define __AUDIOFILE_H__ #include "audioloop.h" -#include "ulaw.h" +#include "audiocodec.h" /** @author Yan Morin <yan.morin@savoirfairelinux.com> @@ -42,7 +42,7 @@ public: private: std::string _filename; - Ulaw* _ulaw; + AudioCodec* _ulaw; bool _start; }; diff --git a/src/audio/audiortp.cpp b/src/audio/audiortp.cpp index 53efa0962dd9fa11271441c6e17d01c71eb8f304..dbf7a5aeaa5e9259df786b6f88f9c7c449d03ad5 100644 --- a/src/audio/audiortp.cpp +++ b/src/audio/audiortp.cpp @@ -29,6 +29,8 @@ //#include <fstream> // fstream + iostream pour fstream debugging.. //#include <iostream> // removeable... #include <math.h> +#include <dlfcn.h> +#include <iostream> #include "../global.h" #include "../manager.h" @@ -66,7 +68,6 @@ AudioRtp::createNewSession (SIPCall *ca) { // Start RTP Send/Receive threads _symmetric = Manager::instance().getConfigInt(SIGNALISATION,SYMMETRIC) ? true : false; _RTXThread = new AudioRtpRTX (ca, _symmetric); - try { if (_RTXThread->start() != 0) { _debug("! ARTP Failure: unable to start RTX Thread\n"); @@ -105,13 +106,13 @@ AudioRtpRTX::AudioRtpRTX (SIPCall *sipcall, bool sym) _sym = sym; // AudioRtpRTX should be close if we change sample rate - _codecSampleRate = _ca->getAudioCodec()->getClockRate(); - + //_codecSampleRate = _ca->getAudioCodec()->getClockRate(); + + // TODO: Change bind address according to user settings. // TODO: this should be the local ip not the external (router) IP std::string localipConfig = _ca->getLocalIp(); // _ca->getLocalIp(); ost::InetHostAddress local_ip(localipConfig.c_str()); - if (!_sym) { _sessionRecv = new ost::RTPSession(local_ip, _ca->getLocalAudioPort()); _sessionSend = new ost::RTPSession(local_ip, _ca->getLocalAudioPort()); @@ -179,10 +180,16 @@ AudioRtpRTX::initBuffers() void AudioRtpRTX::initAudioRtpSession (void) { + + + try { if (_ca == 0) { return; } - - //_debug("Init audio RTP session\n"); + _debug("AUDIOCODEC=%i\n", _ca->getAudioCodec()); + AudioCodec* audiocodec = loadCodec(_ca->getAudioCodec()); + _codecSampleRate = audiocodec->getClockRate(); + + _debug("Init audio RTP session\n"); ost::InetHostAddress remote_ip(_ca->getRemoteIp().c_str()); if (!remote_ip) { _debug("! ARTP Thread Error: Target IP address [%s] is not correct!\n", _ca->getRemoteIp().data()); @@ -211,7 +218,6 @@ AudioRtpRTX::initAudioRtpSession (void) return; } - AudioCodec* audiocodec = _ca->getAudioCodec(); bool payloadIsSet = false; if (audiocodec) { if (audiocodec->hasDynamicPayload()) { @@ -224,13 +230,12 @@ AudioRtpRTX::initAudioRtpSession (void) _sessionSend->setMark(true); } else { - //_debug("AudioRTP Thread: Added session destination %s:%d\n", remote_ip.getHostname(), (unsigned short) _ca->getRemoteSdpAudioPort()); + //_debug("AudioRTP Thread: Added session destination %s\n", remote_ip.getHostname() ); if (!_session->addDestination (remote_ip, (unsigned short) _ca->getRemoteAudioPort())) { return; } - AudioCodec* audiocodec = _ca->getAudioCodec(); bool payloadIsSet = false; if (audiocodec) { if (audiocodec->hasDynamicPayload()) { @@ -240,219 +245,274 @@ AudioRtpRTX::initAudioRtpSession (void) } } } + unloadCodec(audiocodec); } catch(...) { _debugException("! ARTP Failure: initialisation failed"); throw; } } + +AudioCodec* +AudioRtpRTX::loadCodec(int payload) +{ + using std::cerr; + + switch(payload){ + case 0: + handle_codec = dlopen("codec_ulaw.so", RTLD_LAZY); + break; + case 3: + handle_codec = dlopen("codec_gsm.so", RTLD_LAZY); + break; + case 8: + handle_codec = dlopen("codec_alaw.so", RTLD_LAZY); + break; + case 97: + handle_codec = dlopen("codec_ilbc.so", RTLD_LAZY); + break; + } + + if(!handle_codec){ + cerr<<"cannot load library: "<< dlerror() <<'\n'; + } + dlerror(); + create_t* create_codec = (create_t*)dlsym(handle_codec, "create"); + const char* dlsym_error = dlerror(); + if(dlsym_error){ + cerr << "Cannot load symbol create: " << dlsym_error << '\n'; + } + return create_codec(); +} + +void +AudioRtpRTX::unloadCodec(AudioCodec* audiocodec) +{ + using std::cerr; + destroy_t* destroy_codec = (destroy_t*)dlsym(handle_codec, "destroy"); + const char* dlsym_error = dlerror(); + if(dlsym_error){ + cerr << "Cannot load symbol destroy" << dlsym_error << '\n'; + } + destroy_codec(audiocodec); + dlclose(handle_codec); +} + void AudioRtpRTX::sendSessionFromMic(int timestamp) { - // STEP: - // 1. get data from mic - // 2. convert it to int16 - good sample, good rate - // 3. encode it - // 4. send it - try { - int16* toSIP = NULL; - - timestamp += time->getSecond(); - if (_ca==0) { _debug(" !ARTP: No call associated (mic)\n"); return; } // no call, so we do nothing - AudioLayer* audiolayer = Manager::instance().getAudioDriver(); - if (!audiolayer) { _debug(" !ARTP: No audiolayer available for mic\n"); return; } - - AudioCodec* audiocodec = _ca->getAudioCodec(); - if (!audiocodec) { _debug(" !ARTP: No audiocodec available for mic\n"); return; } - - // we have to get 20ms of data from the mic *20/1000 = /50 - int maxBytesToGet = _layerSampleRate * _layerFrameSize * sizeof(SFLDataFormat) / 1000; - - // available bytes inside ringbuffer - int availBytesFromMic = audiolayer->canGetMic(); - - // take the lowest - int bytesAvail = (availBytesFromMic < maxBytesToGet) ? availBytesFromMic : maxBytesToGet; - - // Get bytes from micRingBuffer to data_from_mic - int nbSample = audiolayer->getMic(_dataAudioLayer, bytesAvail) / sizeof(SFLDataFormat); - int nb_sample_up = nbSample; - int nbSamplesMax = _layerFrameSize * audiocodec->getClockRate() / 1000; - - nbSample = reSampleData(audiocodec->getClockRate(), nb_sample_up, DOWN_SAMPLING); - - toSIP = _intBufferDown; - - if ( nbSample < nbSamplesMax - 10 ) { // if only 10 is missing, it's ok - // fill end with 0... - //_debug("begin: %p, nbSample: %d\n", toSIP, nbSample); - memset(toSIP + nbSample, 0, (nbSamplesMax-nbSample)*sizeof(int16)); - nbSample = nbSamplesMax; - } - //_debug("AR: Nb sample: %d int, [0]=%d [1]=%d [2]=%d\n", nbSample, toSIP[0], toSIP[1], toSIP[2]); + AudioCodec* audiocodec = loadCodec(_ca->getAudioCodec()); - // for the mono: range = 0 to RTP_FRAME2SEND * sizeof(int16) - // codecEncode(char *dest, int16* src, size in bytes of the src) - int compSize = audiocodec->codecEncode(_sendDataEncoded, toSIP, nbSample*sizeof(int16)); +// STEP: +// 1. get data from mic +// 2. convert it to int16 - good sample, good rate +// 3. encode it +// 4. send it +try { + int16* toSIP = NULL; - // encode divise by two - // Send encoded audio sample over the network - if (compSize > nbSamplesMax) { _debug("! ARTP: %d should be %d\n", compSize, nbSamplesMax);} - if (!_sym) { - _sessionSend->putData(timestamp, _sendDataEncoded, compSize); - } else { - _session->putData(timestamp, _sendDataEncoded, compSize); - } - toSIP = NULL; - } catch(...) { - _debugException("! ARTP: sending failed"); - throw; + timestamp += time->getSecond(); + if (_ca==0) { _debug(" !ARTP: No call associated (mic)\n"); return; } // no call, so we do nothing + AudioLayer* audiolayer = Manager::instance().getAudioDriver(); + if (!audiolayer) { _debug(" !ARTP: No audiolayer available for mic\n"); return; } + + //AudioCodec* audiocodec = _ca->getAudioCodec(); + if (!audiocodec) { _debug(" !ARTP: No audiocodec available for mic\n"); return; } + + // we have to get 20ms of data from the mic *20/1000 = /50 + int maxBytesToGet = _layerSampleRate * _layerFrameSize * sizeof(SFLDataFormat) / 1000; + + // available bytes inside ringbuffer + int availBytesFromMic = audiolayer->canGetMic(); + + // take the lowest + int bytesAvail = (availBytesFromMic < maxBytesToGet) ? availBytesFromMic : maxBytesToGet; + + // Get bytes from micRingBuffer to data_from_mic + int nbSample = audiolayer->getMic(_dataAudioLayer, bytesAvail) / sizeof(SFLDataFormat); + int nb_sample_up = nbSample; + int nbSamplesMax = _layerFrameSize * audiocodec->getClockRate() / 1000; + + nbSample = reSampleData(audiocodec->getClockRate(), nb_sample_up, DOWN_SAMPLING); + + toSIP = _intBufferDown; + + if ( nbSample < nbSamplesMax - 10 ) { // if only 10 is missing, it's ok + // fill end with 0... + //_debug("begin: %p, nbSample: %d\n", toSIP, nbSample); + memset(toSIP + nbSample, 0, (nbSamplesMax-nbSample)*sizeof(int16)); + nbSample = nbSamplesMax; } + //_debug("AR: Nb sample: %d int, [0]=%d [1]=%d [2]=%d\n", nbSample, toSIP[0], toSIP[1], toSIP[2]); + + // for the mono: range = 0 to RTP_FRAME2SEND * sizeof(int16) + // codecEncode(char *dest, int16* src, size in bytes of the src) + int compSize = audiocodec->codecEncode(_sendDataEncoded, toSIP, nbSample*sizeof(int16)); + // encode divise by two + // Send encoded audio sample over the network + if (compSize > nbSamplesMax) { _debug("! ARTP: %d should be %d\n", compSize, nbSamplesMax);} + if (!_sym) { + _sessionSend->putData(timestamp, _sendDataEncoded, compSize); + } else { + _session->putData(timestamp, _sendDataEncoded, compSize); + } + toSIP = NULL; +} catch(...) { + _debugException("! ARTP: sending failed"); + throw; +} + unloadCodec(audiocodec); } - void +void AudioRtpRTX::receiveSessionForSpkr (int& countTime) { - if (_ca == 0) { return; } - try { - AudioLayer* audiolayer = Manager::instance().getAudioDriver(); - if (!audiolayer) { return; } - const ost::AppDataUnit* adu = NULL; - // Get audio data stream +AudioCodec* audiocodec; - if (!_sym) { - adu = _sessionRecv->getData(_sessionRecv->getFirstTimestamp()); - } else { - adu = _session->getData(_session->getFirstTimestamp()); - } - if (adu == NULL) { - return; - } +if (_ca == 0) { return; } +try { + AudioLayer* audiolayer = Manager::instance().getAudioDriver(); + if (!audiolayer) { return; } - int payload = adu->getType(); // codec type - unsigned char* data = (unsigned char*)adu->getData(); // data in char - unsigned int size = adu->getSize(); // size in char - - - // Decode data with relevant codec - AudioCodec* audiocodec = _ca->getCodecMap().getCodec((CodecType)payload); - _codecSampleRate = audiocodec->getClockRate(); - int max = (int)(_codecSampleRate * _layerFrameSize); - - if ( size > max ) { - _debug("We have received from RTP a packet larger than expected: %s VS %s\n", size, max); - _debug("The packet size has been cropped\n"); - size=max; - } - - - if (audiocodec != NULL) { - int expandedSize = audiocodec->codecDecode(_receiveDataDecoded, data, size); - //buffer _receiveDataDecoded ----> short int or int16, coded on 2 bytes - int nbInt16 = expandedSize / sizeof(int16); - //nbInt16 represents the number of samples we just decoded - if (nbInt16 > max) { - _debug("We have decoded an RTP packet larger than expected: %s VS %s. Cropping.\n", nbInt16, max); - nbInt16=max; - } + const ost::AppDataUnit* adu = NULL; + // Get audio data stream + + if (!_sym) { + adu = _sessionRecv->getData(_sessionRecv->getFirstTimestamp()); + } else { + adu = _session->getData(_session->getFirstTimestamp()); + } + if (adu == NULL) { + //_debug("No RTP audio stream\n"); + return; + } + + int payload = adu->getType(); // codec type + unsigned char* data = (unsigned char*)adu->getData(); // data in char + unsigned int size = adu->getSize(); // size in char + + audiocodec = loadCodec(payload); + // Decode data with relevant codec + _codecSampleRate = audiocodec->getClockRate(); + int max = (int)(_codecSampleRate * _layerFrameSize); + + if ( size > max ) { + _debug("We have received from RTP a packet larger than expected: %s VS %s\n", size, max); + _debug("The packet size has been cropped\n"); + size=max; + } - SFLDataFormat* toAudioLayer; - int nbSample = nbInt16; - // Do sample rate conversion - int nb_sample_down = nbSample; - nbSample = reSampleData(_codecSampleRate , nb_sample_down, UP_SAMPLING); + if (audiocodec != NULL) { + int expandedSize = audiocodec->codecDecode(_receiveDataDecoded, data, size); + //buffer _receiveDataDecoded ----> short int or int16, coded on 2 bytes + int nbInt16 = expandedSize / sizeof(int16); + //nbInt16 represents the number of samples we just decoded + if (nbInt16 > max) { + _debug("We have decoded an RTP packet larger than expected: %s VS %s. Cropping.\n", nbInt16, max); + nbInt16=max; + } + + SFLDataFormat* toAudioLayer; + int nbSample = nbInt16; + + // Do sample rate conversion + int nb_sample_down = nbSample; + nbSample = reSampleData(_codecSampleRate , nb_sample_down, UP_SAMPLING); #ifdef DATAFORMAT_IS_FLOAT - toAudioLayer = _floatBufferUp; + toAudioLayer = _floatBufferUp; #else - toAudioLayer = _dataAudioLayer; + toAudioLayer = _dataAudioLayer; #endif - audiolayer->putMain(toAudioLayer, nbSample * sizeof(SFLDataFormat)); + audiolayer->putMain(toAudioLayer, nbSample * sizeof(SFLDataFormat)); - // Notify (with a beep) an incoming call when there is already a call - countTime += time->getSecond(); - if (Manager::instance().incomingCallWaiting() > 0) { - countTime = countTime % 500; // more often... - if (countTime == 0) { - Manager::instance().notificationIncomingCall(); - } + // Notify (with a beep) an incoming call when there is already a call + countTime += time->getSecond(); + if (Manager::instance().incomingCallWaiting() > 0) { + countTime = countTime % 500; // more often... + if (countTime == 0) { + Manager::instance().notificationIncomingCall(); } - - } else { - countTime += time->getSecond(); } - delete adu; adu = NULL; - } catch(...) { - _debugException("! ARTP: receiving failed"); - throw; + } else { + countTime += time->getSecond(); } + + delete adu; adu = NULL; +} catch(...) { + _debugException("! ARTP: receiving failed"); + throw; +} + + unloadCodec(audiocodec); + } int AudioRtpRTX::reSampleData(int sampleRate_codec, int nbSamples, int status) { - if(status==UP_SAMPLING) - return upSampleData(sampleRate_codec, nbSamples); - else if(status==DOWN_SAMPLING) - return downSampleData(sampleRate_codec, nbSamples); - else - return 0; +if(status==UP_SAMPLING) + return upSampleData(sampleRate_codec, nbSamples); +else if(status==DOWN_SAMPLING) + return downSampleData(sampleRate_codec, nbSamples); +else + return 0; } //////////////////////////////////////////////////////////////////// //////////// RESAMPLING FUNCTIONS ///////////////////////////////// ////////////////////////////////////////////////////////////////// - int +int AudioRtpRTX::upSampleData(int sampleRate_codec, int nbSamples) { - double upsampleFactor = (double) _layerSampleRate / sampleRate_codec; - int nbSamplesMax = (int) (_layerSampleRate * _layerFrameSize /1000); - if( upsampleFactor != 1 ) - { - SRC_DATA src_data; - src_data.data_in = _floatBufferDown; - src_data.data_out = _floatBufferUp; - src_data.input_frames = nbSamples; - src_data.output_frames = (int) floor(upsampleFactor * nbSamples); - src_data.src_ratio = upsampleFactor; - src_data.end_of_input = 0; // More data will come - src_short_to_float_array(_receiveDataDecoded, _floatBufferDown, nbSamples); - src_process(_src_state_spkr, &src_data); - nbSamples = ( src_data.output_frames_gen > nbSamplesMax) ? nbSamplesMax : src_data.output_frames_gen; - src_float_to_short_array(_floatBufferUp, _dataAudioLayer, nbSamples); - } +double upsampleFactor = (double) _layerSampleRate / sampleRate_codec; +int nbSamplesMax = (int) (_layerSampleRate * _layerFrameSize /1000); +if( upsampleFactor != 1 ) +{ + SRC_DATA src_data; + src_data.data_in = _floatBufferDown; + src_data.data_out = _floatBufferUp; + src_data.input_frames = nbSamples; + src_data.output_frames = (int) floor(upsampleFactor * nbSamples); + src_data.src_ratio = upsampleFactor; + src_data.end_of_input = 0; // More data will come + src_short_to_float_array(_receiveDataDecoded, _floatBufferDown, nbSamples); + src_process(_src_state_spkr, &src_data); + nbSamples = ( src_data.output_frames_gen > nbSamplesMax) ? nbSamplesMax : src_data.output_frames_gen; + src_float_to_short_array(_floatBufferUp, _dataAudioLayer, nbSamples); +} - return nbSamples; +return nbSamples; } - int +int AudioRtpRTX::downSampleData(int sampleRate_codec, int nbSamples) { - double downsampleFactor = (double) sampleRate_codec / _layerSampleRate; - int nbSamplesMax = (int) (sampleRate_codec * _layerFrameSize / 1000); - if ( downsampleFactor != 1) - { - SRC_DATA src_data; - src_data.data_in = _floatBufferUp; - src_data.data_out = _floatBufferDown; - src_data.input_frames = nbSamples; - src_data.output_frames = (int) floor(downsampleFactor * nbSamples); - src_data.src_ratio = downsampleFactor; - src_data.end_of_input = 0; // More data will come - src_short_to_float_array(_dataAudioLayer, _floatBufferUp, nbSamples); - src_process(_src_state_mic, &src_data); - nbSamples = ( src_data.output_frames_gen > nbSamplesMax) ? nbSamplesMax : src_data.output_frames_gen; - src_float_to_short_array(_floatBufferDown, _intBufferDown, nbSamples); - } - return nbSamples; +double downsampleFactor = (double) sampleRate_codec / _layerSampleRate; +int nbSamplesMax = (int) (sampleRate_codec * _layerFrameSize / 1000); +if ( downsampleFactor != 1) +{ + SRC_DATA src_data; + src_data.data_in = _floatBufferUp; + src_data.data_out = _floatBufferDown; + src_data.input_frames = nbSamples; + src_data.output_frames = (int) floor(downsampleFactor * nbSamples); + src_data.src_ratio = downsampleFactor; + src_data.end_of_input = 0; // More data will come + src_short_to_float_array(_dataAudioLayer, _floatBufferUp, nbSamples); + src_process(_src_state_mic, &src_data); + nbSamples = ( src_data.output_frames_gen > nbSamplesMax) ? nbSamplesMax : src_data.output_frames_gen; + src_float_to_short_array(_floatBufferDown, _intBufferDown, nbSamples); +} +return nbSamples; } @@ -460,63 +520,62 @@ AudioRtpRTX::downSampleData(int sampleRate_codec, int nbSamples) void AudioRtpRTX::run () { - //mic, we receive from soundcard in stereo, and we send encoded - //encoding before sending - AudioLayer *audiolayer = Manager::instance().getAudioDriver(); - - _layerFrameSize = audiolayer->getFrameSize(); // en ms - _layerSampleRate = audiolayer->getSampleRate(); - initBuffers(); - int step = (int)(_layerFrameSize * _codecSampleRate / 1000); - - try { - // Init the session - initAudioRtpSession(); - - // start running the packet queue scheduler. - //_debug("AudioRTP Thread started\n"); - if (!_sym) { - _sessionRecv->startRunning(); - _sessionSend->startRunning(); - } else { - _session->startRunning(); - //_debug("Session is now: %d active\n", _session->isActive()); - } +//mic, we receive from soundcard in stereo, and we send encoded +//encoding before sending +AudioLayer *audiolayer = Manager::instance().getAudioDriver(); + +_layerFrameSize = audiolayer->getFrameSize(); // en ms +_layerSampleRate = audiolayer->getSampleRate(); +initBuffers(); +int step; + +try { + // Init the session + initAudioRtpSession(); + step = (int) (_layerFrameSize * _codecSampleRate / 1000); + // start running the packet queue scheduler. + //_debug("AudioRTP Thread started\n"); + if (!_sym) { + _sessionRecv->startRunning(); + _sessionSend->startRunning(); + } else { + _session->startRunning(); + //_debug("Session is now: %d active\n", _session->isActive()); + } - int timestamp = 0; // for mic - int countTime = 0; // for receive - TimerPort::setTimer(_layerFrameSize); - - audiolayer->flushMic(); - audiolayer->startStream(); - _start.post(); - _debug("- ARTP Action: Start\n"); - while (!testCancel()) { - //////////////////////////// - // Send session - //////////////////////////// - sendSessionFromMic(timestamp); - timestamp += step; - //////////////////////////// - // Recv session - //////////////////////////// - receiveSessionForSpkr(countTime); - - // Let's wait for the next transmit cycle - Thread::sleep(TimerPort::getTimer()); - TimerPort::incTimer(_layerFrameSize); // 'frameSize' ms - } - //_debug("stop stream for audiortp loop\n"); - audiolayer->stopStream(); - } catch(std::exception &e) { - _start.post(); - _debug("! ARTP: Stop %s\n", e.what()); - throw; - } catch(...) { - _start.post(); - _debugException("* ARTP Action: Stop"); - throw; + int timestamp = 0; // for mic + int countTime = 0; // for receive + TimerPort::setTimer(_layerFrameSize); + + audiolayer->flushMic(); + audiolayer->startStream(); + _start.post(); + _debug("- ARTP Action: Start\n"); + while (!testCancel()) { + //////////////////////////// + // Send session + //////////////////////////// + sendSessionFromMic(timestamp); + timestamp += step; + //////////////////////////// + // Recv session + //////////////////////////// + receiveSessionForSpkr(countTime); + // Let's wait for the next transmit cycle + Thread::sleep(TimerPort::getTimer()); + TimerPort::incTimer(_layerFrameSize); // 'frameSize' ms } + //_debug("stop stream for audiortp loop\n"); + audiolayer->stopStream(); +} catch(std::exception &e) { + _start.post(); + _debug("! ARTP: Stop %s\n", e.what()); + throw; +} catch(...) { + _start.post(); + _debugException("* ARTP Action: Stop"); + throw; +} } diff --git a/src/audio/audiortp.h b/src/audio/audiortp.h index 2444be567611e17b4858ef8321baed96a7c91500..c37174826e3e6e4eee7339ba0bdb2e754d7e95e0 100644 --- a/src/audio/audiortp.h +++ b/src/audio/audiortp.h @@ -119,6 +119,22 @@ class AudioRtpRTX : public ost::Thread, public ost::TimerPort { * @return int The number of samples after the operation */ int downSampleData(int, int); + + /** Pointer on function to handle codecs **/ + void* handle_codec; + + /** + * Load dynamically a codec (.so library) + * @param payload The payload of the codec you want to load + * @return AudioCodec* A pointer on a audio codec object + */ + AudioCodec* loadCodec(int payload); + + /** + * Destroy and close dynamically a codec (.so library) + * @param audiocodec The audio codec you want to unload + */ + void unloadCodec(AudioCodec* audiocodec); }; /////////////////////////////////////////////////////////////////////////////// diff --git a/src/audio/codecDescriptor.cpp b/src/audio/codecDescriptor.cpp index eb231d7c68ff740a3dd87f1333bb84bbe21563f7..feb00971b0eed5e804cfcec46f832478d10d22a5 100644 --- a/src/audio/codecDescriptor.cpp +++ b/src/audio/codecDescriptor.cpp @@ -22,65 +22,125 @@ #include <iostream> #include "audiocodec.h" -#include "gsmcodec.h" -#include "alaw.h" -#include "ulaw.h" #include "codecDescriptor.h" -#ifdef HAVE_SPEEX +/*#ifdef HAVE_SPEEX #include "CodecSpeex.h" -#endif +#endif*/ -CodecDescriptorMap::CodecDescriptorMap() +CodecDescriptor::CodecDescriptor() { - _codecMap[PAYLOAD_CODEC_ALAW] = new Alaw(); - _codecMap[PAYLOAD_CODEC_ULAW] = new Ulaw(); - _codecMap[PAYLOAD_CODEC_GSM] = new Gsm(); + // Default codecs + _codecMap[PAYLOAD_CODEC_ULAW] = "PCMU"; + _codecMap[PAYLOAD_CODEC_GSM] = "GSM"; + _codecMap[PAYLOAD_CODEC_ALAW] = "PCMA"; #ifdef HAVE_SPEEX _codecMap[PAYLOAD_CODEC_SPEEX] = new CodecSpeex(PAYLOAD_CODEC_SPEEX); // TODO: this is a variable payload! #endif // theses one are not implemented yet.. -// _codecMap[PAYLOAD_CODEC_ILBC] = Ilbc(); +// _codecMap[PAYLOAD_CODEC_ILBC_20] = "iLBC"; // _codecMap[PAYLOAD_CODEC_SPEEX] = Speex(); } -AudioCodec* -CodecDescriptorMap::getCodec(CodecType payload) +void +CodecDescriptor::init() +{ + _codecMap[PAYLOAD_CODEC_ULAW] = "PCMU"; + _codecMap[PAYLOAD_CODEC_GSM] = "GSM"; + _codecMap[PAYLOAD_CODEC_ALAW] = "PCMA"; +// _codecMap[PAYLOAD_CODEC_ILBC_20] = "iLBC"; +} + +std::string& +CodecDescriptor::getCodecName(CodecType payload) { CodecMap::iterator iter = _codecMap.find(payload); if (iter!=_codecMap.end()) { return (iter->second); } - return NULL; + //return ; } -void -CodecDescriptorMap::setActive(const std::string& codecDescription) +bool +CodecDescriptor::isSupported(CodecType payload) { CodecMap::iterator iter = _codecMap.begin(); while(iter!=_codecMap.end()) { - if (iter->second!=0) { - if (iter->second->getDescription() == codecDescription) { - iter->second->setActive(true); - break; + if (iter->first == payload) { + // codec is already in the map --> nothing to do + _debug("Codec with payload %i already in the map\n", payload); + //break; + return true; } - } iter++; } + return false; } void -CodecDescriptorMap::setInactive(const std::string& codecDescription) +CodecDescriptor::removeCodec(CodecType payload) { CodecMap::iterator iter = _codecMap.begin(); while(iter!=_codecMap.end()) { - if (iter->second!=0) { - if (iter->second->getDescription() == codecDescription) { - iter->second->setActive(false); + if (iter->first == payload) { + _debug("Codec %s removed from the list", getCodecName(payload).data()); + _codecMap.erase(iter); break; } - } iter++; } } +void +CodecDescriptor::addCodec(CodecType payload) +{ +} + +double +CodecDescriptor::getBitRate(CodecType payload) +{ + switch(payload){ + case PAYLOAD_CODEC_ULAW | PAYLOAD_CODEC_ALAW: + return 64; + case PAYLOAD_CODEC_GSM: + return 13.3; + case PAYLOAD_CODEC_ILBC_20: + return 15.2; + case PAYLOAD_CODEC_ILBC_30: + return 15.2; + + } + return -1; +} + +double +CodecDescriptor::getBandwidthPerCall(CodecType payload) +{ + switch(payload){ + case PAYLOAD_CODEC_ULAW | PAYLOAD_CODEC_ALAW: + return 80; + case PAYLOAD_CODEC_GSM: + return 28.6; + case PAYLOAD_CODEC_ILBC_20: + return 30.8; + } + return -1; + +} + +int +CodecDescriptor::getSampleRate(CodecType payload) +{ + switch(payload){ + case PAYLOAD_CODEC_ULAW | PAYLOAD_CODEC_ALAW | PAYLOAD_CODEC_GSM | PAYLOAD_CODEC_ILBC_20: + return 8000; + } + return -1; +} + + + + + + + diff --git a/src/audio/codecDescriptor.h b/src/audio/codecDescriptor.h index e001862adb118c9f3b99f9069e7552d31d38a4e1..7dfac68acef862faf236691c8fa6939af17f9eaa 100644 --- a/src/audio/codecDescriptor.h +++ b/src/audio/codecDescriptor.h @@ -2,6 +2,7 @@ * Copyright (C) 2004-2005 Savoir-Faire Linux inc. * Author: Yan Morin <yan.morin@savoirfairelinux.com> * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> + * 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 @@ -25,6 +26,7 @@ #include <string> #include <map> +#include "../global.h" typedef enum { // http://www.iana.org/assignments/rtp-parameters // http://www.gnu.org/software/ccrtp/doc/refman/html/formats_8h.html#a0 @@ -36,7 +38,8 @@ typedef enum { PAYLOAD_CODEC_ALAW = 8, // http://www.ietf.org/rfc/rfc3952.txt // 97 iLBC/8000 - PAYLOAD_CODEC_ILBC = 97, + PAYLOAD_CODEC_ILBC_20 = 97, + PAYLOAD_CODEC_ILBC_30 = 98, // http://www.speex.org/drafts/draft-herlein-speex-rtp-profile-00.txt // 97 speex/8000 // http://support.xten.com/viewtopic.php?p=8684&sid=3367a83d01fdcad16c7459a79859b08e @@ -45,33 +48,72 @@ typedef enum { } CodecType; #include "audiocodec.h" -typedef std::map<CodecType, AudioCodec*> CodecMap; -class CodecDescriptorMap { +/* A codec is identified by its payload. A payload is associated with a name. */ +typedef std::map<CodecType, std::string> CodecMap; + +class CodecDescriptor { public: /** * Initialize all codec */ - CodecDescriptorMap(); - ~CodecDescriptorMap() {}; - CodecMap getMap() { return _codecMap; } + CodecDescriptor(); + ~CodecDescriptor() {}; + CodecMap& getCodecMap() { return _codecMap; } /** * Get codec with is associated payload * @param payload the payload associated with the payload * same as getPayload() - * @return the address of the codec or 0 + * @return the name of the codec */ - AudioCodec* getCodec(CodecType payload); + std::string& getCodecName(CodecType payload); + + void init(); /** - * Get codec with is associated payload - * Put a codec active, with it's codec's _description - * O(n) if not found where n is the number of element - * @param codecDescription is the same as with getCodec(number)->getDescription() + * Check in the map codec if the specified codec is supported + * @param payload unique identifier of a codec (RFC) + * @return true if the codec specified is supported + * false otherwise */ - void setActive(const std::string& codecDescription); - void setInactive(const std::string& codecDescription); + bool isSupported(CodecType payload); + + /** + * Remove the codec with payload payload from the list + * @param payload the codec to erase + */ + void removeCodec(CodecType payload); + + /** + * Add a codec in the list. + * @param payload the codec to add + */ + void addCodec(CodecType payload); + + /** + * Get the bit rate of the specified codec. + * @param payload The payload of the codec + * @return double The bit rate + */ + double getBitRate(CodecType payload); + + /** + * Get the bandwidth for one call with the specified codec. + * The value has been calculated with the further information: + * RTp communication, SIP protocol (the value with IAX2 is very close), no RTCP, one simultaneous call, for one channel (the incoming one). + * @param payload The payload of the codec + * @return double The bandwidth + */ + double getBandwidthPerCall(CodecType payload); + + + /** + * Get the clock rate of the specified codec + * @param payload The payload of the codec + * @return int The clock rate of the specified codec + */ + int getSampleRate(CodecType payload); private: CodecMap _codecMap; }; diff --git a/src/audio/codec_alaw.so b/src/audio/codec_alaw.so new file mode 100755 index 0000000000000000000000000000000000000000..9c1a8446e9dd3b0662deef9bce208deadac3401e Binary files /dev/null and b/src/audio/codec_alaw.so differ diff --git a/src/audio/codec_gsm.so b/src/audio/codec_gsm.so new file mode 100755 index 0000000000000000000000000000000000000000..16846e53f4752c1f9bd4569ee056bd7aaec04782 Binary files /dev/null and b/src/audio/codec_gsm.so differ diff --git a/src/audio/codec_ilbc.so b/src/audio/codec_ilbc.so new file mode 100755 index 0000000000000000000000000000000000000000..28b1ae6dc3b2f617159f698be82fa514184492ee Binary files /dev/null and b/src/audio/codec_ilbc.so differ diff --git a/src/audio/codec_ulaw.so b/src/audio/codec_ulaw.so new file mode 100755 index 0000000000000000000000000000000000000000..3cdfe0f32e8905a4dd86b4f2f8ce6597ca364655 Binary files /dev/null and b/src/audio/codec_ulaw.so differ diff --git a/src/audio/gsm/Makefile.am b/src/audio/gsm/Makefile.am deleted file mode 100644 index 10c9a00019bb1a477ec1c641ded0ebf89aa3d436..0000000000000000000000000000000000000000 --- a/src/audio/gsm/Makefile.am +++ /dev/null @@ -1,26 +0,0 @@ -#EXTRA_DIST = ChangeLog INSTALL MACHINES MANIFEST README COPYRIGHT - -noinst_LTLIBRARIES = libgsm.la - -noinst_HEADERS = config.h gsm.h private.h proto.h toast.h unproto.h - -libgsm_la_SOURCES = \ - add.c\ - gsm_create.c\ - gsm_explode.c\ - long_term.c\ - short_term.c\ - code.c\ - gsm_decode.c\ - gsm_implode.c\ - lpc.c\ - table.c\ - debug.c\ - gsm_destroy.c\ - gsm_option.c\ - preprocess.c\ - decode.c\ - gsm_encode.c\ - gsm_print.c\ - rpe.c - diff --git a/src/audio/gsm/add.c b/src/audio/gsm/add.c deleted file mode 100644 index 21ccfabe7b6fb663e739cd7bc08ba45d92151acd..0000000000000000000000000000000000000000 --- a/src/audio/gsm/add.c +++ /dev/null @@ -1,235 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -/* - * See private.h for the more commonly used macro versions. - */ - -#include <stdio.h> -#include <assert.h> - -#include "private.h" -#include "gsm.h" -#include "proto.h" - -#define saturate(x) \ - ((x) < MIN_WORD ? MIN_WORD : (x) > MAX_WORD ? MAX_WORD: (x)) - -word gsm_add P2((a,b), word a, word b) -{ - longword sum = (longword)a + (longword)b; - return saturate(sum); -} - -word gsm_sub P2((a,b), word a, word b) -{ - longword diff = (longword)a - (longword)b; - return saturate(diff); -} - -word gsm_mult P2((a,b), word a, word b) -{ - if (a == MIN_WORD && b == MIN_WORD) return MAX_WORD; - else return SASR( (longword)a * (longword)b, 15 ); -} - -word gsm_mult_r P2((a,b), word a, word b) -{ - if (b == MIN_WORD && a == MIN_WORD) return MAX_WORD; - else { - longword prod = (longword)a * (longword)b + 16384; - prod >>= 15; - return prod & 0xFFFF; - } -} - -word gsm_abs P1((a), word a) -{ - return a < 0 ? (a == MIN_WORD ? MAX_WORD : -a) : a; -} - -longword gsm_L_mult P2((a,b),word a, word b) -{ - assert( a != MIN_WORD || b != MIN_WORD ); - return ((longword)a * (longword)b) << 1; -} - -longword gsm_L_add P2((a,b), longword a, longword b) -{ - if (a < 0) { - if (b >= 0) return a + b; - else { - ulongword A = (ulongword)-(a + 1) + (ulongword)-(b + 1); - return A >= MAX_LONGWORD ? MIN_LONGWORD :-(longword)A-2; - } - } - else if (b <= 0) return a + b; - else { - ulongword A = (ulongword)a + (ulongword)b; - return A > MAX_LONGWORD ? MAX_LONGWORD : A; - } -} - -longword gsm_L_sub P2((a,b), longword a, longword b) -{ - if (a >= 0) { - if (b >= 0) return a - b; - else { - /* a>=0, b<0 */ - - ulongword A = (ulongword)a + -(b + 1); - return A >= MAX_LONGWORD ? MAX_LONGWORD : (A + 1); - } - } - else if (b <= 0) return a - b; - else { - /* a<0, b>0 */ - - ulongword A = (ulongword)-(a + 1) + b; - return A >= MAX_LONGWORD ? MIN_LONGWORD : -(longword)A - 1; - } -} - -static unsigned char const bitoff[ 256 ] = { - 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -word gsm_norm P1((a), longword a ) -/* - * the number of left shifts needed to normalize the 32 bit - * variable L_var1 for positive values on the interval - * - * with minimum of - * minimum of 1073741824 (01000000000000000000000000000000) and - * maximum of 2147483647 (01111111111111111111111111111111) - * - * - * and for negative values on the interval with - * minimum of -2147483648 (-10000000000000000000000000000000) and - * maximum of -1073741824 ( -1000000000000000000000000000000). - * - * in order to normalize the result, the following - * operation must be done: L_norm_var1 = L_var1 << norm( L_var1 ); - * - * (That's 'ffs', only from the left, not the right..) - */ -{ - assert(a != 0); - - if (a < 0) { - if (a <= -1073741824) return 0; - a = ~a; - } - - return a & 0xffff0000 - ? ( a & 0xff000000 - ? -1 + bitoff[ 0xFF & (a >> 24) ] - : 7 + bitoff[ 0xFF & (a >> 16) ] ) - : ( a & 0xff00 - ? 15 + bitoff[ 0xFF & (a >> 8) ] - : 23 + bitoff[ 0xFF & a ] ); -} - -longword gsm_L_asl P2((a,n), longword a, int n) -{ - if (n >= 32) return 0; - if (n <= -32) return -(a < 0); - if (n < 0) return gsm_L_asr(a, -n); - return a << n; -} - -word gsm_asl P2((a,n), word a, int n) -{ - if (n >= 16) return 0; - if (n <= -16) return -(a < 0); - if (n < 0) return gsm_asr(a, -n); - return a << n; -} - -longword gsm_L_asr P2((a,n), longword a, int n) -{ - if (n >= 32) return -(a < 0); - if (n <= -32) return 0; - if (n < 0) return a << -n; - -# ifdef SASR - return a >> n; -# else - if (a >= 0) return a >> n; - else return -(longword)( -(ulongword)a >> n ); -# endif -} - -word gsm_asr P2((a,n), word a, int n) -{ - if (n >= 16) return -(a < 0); - if (n <= -16) return 0; - if (n < 0) return a << -n; - -# ifdef SASR - return a >> n; -# else - if (a >= 0) return a >> n; - else return -(word)( -(uword)a >> n ); -# endif -} - -/* - * (From p. 46, end of section 4.2.5) - * - * NOTE: The following lines gives [sic] one correct implementation - * of the div(num, denum) arithmetic operation. Compute div - * which is the integer division of num by denum: with denum - * >= num > 0 - */ - -word gsm_div P2((num,denum), word num, word denum) -{ - longword L_num = num; - longword L_denum = denum; - word div = 0; - int k = 15; - - /* The parameter num sometimes becomes zero. - * Although this is explicitly guarded against in 4.2.5, - * we assume that the result should then be zero as well. - */ - - /* assert(num != 0); */ - - assert(num >= 0 && denum >= num); - if (num == 0) - return 0; - - while (k--) { - div <<= 1; - L_num <<= 1; - - if (L_num >= L_denum) { - L_num -= L_denum; - div++; - } - } - - return div; -} diff --git a/src/audio/gsm/code.c b/src/audio/gsm/code.c deleted file mode 100644 index 90593dc9aa7c10f547471548155f1dd75b1e9ba4..0000000000000000000000000000000000000000 --- a/src/audio/gsm/code.c +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include "config.h" - - -/* - #ifdef HAS_STDLIB_H -//#include <stdlib.h> -*/ -#ifdef HAS_STRING_H -#include <string.h> -#else -# include "proto.h" - extern char * memcpy P((char *, char *, int)); -#endif - -#include "private.h" -#include "gsm.h" -#include "proto.h" - -/* - * 4.2 FIXED POINT IMPLEMENTATION OF THE RPE-LTP CODER - */ - -void Gsm_Coder P8((S,s,LARc,Nc,bc,Mc,xmaxc,xMc), - - struct gsm_state * S, - - word * s, /* [0..159] samples IN */ - -/* - * The RPE-LTD coder works on a frame by frame basis. The length of - * the frame is equal to 160 samples. Some computations are done - * once per frame to produce at the output of the coder the - * LARc[1..8] parameters which are the coded LAR coefficients and - * also to realize the inverse filtering operation for the entire - * frame (160 samples of signal d[0..159]). These parts produce at - * the output of the coder: - */ - - word * LARc, /* [0..7] LAR coefficients OUT */ - -/* - * Procedure 4.2.11 to 4.2.18 are to be executed four times per - * frame. That means once for each sub-segment RPE-LTP analysis of - * 40 samples. These parts produce at the output of the coder: - */ - - word * Nc, /* [0..3] LTP lag OUT */ - word * bc, /* [0..3] coded LTP gain OUT */ - word * Mc, /* [0..3] RPE grid selection OUT */ - word * xmaxc,/* [0..3] Coded maximum amplitude OUT */ - word * xMc /* [13*4] normalized RPE samples OUT */ -) -{ - int k; - word * dp = S->dp0 + 120; /* [ -120...-1 ] */ - word * dpp = dp; /* [ 0...39 ] */ - - static word e[50]; - - word so[160]; - - Gsm_Preprocess (S, s, so); - Gsm_LPC_Analysis (S, so, LARc); - Gsm_Short_Term_Analysis_Filter (S, LARc, so); - - for (k = 0; k <= 3; k++, xMc += 13) { - - Gsm_Long_Term_Predictor ( S, - so+k*40, /* d [0..39] IN */ - dp, /* dp [-120..-1] IN */ - e + 5, /* e [0..39] OUT */ - dpp, /* dpp [0..39] OUT */ - Nc++, - bc++); - - Gsm_RPE_Encoding ( S, - e + 5, /* e ][0..39][ IN/OUT */ - xmaxc++, Mc++, xMc ); - /* - * Gsm_Update_of_reconstructed_short_time_residual_signal - * ( dpp, e + 5, dp ); - */ - - { register int i; - register longword ltmp; - for (i = 0; i <= 39; i++) - dp[ i ] = GSM_ADD( e[5 + i], dpp[i] ); - } - dp += 40; - dpp += 40; - - } - (void)memcpy( (char *)S->dp0, (char *)(S->dp0 + 160), - 120 * sizeof(*S->dp0) ); -} diff --git a/src/audio/gsm/config.h b/src/audio/gsm/config.h deleted file mode 100644 index ad57d91faf32c4056070b3c89c77e0c47468a651..0000000000000000000000000000000000000000 --- a/src/audio/gsm/config.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/*$Header$*/ - -#ifndef CONFIG_H -#define CONFIG_H - -/*efine SIGHANDLER_T int */ /* signal handlers are void */ -/*efine HAS_SYSV_SIGNAL 1 */ /* sigs not blocked/reset? */ - -#define HAS_STDLIB_H 1 /* /usr/include/stdlib.h */ -/*efine HAS_LIMITS_H 1 */ /* /usr/include/limits.h */ -#define HAS_FCNTL_H 1 /* /usr/include/fcntl.h */ -/*efine HAS_ERRNO_DECL 1 */ /* errno.h declares errno */ - -#define HAS_FSTAT 1 /* fstat syscall */ -#define HAS_FCHMOD 1 /* fchmod syscall */ -#define HAS_CHMOD 1 /* chmod syscall */ -#define HAS_FCHOWN 1 /* fchown syscall */ -#define HAS_CHOWN 1 /* chown syscall */ -/*efine HAS__FSETMODE 1 */ /* _fsetmode -- set file mode */ - -#define HAS_STRING_H 1 /* /usr/include/string.h */ -/*efine HAS_STRINGS_H 1 */ /* /usr/include/strings.h */ - -#define HAS_UNISTD_H 1 /* /usr/include/unistd.h */ -#define HAS_UTIME 1 /* POSIX utime(path, times) */ -/*efine HAS_UTIMES 1 */ /* use utimes() syscall instead */ -#define HAS_UTIME_H 1 /* UTIME header file */ -/*efine HAS_UTIMBUF 1 */ /* struct utimbuf */ -/*efine HAS_UTIMEUSEC 1*/ /* microseconds in utimbuf? */ - -#endif /* CONFIG_H */ diff --git a/src/audio/gsm/debug.c b/src/audio/gsm/debug.c deleted file mode 100644 index e05210428f3ee87732c887e9e0cf5cfbb07ea17d..0000000000000000000000000000000000000000 --- a/src/audio/gsm/debug.c +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include "private.h" - -#ifndef NDEBUG - -/* If NDEBUG _is_ defined and no debugging should be performed, - * calls to functions in this module are #defined to nothing - * in private.h. - */ - -#include <stdio.h> -#include "proto.h" - -void gsm_debug_words P4( (name, from, to, ptr), - char * name, - int from, - int to, - word * ptr) -{ - int nprinted = 0; - - fprintf( stderr, "%s [%d .. %d]: ", name, from, to ); - while (from <= to) { - fprintf(stderr, "%d ", ptr[ from ] ); - from++; - if (nprinted++ >= 7) { - nprinted = 0; - if (from < to) putc('\n', stderr); - } - } - putc('\n', stderr); -} - -void gsm_debug_longwords P4( (name, from, to, ptr), - char * name, - int from, - int to, - longword * ptr) -{ - int nprinted = 0; - - fprintf( stderr, "%s [%d .. %d]: ", name, from, to ); - while (from <= to) { - - fprintf(stderr, "%ld ", ptr[ from ] ); - from++; - if (nprinted++ >= 7) { - nprinted = 0; - if (from < to) putc('\n', stderr); - } - } - putc('\n', stderr); -} - -void gsm_debug_longword P2( (name, value), - char * name, - longword value ) -{ - fprintf(stderr, "%s: %ld\n", name, (long)value ); -} - -void gsm_debug_word P2( (name, value), - char * name, - word value ) -{ - fprintf(stderr, "%s: %ld\n", name, (long)value); -} - -#endif diff --git a/src/audio/gsm/decode.c b/src/audio/gsm/decode.c deleted file mode 100644 index 34e5586633af1bf58fb73ad7220d20aef641bdbb..0000000000000000000000000000000000000000 --- a/src/audio/gsm/decode.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include <stdio.h> - -#include "private.h" -#include "gsm.h" -#include "proto.h" - -/* - * 4.3 FIXED POINT IMPLEMENTATION OF THE RPE-LTP DECODER - */ - -static void Postprocessing P2((S,s), - struct gsm_state * S, - register word * s) -{ - register int k; - register word msr = S->msr; - register longword ltmp; /* for GSM_ADD */ - register word tmp; - - for (k = 160; k--; s++) { - tmp = GSM_MULT_R( msr, 28180 ); - msr = GSM_ADD(*s, tmp); /* Deemphasis */ - *s = GSM_ADD(msr, msr) & 0xFFF8; /* Truncation & Upscaling */ - } - S->msr = msr; -} - -void Gsm_Decoder P8((S,LARcr, Ncr,bcr,Mcr,xmaxcr,xMcr,s), - struct gsm_state * S, - - word * LARcr, /* [0..7] IN */ - - word * Ncr, /* [0..3] IN */ - word * bcr, /* [0..3] IN */ - word * Mcr, /* [0..3] IN */ - word * xmaxcr, /* [0..3] IN */ - word * xMcr, /* [0..13*4] IN */ - - word * s) /* [0..159] OUT */ -{ - int j, k; - word erp[40], wt[160]; - word * drp = S->dp0 + 120; - - for (j=0; j <= 3; j++, xmaxcr++, bcr++, Ncr++, Mcr++, xMcr += 13) { - - Gsm_RPE_Decoding( S, *xmaxcr, *Mcr, xMcr, erp ); - Gsm_Long_Term_Synthesis_Filtering( S, *Ncr, *bcr, erp, drp ); - - for (k = 0; k <= 39; k++) wt[ j * 40 + k ] = drp[ k ]; - } - - Gsm_Short_Term_Synthesis_Filter( S, LARcr, wt, s ); - Postprocessing(S, s); -} diff --git a/src/audio/gsm/gsm.h b/src/audio/gsm/gsm.h deleted file mode 100644 index 81065e51290283a971c77279a5d913aef2f3f57a..0000000000000000000000000000000000000000 --- a/src/audio/gsm/gsm.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/*$Header$*/ - -#ifndef GSM_H -#define GSM_H - -#ifdef __cplusplus -# define NeedFunctionPrototypes 1 -#endif - -#if __STDC__ -# define NeedFunctionPrototypes 1 -#endif - -#ifdef _NO_PROTO -# undef NeedFunctionPrototypes -#endif - -#ifdef NeedFunctionPrototypes -# include <stdio.h> /* for FILE * */ -#endif - -#undef GSM_P -#if NeedFunctionPrototypes -# define GSM_P( protos ) protos -#else -# define GSM_P( protos ) ( /* protos */ ) -#endif - -/* - * Interface - */ - -typedef struct gsm_state * gsm; -typedef short gsm_signal; /* signed 16 bit */ -typedef unsigned char gsm_byte; -typedef gsm_byte gsm_frame[33]; /* 33 * 8 bits */ - -#define GSM_MAGIC 0xD /* 13 kbit/s RPE-LTP */ - -#define GSM_PATCHLEVEL 10 -#define GSM_MINOR 0 -#define GSM_MAJOR 1 - -#define GSM_OPT_VERBOSE 1 -#define GSM_OPT_FAST 2 -#define GSM_OPT_LTP_CUT 3 -#define GSM_OPT_WAV49 4 -#define GSM_OPT_FRAME_INDEX 5 -#define GSM_OPT_FRAME_CHAIN 6 - -extern gsm gsm_create GSM_P((void)); -extern void gsm_destroy GSM_P((gsm)); - -extern int gsm_print GSM_P((FILE *, gsm, gsm_byte *)); -extern int gsm_option GSM_P((gsm, int, int *)); - -extern void gsm_encode GSM_P((gsm, gsm_signal *, gsm_byte *)); -extern int gsm_decode GSM_P((gsm, gsm_byte *, gsm_signal *)); - -extern int gsm_explode GSM_P((gsm, gsm_byte *, gsm_signal *)); -extern void gsm_implode GSM_P((gsm, gsm_signal *, gsm_byte *)); - -#undef GSM_P - -#endif /* GSM_H */ diff --git a/src/audio/gsm/gsm_create.c b/src/audio/gsm/gsm_create.c deleted file mode 100644 index a59aa2f2a38335b87ac0d943a5b1787bd3450ae2..0000000000000000000000000000000000000000 --- a/src/audio/gsm/gsm_create.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -static char const ident[] = "$Header$"; - -#include "config.h" - -#ifdef HAS_STRING_H -#include <string.h> -#else -# include "proto.h" - extern char * memset P((char *, int, int)); -#endif - -#ifdef HAS_STDLIB_H -# include <stdlib.h> -#else -# ifdef HAS_MALLOC_H -# include <malloc.h> -# else - extern char * malloc(); -# endif -#endif - -#include <stdio.h> - -#include "gsm.h" -#include "private.h" -#include "proto.h" - -gsm gsm_create P0() -{ - gsm r; - - r = (gsm)malloc(sizeof(struct gsm_state)); - if (!r) return r; - - memset((char *)r, 0, sizeof(*r)); - r->nrp = 40; - - return r; -} diff --git a/src/audio/gsm/gsm_decode.c b/src/audio/gsm/gsm_decode.c deleted file mode 100644 index 7318ba2d4d801ea8f6dee4a2558a61bb92ca594b..0000000000000000000000000000000000000000 --- a/src/audio/gsm/gsm_decode.c +++ /dev/null @@ -1,361 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include "private.h" - -#include "gsm.h" -#include "proto.h" - -int gsm_decode P3((s, c, target), gsm s, gsm_byte * c, gsm_signal * target) -{ - word LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4]; - -#ifdef WAV49 - if (s->wav_fmt) { - - uword sr = 0; - - s->frame_index = !s->frame_index; - if (s->frame_index) { - - sr = *c++; - LARc[0] = sr & 0x3f; sr >>= 6; - sr |= (uword)*c++ << 2; - LARc[1] = sr & 0x3f; sr >>= 6; - sr |= (uword)*c++ << 4; - LARc[2] = sr & 0x1f; sr >>= 5; - LARc[3] = sr & 0x1f; sr >>= 5; - sr |= (uword)*c++ << 2; - LARc[4] = sr & 0xf; sr >>= 4; - LARc[5] = sr & 0xf; sr >>= 4; - sr |= (uword)*c++ << 2; /* 5 */ - LARc[6] = sr & 0x7; sr >>= 3; - LARc[7] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 4; - Nc[0] = sr & 0x7f; sr >>= 7; - bc[0] = sr & 0x3; sr >>= 2; - Mc[0] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 1; - xmaxc[0] = sr & 0x3f; sr >>= 6; - xmc[0] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[1] = sr & 0x7; sr >>= 3; - xmc[2] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[3] = sr & 0x7; sr >>= 3; - xmc[4] = sr & 0x7; sr >>= 3; - xmc[5] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; /* 10 */ - xmc[6] = sr & 0x7; sr >>= 3; - xmc[7] = sr & 0x7; sr >>= 3; - xmc[8] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[9] = sr & 0x7; sr >>= 3; - xmc[10] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[11] = sr & 0x7; sr >>= 3; - xmc[12] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 4; - Nc[1] = sr & 0x7f; sr >>= 7; - bc[1] = sr & 0x3; sr >>= 2; - Mc[1] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 1; - xmaxc[1] = sr & 0x3f; sr >>= 6; - xmc[13] = sr & 0x7; sr >>= 3; - sr = *c++; /* 15 */ - xmc[14] = sr & 0x7; sr >>= 3; - xmc[15] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[16] = sr & 0x7; sr >>= 3; - xmc[17] = sr & 0x7; sr >>= 3; - xmc[18] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[19] = sr & 0x7; sr >>= 3; - xmc[20] = sr & 0x7; sr >>= 3; - xmc[21] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[22] = sr & 0x7; sr >>= 3; - xmc[23] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[24] = sr & 0x7; sr >>= 3; - xmc[25] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 4; /* 20 */ - Nc[2] = sr & 0x7f; sr >>= 7; - bc[2] = sr & 0x3; sr >>= 2; - Mc[2] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 1; - xmaxc[2] = sr & 0x3f; sr >>= 6; - xmc[26] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[27] = sr & 0x7; sr >>= 3; - xmc[28] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[29] = sr & 0x7; sr >>= 3; - xmc[30] = sr & 0x7; sr >>= 3; - xmc[31] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[32] = sr & 0x7; sr >>= 3; - xmc[33] = sr & 0x7; sr >>= 3; - xmc[34] = sr & 0x7; sr >>= 3; - sr = *c++; /* 25 */ - xmc[35] = sr & 0x7; sr >>= 3; - xmc[36] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[37] = sr & 0x7; sr >>= 3; - xmc[38] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 4; - Nc[3] = sr & 0x7f; sr >>= 7; - bc[3] = sr & 0x3; sr >>= 2; - Mc[3] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 1; - xmaxc[3] = sr & 0x3f; sr >>= 6; - xmc[39] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[40] = sr & 0x7; sr >>= 3; - xmc[41] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; /* 30 */ - xmc[42] = sr & 0x7; sr >>= 3; - xmc[43] = sr & 0x7; sr >>= 3; - xmc[44] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[45] = sr & 0x7; sr >>= 3; - xmc[46] = sr & 0x7; sr >>= 3; - xmc[47] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[48] = sr & 0x7; sr >>= 3; - xmc[49] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[50] = sr & 0x7; sr >>= 3; - xmc[51] = sr & 0x7; sr >>= 3; - - s->frame_chain = sr & 0xf; - } - else { - sr = s->frame_chain; - sr |= (uword)*c++ << 4; /* 1 */ - LARc[0] = sr & 0x3f; sr >>= 6; - LARc[1] = sr & 0x3f; sr >>= 6; - sr = *c++; - LARc[2] = sr & 0x1f; sr >>= 5; - sr |= (uword)*c++ << 3; - LARc[3] = sr & 0x1f; sr >>= 5; - LARc[4] = sr & 0xf; sr >>= 4; - sr |= (uword)*c++ << 2; - LARc[5] = sr & 0xf; sr >>= 4; - LARc[6] = sr & 0x7; sr >>= 3; - LARc[7] = sr & 0x7; sr >>= 3; - sr = *c++; /* 5 */ - Nc[0] = sr & 0x7f; sr >>= 7; - sr |= (uword)*c++ << 1; - bc[0] = sr & 0x3; sr >>= 2; - Mc[0] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 5; - xmaxc[0] = sr & 0x3f; sr >>= 6; - xmc[0] = sr & 0x7; sr >>= 3; - xmc[1] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[2] = sr & 0x7; sr >>= 3; - xmc[3] = sr & 0x7; sr >>= 3; - xmc[4] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[5] = sr & 0x7; sr >>= 3; - xmc[6] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; /* 10 */ - xmc[7] = sr & 0x7; sr >>= 3; - xmc[8] = sr & 0x7; sr >>= 3; - xmc[9] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[10] = sr & 0x7; sr >>= 3; - xmc[11] = sr & 0x7; sr >>= 3; - xmc[12] = sr & 0x7; sr >>= 3; - sr = *c++; - Nc[1] = sr & 0x7f; sr >>= 7; - sr |= (uword)*c++ << 1; - bc[1] = sr & 0x3; sr >>= 2; - Mc[1] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 5; - xmaxc[1] = sr & 0x3f; sr >>= 6; - xmc[13] = sr & 0x7; sr >>= 3; - xmc[14] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; /* 15 */ - xmc[15] = sr & 0x7; sr >>= 3; - xmc[16] = sr & 0x7; sr >>= 3; - xmc[17] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[18] = sr & 0x7; sr >>= 3; - xmc[19] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[20] = sr & 0x7; sr >>= 3; - xmc[21] = sr & 0x7; sr >>= 3; - xmc[22] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[23] = sr & 0x7; sr >>= 3; - xmc[24] = sr & 0x7; sr >>= 3; - xmc[25] = sr & 0x7; sr >>= 3; - sr = *c++; - Nc[2] = sr & 0x7f; sr >>= 7; - sr |= (uword)*c++ << 1; /* 20 */ - bc[2] = sr & 0x3; sr >>= 2; - Mc[2] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 5; - xmaxc[2] = sr & 0x3f; sr >>= 6; - xmc[26] = sr & 0x7; sr >>= 3; - xmc[27] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[28] = sr & 0x7; sr >>= 3; - xmc[29] = sr & 0x7; sr >>= 3; - xmc[30] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[31] = sr & 0x7; sr >>= 3; - xmc[32] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[33] = sr & 0x7; sr >>= 3; - xmc[34] = sr & 0x7; sr >>= 3; - xmc[35] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; /* 25 */ - xmc[36] = sr & 0x7; sr >>= 3; - xmc[37] = sr & 0x7; sr >>= 3; - xmc[38] = sr & 0x7; sr >>= 3; - sr = *c++; - Nc[3] = sr & 0x7f; sr >>= 7; - sr |= (uword)*c++ << 1; - bc[3] = sr & 0x3; sr >>= 2; - Mc[3] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 5; - xmaxc[3] = sr & 0x3f; sr >>= 6; - xmc[39] = sr & 0x7; sr >>= 3; - xmc[40] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[41] = sr & 0x7; sr >>= 3; - xmc[42] = sr & 0x7; sr >>= 3; - xmc[43] = sr & 0x7; sr >>= 3; - sr = *c++; /* 30 */ - xmc[44] = sr & 0x7; sr >>= 3; - xmc[45] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[46] = sr & 0x7; sr >>= 3; - xmc[47] = sr & 0x7; sr >>= 3; - xmc[48] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[49] = sr & 0x7; sr >>= 3; - xmc[50] = sr & 0x7; sr >>= 3; - xmc[51] = sr & 0x7; sr >>= 3; - } - } - else -#endif - { - /* GSM_MAGIC = (*c >> 4) & 0xF; */ - - if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1; - - LARc[0] = (*c++ & 0xF) << 2; /* 1 */ - LARc[0] |= (*c >> 6) & 0x3; - LARc[1] = *c++ & 0x3F; - LARc[2] = (*c >> 3) & 0x1F; - LARc[3] = (*c++ & 0x7) << 2; - LARc[3] |= (*c >> 6) & 0x3; - LARc[4] = (*c >> 2) & 0xF; - LARc[5] = (*c++ & 0x3) << 2; - LARc[5] |= (*c >> 6) & 0x3; - LARc[6] = (*c >> 3) & 0x7; - LARc[7] = *c++ & 0x7; - Nc[0] = (*c >> 1) & 0x7F; - bc[0] = (*c++ & 0x1) << 1; - bc[0] |= (*c >> 7) & 0x1; - Mc[0] = (*c >> 5) & 0x3; - xmaxc[0] = (*c++ & 0x1F) << 1; - xmaxc[0] |= (*c >> 7) & 0x1; - xmc[0] = (*c >> 4) & 0x7; - xmc[1] = (*c >> 1) & 0x7; - xmc[2] = (*c++ & 0x1) << 2; - xmc[2] |= (*c >> 6) & 0x3; - xmc[3] = (*c >> 3) & 0x7; - xmc[4] = *c++ & 0x7; - xmc[5] = (*c >> 5) & 0x7; - xmc[6] = (*c >> 2) & 0x7; - xmc[7] = (*c++ & 0x3) << 1; /* 10 */ - xmc[7] |= (*c >> 7) & 0x1; - xmc[8] = (*c >> 4) & 0x7; - xmc[9] = (*c >> 1) & 0x7; - xmc[10] = (*c++ & 0x1) << 2; - xmc[10] |= (*c >> 6) & 0x3; - xmc[11] = (*c >> 3) & 0x7; - xmc[12] = *c++ & 0x7; - Nc[1] = (*c >> 1) & 0x7F; - bc[1] = (*c++ & 0x1) << 1; - bc[1] |= (*c >> 7) & 0x1; - Mc[1] = (*c >> 5) & 0x3; - xmaxc[1] = (*c++ & 0x1F) << 1; - xmaxc[1] |= (*c >> 7) & 0x1; - xmc[13] = (*c >> 4) & 0x7; - xmc[14] = (*c >> 1) & 0x7; - xmc[15] = (*c++ & 0x1) << 2; - xmc[15] |= (*c >> 6) & 0x3; - xmc[16] = (*c >> 3) & 0x7; - xmc[17] = *c++ & 0x7; - xmc[18] = (*c >> 5) & 0x7; - xmc[19] = (*c >> 2) & 0x7; - xmc[20] = (*c++ & 0x3) << 1; - xmc[20] |= (*c >> 7) & 0x1; - xmc[21] = (*c >> 4) & 0x7; - xmc[22] = (*c >> 1) & 0x7; - xmc[23] = (*c++ & 0x1) << 2; - xmc[23] |= (*c >> 6) & 0x3; - xmc[24] = (*c >> 3) & 0x7; - xmc[25] = *c++ & 0x7; - Nc[2] = (*c >> 1) & 0x7F; - bc[2] = (*c++ & 0x1) << 1; /* 20 */ - bc[2] |= (*c >> 7) & 0x1; - Mc[2] = (*c >> 5) & 0x3; - xmaxc[2] = (*c++ & 0x1F) << 1; - xmaxc[2] |= (*c >> 7) & 0x1; - xmc[26] = (*c >> 4) & 0x7; - xmc[27] = (*c >> 1) & 0x7; - xmc[28] = (*c++ & 0x1) << 2; - xmc[28] |= (*c >> 6) & 0x3; - xmc[29] = (*c >> 3) & 0x7; - xmc[30] = *c++ & 0x7; - xmc[31] = (*c >> 5) & 0x7; - xmc[32] = (*c >> 2) & 0x7; - xmc[33] = (*c++ & 0x3) << 1; - xmc[33] |= (*c >> 7) & 0x1; - xmc[34] = (*c >> 4) & 0x7; - xmc[35] = (*c >> 1) & 0x7; - xmc[36] = (*c++ & 0x1) << 2; - xmc[36] |= (*c >> 6) & 0x3; - xmc[37] = (*c >> 3) & 0x7; - xmc[38] = *c++ & 0x7; - Nc[3] = (*c >> 1) & 0x7F; - bc[3] = (*c++ & 0x1) << 1; - bc[3] |= (*c >> 7) & 0x1; - Mc[3] = (*c >> 5) & 0x3; - xmaxc[3] = (*c++ & 0x1F) << 1; - xmaxc[3] |= (*c >> 7) & 0x1; - xmc[39] = (*c >> 4) & 0x7; - xmc[40] = (*c >> 1) & 0x7; - xmc[41] = (*c++ & 0x1) << 2; - xmc[41] |= (*c >> 6) & 0x3; - xmc[42] = (*c >> 3) & 0x7; - xmc[43] = *c++ & 0x7; /* 30 */ - xmc[44] = (*c >> 5) & 0x7; - xmc[45] = (*c >> 2) & 0x7; - xmc[46] = (*c++ & 0x3) << 1; - xmc[46] |= (*c >> 7) & 0x1; - xmc[47] = (*c >> 4) & 0x7; - xmc[48] = (*c >> 1) & 0x7; - xmc[49] = (*c++ & 0x1) << 2; - xmc[49] |= (*c >> 6) & 0x3; - xmc[50] = (*c >> 3) & 0x7; - xmc[51] = *c & 0x7; /* 33 */ - } - - Gsm_Decoder(s, LARc, Nc, bc, Mc, xmaxc, xmc, target); - - return 0; -} diff --git a/src/audio/gsm/gsm_destroy.c b/src/audio/gsm/gsm_destroy.c deleted file mode 100644 index 4807c0acdda2442411619418bc76671afce875ac..0000000000000000000000000000000000000000 --- a/src/audio/gsm/gsm_destroy.c +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include "gsm.h" -#include "config.h" -#include "proto.h" - -#ifdef HAS_STDLIB_H -# include <stdlib.h> -#else -# ifdef HAS_MALLOC_H -# include <malloc.h> -# else - extern void free(); -# endif -#endif - -void gsm_destroy P1((S), gsm S) -{ - if (S) free((char *)S); -} diff --git a/src/audio/gsm/gsm_encode.c b/src/audio/gsm/gsm_encode.c deleted file mode 100644 index 62338300ee44460597438158e702a59ab58676a1..0000000000000000000000000000000000000000 --- a/src/audio/gsm/gsm_encode.c +++ /dev/null @@ -1,451 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include "private.h" -#include "gsm.h" -#include "proto.h" - -void gsm_encode P3((s, source, c), gsm s, gsm_signal * source, gsm_byte * c) -{ - word LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4]; - - Gsm_Coder(s, source, LARc, Nc, bc, Mc, xmaxc, xmc); - - - /* variable size - - GSM_MAGIC 4 - - LARc[0] 6 - LARc[1] 6 - LARc[2] 5 - LARc[3] 5 - LARc[4] 4 - LARc[5] 4 - LARc[6] 3 - LARc[7] 3 - - Nc[0] 7 - bc[0] 2 - Mc[0] 2 - xmaxc[0] 6 - xmc[0] 3 - xmc[1] 3 - xmc[2] 3 - xmc[3] 3 - xmc[4] 3 - xmc[5] 3 - xmc[6] 3 - xmc[7] 3 - xmc[8] 3 - xmc[9] 3 - xmc[10] 3 - xmc[11] 3 - xmc[12] 3 - - Nc[1] 7 - bc[1] 2 - Mc[1] 2 - xmaxc[1] 6 - xmc[13] 3 - xmc[14] 3 - xmc[15] 3 - xmc[16] 3 - xmc[17] 3 - xmc[18] 3 - xmc[19] 3 - xmc[20] 3 - xmc[21] 3 - xmc[22] 3 - xmc[23] 3 - xmc[24] 3 - xmc[25] 3 - - Nc[2] 7 - bc[2] 2 - Mc[2] 2 - xmaxc[2] 6 - xmc[26] 3 - xmc[27] 3 - xmc[28] 3 - xmc[29] 3 - xmc[30] 3 - xmc[31] 3 - xmc[32] 3 - xmc[33] 3 - xmc[34] 3 - xmc[35] 3 - xmc[36] 3 - xmc[37] 3 - xmc[38] 3 - - Nc[3] 7 - bc[3] 2 - Mc[3] 2 - xmaxc[3] 6 - xmc[39] 3 - xmc[40] 3 - xmc[41] 3 - xmc[42] 3 - xmc[43] 3 - xmc[44] 3 - xmc[45] 3 - xmc[46] 3 - xmc[47] 3 - xmc[48] 3 - xmc[49] 3 - xmc[50] 3 - xmc[51] 3 - */ - -#ifdef WAV49 - - if (s->wav_fmt) { - s->frame_index = !s->frame_index; - if (s->frame_index) { - - uword sr; - - sr = 0; - sr = sr >> 6 | LARc[0] << 10; - sr = sr >> 6 | LARc[1] << 10; - *c++ = sr >> 4; - sr = sr >> 5 | LARc[2] << 11; - *c++ = sr >> 7; - sr = sr >> 5 | LARc[3] << 11; - sr = sr >> 4 | LARc[4] << 12; - *c++ = sr >> 6; - sr = sr >> 4 | LARc[5] << 12; - sr = sr >> 3 | LARc[6] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | LARc[7] << 13; - sr = sr >> 7 | Nc[0] << 9; - *c++ = sr >> 5; - sr = sr >> 2 | bc[0] << 14; - sr = sr >> 2 | Mc[0] << 14; - sr = sr >> 6 | xmaxc[0] << 10; - *c++ = sr >> 3; - sr = sr >> 3 | xmc[0] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[1] << 13; - sr = sr >> 3 | xmc[2] << 13; - sr = sr >> 3 | xmc[3] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[4] << 13; - sr = sr >> 3 | xmc[5] << 13; - sr = sr >> 3 | xmc[6] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[7] << 13; - sr = sr >> 3 | xmc[8] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[9] << 13; - sr = sr >> 3 | xmc[10] << 13; - sr = sr >> 3 | xmc[11] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[12] << 13; - sr = sr >> 7 | Nc[1] << 9; - *c++ = sr >> 5; - sr = sr >> 2 | bc[1] << 14; - sr = sr >> 2 | Mc[1] << 14; - sr = sr >> 6 | xmaxc[1] << 10; - *c++ = sr >> 3; - sr = sr >> 3 | xmc[13] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[14] << 13; - sr = sr >> 3 | xmc[15] << 13; - sr = sr >> 3 | xmc[16] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[17] << 13; - sr = sr >> 3 | xmc[18] << 13; - sr = sr >> 3 | xmc[19] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[20] << 13; - sr = sr >> 3 | xmc[21] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[22] << 13; - sr = sr >> 3 | xmc[23] << 13; - sr = sr >> 3 | xmc[24] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[25] << 13; - sr = sr >> 7 | Nc[2] << 9; - *c++ = sr >> 5; - sr = sr >> 2 | bc[2] << 14; - sr = sr >> 2 | Mc[2] << 14; - sr = sr >> 6 | xmaxc[2] << 10; - *c++ = sr >> 3; - sr = sr >> 3 | xmc[26] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[27] << 13; - sr = sr >> 3 | xmc[28] << 13; - sr = sr >> 3 | xmc[29] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[30] << 13; - sr = sr >> 3 | xmc[31] << 13; - sr = sr >> 3 | xmc[32] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[33] << 13; - sr = sr >> 3 | xmc[34] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[35] << 13; - sr = sr >> 3 | xmc[36] << 13; - sr = sr >> 3 | xmc[37] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[38] << 13; - sr = sr >> 7 | Nc[3] << 9; - *c++ = sr >> 5; - sr = sr >> 2 | bc[3] << 14; - sr = sr >> 2 | Mc[3] << 14; - sr = sr >> 6 | xmaxc[3] << 10; - *c++ = sr >> 3; - sr = sr >> 3 | xmc[39] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[40] << 13; - sr = sr >> 3 | xmc[41] << 13; - sr = sr >> 3 | xmc[42] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[43] << 13; - sr = sr >> 3 | xmc[44] << 13; - sr = sr >> 3 | xmc[45] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[46] << 13; - sr = sr >> 3 | xmc[47] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[48] << 13; - sr = sr >> 3 | xmc[49] << 13; - sr = sr >> 3 | xmc[50] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[51] << 13; - sr = sr >> 4; - *c = sr >> 8; - s->frame_chain = *c; - } - else { - uword sr; - - sr = 0; - sr = sr >> 4 | s->frame_chain << 12; - sr = sr >> 6 | LARc[0] << 10; - *c++ = sr >> 6; - sr = sr >> 6 | LARc[1] << 10; - *c++ = sr >> 8; - sr = sr >> 5 | LARc[2] << 11; - sr = sr >> 5 | LARc[3] << 11; - *c++ = sr >> 6; - sr = sr >> 4 | LARc[4] << 12; - sr = sr >> 4 | LARc[5] << 12; - *c++ = sr >> 6; - sr = sr >> 3 | LARc[6] << 13; - sr = sr >> 3 | LARc[7] << 13; - *c++ = sr >> 8; - sr = sr >> 7 | Nc[0] << 9; - sr = sr >> 2 | bc[0] << 14; - *c++ = sr >> 7; - sr = sr >> 2 | Mc[0] << 14; - sr = sr >> 6 | xmaxc[0] << 10; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[0] << 13; - sr = sr >> 3 | xmc[1] << 13; - sr = sr >> 3 | xmc[2] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[3] << 13; - sr = sr >> 3 | xmc[4] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[5] << 13; - sr = sr >> 3 | xmc[6] << 13; - sr = sr >> 3 | xmc[7] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[8] << 13; - sr = sr >> 3 | xmc[9] << 13; - sr = sr >> 3 | xmc[10] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[11] << 13; - sr = sr >> 3 | xmc[12] << 13; - *c++ = sr >> 8; - sr = sr >> 7 | Nc[1] << 9; - sr = sr >> 2 | bc[1] << 14; - *c++ = sr >> 7; - sr = sr >> 2 | Mc[1] << 14; - sr = sr >> 6 | xmaxc[1] << 10; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[13] << 13; - sr = sr >> 3 | xmc[14] << 13; - sr = sr >> 3 | xmc[15] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[16] << 13; - sr = sr >> 3 | xmc[17] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[18] << 13; - sr = sr >> 3 | xmc[19] << 13; - sr = sr >> 3 | xmc[20] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[21] << 13; - sr = sr >> 3 | xmc[22] << 13; - sr = sr >> 3 | xmc[23] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[24] << 13; - sr = sr >> 3 | xmc[25] << 13; - *c++ = sr >> 8; - sr = sr >> 7 | Nc[2] << 9; - sr = sr >> 2 | bc[2] << 14; - *c++ = sr >> 7; - sr = sr >> 2 | Mc[2] << 14; - sr = sr >> 6 | xmaxc[2] << 10; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[26] << 13; - sr = sr >> 3 | xmc[27] << 13; - sr = sr >> 3 | xmc[28] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[29] << 13; - sr = sr >> 3 | xmc[30] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[31] << 13; - sr = sr >> 3 | xmc[32] << 13; - sr = sr >> 3 | xmc[33] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[34] << 13; - sr = sr >> 3 | xmc[35] << 13; - sr = sr >> 3 | xmc[36] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[37] << 13; - sr = sr >> 3 | xmc[38] << 13; - *c++ = sr >> 8; - sr = sr >> 7 | Nc[3] << 9; - sr = sr >> 2 | bc[3] << 14; - *c++ = sr >> 7; - sr = sr >> 2 | Mc[3] << 14; - sr = sr >> 6 | xmaxc[3] << 10; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[39] << 13; - sr = sr >> 3 | xmc[40] << 13; - sr = sr >> 3 | xmc[41] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[42] << 13; - sr = sr >> 3 | xmc[43] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[44] << 13; - sr = sr >> 3 | xmc[45] << 13; - sr = sr >> 3 | xmc[46] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[47] << 13; - sr = sr >> 3 | xmc[48] << 13; - sr = sr >> 3 | xmc[49] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[50] << 13; - sr = sr >> 3 | xmc[51] << 13; - *c++ = sr >> 8; - } - } - - else - -#endif /* WAV49 */ - { - - *c++ = ((GSM_MAGIC & 0xF) << 4) /* 1 */ - | ((LARc[0] >> 2) & 0xF); - *c++ = ((LARc[0] & 0x3) << 6) - | (LARc[1] & 0x3F); - *c++ = ((LARc[2] & 0x1F) << 3) - | ((LARc[3] >> 2) & 0x7); - *c++ = ((LARc[3] & 0x3) << 6) - | ((LARc[4] & 0xF) << 2) - | ((LARc[5] >> 2) & 0x3); - *c++ = ((LARc[5] & 0x3) << 6) - | ((LARc[6] & 0x7) << 3) - | (LARc[7] & 0x7); - *c++ = ((Nc[0] & 0x7F) << 1) - | ((bc[0] >> 1) & 0x1); - *c++ = ((bc[0] & 0x1) << 7) - | ((Mc[0] & 0x3) << 5) - | ((xmaxc[0] >> 1) & 0x1F); - *c++ = ((xmaxc[0] & 0x1) << 7) - | ((xmc[0] & 0x7) << 4) - | ((xmc[1] & 0x7) << 1) - | ((xmc[2] >> 2) & 0x1); - *c++ = ((xmc[2] & 0x3) << 6) - | ((xmc[3] & 0x7) << 3) - | (xmc[4] & 0x7); - *c++ = ((xmc[5] & 0x7) << 5) /* 10 */ - | ((xmc[6] & 0x7) << 2) - | ((xmc[7] >> 1) & 0x3); - *c++ = ((xmc[7] & 0x1) << 7) - | ((xmc[8] & 0x7) << 4) - | ((xmc[9] & 0x7) << 1) - | ((xmc[10] >> 2) & 0x1); - *c++ = ((xmc[10] & 0x3) << 6) - | ((xmc[11] & 0x7) << 3) - | (xmc[12] & 0x7); - *c++ = ((Nc[1] & 0x7F) << 1) - | ((bc[1] >> 1) & 0x1); - *c++ = ((bc[1] & 0x1) << 7) - | ((Mc[1] & 0x3) << 5) - | ((xmaxc[1] >> 1) & 0x1F); - *c++ = ((xmaxc[1] & 0x1) << 7) - | ((xmc[13] & 0x7) << 4) - | ((xmc[14] & 0x7) << 1) - | ((xmc[15] >> 2) & 0x1); - *c++ = ((xmc[15] & 0x3) << 6) - | ((xmc[16] & 0x7) << 3) - | (xmc[17] & 0x7); - *c++ = ((xmc[18] & 0x7) << 5) - | ((xmc[19] & 0x7) << 2) - | ((xmc[20] >> 1) & 0x3); - *c++ = ((xmc[20] & 0x1) << 7) - | ((xmc[21] & 0x7) << 4) - | ((xmc[22] & 0x7) << 1) - | ((xmc[23] >> 2) & 0x1); - *c++ = ((xmc[23] & 0x3) << 6) - | ((xmc[24] & 0x7) << 3) - | (xmc[25] & 0x7); - *c++ = ((Nc[2] & 0x7F) << 1) /* 20 */ - | ((bc[2] >> 1) & 0x1); - *c++ = ((bc[2] & 0x1) << 7) - | ((Mc[2] & 0x3) << 5) - | ((xmaxc[2] >> 1) & 0x1F); - *c++ = ((xmaxc[2] & 0x1) << 7) - | ((xmc[26] & 0x7) << 4) - | ((xmc[27] & 0x7) << 1) - | ((xmc[28] >> 2) & 0x1); - *c++ = ((xmc[28] & 0x3) << 6) - | ((xmc[29] & 0x7) << 3) - | (xmc[30] & 0x7); - *c++ = ((xmc[31] & 0x7) << 5) - | ((xmc[32] & 0x7) << 2) - | ((xmc[33] >> 1) & 0x3); - *c++ = ((xmc[33] & 0x1) << 7) - | ((xmc[34] & 0x7) << 4) - | ((xmc[35] & 0x7) << 1) - | ((xmc[36] >> 2) & 0x1); - *c++ = ((xmc[36] & 0x3) << 6) - | ((xmc[37] & 0x7) << 3) - | (xmc[38] & 0x7); - *c++ = ((Nc[3] & 0x7F) << 1) - | ((bc[3] >> 1) & 0x1); - *c++ = ((bc[3] & 0x1) << 7) - | ((Mc[3] & 0x3) << 5) - | ((xmaxc[3] >> 1) & 0x1F); - *c++ = ((xmaxc[3] & 0x1) << 7) - | ((xmc[39] & 0x7) << 4) - | ((xmc[40] & 0x7) << 1) - | ((xmc[41] >> 2) & 0x1); - *c++ = ((xmc[41] & 0x3) << 6) /* 30 */ - | ((xmc[42] & 0x7) << 3) - | (xmc[43] & 0x7); - *c++ = ((xmc[44] & 0x7) << 5) - | ((xmc[45] & 0x7) << 2) - | ((xmc[46] >> 1) & 0x3); - *c++ = ((xmc[46] & 0x1) << 7) - | ((xmc[47] & 0x7) << 4) - | ((xmc[48] & 0x7) << 1) - | ((xmc[49] >> 2) & 0x1); - *c++ = ((xmc[49] & 0x3) << 6) - | ((xmc[50] & 0x7) << 3) - | (xmc[51] & 0x7); - - } -} diff --git a/src/audio/gsm/gsm_explode.c b/src/audio/gsm/gsm_explode.c deleted file mode 100644 index a906fc2ed88e5d4fb2502f7646f5182f0e6cbefd..0000000000000000000000000000000000000000 --- a/src/audio/gsm/gsm_explode.c +++ /dev/null @@ -1,417 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include "private.h" -#include "gsm.h" -#include "proto.h" - -int gsm_explode P3((s, c, target), gsm s, gsm_byte * c, gsm_signal * target) -{ -# define LARc target -# define Nc *((gsm_signal (*) [17])(target + 8)) -# define bc *((gsm_signal (*) [17])(target + 9)) -# define Mc *((gsm_signal (*) [17])(target + 10)) -# define xmaxc *((gsm_signal (*) [17])(target + 11)) - - -#ifdef WAV49 - if (s->wav_fmt) { - - uword sr = 0; - - if (s->frame_index == 1) { - - sr = *c++; - LARc[0] = sr & 0x3f; sr >>= 6; - sr |= (uword)*c++ << 2; - LARc[1] = sr & 0x3f; sr >>= 6; - sr |= (uword)*c++ << 4; - LARc[2] = sr & 0x1f; sr >>= 5; - LARc[3] = sr & 0x1f; sr >>= 5; - sr |= (uword)*c++ << 2; - LARc[4] = sr & 0xf; sr >>= 4; - LARc[5] = sr & 0xf; sr >>= 4; - sr |= (uword)*c++ << 2; /* 5 */ - LARc[6] = sr & 0x7; sr >>= 3; - LARc[7] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 4; - Nc[0] = sr & 0x7f; sr >>= 7; - bc[0] = sr & 0x3; sr >>= 2; - Mc[0] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 1; - xmaxc[0] = sr & 0x3f; sr >>= 6; -#undef xmc -#define xmc (target + 12) - xmc[0] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[1] = sr & 0x7; sr >>= 3; - xmc[2] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[3] = sr & 0x7; sr >>= 3; - xmc[4] = sr & 0x7; sr >>= 3; - xmc[5] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; /* 10 */ - xmc[6] = sr & 0x7; sr >>= 3; - xmc[7] = sr & 0x7; sr >>= 3; - xmc[8] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[9] = sr & 0x7; sr >>= 3; - xmc[10] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[11] = sr & 0x7; sr >>= 3; - xmc[12] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 4; - Nc[1] = sr & 0x7f; sr >>= 7; - bc[1] = sr & 0x3; sr >>= 2; - Mc[1] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 1; - xmaxc[1] = sr & 0x3f; sr >>= 6; -#undef xmc -#define xmc (target + 29 - 13) - - xmc[13] = sr & 0x7; sr >>= 3; - sr = *c++; /* 15 */ - xmc[14] = sr & 0x7; sr >>= 3; - xmc[15] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[16] = sr & 0x7; sr >>= 3; - xmc[17] = sr & 0x7; sr >>= 3; - xmc[18] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[19] = sr & 0x7; sr >>= 3; - xmc[20] = sr & 0x7; sr >>= 3; - xmc[21] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[22] = sr & 0x7; sr >>= 3; - xmc[23] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[24] = sr & 0x7; sr >>= 3; - xmc[25] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 4; /* 20 */ - Nc[2] = sr & 0x7f; sr >>= 7; - bc[2] = sr & 0x3; sr >>= 2; - Mc[2] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 1; - xmaxc[2] = sr & 0x3f; sr >>= 6; - -#undef xmc -#define xmc (target + 46 - 26) - - xmc[26] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[27] = sr & 0x7; sr >>= 3; - xmc[28] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[29] = sr & 0x7; sr >>= 3; - xmc[30] = sr & 0x7; sr >>= 3; - xmc[31] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[32] = sr & 0x7; sr >>= 3; - xmc[33] = sr & 0x7; sr >>= 3; - xmc[34] = sr & 0x7; sr >>= 3; - sr = *c++; /* 25 */ - xmc[35] = sr & 0x7; sr >>= 3; - xmc[36] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[37] = sr & 0x7; sr >>= 3; - xmc[38] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 4; - Nc[3] = sr & 0x7f; sr >>= 7; - bc[3] = sr & 0x3; sr >>= 2; - Mc[3] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 1; - xmaxc[3] = sr & 0x3f; sr >>= 6; -#undef xmc -#define xmc (target + 63 - 39) - - xmc[39] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[40] = sr & 0x7; sr >>= 3; - xmc[41] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; /* 30 */ - xmc[42] = sr & 0x7; sr >>= 3; - xmc[43] = sr & 0x7; sr >>= 3; - xmc[44] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[45] = sr & 0x7; sr >>= 3; - xmc[46] = sr & 0x7; sr >>= 3; - xmc[47] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[48] = sr & 0x7; sr >>= 3; - xmc[49] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[50] = sr & 0x7; sr >>= 3; - xmc[51] = sr & 0x7; sr >>= 3; - - s->frame_chain = sr & 0xf; - } - else { - sr = s->frame_chain; - sr |= (uword)*c++ << 4; /* 1 */ - LARc[0] = sr & 0x3f; sr >>= 6; - LARc[1] = sr & 0x3f; sr >>= 6; - sr = *c++; - LARc[2] = sr & 0x1f; sr >>= 5; - sr |= (uword)*c++ << 3; - LARc[3] = sr & 0x1f; sr >>= 5; - LARc[4] = sr & 0xf; sr >>= 4; - sr |= (uword)*c++ << 2; - LARc[5] = sr & 0xf; sr >>= 4; - LARc[6] = sr & 0x7; sr >>= 3; - LARc[7] = sr & 0x7; sr >>= 3; - sr = *c++; /* 5 */ - Nc[0] = sr & 0x7f; sr >>= 7; - sr |= (uword)*c++ << 1; - bc[0] = sr & 0x3; sr >>= 2; - Mc[0] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 5; - xmaxc[0] = sr & 0x3f; sr >>= 6; -#undef xmc -#define xmc (target + 12) - xmc[0] = sr & 0x7; sr >>= 3; - xmc[1] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[2] = sr & 0x7; sr >>= 3; - xmc[3] = sr & 0x7; sr >>= 3; - xmc[4] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[5] = sr & 0x7; sr >>= 3; - xmc[6] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; /* 10 */ - xmc[7] = sr & 0x7; sr >>= 3; - xmc[8] = sr & 0x7; sr >>= 3; - xmc[9] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[10] = sr & 0x7; sr >>= 3; - xmc[11] = sr & 0x7; sr >>= 3; - xmc[12] = sr & 0x7; sr >>= 3; - sr = *c++; - Nc[1] = sr & 0x7f; sr >>= 7; - sr |= (uword)*c++ << 1; - bc[1] = sr & 0x3; sr >>= 2; - Mc[1] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 5; - xmaxc[1] = sr & 0x3f; sr >>= 6; -#undef xmc -#define xmc (target + 29 - 13) - - xmc[13] = sr & 0x7; sr >>= 3; - xmc[14] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; /* 15 */ - xmc[15] = sr & 0x7; sr >>= 3; - xmc[16] = sr & 0x7; sr >>= 3; - xmc[17] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[18] = sr & 0x7; sr >>= 3; - xmc[19] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[20] = sr & 0x7; sr >>= 3; - xmc[21] = sr & 0x7; sr >>= 3; - xmc[22] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[23] = sr & 0x7; sr >>= 3; - xmc[24] = sr & 0x7; sr >>= 3; - xmc[25] = sr & 0x7; sr >>= 3; - sr = *c++; - Nc[2] = sr & 0x7f; sr >>= 7; - sr |= (uword)*c++ << 1; /* 20 */ - bc[2] = sr & 0x3; sr >>= 2; - Mc[2] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 5; - xmaxc[2] = sr & 0x3f; sr >>= 6; -#undef xmc -#define xmc (target + 46 - 26) - xmc[26] = sr & 0x7; sr >>= 3; - xmc[27] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[28] = sr & 0x7; sr >>= 3; - xmc[29] = sr & 0x7; sr >>= 3; - xmc[30] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[31] = sr & 0x7; sr >>= 3; - xmc[32] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[33] = sr & 0x7; sr >>= 3; - xmc[34] = sr & 0x7; sr >>= 3; - xmc[35] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; /* 25 */ - xmc[36] = sr & 0x7; sr >>= 3; - xmc[37] = sr & 0x7; sr >>= 3; - xmc[38] = sr & 0x7; sr >>= 3; - sr = *c++; - Nc[3] = sr & 0x7f; sr >>= 7; - sr |= (uword)*c++ << 1; - bc[3] = sr & 0x3; sr >>= 2; - Mc[3] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 5; - xmaxc[3] = sr & 0x3f; sr >>= 6; - -#undef xmc -#define xmc (target + 63 - 39) - - xmc[39] = sr & 0x7; sr >>= 3; - xmc[40] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[41] = sr & 0x7; sr >>= 3; - xmc[42] = sr & 0x7; sr >>= 3; - xmc[43] = sr & 0x7; sr >>= 3; - sr = *c++; /* 30 */ - xmc[44] = sr & 0x7; sr >>= 3; - xmc[45] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[46] = sr & 0x7; sr >>= 3; - xmc[47] = sr & 0x7; sr >>= 3; - xmc[48] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[49] = sr & 0x7; sr >>= 3; - xmc[50] = sr & 0x7; sr >>= 3; - xmc[51] = sr & 0x7; sr >>= 3; - } - } - else -#endif - { - /* GSM_MAGIC = (*c >> 4) & 0xF; */ - - if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1; - - LARc[0] = (*c++ & 0xF) << 2; /* 1 */ - LARc[0] |= (*c >> 6) & 0x3; - LARc[1] = *c++ & 0x3F; - LARc[2] = (*c >> 3) & 0x1F; - LARc[3] = (*c++ & 0x7) << 2; - LARc[3] |= (*c >> 6) & 0x3; - LARc[4] = (*c >> 2) & 0xF; - LARc[5] = (*c++ & 0x3) << 2; - LARc[5] |= (*c >> 6) & 0x3; - LARc[6] = (*c >> 3) & 0x7; - LARc[7] = *c++ & 0x7; - - Nc[0] = (*c >> 1) & 0x7F; - - bc[0] = (*c++ & 0x1) << 1; - bc[0] |= (*c >> 7) & 0x1; - - Mc[0] = (*c >> 5) & 0x3; - - xmaxc[0] = (*c++ & 0x1F) << 1; - xmaxc[0] |= (*c >> 7) & 0x1; - -#undef xmc -#define xmc (target + 12) - - xmc[0] = (*c >> 4) & 0x7; - xmc[1] = (*c >> 1) & 0x7; - xmc[2] = (*c++ & 0x1) << 2; - xmc[2] |= (*c >> 6) & 0x3; - xmc[3] = (*c >> 3) & 0x7; - xmc[4] = *c++ & 0x7; - xmc[5] = (*c >> 5) & 0x7; - xmc[6] = (*c >> 2) & 0x7; - xmc[7] = (*c++ & 0x3) << 1; /* 10 */ - xmc[7] |= (*c >> 7) & 0x1; - xmc[8] = (*c >> 4) & 0x7; - xmc[9] = (*c >> 1) & 0x7; - xmc[10] = (*c++ & 0x1) << 2; - xmc[10] |= (*c >> 6) & 0x3; - xmc[11] = (*c >> 3) & 0x7; - xmc[12] = *c++ & 0x7; - - Nc[1] = (*c >> 1) & 0x7F; - - bc[1] = (*c++ & 0x1) << 1; - bc[1] |= (*c >> 7) & 0x1; - - Mc[1] = (*c >> 5) & 0x3; - - xmaxc[1] = (*c++ & 0x1F) << 1; - xmaxc[1] |= (*c >> 7) & 0x1; - -#undef xmc -#define xmc (target + 29 - 13) - - xmc[13] = (*c >> 4) & 0x7; - xmc[14] = (*c >> 1) & 0x7; - xmc[15] = (*c++ & 0x1) << 2; - xmc[15] |= (*c >> 6) & 0x3; - xmc[16] = (*c >> 3) & 0x7; - xmc[17] = *c++ & 0x7; - xmc[18] = (*c >> 5) & 0x7; - xmc[19] = (*c >> 2) & 0x7; - xmc[20] = (*c++ & 0x3) << 1; - xmc[20] |= (*c >> 7) & 0x1; - xmc[21] = (*c >> 4) & 0x7; - xmc[22] = (*c >> 1) & 0x7; - xmc[23] = (*c++ & 0x1) << 2; - xmc[23] |= (*c >> 6) & 0x3; - xmc[24] = (*c >> 3) & 0x7; - xmc[25] = *c++ & 0x7; - - Nc[2] = (*c >> 1) & 0x7F; - - bc[2] = (*c++ & 0x1) << 1; /* 20 */ - bc[2] |= (*c >> 7) & 0x1; - - Mc[2] = (*c >> 5) & 0x3; - - xmaxc[2] = (*c++ & 0x1F) << 1; - xmaxc[2] |= (*c >> 7) & 0x1; - -#undef xmc -#define xmc (target + 46 - 26) - - xmc[26] = (*c >> 4) & 0x7; - xmc[27] = (*c >> 1) & 0x7; - xmc[28] = (*c++ & 0x1) << 2; - xmc[28] |= (*c >> 6) & 0x3; - xmc[29] = (*c >> 3) & 0x7; - xmc[30] = *c++ & 0x7; - xmc[31] = (*c >> 5) & 0x7; - xmc[32] = (*c >> 2) & 0x7; - xmc[33] = (*c++ & 0x3) << 1; - xmc[33] |= (*c >> 7) & 0x1; - xmc[34] = (*c >> 4) & 0x7; - xmc[35] = (*c >> 1) & 0x7; - xmc[36] = (*c++ & 0x1) << 2; - xmc[36] |= (*c >> 6) & 0x3; - xmc[37] = (*c >> 3) & 0x7; - xmc[38] = *c++ & 0x7; - - Nc[3] = (*c >> 1) & 0x7F; - - bc[3] = (*c++ & 0x1) << 1; - bc[3] |= (*c >> 7) & 0x1; - - Mc[3] = (*c >> 5) & 0x3; - - xmaxc[3] = (*c++ & 0x1F) << 1; - xmaxc[3] |= (*c >> 7) & 0x1; - -#undef xmc -#define xmc (target + 63 - 39) - - xmc[39] = (*c >> 4) & 0x7; - xmc[40] = (*c >> 1) & 0x7; - xmc[41] = (*c++ & 0x1) << 2; - xmc[41] |= (*c >> 6) & 0x3; - xmc[42] = (*c >> 3) & 0x7; - xmc[43] = *c++ & 0x7; /* 30 */ - xmc[44] = (*c >> 5) & 0x7; - xmc[45] = (*c >> 2) & 0x7; - xmc[46] = (*c++ & 0x3) << 1; - xmc[46] |= (*c >> 7) & 0x1; - xmc[47] = (*c >> 4) & 0x7; - xmc[48] = (*c >> 1) & 0x7; - xmc[49] = (*c++ & 0x1) << 2; - xmc[49] |= (*c >> 6) & 0x3; - xmc[50] = (*c >> 3) & 0x7; - xmc[51] = *c & 0x7; /* 33 */ - } - - return 0; -} diff --git a/src/audio/gsm/gsm_implode.c b/src/audio/gsm/gsm_implode.c deleted file mode 100644 index 453b8cf390268ac8e140ccd4093faa7a97bc5c3b..0000000000000000000000000000000000000000 --- a/src/audio/gsm/gsm_implode.c +++ /dev/null @@ -1,515 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include "private.h" - -#include "gsm.h" -#include "proto.h" - -void gsm_implode P3((s, source, c), gsm s, gsm_signal * source, gsm_byte * c) -{ - /* variable size index - - GSM_MAGIC 4 - - - LARc[0] 6 0 - LARc[1] 6 1 - LARc[2] 5 2 - LARc[3] 5 3 - LARc[4] 4 4 - LARc[5] 4 5 - LARc[6] 3 6 - LARc[7] 3 7 - - Nc[0] 7 8 - bc[0] 2 9 - Mc[0] 2 10 - xmaxc[0] 6 11 - xmc[0] 3 12 - xmc[1] 3 13 - xmc[2] 3 14 - xmc[3] 3 15 - xmc[4] 3 16 - xmc[5] 3 17 - xmc[6] 3 18 - xmc[7] 3 19 - xmc[8] 3 20 - xmc[9] 3 21 - xmc[10] 3 22 - xmc[11] 3 23 - xmc[12] 3 24 - - Nc[1] 7 25 - bc[1] 2 26 - Mc[1] 2 27 - xmaxc[1] 6 28 - xmc[13] 3 29 - xmc[14] 3 30 - xmc[15] 3 31 - xmc[16] 3 32 - xmc[17] 3 33 - xmc[18] 3 34 - xmc[19] 3 35 - xmc[20] 3 36 - xmc[21] 3 37 - xmc[22] 3 38 - xmc[23] 3 39 - xmc[24] 3 40 - xmc[25] 3 41 - - Nc[2] 7 42 - bc[2] 2 43 - Mc[2] 2 44 - xmaxc[2] 6 45 - xmc[26] 3 46 - xmc[27] 3 47 - xmc[28] 3 48 - xmc[29] 3 49 - xmc[30] 3 50 - xmc[31] 3 51 - xmc[32] 3 52 - xmc[33] 3 53 - xmc[34] 3 54 - xmc[35] 3 55 - xmc[36] 3 56 - xmc[37] 3 57 - xmc[38] 3 58 - - Nc[3] 7 59 - bc[3] 2 60 - Mc[3] 2 61 - xmaxc[3] 6 62 - xmc[39] 3 63 - xmc[40] 3 64 - xmc[41] 3 65 - xmc[42] 3 66 - xmc[43] 3 67 - xmc[44] 3 68 - xmc[45] 3 69 - xmc[46] 3 70 - xmc[47] 3 71 - xmc[48] 3 72 - xmc[49] 3 73 - xmc[50] 3 74 - xmc[51] 3 75 - */ - - /* There are 76 parameters per frame. The first eight are - * unique. The remaining 68 are four identical subframes of - * 17 parameters each. gsm_implode converts from a representation - * of these parameters as values in one array of signed words - * to the "packed" version of a GSM frame. - */ - -# define LARc source -# define Nc *((gsm_signal (*) [17])(source + 8)) -# define bc *((gsm_signal (*) [17])(source + 9)) -# define Mc *((gsm_signal (*) [17])(source + 10)) -# define xmaxc *((gsm_signal (*) [17])(source + 11)) - -#ifdef WAV49 - if (s->wav_fmt) { - - uword sr = 0; - if (s->frame_index == 0) { - - sr = *c++; - LARc[0] = sr & 0x3f; sr >>= 6; - sr |= (uword)*c++ << 2; - LARc[1] = sr & 0x3f; sr >>= 6; - sr |= (uword)*c++ << 4; - LARc[2] = sr & 0x1f; sr >>= 5; - LARc[3] = sr & 0x1f; sr >>= 5; - sr |= (uword)*c++ << 2; - LARc[4] = sr & 0xf; sr >>= 4; - LARc[5] = sr & 0xf; sr >>= 4; - sr |= (uword)*c++ << 2; /* 5 */ - LARc[6] = sr & 0x7; sr >>= 3; - LARc[7] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 4; - Nc[0] = sr & 0x7f; sr >>= 7; - bc[0] = sr & 0x3; sr >>= 2; - Mc[0] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 1; - xmaxc[0] = sr & 0x3f; sr >>= 6; -#undef xmc -#define xmc (source + 12) - xmc[0] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[1] = sr & 0x7; sr >>= 3; - xmc[2] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[3] = sr & 0x7; sr >>= 3; - xmc[4] = sr & 0x7; sr >>= 3; - xmc[5] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; /* 10 */ - xmc[6] = sr & 0x7; sr >>= 3; - xmc[7] = sr & 0x7; sr >>= 3; - xmc[8] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[9] = sr & 0x7; sr >>= 3; - xmc[10] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[11] = sr & 0x7; sr >>= 3; - xmc[12] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 4; - Nc[1] = sr & 0x7f; sr >>= 7; - bc[1] = sr & 0x3; sr >>= 2; - Mc[1] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 1; - xmaxc[1] = sr & 0x3f; sr >>= 6; -#undef xmc -#define xmc (source + 29 - 13) - xmc[13] = sr & 0x7; sr >>= 3; - sr = *c++; /* 15 */ - xmc[14] = sr & 0x7; sr >>= 3; - xmc[15] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[16] = sr & 0x7; sr >>= 3; - xmc[17] = sr & 0x7; sr >>= 3; - xmc[18] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[19] = sr & 0x7; sr >>= 3; - xmc[20] = sr & 0x7; sr >>= 3; - xmc[21] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[22] = sr & 0x7; sr >>= 3; - xmc[23] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[24] = sr & 0x7; sr >>= 3; - xmc[25] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 4; /* 20 */ - Nc[2] = sr & 0x7f; sr >>= 7; - bc[2] = sr & 0x3; sr >>= 2; - Mc[2] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 1; - xmaxc[2] = sr & 0x3f; sr >>= 6; -#undef xmc -#define xmc (source + 46 - 26) - xmc[26] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[27] = sr & 0x7; sr >>= 3; - xmc[28] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[29] = sr & 0x7; sr >>= 3; - xmc[30] = sr & 0x7; sr >>= 3; - xmc[31] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[32] = sr & 0x7; sr >>= 3; - xmc[33] = sr & 0x7; sr >>= 3; - xmc[34] = sr & 0x7; sr >>= 3; - sr = *c++; /* 25 */ - xmc[35] = sr & 0x7; sr >>= 3; - xmc[36] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[37] = sr & 0x7; sr >>= 3; - xmc[38] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 4; - Nc[3] = sr & 0x7f; sr >>= 7; - bc[3] = sr & 0x3; sr >>= 2; - Mc[3] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 1; - xmaxc[3] = sr & 0x3f; sr >>= 6; -#undef xmc -#define xmc (source + 63 - 39) - - xmc[39] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[40] = sr & 0x7; sr >>= 3; - xmc[41] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; /* 30 */ - xmc[42] = sr & 0x7; sr >>= 3; - xmc[43] = sr & 0x7; sr >>= 3; - xmc[44] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[45] = sr & 0x7; sr >>= 3; - xmc[46] = sr & 0x7; sr >>= 3; - xmc[47] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[48] = sr & 0x7; sr >>= 3; - xmc[49] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[50] = sr & 0x7; sr >>= 3; - xmc[51] = sr & 0x7; sr >>= 3; - - s->frame_chain = sr & 0xf; - } - else { - sr = s->frame_chain; - sr |= (uword)*c++ << 4; /* 1 */ - LARc[0] = sr & 0x3f; sr >>= 6; - LARc[1] = sr & 0x3f; sr >>= 6; - sr = *c++; - LARc[2] = sr & 0x1f; sr >>= 5; - sr |= (uword)*c++ << 3; - LARc[3] = sr & 0x1f; sr >>= 5; - LARc[4] = sr & 0xf; sr >>= 4; - sr |= (uword)*c++ << 2; - LARc[5] = sr & 0xf; sr >>= 4; - LARc[6] = sr & 0x7; sr >>= 3; - LARc[7] = sr & 0x7; sr >>= 3; - sr = *c++; /* 5 */ - Nc[0] = sr & 0x7f; sr >>= 7; - sr |= (uword)*c++ << 1; - bc[0] = sr & 0x3; sr >>= 2; - Mc[0] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 5; - xmaxc[0] = sr & 0x3f; sr >>= 6; -#undef xmc -#define xmc (source + 12) - xmc[0] = sr & 0x7; sr >>= 3; - xmc[1] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[2] = sr & 0x7; sr >>= 3; - xmc[3] = sr & 0x7; sr >>= 3; - xmc[4] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[5] = sr & 0x7; sr >>= 3; - xmc[6] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; /* 10 */ - xmc[7] = sr & 0x7; sr >>= 3; - xmc[8] = sr & 0x7; sr >>= 3; - xmc[9] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[10] = sr & 0x7; sr >>= 3; - xmc[11] = sr & 0x7; sr >>= 3; - xmc[12] = sr & 0x7; sr >>= 3; - sr = *c++; - Nc[1] = sr & 0x7f; sr >>= 7; - sr |= (uword)*c++ << 1; - bc[1] = sr & 0x3; sr >>= 2; - Mc[1] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 5; - xmaxc[1] = sr & 0x3f; sr >>= 6; -#undef xmc -#define xmc (source + 29 - 13) - xmc[13] = sr & 0x7; sr >>= 3; - xmc[14] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; /* 15 */ - xmc[15] = sr & 0x7; sr >>= 3; - xmc[16] = sr & 0x7; sr >>= 3; - xmc[17] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[18] = sr & 0x7; sr >>= 3; - xmc[19] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[20] = sr & 0x7; sr >>= 3; - xmc[21] = sr & 0x7; sr >>= 3; - xmc[22] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[23] = sr & 0x7; sr >>= 3; - xmc[24] = sr & 0x7; sr >>= 3; - xmc[25] = sr & 0x7; sr >>= 3; - sr = *c++; - Nc[2] = sr & 0x7f; sr >>= 7; - sr |= (uword)*c++ << 1; /* 20 */ - bc[2] = sr & 0x3; sr >>= 2; - Mc[2] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 5; - xmaxc[2] = sr & 0x3f; sr >>= 6; -#undef xmc -#define xmc (source + 46 - 26) - xmc[26] = sr & 0x7; sr >>= 3; - xmc[27] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[28] = sr & 0x7; sr >>= 3; - xmc[29] = sr & 0x7; sr >>= 3; - xmc[30] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[31] = sr & 0x7; sr >>= 3; - xmc[32] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[33] = sr & 0x7; sr >>= 3; - xmc[34] = sr & 0x7; sr >>= 3; - xmc[35] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; /* 25 */ - xmc[36] = sr & 0x7; sr >>= 3; - xmc[37] = sr & 0x7; sr >>= 3; - xmc[38] = sr & 0x7; sr >>= 3; - sr = *c++; - Nc[3] = sr & 0x7f; sr >>= 7; - sr |= (uword)*c++ << 1; - bc[3] = sr & 0x3; sr >>= 2; - Mc[3] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 5; - xmaxc[3] = sr & 0x3f; sr >>= 6; -#undef xmc -#define xmc (source + 63 - 39) - - xmc[39] = sr & 0x7; sr >>= 3; - xmc[40] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[41] = sr & 0x7; sr >>= 3; - xmc[42] = sr & 0x7; sr >>= 3; - xmc[43] = sr & 0x7; sr >>= 3; - sr = *c++; /* 30 */ - xmc[44] = sr & 0x7; sr >>= 3; - xmc[45] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[46] = sr & 0x7; sr >>= 3; - xmc[47] = sr & 0x7; sr >>= 3; - xmc[48] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[49] = sr & 0x7; sr >>= 3; - xmc[50] = sr & 0x7; sr >>= 3; - xmc[51] = sr & 0x7; sr >>= 3; - } - } - else -#endif - { - - *c++ = ((GSM_MAGIC & 0xF) << 4) /* 1 */ - | ((LARc[0] >> 2) & 0xF); - *c++ = ((LARc[0] & 0x3) << 6) - | (LARc[1] & 0x3F); - *c++ = ((LARc[2] & 0x1F) << 3) - | ((LARc[3] >> 2) & 0x7); - *c++ = ((LARc[3] & 0x3) << 6) - | ((LARc[4] & 0xF) << 2) - | ((LARc[5] >> 2) & 0x3); - *c++ = ((LARc[5] & 0x3) << 6) - | ((LARc[6] & 0x7) << 3) - | (LARc[7] & 0x7); - - - *c++ = ((Nc[0] & 0x7F) << 1) - - - | ((bc[0] >> 1) & 0x1); - *c++ = ((bc[0] & 0x1) << 7) - - - | ((Mc[0] & 0x3) << 5) - - | ((xmaxc[0] >> 1) & 0x1F); - *c++ = ((xmaxc[0] & 0x1) << 7) - -#undef xmc -#define xmc (source + 12) - - | ((xmc[0] & 0x7) << 4) - | ((xmc[1] & 0x7) << 1) - | ((xmc[2] >> 2) & 0x1); - *c++ = ((xmc[2] & 0x3) << 6) - | ((xmc[3] & 0x7) << 3) - | (xmc[4] & 0x7); - *c++ = ((xmc[5] & 0x7) << 5) /* 10 */ - | ((xmc[6] & 0x7) << 2) - | ((xmc[7] >> 1) & 0x3); - *c++ = ((xmc[7] & 0x1) << 7) - | ((xmc[8] & 0x7) << 4) - | ((xmc[9] & 0x7) << 1) - | ((xmc[10] >> 2) & 0x1); - *c++ = ((xmc[10] & 0x3) << 6) - | ((xmc[11] & 0x7) << 3) - | (xmc[12] & 0x7); - - - *c++ = ((Nc[1] & 0x7F) << 1) - - - | ((bc[1] >> 1) & 0x1); - *c++ = ((bc[1] & 0x1) << 7) - - - | ((Mc[1] & 0x3) << 5) - - - | ((xmaxc[1] >> 1) & 0x1F); - *c++ = ((xmaxc[1] & 0x1) << 7) - -#undef xmc -#define xmc (source + 29 - 13) - - | ((xmc[13] & 0x7) << 4) - | ((xmc[14] & 0x7) << 1) - | ((xmc[15] >> 2) & 0x1); - *c++ = ((xmc[15] & 0x3) << 6) - | ((xmc[16] & 0x7) << 3) - | (xmc[17] & 0x7); - *c++ = ((xmc[18] & 0x7) << 5) - | ((xmc[19] & 0x7) << 2) - | ((xmc[20] >> 1) & 0x3); - *c++ = ((xmc[20] & 0x1) << 7) - | ((xmc[21] & 0x7) << 4) - | ((xmc[22] & 0x7) << 1) - | ((xmc[23] >> 2) & 0x1); - *c++ = ((xmc[23] & 0x3) << 6) - | ((xmc[24] & 0x7) << 3) - | (xmc[25] & 0x7); - - - *c++ = ((Nc[2] & 0x7F) << 1) /* 20 */ - - - | ((bc[2] >> 1) & 0x1); - *c++ = ((bc[2] & 0x1) << 7) - - - | ((Mc[2] & 0x3) << 5) - - - | ((xmaxc[2] >> 1) & 0x1F); - *c++ = ((xmaxc[2] & 0x1) << 7) - -#undef xmc -#define xmc (source + 46 - 26) - - | ((xmc[26] & 0x7) << 4) - | ((xmc[27] & 0x7) << 1) - | ((xmc[28] >> 2) & 0x1); - *c++ = ((xmc[28] & 0x3) << 6) - | ((xmc[29] & 0x7) << 3) - | (xmc[30] & 0x7); - *c++ = ((xmc[31] & 0x7) << 5) - | ((xmc[32] & 0x7) << 2) - | ((xmc[33] >> 1) & 0x3); - *c++ = ((xmc[33] & 0x1) << 7) - | ((xmc[34] & 0x7) << 4) - | ((xmc[35] & 0x7) << 1) - | ((xmc[36] >> 2) & 0x1); - *c++ = ((xmc[36] & 0x3) << 6) - | ((xmc[37] & 0x7) << 3) - | (xmc[38] & 0x7); - - - *c++ = ((Nc[3] & 0x7F) << 1) - - - | ((bc[3] >> 1) & 0x1); - *c++ = ((bc[3] & 0x1) << 7) - - - | ((Mc[3] & 0x3) << 5) - - - | ((xmaxc[3] >> 1) & 0x1F); - *c++ = ((xmaxc[3] & 0x1) << 7) - -#undef xmc -#define xmc (source + 63 - 39) - - | ((xmc[39] & 0x7) << 4) - | ((xmc[40] & 0x7) << 1) - | ((xmc[41] >> 2) & 0x1); - *c++ = ((xmc[41] & 0x3) << 6) /* 30 */ - | ((xmc[42] & 0x7) << 3) - | (xmc[43] & 0x7); - *c++ = ((xmc[44] & 0x7) << 5) - | ((xmc[45] & 0x7) << 2) - | ((xmc[46] >> 1) & 0x3); - *c++ = ((xmc[46] & 0x1) << 7) - | ((xmc[47] & 0x7) << 4) - | ((xmc[48] & 0x7) << 1) - | ((xmc[49] >> 2) & 0x1); - *c++ = ((xmc[49] & 0x3) << 6) - | ((xmc[50] & 0x7) << 3) - | (xmc[51] & 0x7); - } -} diff --git a/src/audio/gsm/gsm_option.c b/src/audio/gsm/gsm_option.c deleted file mode 100644 index 2807801328ed2b73d37ecb9cd0e4eec5ee2e9de3..0000000000000000000000000000000000000000 --- a/src/audio/gsm/gsm_option.c +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include "private.h" - -#include "gsm.h" -#include "proto.h" - -int gsm_option P3((r, opt, val), gsm r, int opt, int * val) -{ - int result = -1; - - switch (opt) { - case GSM_OPT_LTP_CUT: -#ifdef LTP_CUT - result = r->ltp_cut; - if (val) r->ltp_cut = *val; -#endif - break; - - case GSM_OPT_VERBOSE: -#ifndef NDEBUG - result = r->verbose; - if (val) r->verbose = *val; -#endif - break; - - case GSM_OPT_FAST: - -#if defined(FAST) && defined(USE_FLOAT_MUL) - result = r->fast; - if (val) r->fast = !!*val; -#endif - break; - - case GSM_OPT_FRAME_CHAIN: - -#ifdef WAV49 - result = r->frame_chain; - if (val) r->frame_chain = *val; -#endif - break; - - case GSM_OPT_FRAME_INDEX: - -#ifdef WAV49 - result = r->frame_index; - if (val) r->frame_index = *val; -#endif - break; - - case GSM_OPT_WAV49: - -#ifdef WAV49 - result = r->wav_fmt; - if (val) r->wav_fmt = !!*val; -#endif - break; - - default: - break; - } - return result; -} diff --git a/src/audio/gsm/gsm_print.c b/src/audio/gsm/gsm_print.c deleted file mode 100644 index af745bc48a0742580ae8a162809f7315f3231aec..0000000000000000000000000000000000000000 --- a/src/audio/gsm/gsm_print.c +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include <stdio.h> - -#include "private.h" - -#include "gsm.h" -#include "proto.h" - -int gsm_print P3((f, s, c), FILE * f, gsm s, gsm_byte * c) -{ - word LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4]; - - /* GSM_MAGIC = (*c >> 4) & 0xF; */ - - if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1; - - LARc[0] = (*c++ & 0xF) << 2; /* 1 */ - LARc[0] |= (*c >> 6) & 0x3; - LARc[1] = *c++ & 0x3F; - LARc[2] = (*c >> 3) & 0x1F; - LARc[3] = (*c++ & 0x7) << 2; - LARc[3] |= (*c >> 6) & 0x3; - LARc[4] = (*c >> 2) & 0xF; - LARc[5] = (*c++ & 0x3) << 2; - LARc[5] |= (*c >> 6) & 0x3; - LARc[6] = (*c >> 3) & 0x7; - LARc[7] = *c++ & 0x7; - - - Nc[0] = (*c >> 1) & 0x7F; - bc[0] = (*c++ & 0x1) << 1; - bc[0] |= (*c >> 7) & 0x1; - Mc[0] = (*c >> 5) & 0x3; - xmaxc[0] = (*c++ & 0x1F) << 1; - xmaxc[0] |= (*c >> 7) & 0x1; - xmc[0] = (*c >> 4) & 0x7; - xmc[1] = (*c >> 1) & 0x7; - xmc[2] = (*c++ & 0x1) << 2; - xmc[2] |= (*c >> 6) & 0x3; - xmc[3] = (*c >> 3) & 0x7; - xmc[4] = *c++ & 0x7; - xmc[5] = (*c >> 5) & 0x7; - xmc[6] = (*c >> 2) & 0x7; - xmc[7] = (*c++ & 0x3) << 1; /* 10 */ - xmc[7] |= (*c >> 7) & 0x1; - xmc[8] = (*c >> 4) & 0x7; - xmc[9] = (*c >> 1) & 0x7; - xmc[10] = (*c++ & 0x1) << 2; - xmc[10] |= (*c >> 6) & 0x3; - xmc[11] = (*c >> 3) & 0x7; - xmc[12] = *c++ & 0x7; - - Nc[1] = (*c >> 1) & 0x7F; - bc[1] = (*c++ & 0x1) << 1; - bc[1] |= (*c >> 7) & 0x1; - Mc[1] = (*c >> 5) & 0x3; - xmaxc[1] = (*c++ & 0x1F) << 1; - xmaxc[1] |= (*c >> 7) & 0x1; - xmc[13] = (*c >> 4) & 0x7; - xmc[14] = (*c >> 1) & 0x7; - xmc[15] = (*c++ & 0x1) << 2; - xmc[15] |= (*c >> 6) & 0x3; - xmc[16] = (*c >> 3) & 0x7; - xmc[17] = *c++ & 0x7; - xmc[18] = (*c >> 5) & 0x7; - xmc[19] = (*c >> 2) & 0x7; - xmc[20] = (*c++ & 0x3) << 1; - xmc[20] |= (*c >> 7) & 0x1; - xmc[21] = (*c >> 4) & 0x7; - xmc[22] = (*c >> 1) & 0x7; - xmc[23] = (*c++ & 0x1) << 2; - xmc[23] |= (*c >> 6) & 0x3; - xmc[24] = (*c >> 3) & 0x7; - xmc[25] = *c++ & 0x7; - - - Nc[2] = (*c >> 1) & 0x7F; - bc[2] = (*c++ & 0x1) << 1; /* 20 */ - bc[2] |= (*c >> 7) & 0x1; - Mc[2] = (*c >> 5) & 0x3; - xmaxc[2] = (*c++ & 0x1F) << 1; - xmaxc[2] |= (*c >> 7) & 0x1; - xmc[26] = (*c >> 4) & 0x7; - xmc[27] = (*c >> 1) & 0x7; - xmc[28] = (*c++ & 0x1) << 2; - xmc[28] |= (*c >> 6) & 0x3; - xmc[29] = (*c >> 3) & 0x7; - xmc[30] = *c++ & 0x7; - xmc[31] = (*c >> 5) & 0x7; - xmc[32] = (*c >> 2) & 0x7; - xmc[33] = (*c++ & 0x3) << 1; - xmc[33] |= (*c >> 7) & 0x1; - xmc[34] = (*c >> 4) & 0x7; - xmc[35] = (*c >> 1) & 0x7; - xmc[36] = (*c++ & 0x1) << 2; - xmc[36] |= (*c >> 6) & 0x3; - xmc[37] = (*c >> 3) & 0x7; - xmc[38] = *c++ & 0x7; - - Nc[3] = (*c >> 1) & 0x7F; - bc[3] = (*c++ & 0x1) << 1; - bc[3] |= (*c >> 7) & 0x1; - Mc[3] = (*c >> 5) & 0x3; - xmaxc[3] = (*c++ & 0x1F) << 1; - xmaxc[3] |= (*c >> 7) & 0x1; - - xmc[39] = (*c >> 4) & 0x7; - xmc[40] = (*c >> 1) & 0x7; - xmc[41] = (*c++ & 0x1) << 2; - xmc[41] |= (*c >> 6) & 0x3; - xmc[42] = (*c >> 3) & 0x7; - xmc[43] = *c++ & 0x7; /* 30 */ - xmc[44] = (*c >> 5) & 0x7; - xmc[45] = (*c >> 2) & 0x7; - xmc[46] = (*c++ & 0x3) << 1; - xmc[46] |= (*c >> 7) & 0x1; - xmc[47] = (*c >> 4) & 0x7; - xmc[48] = (*c >> 1) & 0x7; - xmc[49] = (*c++ & 0x1) << 2; - xmc[49] |= (*c >> 6) & 0x3; - xmc[50] = (*c >> 3) & 0x7; - xmc[51] = *c & 0x7; /* 33 */ - - fprintf(f, - "LARc:\t%2.2d %2.2d %2.2d %2.2d %2.2d %2.2d %2.2d %2.2d\n", - LARc[0],LARc[1],LARc[2],LARc[3],LARc[4],LARc[5],LARc[6],LARc[7]); - - fprintf(f, "#1: Nc %4.4d bc %d Mc %d xmaxc %d\n", - Nc[0], bc[0], Mc[0], xmaxc[0]); - fprintf(f, -"\t%.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d\n", - xmc[0],xmc[1],xmc[2],xmc[3],xmc[4],xmc[5],xmc[6], - xmc[7],xmc[8],xmc[9],xmc[10],xmc[11],xmc[12] ); - - fprintf(f, "#2: Nc %4.4d bc %d Mc %d xmaxc %d\n", - Nc[1], bc[1], Mc[1], xmaxc[1]); - fprintf(f, -"\t%.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d\n", - xmc[13+0],xmc[13+1],xmc[13+2],xmc[13+3],xmc[13+4],xmc[13+5], - xmc[13+6], xmc[13+7],xmc[13+8],xmc[13+9],xmc[13+10],xmc[13+11], - xmc[13+12] ); - - fprintf(f, "#3: Nc %4.4d bc %d Mc %d xmaxc %d\n", - Nc[2], bc[2], Mc[2], xmaxc[2]); - fprintf(f, -"\t%.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d\n", - xmc[26+0],xmc[26+1],xmc[26+2],xmc[26+3],xmc[26+4],xmc[26+5], - xmc[26+6], xmc[26+7],xmc[26+8],xmc[26+9],xmc[26+10],xmc[26+11], - xmc[26+12] ); - - fprintf(f, "#4: Nc %4.4d bc %d Mc %d xmaxc %d\n", - Nc[3], bc[3], Mc[3], xmaxc[3]); - fprintf(f, -"\t%.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d\n", - xmc[39+0],xmc[39+1],xmc[39+2],xmc[39+3],xmc[39+4],xmc[39+5], - xmc[39+6], xmc[39+7],xmc[39+8],xmc[39+9],xmc[39+10],xmc[39+11], - xmc[39+12] ); - - return 0; -} diff --git a/src/audio/gsm/long_term.c b/src/audio/gsm/long_term.c deleted file mode 100644 index fd67bda193f027ed9829b683224622d19adb928c..0000000000000000000000000000000000000000 --- a/src/audio/gsm/long_term.c +++ /dev/null @@ -1,949 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include <stdio.h> -#include <assert.h> - -#include "private.h" - -#include "gsm.h" -#include "proto.h" - -/* - * 4.2.11 .. 4.2.12 LONG TERM PREDICTOR (LTP) SECTION - */ - - -/* - * This module computes the LTP gain (bc) and the LTP lag (Nc) - * for the long term analysis filter. This is done by calculating a - * maximum of the cross-correlation function between the current - * sub-segment short term residual signal d[0..39] (output of - * the short term analysis filter; for simplification the index - * of this array begins at 0 and ends at 39 for each sub-segment of the - * RPE-LTP analysis) and the previous reconstructed short term - * residual signal dp[ -120 .. -1 ]. A dynamic scaling must be - * performed to avoid overflow. - */ - - /* The next procedure exists in six versions. First two integer - * version (if USE_FLOAT_MUL is not defined); then four floating - * point versions, twice with proper scaling (USE_FLOAT_MUL defined), - * once without (USE_FLOAT_MUL and FAST defined, and fast run-time - * option used). Every pair has first a Cut version (see the -C - * option to toast or the LTP_CUT option to gsm_option()), then the - * uncut one. (For a detailed explanation of why this is altogether - * a bad idea, see Henry Spencer and Geoff Collyer, ``#ifdef Considered - * Harmful''.) - */ - -#ifndef USE_FLOAT_MUL - -#ifdef LTP_CUT - -static void Cut_Calculation_of_the_LTP_parameters P5((st, d,dp,bc_out,Nc_out), - - struct gsm_state * st, - - register word * d, /* [0..39] IN */ - register word * dp, /* [-120..-1] IN */ - word * bc_out, /* OUT */ - word * Nc_out /* OUT */ -) -{ - register int k, lambda; - word Nc, bc; - word wt[40]; - - longword L_result; - longword L_max, L_power; - word R, S, dmax, scal, best_k; - word ltp_cut; - - register word temp, wt_k; - - /* Search of the optimum scaling of d[0..39]. - */ - dmax = 0; - for (k = 0; k <= 39; k++) { - temp = d[k]; - temp = GSM_ABS( temp ); - if (temp > dmax) { - dmax = temp; - best_k = k; - } - } - temp = 0; - if (dmax == 0) scal = 0; - else { - assert(dmax > 0); - temp = gsm_norm( (longword)dmax << 16 ); - } - if (temp > 6) scal = 0; - else scal = 6 - temp; - assert(scal >= 0); - - /* Search for the maximum cross-correlation and coding of the LTP lag - */ - L_max = 0; - Nc = 40; /* index for the maximum cross-correlation */ - wt_k = SASR(d[best_k], scal); - - for (lambda = 40; lambda <= 120; lambda++) { - L_result = (longword)wt_k * dp[best_k - lambda]; - if (L_result > L_max) { - Nc = lambda; - L_max = L_result; - } - } - *Nc_out = Nc; - L_max <<= 1; - - /* Rescaling of L_max - */ - assert(scal <= 100 && scal >= -100); - L_max = L_max >> (6 - scal); /* sub(6, scal) */ - - assert( Nc <= 120 && Nc >= 40); - - /* Compute the power of the reconstructed short term residual - * signal dp[..] - */ - L_power = 0; - for (k = 0; k <= 39; k++) { - - register longword L_temp; - - L_temp = SASR( dp[k - Nc], 3 ); - L_power += L_temp * L_temp; - } - L_power <<= 1; /* from L_MULT */ - - /* Normalization of L_max and L_power - */ - - if (L_max <= 0) { - *bc_out = 0; - return; - } - if (L_max >= L_power) { - *bc_out = 3; - return; - } - - temp = gsm_norm( L_power ); - - R = SASR( L_max << temp, 16 ); - S = SASR( L_power << temp, 16 ); - - /* Coding of the LTP gain - */ - - /* Table 4.3a must be used to obtain the level DLB[i] for the - * quantization of the LTP gain b to get the coded version bc. - */ - for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break; - *bc_out = bc; -} - -#endif /* LTP_CUT */ - -static void Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out), - register word * d, /* [0..39] IN */ - register word * dp, /* [-120..-1] IN */ - word * bc_out, /* OUT */ - word * Nc_out /* OUT */ -) -{ - register int k, lambda; - word Nc, bc; - word wt[40]; - - longword L_max, L_power; - word R, S, dmax, scal; - register word temp; - - /* Search of the optimum scaling of d[0..39]. - */ - dmax = 0; - - for (k = 0; k <= 39; k++) { - temp = d[k]; - temp = GSM_ABS( temp ); - if (temp > dmax) dmax = temp; - } - - temp = 0; - if (dmax == 0) scal = 0; - else { - assert(dmax > 0); - temp = gsm_norm( (longword)dmax << 16 ); - } - - if (temp > 6) scal = 0; - else scal = 6 - temp; - - assert(scal >= 0); - - /* Initialization of a working array wt - */ - - for (k = 0; k <= 39; k++) wt[k] = SASR( d[k], scal ); - - /* Search for the maximum cross-correlation and coding of the LTP lag - */ - L_max = 0; - Nc = 40; /* index for the maximum cross-correlation */ - - for (lambda = 40; lambda <= 120; lambda++) { - -# undef STEP -# define STEP(k) (longword)wt[k] * dp[k - lambda] - - register longword L_result; - - L_result = STEP(0) ; L_result += STEP(1) ; - L_result += STEP(2) ; L_result += STEP(3) ; - L_result += STEP(4) ; L_result += STEP(5) ; - L_result += STEP(6) ; L_result += STEP(7) ; - L_result += STEP(8) ; L_result += STEP(9) ; - L_result += STEP(10) ; L_result += STEP(11) ; - L_result += STEP(12) ; L_result += STEP(13) ; - L_result += STEP(14) ; L_result += STEP(15) ; - L_result += STEP(16) ; L_result += STEP(17) ; - L_result += STEP(18) ; L_result += STEP(19) ; - L_result += STEP(20) ; L_result += STEP(21) ; - L_result += STEP(22) ; L_result += STEP(23) ; - L_result += STEP(24) ; L_result += STEP(25) ; - L_result += STEP(26) ; L_result += STEP(27) ; - L_result += STEP(28) ; L_result += STEP(29) ; - L_result += STEP(30) ; L_result += STEP(31) ; - L_result += STEP(32) ; L_result += STEP(33) ; - L_result += STEP(34) ; L_result += STEP(35) ; - L_result += STEP(36) ; L_result += STEP(37) ; - L_result += STEP(38) ; L_result += STEP(39) ; - - if (L_result > L_max) { - - Nc = lambda; - L_max = L_result; - } - } - - *Nc_out = Nc; - - L_max <<= 1; - - /* Rescaling of L_max - */ - assert(scal <= 100 && scal >= -100); - L_max = L_max >> (6 - scal); /* sub(6, scal) */ - - assert( Nc <= 120 && Nc >= 40); - - /* Compute the power of the reconstructed short term residual - * signal dp[..] - */ - L_power = 0; - for (k = 0; k <= 39; k++) { - - register longword L_temp; - - L_temp = SASR( dp[k - Nc], 3 ); - L_power += L_temp * L_temp; - } - L_power <<= 1; /* from L_MULT */ - - /* Normalization of L_max and L_power - */ - - if (L_max <= 0) { - *bc_out = 0; - return; - } - if (L_max >= L_power) { - *bc_out = 3; - return; - } - - temp = gsm_norm( L_power ); - - R = SASR( L_max << temp, 16 ); - S = SASR( L_power << temp, 16 ); - - /* Coding of the LTP gain - */ - - /* Table 4.3a must be used to obtain the level DLB[i] for the - * quantization of the LTP gain b to get the coded version bc. - */ - for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break; - *bc_out = bc; -} - -#else /* USE_FLOAT_MUL */ - -#ifdef LTP_CUT - -static void Cut_Calculation_of_the_LTP_parameters P5((st, d,dp,bc_out,Nc_out), - struct gsm_state * st, /* IN */ - register word * d, /* [0..39] IN */ - register word * dp, /* [-120..-1] IN */ - word * bc_out, /* OUT */ - word * Nc_out /* OUT */ -) -{ - register int k, lambda; - word Nc, bc; - word ltp_cut; - - float wt_float[40]; - float dp_float_base[120], * dp_float = dp_float_base + 120; - - longword L_max, L_power; - word R, S, dmax, scal; - register word temp; - - /* Search of the optimum scaling of d[0..39]. - */ - dmax = 0; - - for (k = 0; k <= 39; k++) { - temp = d[k]; - temp = GSM_ABS( temp ); - if (temp > dmax) dmax = temp; - } - - temp = 0; - if (dmax == 0) scal = 0; - else { - assert(dmax > 0); - temp = gsm_norm( (longword)dmax << 16 ); - } - - if (temp > 6) scal = 0; - else scal = 6 - temp; - - assert(scal >= 0); - ltp_cut = (longword)SASR(dmax, scal) * st->ltp_cut / 100; - - - /* Initialization of a working array wt - */ - - for (k = 0; k < 40; k++) { - register word w = SASR( d[k], scal ); - if (w < 0 ? w > -ltp_cut : w < ltp_cut) { - wt_float[k] = 0.0; - } - else { - wt_float[k] = w; - } - } - for (k = -120; k < 0; k++) dp_float[k] = dp[k]; - - /* Search for the maximum cross-correlation and coding of the LTP lag - */ - L_max = 0; - Nc = 40; /* index for the maximum cross-correlation */ - - for (lambda = 40; lambda <= 120; lambda += 9) { - - /* Calculate L_result for l = lambda .. lambda + 9. - */ - register float *lp = dp_float - lambda; - - register float W; - register float a = lp[-8], b = lp[-7], c = lp[-6], - d = lp[-5], e = lp[-4], f = lp[-3], - g = lp[-2], h = lp[-1]; - register float E; - register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0, - S5 = 0, S6 = 0, S7 = 0, S8 = 0; - -# undef STEP -# define STEP(K, a, b, c, d, e, f, g, h) \ - if ((W = wt_float[K]) != 0.0) { \ - E = W * a; S8 += E; \ - E = W * b; S7 += E; \ - E = W * c; S6 += E; \ - E = W * d; S5 += E; \ - E = W * e; S4 += E; \ - E = W * f; S3 += E; \ - E = W * g; S2 += E; \ - E = W * h; S1 += E; \ - a = lp[K]; \ - E = W * a; S0 += E; } else (a = lp[K]) - -# define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h) -# define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a) -# define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b) -# define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c) -# define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d) -# define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e) -# define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f) -# define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g) - - STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3); - STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7); - - STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11); - STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15); - - STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19); - STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23); - - STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27); - STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31); - - STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35); - STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39); - - if (S0 > L_max) { L_max = S0; Nc = lambda; } - if (S1 > L_max) { L_max = S1; Nc = lambda + 1; } - if (S2 > L_max) { L_max = S2; Nc = lambda + 2; } - if (S3 > L_max) { L_max = S3; Nc = lambda + 3; } - if (S4 > L_max) { L_max = S4; Nc = lambda + 4; } - if (S5 > L_max) { L_max = S5; Nc = lambda + 5; } - if (S6 > L_max) { L_max = S6; Nc = lambda + 6; } - if (S7 > L_max) { L_max = S7; Nc = lambda + 7; } - if (S8 > L_max) { L_max = S8; Nc = lambda + 8; } - - } - *Nc_out = Nc; - - L_max <<= 1; - - /* Rescaling of L_max - */ - assert(scal <= 100 && scal >= -100); - L_max = L_max >> (6 - scal); /* sub(6, scal) */ - - assert( Nc <= 120 && Nc >= 40); - - /* Compute the power of the reconstructed short term residual - * signal dp[..] - */ - L_power = 0; - for (k = 0; k <= 39; k++) { - - register longword L_temp; - - L_temp = SASR( dp[k - Nc], 3 ); - L_power += L_temp * L_temp; - } - L_power <<= 1; /* from L_MULT */ - - /* Normalization of L_max and L_power - */ - - if (L_max <= 0) { - *bc_out = 0; - return; - } - if (L_max >= L_power) { - *bc_out = 3; - return; - } - - temp = gsm_norm( L_power ); - - R = SASR( L_max << temp, 16 ); - S = SASR( L_power << temp, 16 ); - - /* Coding of the LTP gain - */ - - /* Table 4.3a must be used to obtain the level DLB[i] for the - * quantization of the LTP gain b to get the coded version bc. - */ - for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break; - *bc_out = bc; -} - -#endif /* LTP_CUT */ - -static void Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out), - register word * d, /* [0..39] IN */ - register word * dp, /* [-120..-1] IN */ - word * bc_out, /* OUT */ - word * Nc_out /* OUT */ -) -{ - register int k, lambda; - word Nc, bc; - - float wt_float[40]; - float dp_float_base[120], * dp_float = dp_float_base + 120; - - longword L_max, L_power; - word R, S, dmax, scal; - register word temp; - - /* Search of the optimum scaling of d[0..39]. - */ - dmax = 0; - - for (k = 0; k <= 39; k++) { - temp = d[k]; - temp = GSM_ABS( temp ); - if (temp > dmax) dmax = temp; - } - - temp = 0; - if (dmax == 0) scal = 0; - else { - assert(dmax > 0); - temp = gsm_norm( (longword)dmax << 16 ); - } - - if (temp > 6) scal = 0; - else scal = 6 - temp; - - assert(scal >= 0); - - /* Initialization of a working array wt - */ - - for (k = 0; k < 40; k++) wt_float[k] = SASR( d[k], scal ); - for (k = -120; k < 0; k++) dp_float[k] = dp[k]; - - /* Search for the maximum cross-correlation and coding of the LTP lag - */ - L_max = 0; - Nc = 40; /* index for the maximum cross-correlation */ - - for (lambda = 40; lambda <= 120; lambda += 9) { - - /* Calculate L_result for l = lambda .. lambda + 9. - */ - register float *lp = dp_float - lambda; - - register float W; - register float a = lp[-8], b = lp[-7], c = lp[-6], - d = lp[-5], e = lp[-4], f = lp[-3], - g = lp[-2], h = lp[-1]; - register float E; - register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0, - S5 = 0, S6 = 0, S7 = 0, S8 = 0; - -# undef STEP -# define STEP(K, a, b, c, d, e, f, g, h) \ - W = wt_float[K]; \ - E = W * a; S8 += E; \ - E = W * b; S7 += E; \ - E = W * c; S6 += E; \ - E = W * d; S5 += E; \ - E = W * e; S4 += E; \ - E = W * f; S3 += E; \ - E = W * g; S2 += E; \ - E = W * h; S1 += E; \ - a = lp[K]; \ - E = W * a; S0 += E - -# define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h) -# define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a) -# define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b) -# define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c) -# define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d) -# define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e) -# define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f) -# define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g) - - STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3); - STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7); - - STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11); - STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15); - - STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19); - STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23); - - STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27); - STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31); - - STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35); - STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39); - - if (S0 > L_max) { L_max = S0; Nc = lambda; } - if (S1 > L_max) { L_max = S1; Nc = lambda + 1; } - if (S2 > L_max) { L_max = S2; Nc = lambda + 2; } - if (S3 > L_max) { L_max = S3; Nc = lambda + 3; } - if (S4 > L_max) { L_max = S4; Nc = lambda + 4; } - if (S5 > L_max) { L_max = S5; Nc = lambda + 5; } - if (S6 > L_max) { L_max = S6; Nc = lambda + 6; } - if (S7 > L_max) { L_max = S7; Nc = lambda + 7; } - if (S8 > L_max) { L_max = S8; Nc = lambda + 8; } - } - *Nc_out = Nc; - - L_max <<= 1; - - /* Rescaling of L_max - */ - assert(scal <= 100 && scal >= -100); - L_max = L_max >> (6 - scal); /* sub(6, scal) */ - - assert( Nc <= 120 && Nc >= 40); - - /* Compute the power of the reconstructed short term residual - * signal dp[..] - */ - L_power = 0; - for (k = 0; k <= 39; k++) { - - register longword L_temp; - - L_temp = SASR( dp[k - Nc], 3 ); - L_power += L_temp * L_temp; - } - L_power <<= 1; /* from L_MULT */ - - /* Normalization of L_max and L_power - */ - - if (L_max <= 0) { - *bc_out = 0; - return; - } - if (L_max >= L_power) { - *bc_out = 3; - return; - } - - temp = gsm_norm( L_power ); - - R = SASR( L_max << temp, 16 ); - S = SASR( L_power << temp, 16 ); - - /* Coding of the LTP gain - */ - - /* Table 4.3a must be used to obtain the level DLB[i] for the - * quantization of the LTP gain b to get the coded version bc. - */ - for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break; - *bc_out = bc; -} - -#ifdef FAST -#ifdef LTP_CUT - -static void Cut_Fast_Calculation_of_the_LTP_parameters P5((st, - d,dp,bc_out,Nc_out), - struct gsm_state * st, /* IN */ - register word * d, /* [0..39] IN */ - register word * dp, /* [-120..-1] IN */ - word * bc_out, /* OUT */ - word * Nc_out /* OUT */ -) -{ - register int k, lambda; - register float wt_float; - word Nc, bc; - word wt_max, best_k, ltp_cut; - - float dp_float_base[120], * dp_float = dp_float_base + 120; - - register float L_result, L_max, L_power; - - wt_max = 0; - - for (k = 0; k < 40; ++k) { - if ( d[k] > wt_max) wt_max = d[best_k = k]; - else if (-d[k] > wt_max) wt_max = -d[best_k = k]; - } - - assert(wt_max >= 0); - wt_float = (float)wt_max; - - for (k = -120; k < 0; ++k) dp_float[k] = (float)dp[k]; - - /* Search for the maximum cross-correlation and coding of the LTP lag - */ - L_max = 0; - Nc = 40; /* index for the maximum cross-correlation */ - - for (lambda = 40; lambda <= 120; lambda++) { - L_result = wt_float * dp_float[best_k - lambda]; - if (L_result > L_max) { - Nc = lambda; - L_max = L_result; - } - } - - *Nc_out = Nc; - if (L_max <= 0.) { - *bc_out = 0; - return; - } - - /* Compute the power of the reconstructed short term residual - * signal dp[..] - */ - dp_float -= Nc; - L_power = 0; - for (k = 0; k < 40; ++k) { - register float f = dp_float[k]; - L_power += f * f; - } - - if (L_max >= L_power) { - *bc_out = 3; - return; - } - - /* Coding of the LTP gain - * Table 4.3a must be used to obtain the level DLB[i] for the - * quantization of the LTP gain b to get the coded version bc. - */ - lambda = L_max / L_power * 32768.; - for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break; - *bc_out = bc; -} - -#endif /* LTP_CUT */ - -static void Fast_Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out), - register word * d, /* [0..39] IN */ - register word * dp, /* [-120..-1] IN */ - word * bc_out, /* OUT */ - word * Nc_out /* OUT */ -) -{ - register int k, lambda; - word Nc, bc; - - float wt_float[40]; - float dp_float_base[120], * dp_float = dp_float_base + 120; - - register float L_max, L_power; - - for (k = 0; k < 40; ++k) wt_float[k] = (float)d[k]; - for (k = -120; k < 0; ++k) dp_float[k] = (float)dp[k]; - - /* Search for the maximum cross-correlation and coding of the LTP lag - */ - L_max = 0; - Nc = 40; /* index for the maximum cross-correlation */ - - for (lambda = 40; lambda <= 120; lambda += 9) { - - /* Calculate L_result for l = lambda .. lambda + 9. - */ - register float *lp = dp_float - lambda; - - register float W; - register float a = lp[-8], b = lp[-7], c = lp[-6], - d = lp[-5], e = lp[-4], f = lp[-3], - g = lp[-2], h = lp[-1]; - register float E; - register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0, - S5 = 0, S6 = 0, S7 = 0, S8 = 0; - -# undef STEP -# define STEP(K, a, b, c, d, e, f, g, h) \ - W = wt_float[K]; \ - E = W * a; S8 += E; \ - E = W * b; S7 += E; \ - E = W * c; S6 += E; \ - E = W * d; S5 += E; \ - E = W * e; S4 += E; \ - E = W * f; S3 += E; \ - E = W * g; S2 += E; \ - E = W * h; S1 += E; \ - a = lp[K]; \ - E = W * a; S0 += E - -# define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h) -# define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a) -# define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b) -# define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c) -# define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d) -# define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e) -# define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f) -# define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g) - - STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3); - STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7); - - STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11); - STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15); - - STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19); - STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23); - - STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27); - STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31); - - STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35); - STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39); - - if (S0 > L_max) { L_max = S0; Nc = lambda; } - if (S1 > L_max) { L_max = S1; Nc = lambda + 1; } - if (S2 > L_max) { L_max = S2; Nc = lambda + 2; } - if (S3 > L_max) { L_max = S3; Nc = lambda + 3; } - if (S4 > L_max) { L_max = S4; Nc = lambda + 4; } - if (S5 > L_max) { L_max = S5; Nc = lambda + 5; } - if (S6 > L_max) { L_max = S6; Nc = lambda + 6; } - if (S7 > L_max) { L_max = S7; Nc = lambda + 7; } - if (S8 > L_max) { L_max = S8; Nc = lambda + 8; } - } - *Nc_out = Nc; - - if (L_max <= 0.) { - *bc_out = 0; - return; - } - - /* Compute the power of the reconstructed short term residual - * signal dp[..] - */ - dp_float -= Nc; - L_power = 0; - for (k = 0; k < 40; ++k) { - register float f = dp_float[k]; - L_power += f * f; - } - - if (L_max >= L_power) { - *bc_out = 3; - return; - } - - /* Coding of the LTP gain - * Table 4.3a must be used to obtain the level DLB[i] for the - * quantization of the LTP gain b to get the coded version bc. - */ - lambda = L_max / L_power * 32768.; - for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break; - *bc_out = bc; -} - -#endif /* FAST */ -#endif /* USE_FLOAT_MUL */ - - -/* 4.2.12 */ - -static void Long_term_analysis_filtering P6((bc,Nc,dp,d,dpp,e), - word bc, /* IN */ - word Nc, /* IN */ - register word * dp, /* previous d [-120..-1] IN */ - register word * d, /* d [0..39] IN */ - register word * dpp, /* estimate [0..39] OUT */ - register word * e /* long term res. signal [0..39] OUT */ -) -/* - * In this part, we have to decode the bc parameter to compute - * the samples of the estimate dpp[0..39]. The decoding of bc needs the - * use of table 4.3b. The long term residual signal e[0..39] - * is then calculated to be fed to the RPE encoding section. - */ -{ - register int k; - register longword ltmp; - -# undef STEP -# define STEP(BP) \ - for (k = 0; k <= 39; k++) { \ - dpp[k] = GSM_MULT_R( BP, dp[k - Nc]); \ - e[k] = GSM_SUB( d[k], dpp[k] ); \ - } - - switch (bc) { - case 0: STEP( 3277 ); break; - case 1: STEP( 11469 ); break; - case 2: STEP( 21299 ); break; - case 3: STEP( 32767 ); break; - } -} - -void Gsm_Long_Term_Predictor P7((S,d,dp,e,dpp,Nc,bc), /* 4x for 160 samples */ - - struct gsm_state * S, - - word * d, /* [0..39] residual signal IN */ - word * dp, /* [-120..-1] d' IN */ - - word * e, /* [0..39] OUT */ - word * dpp, /* [0..39] OUT */ - word * Nc, /* correlation lag OUT */ - word * bc /* gain factor OUT */ -) -{ - assert( d ); assert( dp ); assert( e ); - assert( dpp); assert( Nc ); assert( bc ); - -#if defined(FAST) && defined(USE_FLOAT_MUL) - if (S->fast) -#if defined (LTP_CUT) - if (S->ltp_cut) - Cut_Fast_Calculation_of_the_LTP_parameters(S, - d, dp, bc, Nc); - else -#endif /* LTP_CUT */ - Fast_Calculation_of_the_LTP_parameters(d, dp, bc, Nc ); - else -#endif /* FAST & USE_FLOAT_MUL */ -#ifdef LTP_CUT - if (S->ltp_cut) - Cut_Calculation_of_the_LTP_parameters(S, d, dp, bc, Nc); - else -#endif - Calculation_of_the_LTP_parameters(d, dp, bc, Nc); - - Long_term_analysis_filtering( *bc, *Nc, dp, d, dpp, e ); -} - -/* 4.3.2 */ -void Gsm_Long_Term_Synthesis_Filtering P5((S,Ncr,bcr,erp,drp), - struct gsm_state * S, - - word Ncr, - word bcr, - register word * erp, /* [0..39] IN */ - register word * drp /* [-120..-1] IN, [-120..40] OUT */ -) -/* - * This procedure uses the bcr and Ncr parameter to realize the - * long term synthesis filtering. The decoding of bcr needs - * table 4.3b. - */ -{ - register longword ltmp; /* for ADD */ - register int k; - word brp, drpp, Nr; - - /* Check the limits of Nr. - */ - Nr = Ncr < 40 || Ncr > 120 ? S->nrp : Ncr; - S->nrp = Nr; - assert(Nr >= 40 && Nr <= 120); - - /* Decoding of the LTP gain bcr - */ - brp = gsm_QLB[ bcr ]; - - /* Computation of the reconstructed short term residual - * signal drp[0..39] - */ - assert(brp != MIN_WORD); - - for (k = 0; k <= 39; k++) { - drpp = GSM_MULT_R( brp, drp[ k - Nr ] ); - drp[k] = GSM_ADD( erp[k], drpp ); - } - - /* - * Update of the reconstructed short term residual signal - * drp[ -1..-120 ] - */ - - for (k = 0; k <= 119; k++) drp[ -120 + k ] = drp[ -80 + k ]; -} diff --git a/src/audio/gsm/lpc.c b/src/audio/gsm/lpc.c deleted file mode 100644 index ac2b8a9eb067ac1a3760f26cfa21a846b2eb6a96..0000000000000000000000000000000000000000 --- a/src/audio/gsm/lpc.c +++ /dev/null @@ -1,341 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include <stdio.h> -#include <assert.h> - -#include "private.h" - -#include "gsm.h" -#include "proto.h" - -#undef P - -/* - * 4.2.4 .. 4.2.7 LPC ANALYSIS SECTION - */ - -/* 4.2.4 */ - - -static void Autocorrelation P2((s, L_ACF), - word * s, /* [0..159] IN/OUT */ - longword * L_ACF) /* [0..8] OUT */ -/* - * The goal is to compute the array L_ACF[k]. The signal s[i] must - * be scaled in order to avoid an overflow situation. - */ -{ - register int k, i; - - word temp, smax, scalauto; - -#ifdef USE_FLOAT_MUL - float float_s[160]; -#endif - - /* Dynamic scaling of the array s[0..159] - */ - - /* Search for the maximum. - */ - smax = 0; - for (k = 0; k <= 159; k++) { - temp = GSM_ABS( s[k] ); - if (temp > smax) smax = temp; - } - - /* Computation of the scaling factor. - */ - if (smax == 0) scalauto = 0; - else { - assert(smax > 0); - scalauto = 4 - gsm_norm( (longword)smax << 16 );/* sub(4,..) */ - } - - /* Scaling of the array s[0...159] - */ - - if (scalauto > 0) { - -# ifdef USE_FLOAT_MUL -# define SCALE(n) \ - case n: for (k = 0; k <= 159; k++) \ - float_s[k] = (float) \ - (s[k] = GSM_MULT_R(s[k], 16384 >> (n-1)));\ - break; -# else -# define SCALE(n) \ - case n: for (k = 0; k <= 159; k++) \ - s[k] = GSM_MULT_R( s[k], 16384 >> (n-1) );\ - break; -# endif /* USE_FLOAT_MUL */ - - switch (scalauto) { - SCALE(1) - SCALE(2) - SCALE(3) - SCALE(4) - } -# undef SCALE - } -# ifdef USE_FLOAT_MUL - else for (k = 0; k <= 159; k++) float_s[k] = (float) s[k]; -# endif - - /* Compute the L_ACF[..]. - */ - { -# ifdef USE_FLOAT_MUL - register float * sp = float_s; - register float sl = *sp; - -# define STEP(k) L_ACF[k] += (longword)(sl * sp[ -(k) ]); -# else - word * sp = s; - word sl = *sp; - -# define STEP(k) L_ACF[k] += ((longword)sl * sp[ -(k) ]); -# endif - -# define NEXTI sl = *++sp - - - for (k = 9; k--; L_ACF[k] = 0) ; - - STEP (0); - NEXTI; - STEP(0); STEP(1); - NEXTI; - STEP(0); STEP(1); STEP(2); - NEXTI; - STEP(0); STEP(1); STEP(2); STEP(3); - NEXTI; - STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); - NEXTI; - STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); - NEXTI; - STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6); - NEXTI; - STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6); STEP(7); - - for (i = 8; i <= 159; i++) { - - NEXTI; - - STEP(0); - STEP(1); STEP(2); STEP(3); STEP(4); - STEP(5); STEP(6); STEP(7); STEP(8); - } - - for (k = 9; k--; L_ACF[k] <<= 1) ; - - } - /* Rescaling of the array s[0..159] - */ - if (scalauto > 0) { - assert(scalauto <= 4); - for (k = 160; k--; *s++ <<= scalauto) ; - } -} - -#if defined(USE_FLOAT_MUL) && defined(FAST) - -static void Fast_Autocorrelation P2((s, L_ACF), - word * s, /* [0..159] IN/OUT */ - longword * L_ACF) /* [0..8] OUT */ -{ - register int k, i; - float f_L_ACF[9]; - float scale; - - float s_f[160]; - register float *sf = s_f; - - for (i = 0; i < 160; ++i) sf[i] = s[i]; - for (k = 0; k <= 8; k++) { - register float L_temp2 = 0; - register float *sfl = sf - k; - for (i = k; i < 160; ++i) L_temp2 += sf[i] * sfl[i]; - f_L_ACF[k] = L_temp2; - } - scale = MAX_LONGWORD / f_L_ACF[0]; - - for (k = 0; k <= 8; k++) { - L_ACF[k] = f_L_ACF[k] * scale; - } -} -#endif /* defined (USE_FLOAT_MUL) && defined (FAST) */ - -/* 4.2.5 */ - -static void Reflection_coefficients P2( (L_ACF, r), - longword * L_ACF, /* 0...8 IN */ - register word * r /* 0...7 OUT */ -) -{ - register int i, m, n; - register word temp; - register longword ltmp; - word ACF[9]; /* 0..8 */ - word P[ 9]; /* 0..8 */ - word K[ 9]; /* 2..8 */ - - /* Schur recursion with 16 bits arithmetic. - */ - - if (L_ACF[0] == 0) { - for (i = 8; i--; *r++ = 0) ; - return; - } - - assert( L_ACF[0] != 0 ); - temp = gsm_norm( L_ACF[0] ); - - assert(temp >= 0 && temp < 32); - - /* ? overflow ? */ - for (i = 0; i <= 8; i++) ACF[i] = SASR( L_ACF[i] << temp, 16 ); - - /* Initialize array P[..] and K[..] for the recursion. - */ - - for (i = 1; i <= 7; i++) K[ i ] = ACF[ i ]; - for (i = 0; i <= 8; i++) P[ i ] = ACF[ i ]; - - /* Compute reflection coefficients - */ - for (n = 1; n <= 8; n++, r++) { - - temp = P[1]; - temp = GSM_ABS(temp); - if (P[0] < temp) { - for (i = n; i <= 8; i++) *r++ = 0; - return; - } - - *r = gsm_div( temp, P[0] ); - - assert(*r >= 0); - if (P[1] > 0) *r = -*r; /* r[n] = sub(0, r[n]) */ - assert (*r != MIN_WORD); - if (n == 8) return; - - /* Schur recursion - */ - temp = GSM_MULT_R( P[1], *r ); - P[0] = GSM_ADD( P[0], temp ); - - for (m = 1; m <= 8 - n; m++) { - temp = GSM_MULT_R( K[ m ], *r ); - P[m] = GSM_ADD( P[ m+1 ], temp ); - - temp = GSM_MULT_R( P[ m+1 ], *r ); - K[m] = GSM_ADD( K[ m ], temp ); - } - } -} - -/* 4.2.6 */ - -static void Transformation_to_Log_Area_Ratios P1((r), - register word * r /* 0..7 IN/OUT */ -) -/* - * The following scaling for r[..] and LAR[..] has been used: - * - * r[..] = integer( real_r[..]*32768. ); -1 <= real_r < 1. - * LAR[..] = integer( real_LAR[..] * 16384 ); - * with -1.625 <= real_LAR <= 1.625 - */ -{ - register word temp; - register int i; - - - /* Computation of the LAR[0..7] from the r[0..7] - */ - for (i = 1; i <= 8; i++, r++) { - - temp = *r; - temp = GSM_ABS(temp); - assert(temp >= 0); - - if (temp < 22118) { - temp >>= 1; - } else if (temp < 31130) { - assert( temp >= 11059 ); - temp -= 11059; - } else { - assert( temp >= 26112 ); - temp -= 26112; - temp <<= 2; - } - - *r = *r < 0 ? -temp : temp; - assert( *r != MIN_WORD ); - } -} - -/* 4.2.7 */ - -static void Quantization_and_coding P1((LAR), - register word * LAR /* [0..7] IN/OUT */ -) -{ - register word temp; - longword ltmp; - - - /* This procedure needs four tables; the following equations - * give the optimum scaling for the constants: - * - * A[0..7] = integer( real_A[0..7] * 1024 ) - * B[0..7] = integer( real_B[0..7] * 512 ) - * MAC[0..7] = maximum of the LARc[0..7] - * MIC[0..7] = minimum of the LARc[0..7] - */ - -# undef STEP -# define STEP( A, B, MAC, MIC ) \ - temp = GSM_MULT( A, *LAR ); \ - temp = GSM_ADD( temp, B ); \ - temp = GSM_ADD( temp, 256 ); \ - temp = SASR( temp, 9 ); \ - *LAR = temp>MAC ? MAC - MIC : (temp<MIC ? 0 : temp - MIC); \ - LAR++; - - STEP( 20480, 0, 31, -32 ); - STEP( 20480, 0, 31, -32 ); - STEP( 20480, 2048, 15, -16 ); - STEP( 20480, -2560, 15, -16 ); - - STEP( 13964, 94, 7, -8 ); - STEP( 15360, -1792, 7, -8 ); - STEP( 8534, -341, 3, -4 ); - STEP( 9036, -1144, 3, -4 ); - -# undef STEP -} - -void Gsm_LPC_Analysis P3((S, s,LARc), - struct gsm_state *S, - word * s, /* 0..159 signals IN/OUT */ - word * LARc) /* 0..7 LARc's OUT */ -{ - longword L_ACF[9]; - -#if defined(USE_FLOAT_MUL) && defined(FAST) - if (S->fast) Fast_Autocorrelation (s, L_ACF ); - else -#endif - Autocorrelation (s, L_ACF ); - Reflection_coefficients (L_ACF, LARc ); - Transformation_to_Log_Area_Ratios (LARc); - Quantization_and_coding (LARc); -} diff --git a/src/audio/gsm/preprocess.c b/src/audio/gsm/preprocess.c deleted file mode 100644 index 99c0709dcfb007fbb92116457d0be509f49f0001..0000000000000000000000000000000000000000 --- a/src/audio/gsm/preprocess.c +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include <stdio.h> -#include <assert.h> - -#include "private.h" - -#include "gsm.h" -#include "proto.h" - -/* 4.2.0 .. 4.2.3 PREPROCESSING SECTION - * - * After A-law to linear conversion (or directly from the - * Ato D converter) the following scaling is assumed for - * input to the RPE-LTP algorithm: - * - * in: 0.1.....................12 - * S.v.v.v.v.v.v.v.v.v.v.v.v.*.*.* - * - * Where S is the sign bit, v a valid bit, and * a "don't care" bit. - * The original signal is called sop[..] - * - * out: 0.1................... 12 - * S.S.v.v.v.v.v.v.v.v.v.v.v.v.0.0 - */ - - -void Gsm_Preprocess P3((S, s, so), - struct gsm_state * S, - word * s, - word * so ) /* [0..159] IN/OUT */ -{ - - word z1 = S->z1; - longword L_z2 = S->L_z2; - word mp = S->mp; - - word s1; - longword L_s2; - - longword L_temp; - - word msp, lsp; - word SO; - - longword ltmp; /* for ADD */ - ulongword utmp; /* for L_ADD */ - - register int k = 160; - - while (k--) { - - /* 4.2.1 Downscaling of the input signal - */ - SO = SASR( *s, 3 ) << 2; - s++; - - assert (SO >= -0x4000); /* downscaled by */ - assert (SO <= 0x3FFC); /* previous routine. */ - - - /* 4.2.2 Offset compensation - * - * This part implements a high-pass filter and requires extended - * arithmetic precision for the recursive part of this filter. - * The input of this procedure is the array so[0...159] and the - * output the array sof[ 0...159 ]. - */ - /* Compute the non-recursive part - */ - - s1 = SO - z1; /* s1 = gsm_sub( *so, z1 ); */ - z1 = SO; - - assert(s1 != MIN_WORD); - - /* Compute the recursive part - */ - L_s2 = s1; - L_s2 <<= 15; - - /* Execution of a 31 bv 16 bits multiplication - */ - - msp = SASR( L_z2, 15 ); - lsp = L_z2-((longword)msp<<15); /* gsm_L_sub(L_z2,(msp<<15)); */ - - L_s2 += GSM_MULT_R( lsp, 32735 ); - L_temp = (longword)msp * 32735; /* GSM_L_MULT(msp,32735) >> 1;*/ - L_z2 = GSM_L_ADD( L_temp, L_s2 ); - - /* Compute sof[k] with rounding - */ - L_temp = GSM_L_ADD( L_z2, 16384 ); - - /* 4.2.3 Preemphasis - */ - - msp = GSM_MULT_R( mp, -28180 ); - mp = SASR( L_temp, 15 ); - *so++ = GSM_ADD( mp, msp ); - } - - S->z1 = z1; - S->L_z2 = L_z2; - S->mp = mp; -} diff --git a/src/audio/gsm/private.h b/src/audio/gsm/private.h deleted file mode 100644 index 6b538cc27aa353ac3ef68692e820d6c43a26e224..0000000000000000000000000000000000000000 --- a/src/audio/gsm/private.h +++ /dev/null @@ -1,268 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/*$Header$*/ - -#ifndef PRIVATE_H -#define PRIVATE_H - -typedef short word; /* 16 bit signed int */ -typedef long longword; /* 32 bit signed int */ - -typedef unsigned short uword; /* unsigned word */ -typedef unsigned long ulongword; /* unsigned longword */ - -struct gsm_state { - - word dp0[ 280 ]; - - word z1; /* preprocessing.c, Offset_com. */ - longword L_z2; /* Offset_com. */ - int mp; /* Preemphasis */ - - word u[8]; /* short_term_aly_filter.c */ - word LARpp[2][8]; /* */ - word j; /* */ - - word ltp_cut; /* long_term.c, LTP crosscorr. */ - word nrp; /* 40 */ /* long_term.c, synthesis */ - word v[9]; /* short_term.c, synthesis */ - word msr; /* decoder.c, Postprocessing */ - - char verbose; /* only used if !NDEBUG */ - char fast; /* only used if FAST */ - - char wav_fmt; /* only used if WAV49 defined */ - unsigned char frame_index; /* odd/even chaining */ - unsigned char frame_chain; /* half-byte to carry forward */ -}; - - -#define MIN_WORD (-32767 - 1) -#define MAX_WORD 32767 - -#define MIN_LONGWORD (-2147483647 - 1) -#define MAX_LONGWORD 2147483647 - -#ifdef SASR /* flag: >> is a signed arithmetic shift right */ -#undef SASR -#define SASR(x, by) ((x) >> (by)) -#else -#define SASR(x, by) ((x) >= 0 ? (x) >> (by) : (~(-((x) + 1) >> (by)))) -#endif /* SASR */ - -#include "proto.h" - -/* - * Prototypes from add.c - */ -extern word gsm_mult P((word a, word b)); -extern longword gsm_L_mult P((word a, word b)); -extern word gsm_mult_r P((word a, word b)); - -extern word gsm_div P((word num, word denum)); - -extern word gsm_add P(( word a, word b )); -extern longword gsm_L_add P(( longword a, longword b )); - -extern word gsm_sub P((word a, word b)); -extern longword gsm_L_sub P((longword a, longword b)); - -extern word gsm_abs P((word a)); - -extern word gsm_norm P(( longword a )); - -extern longword gsm_L_asl P((longword a, int n)); -extern word gsm_asl P((word a, int n)); - -extern longword gsm_L_asr P((longword a, int n)); -extern word gsm_asr P((word a, int n)); - -/* - * Inlined functions from add.h - */ - -/* - * #define GSM_MULT_R(a, b) (* word a, word b, !(a == b == MIN_WORD) *) \ - * (0x0FFFF & SASR(((longword)(a) * (longword)(b) + 16384), 15)) - */ -#define GSM_MULT_R(a, b) /* word a, word b, !(a == b == MIN_WORD) */ \ - (SASR( ((longword)(a) * (longword)(b) + 16384), 15 )) - -# define GSM_MULT(a,b) /* word a, word b, !(a == b == MIN_WORD) */ \ - (SASR( ((longword)(a) * (longword)(b)), 15 )) - -# define GSM_L_MULT(a, b) /* word a, word b */ \ - (((longword)(a) * (longword)(b)) << 1) - -# define GSM_L_ADD(a, b) \ - ( (a) < 0 ? ( (b) >= 0 ? (a) + (b) \ - : (utmp = (ulongword)-((a) + 1) + (ulongword)-((b) + 1)) \ - >= MAX_LONGWORD ? MIN_LONGWORD : -(longword)utmp-2 ) \ - : ((b) <= 0 ? (a) + (b) \ - : (utmp = (ulongword)(a) + (ulongword)(b)) >= MAX_LONGWORD \ - ? MAX_LONGWORD : utmp)) - -/* - * # define GSM_ADD(a, b) \ - * ((ltmp = (longword)(a) + (longword)(b)) >= MAX_WORD \ - * ? MAX_WORD : ltmp <= MIN_WORD ? MIN_WORD : ltmp) - */ -/* Nonportable, but faster: */ - -#define GSM_ADD(a, b) \ - ((ulongword)((ltmp = (longword)(a) + (longword)(b)) - MIN_WORD) > \ - MAX_WORD - MIN_WORD ? (ltmp > 0 ? MAX_WORD : MIN_WORD) : ltmp) - -# define GSM_SUB(a, b) \ - ((ltmp = (longword)(a) - (longword)(b)) >= MAX_WORD \ - ? MAX_WORD : ltmp <= MIN_WORD ? MIN_WORD : ltmp) - -# define GSM_ABS(a) ((a) < 0 ? ((a) == MIN_WORD ? MAX_WORD : -(a)) : (a)) - -/* Use these if necessary: - -# define GSM_MULT_R(a, b) gsm_mult_r(a, b) -# define GSM_MULT(a, b) gsm_mult(a, b) -# define GSM_L_MULT(a, b) gsm_L_mult(a, b) - -# define GSM_L_ADD(a, b) gsm_L_add(a, b) -# define GSM_ADD(a, b) gsm_add(a, b) -# define GSM_SUB(a, b) gsm_sub(a, b) - -# define GSM_ABS(a) gsm_abs(a) - -*/ - -/* - * More prototypes from implementations.. - */ -extern void Gsm_Coder P(( - struct gsm_state * S, - word * s, /* [0..159] samples IN */ - word * LARc, /* [0..7] LAR coefficients OUT */ - word * Nc, /* [0..3] LTP lag OUT */ - word * bc, /* [0..3] coded LTP gain OUT */ - word * Mc, /* [0..3] RPE grid selection OUT */ - word * xmaxc,/* [0..3] Coded maximum amplitude OUT */ - word * xMc /* [13*4] normalized RPE samples OUT */)); - -extern void Gsm_Long_Term_Predictor P(( /* 4x for 160 samples */ - struct gsm_state * S, - word * d, /* [0..39] residual signal IN */ - word * dp, /* [-120..-1] d' IN */ - word * e, /* [0..40] OUT */ - word * dpp, /* [0..40] OUT */ - word * Nc, /* correlation lag OUT */ - word * bc /* gain factor OUT */)); - -extern void Gsm_LPC_Analysis P(( - struct gsm_state * S, - word * s, /* 0..159 signals IN/OUT */ - word * LARc)); /* 0..7 LARc's OUT */ - -extern void Gsm_Preprocess P(( - struct gsm_state * S, - word * s, word * so)); - -extern void Gsm_Encoding P(( - struct gsm_state * S, - word * e, - word * ep, - word * xmaxc, - word * Mc, - word * xMc)); - -extern void Gsm_Short_Term_Analysis_Filter P(( - struct gsm_state * S, - word * LARc, /* coded log area ratio [0..7] IN */ - word * d /* st res. signal [0..159] IN/OUT */)); - -extern void Gsm_Decoder P(( - struct gsm_state * S, - word * LARcr, /* [0..7] IN */ - word * Ncr, /* [0..3] IN */ - word * bcr, /* [0..3] IN */ - word * Mcr, /* [0..3] IN */ - word * xmaxcr, /* [0..3] IN */ - word * xMcr, /* [0..13*4] IN */ - word * s)); /* [0..159] OUT */ - -extern void Gsm_Decoding P(( - struct gsm_state * S, - word xmaxcr, - word Mcr, - word * xMcr, /* [0..12] IN */ - word * erp)); /* [0..39] OUT */ - -extern void Gsm_Long_Term_Synthesis_Filtering P(( - struct gsm_state* S, - word Ncr, - word bcr, - word * erp, /* [0..39] IN */ - word * drp)); /* [-120..-1] IN, [0..40] OUT */ - -void Gsm_RPE_Decoding P(( - struct gsm_state *S, - word xmaxcr, - word Mcr, - word * xMcr, /* [0..12], 3 bits IN */ - word * erp)); /* [0..39] OUT */ - -void Gsm_RPE_Encoding P(( - struct gsm_state * S, - word * e, /* -5..-1][0..39][40..44 IN/OUT */ - word * xmaxc, /* OUT */ - word * Mc, /* OUT */ - word * xMc)); /* [0..12] OUT */ - -extern void Gsm_Short_Term_Synthesis_Filter P(( - struct gsm_state * S, - word * LARcr, /* log area ratios [0..7] IN */ - word * drp, /* received d [0...39] IN */ - word * s)); /* signal s [0..159] OUT */ - -extern void Gsm_Update_of_reconstructed_short_time_residual_signal P(( - word * dpp, /* [0...39] IN */ - word * ep, /* [0...39] IN */ - word * dp)); /* [-120...-1] IN/OUT */ - -/* - * Tables from table.c - */ -#ifndef GSM_TABLE_C - -extern word gsm_A[8], gsm_B[8], gsm_MIC[8], gsm_MAC[8]; -extern word gsm_INVA[8]; -extern word gsm_DLB[4], gsm_QLB[4]; -extern word gsm_H[11]; -extern word gsm_NRFAC[8]; -extern word gsm_FAC[8]; - -#endif /* GSM_TABLE_C */ - -/* - * Debugging - */ -#ifdef NDEBUG - -# define gsm_debug_words(a, b, c, d) /* nil */ -# define gsm_debug_longwords(a, b, c, d) /* nil */ -# define gsm_debug_word(a, b) /* nil */ -# define gsm_debug_longword(a, b) /* nil */ - -#else /* !NDEBUG => DEBUG */ - - extern void gsm_debug_words P((char * name, int, int, word *)); - extern void gsm_debug_longwords P((char * name, int, int, longword *)); - extern void gsm_debug_longword P((char * name, longword)); - extern void gsm_debug_word P((char * name, word)); - -#endif /* !NDEBUG */ - -#include "unproto.h" - -#endif /* PRIVATE_H */ diff --git a/src/audio/gsm/proto.h b/src/audio/gsm/proto.h deleted file mode 100644 index 87cf05e8a76a5c8cc7a0822baa549230da8590d4..0000000000000000000000000000000000000000 --- a/src/audio/gsm/proto.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/*$Header$*/ - -#ifndef PROTO_H -#define PROTO_H - -#if __cplusplus -# define NeedFunctionPrototypes 1 -#endif - -#if __STDC__ -# define NeedFunctionPrototypes 1 -#endif - -#ifdef _NO_PROTO -# undef NeedFunctionPrototypes -#endif - -#undef P /* gnu stdio.h actually defines this... */ -#undef P0 -#undef P1 -#undef P2 -#undef P3 -#undef P4 -#undef P5 -#undef P6 -#undef P7 -#undef P8 - -#if NeedFunctionPrototypes - -# define P( protos ) protos - -# define P0() (void) -# define P1(x, a) (a) -# define P2(x, a, b) (a, b) -# define P3(x, a, b, c) (a, b, c) -# define P4(x, a, b, c, d) (a, b, c, d) -# define P5(x, a, b, c, d, e) (a, b, c, d, e) -# define P6(x, a, b, c, d, e, f) (a, b, c, d, e, f) -# define P7(x, a, b, c, d, e, f, g) (a, b, c, d, e, f, g) -# define P8(x, a, b, c, d, e, f, g, h) (a, b, c, d, e, f, g, h) - -#else /* !NeedFunctionPrototypes */ - -# define P( protos ) ( /* protos */ ) - -# define P0() () -# define P1(x, a) x a; -# define P2(x, a, b) x a; b; -# define P3(x, a, b, c) x a; b; c; -# define P4(x, a, b, c, d) x a; b; c; d; -# define P5(x, a, b, c, d, e) x a; b; c; d; e; -# define P6(x, a, b, c, d, e, f) x a; b; c; d; e; f; -# define P7(x, a, b, c, d, e, f, g) x a; b; c; d; e; f; g; -# define P8(x, a, b, c, d, e, f, g, h) x a; b; c; d; e; f; g; h; - -#endif /* !NeedFunctionPrototypes */ - -#endif /* PROTO_H */ diff --git a/src/audio/gsm/rpe.c b/src/audio/gsm/rpe.c deleted file mode 100644 index 8a6b81fae78b89de2c64275b896d3d4642dc7735..0000000000000000000000000000000000000000 --- a/src/audio/gsm/rpe.c +++ /dev/null @@ -1,488 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include <stdio.h> -#include <assert.h> - -#include "private.h" - -#include "gsm.h" -#include "proto.h" - -/* 4.2.13 .. 4.2.17 RPE ENCODING SECTION - */ - -/* 4.2.13 */ - -static void Weighting_filter P2((e, x), - register word * e, /* signal [-5..0.39.44] IN */ - word * x /* signal [0..39] OUT */ -) -/* - * The coefficients of the weighting filter are stored in a table - * (see table 4.4). The following scaling is used: - * - * H[0..10] = integer( real_H[ 0..10] * 8192 ); - */ -{ - /* word wt[ 50 ]; */ - - register longword L_result; - register int k /* , i */ ; - - /* Initialization of a temporary working array wt[0...49] - */ - - /* for (k = 0; k <= 4; k++) wt[k] = 0; - * for (k = 5; k <= 44; k++) wt[k] = *e++; - * for (k = 45; k <= 49; k++) wt[k] = 0; - * - * (e[-5..-1] and e[40..44] are allocated by the caller, - * are initially zero and are not written anywhere.) - */ - e -= 5; - - /* Compute the signal x[0..39] - */ - for (k = 0; k <= 39; k++) { - - L_result = 8192 >> 1; - - /* for (i = 0; i <= 10; i++) { - * L_temp = GSM_L_MULT( wt[k+i], gsm_H[i] ); - * L_result = GSM_L_ADD( L_result, L_temp ); - * } - */ - -#undef STEP -#define STEP( i, H ) (e[ k + i ] * (longword)H) - - /* Every one of these multiplications is done twice -- - * but I don't see an elegant way to optimize this. - * Do you? - */ - -#ifdef STUPID_COMPILER - L_result += STEP( 0, -134 ) ; - L_result += STEP( 1, -374 ) ; - /* + STEP( 2, 0 ) */ - L_result += STEP( 3, 2054 ) ; - L_result += STEP( 4, 5741 ) ; - L_result += STEP( 5, 8192 ) ; - L_result += STEP( 6, 5741 ) ; - L_result += STEP( 7, 2054 ) ; - /* + STEP( 8, 0 ) */ - L_result += STEP( 9, -374 ) ; - L_result += STEP( 10, -134 ) ; -#else - L_result += - STEP( 0, -134 ) - + STEP( 1, -374 ) - /* + STEP( 2, 0 ) */ - + STEP( 3, 2054 ) - + STEP( 4, 5741 ) - + STEP( 5, 8192 ) - + STEP( 6, 5741 ) - + STEP( 7, 2054 ) - /* + STEP( 8, 0 ) */ - + STEP( 9, -374 ) - + STEP(10, -134 ) - ; -#endif - - /* L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x2) *) - * L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x4) *) - * - * x[k] = SASR( L_result, 16 ); - */ - - /* 2 adds vs. >>16 => 14, minus one shift to compensate for - * those we lost when replacing L_MULT by '*'. - */ - - L_result = SASR( L_result, 13 ); - x[k] = ( L_result < MIN_WORD ? MIN_WORD - : (L_result > MAX_WORD ? MAX_WORD : L_result )); - } -} - -/* 4.2.14 */ - -static void RPE_grid_selection P3((x,xM,Mc_out), - word * x, /* [0..39] IN */ - word * xM, /* [0..12] OUT */ - word * Mc_out /* OUT */ -) -/* - * The signal x[0..39] is used to select the RPE grid which is - * represented by Mc. - */ -{ - /* register word temp1; */ - register int /* m, */ i; - register longword L_result, L_temp; - longword EM; /* xxx should be L_EM? */ - word Mc; - - longword L_common_0_3; - - EM = 0; - Mc = 0; - - /* for (m = 0; m <= 3; m++) { - * L_result = 0; - * - * - * for (i = 0; i <= 12; i++) { - * - * temp1 = SASR( x[m + 3*i], 2 ); - * - * assert(temp1 != MIN_WORD); - * - * L_temp = GSM_L_MULT( temp1, temp1 ); - * L_result = GSM_L_ADD( L_temp, L_result ); - * } - * - * if (L_result > EM) { - * Mc = m; - * EM = L_result; - * } - * } - */ - -#undef STEP -#define STEP( m, i ) L_temp = SASR( x[m + 3 * i], 2 ); \ - L_result += L_temp * L_temp; - - /* common part of 0 and 3 */ - - L_result = 0; - STEP( 0, 1 ); STEP( 0, 2 ); STEP( 0, 3 ); STEP( 0, 4 ); - STEP( 0, 5 ); STEP( 0, 6 ); STEP( 0, 7 ); STEP( 0, 8 ); - STEP( 0, 9 ); STEP( 0, 10); STEP( 0, 11); STEP( 0, 12); - L_common_0_3 = L_result; - - /* i = 0 */ - - STEP( 0, 0 ); - L_result <<= 1; /* implicit in L_MULT */ - EM = L_result; - - /* i = 1 */ - - L_result = 0; - STEP( 1, 0 ); - STEP( 1, 1 ); STEP( 1, 2 ); STEP( 1, 3 ); STEP( 1, 4 ); - STEP( 1, 5 ); STEP( 1, 6 ); STEP( 1, 7 ); STEP( 1, 8 ); - STEP( 1, 9 ); STEP( 1, 10); STEP( 1, 11); STEP( 1, 12); - L_result <<= 1; - if (L_result > EM) { - Mc = 1; - EM = L_result; - } - - /* i = 2 */ - - L_result = 0; - STEP( 2, 0 ); - STEP( 2, 1 ); STEP( 2, 2 ); STEP( 2, 3 ); STEP( 2, 4 ); - STEP( 2, 5 ); STEP( 2, 6 ); STEP( 2, 7 ); STEP( 2, 8 ); - STEP( 2, 9 ); STEP( 2, 10); STEP( 2, 11); STEP( 2, 12); - L_result <<= 1; - if (L_result > EM) { - Mc = 2; - EM = L_result; - } - - /* i = 3 */ - - L_result = L_common_0_3; - STEP( 3, 12 ); - L_result <<= 1; - if (L_result > EM) { - Mc = 3; - EM = L_result; - } - - /**/ - - /* Down-sampling by a factor 3 to get the selected xM[0..12] - * RPE sequence. - */ - for (i = 0; i <= 12; i ++) xM[i] = x[Mc + 3*i]; - *Mc_out = Mc; -} - -/* 4.12.15 */ - -static void APCM_quantization_xmaxc_to_exp_mant P3((xmaxc,exp_out,mant_out), - word xmaxc, /* IN */ - word * exp_out, /* OUT */ - word * mant_out ) /* OUT */ -{ - word exp, mant; - - /* Compute exponent and mantissa of the decoded version of xmaxc - */ - - exp = 0; - if (xmaxc > 15) exp = SASR(xmaxc, 3) - 1; - mant = xmaxc - (exp << 3); - - if (mant == 0) { - exp = -4; - mant = 7; - } - else { - while (mant <= 7) { - mant = mant << 1 | 1; - exp--; - } - mant -= 8; - } - - assert( exp >= -4 && exp <= 6 ); - assert( mant >= 0 && mant <= 7 ); - - *exp_out = exp; - *mant_out = mant; -} - -static void APCM_quantization P5((xM,xMc,mant_out,exp_out,xmaxc_out), - word * xM, /* [0..12] IN */ - - word * xMc, /* [0..12] OUT */ - word * mant_out, /* OUT */ - word * exp_out, /* OUT */ - word * xmaxc_out /* OUT */ -) -{ - int i, itest; - - word xmax, xmaxc, temp, temp1, temp2; - word exp, mant; - - - /* Find the maximum absolute value xmax of xM[0..12]. - */ - - xmax = 0; - for (i = 0; i <= 12; i++) { - temp = xM[i]; - temp = GSM_ABS(temp); - if (temp > xmax) xmax = temp; - } - - /* Qantizing and coding of xmax to get xmaxc. - */ - - exp = 0; - temp = SASR( xmax, 9 ); - itest = 0; - - for (i = 0; i <= 5; i++) { - - itest |= (temp <= 0); - temp = SASR( temp, 1 ); - - assert(exp <= 5); - if (itest == 0) exp++; /* exp = add (exp, 1) */ - } - - assert(exp <= 6 && exp >= 0); - temp = exp + 5; - - assert(temp <= 11 && temp >= 0); - xmaxc = gsm_add( SASR(xmax, temp), exp << 3 ); - - /* Quantizing and coding of the xM[0..12] RPE sequence - * to get the xMc[0..12] - */ - - APCM_quantization_xmaxc_to_exp_mant( xmaxc, &exp, &mant ); - - /* This computation uses the fact that the decoded version of xmaxc - * can be calculated by using the exponent and the mantissa part of - * xmaxc (logarithmic table). - * So, this method avoids any division and uses only a scaling - * of the RPE samples by a function of the exponent. A direct - * multiplication by the inverse of the mantissa (NRFAC[0..7] - * found in table 4.5) gives the 3 bit coded version xMc[0..12] - * of the RPE samples. - */ - - - /* Direct computation of xMc[0..12] using table 4.5 - */ - - assert( exp <= 4096 && exp >= -4096); - assert( mant >= 0 && mant <= 7 ); - - temp1 = 6 - exp; /* normalization by the exponent */ - temp2 = gsm_NRFAC[ mant ]; /* inverse mantissa */ - - for (i = 0; i <= 12; i++) { - - assert(temp1 >= 0 && temp1 < 16); - - temp = xM[i] << temp1; - temp = GSM_MULT( temp, temp2 ); - temp = SASR(temp, 12); - xMc[i] = temp + 4; /* see note below */ - } - - /* NOTE: This equation is used to make all the xMc[i] positive. - */ - - *mant_out = mant; - *exp_out = exp; - *xmaxc_out = xmaxc; -} - -/* 4.2.16 */ - -static void APCM_inverse_quantization P4((xMc,mant,exp,xMp), - register word * xMc, /* [0..12] IN */ - word mant, - word exp, - register word * xMp) /* [0..12] OUT */ -/* - * This part is for decoding the RPE sequence of coded xMc[0..12] - * samples to obtain the xMp[0..12] array. Table 4.6 is used to get - * the mantissa of xmaxc (FAC[0..7]). - */ -{ - int i; - word temp, temp1, temp2, temp3; - longword ltmp; - - assert( mant >= 0 && mant <= 7 ); - - temp1 = gsm_FAC[ mant ]; /* see 4.2-15 for mant */ - temp2 = gsm_sub( 6, exp ); /* see 4.2-15 for exp */ - temp3 = gsm_asl( 1, gsm_sub( temp2, 1 )); - - for (i = 13; i--;) { - - assert( *xMc <= 7 && *xMc >= 0 ); /* 3 bit unsigned */ - - /* temp = gsm_sub( *xMc++ << 1, 7 ); */ - temp = (*xMc++ << 1) - 7; /* restore sign */ - assert( temp <= 7 && temp >= -7 ); /* 4 bit signed */ - - temp <<= 12; /* 16 bit signed */ - temp = GSM_MULT_R( temp1, temp ); - temp = GSM_ADD( temp, temp3 ); - *xMp++ = gsm_asr( temp, temp2 ); - } -} - -/* 4.2.17 */ - -static void RPE_grid_positioning P3((Mc,xMp,ep), - word Mc, /* grid position IN */ - register word * xMp, /* [0..12] IN */ - register word * ep /* [0..39] OUT */ -) -/* - * This procedure computes the reconstructed long term residual signal - * ep[0..39] for the LTP analysis filter. The inputs are the Mc - * which is the grid position selection and the xMp[0..12] decoded - * RPE samples which are upsampled by a factor of 3 by inserting zero - * values. - */ -{ - int i = 13; - - assert(0 <= Mc && Mc <= 3); - - switch (Mc) { - case 3: *ep++ = 0; - case 2: do { - *ep++ = 0; - case 1: *ep++ = 0; - case 0: *ep++ = *xMp++; - } while (--i); - } - while (++Mc < 4) *ep++ = 0; - - /* - - int i, k; - for (k = 0; k <= 39; k++) ep[k] = 0; - for (i = 0; i <= 12; i++) { - ep[ Mc + (3*i) ] = xMp[i]; - } - */ -} - -/* 4.2.18 */ - -/* This procedure adds the reconstructed long term residual signal - * ep[0..39] to the estimated signal dpp[0..39] from the long term - * analysis filter to compute the reconstructed short term residual - * signal dp[-40..-1]; also the reconstructed short term residual - * array dp[-120..-41] is updated. - */ - -#if 0 /* Has been inlined in code.c */ -void Gsm_Update_of_reconstructed_short_time_residual_signal P3((dpp, ep, dp), - word * dpp, /* [0...39] IN */ - word * ep, /* [0...39] IN */ - word * dp) /* [-120...-1] IN/OUT */ -{ - int k; - - for (k = 0; k <= 79; k++) - dp[ -120 + k ] = dp[ -80 + k ]; - - for (k = 0; k <= 39; k++) - dp[ -40 + k ] = gsm_add( ep[k], dpp[k] ); -} -#endif /* Has been inlined in code.c */ - -void Gsm_RPE_Encoding P5((S,e,xmaxc,Mc,xMc), - - struct gsm_state * S, - - word * e, /* -5..-1][0..39][40..44 IN/OUT */ - word * xmaxc, /* OUT */ - word * Mc, /* OUT */ - word * xMc) /* [0..12] OUT */ -{ - word x[40]; - word xM[13], xMp[13]; - word mant, exp; - - Weighting_filter(e, x); - RPE_grid_selection(x, xM, Mc); - - APCM_quantization( xM, xMc, &mant, &exp, xmaxc); - APCM_inverse_quantization( xMc, mant, exp, xMp); - - RPE_grid_positioning( *Mc, xMp, e ); - -} - -void Gsm_RPE_Decoding P5((S, xmaxcr, Mcr, xMcr, erp), - struct gsm_state * S, - - word xmaxcr, - word Mcr, - word * xMcr, /* [0..12], 3 bits IN */ - word * erp /* [0..39] OUT */ -) -{ - word exp, mant; - word xMp[ 13 ]; - - APCM_quantization_xmaxc_to_exp_mant( xmaxcr, &exp, &mant ); - APCM_inverse_quantization( xMcr, mant, exp, xMp ); - RPE_grid_positioning( Mcr, xMp, erp ); - -} diff --git a/src/audio/gsm/short_term.c b/src/audio/gsm/short_term.c deleted file mode 100644 index 4f5fd7be741c770e3168568217fc87782e47bc40..0000000000000000000000000000000000000000 --- a/src/audio/gsm/short_term.c +++ /dev/null @@ -1,429 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include <stdio.h> -#include <assert.h> - -#include "private.h" - -#include "gsm.h" -#include "proto.h" - -/* - * SHORT TERM ANALYSIS FILTERING SECTION - */ - -/* 4.2.8 */ - -static void Decoding_of_the_coded_Log_Area_Ratios P2((LARc,LARpp), - word * LARc, /* coded log area ratio [0..7] IN */ - word * LARpp) /* out: decoded .. */ -{ - register word temp1 /* , temp2 */; - register long ltmp; /* for GSM_ADD */ - - /* This procedure requires for efficient implementation - * two tables. - * - * INVA[1..8] = integer( (32768 * 8) / real_A[1..8]) - * MIC[1..8] = minimum value of the LARc[1..8] - */ - - /* Compute the LARpp[1..8] - */ - - /* for (i = 1; i <= 8; i++, B++, MIC++, INVA++, LARc++, LARpp++) { - * - * temp1 = GSM_ADD( *LARc, *MIC ) << 10; - * temp2 = *B << 1; - * temp1 = GSM_SUB( temp1, temp2 ); - * - * assert(*INVA != MIN_WORD); - * - * temp1 = GSM_MULT_R( *INVA, temp1 ); - * *LARpp = GSM_ADD( temp1, temp1 ); - * } - */ - -#undef STEP -#define STEP( B, MIC, INVA ) \ - temp1 = GSM_ADD( *LARc++, MIC ) << 10; \ - temp1 = GSM_SUB( temp1, B << 1 ); \ - temp1 = GSM_MULT_R( INVA, temp1 ); \ - *LARpp++ = GSM_ADD( temp1, temp1 ); - - STEP( 0, -32, 13107 ); - STEP( 0, -32, 13107 ); - STEP( 2048, -16, 13107 ); - STEP( -2560, -16, 13107 ); - - STEP( 94, -8, 19223 ); - STEP( -1792, -8, 17476 ); - STEP( -341, -4, 31454 ); - STEP( -1144, -4, 29708 ); - - /* NOTE: the addition of *MIC is used to restore - * the sign of *LARc. - */ -} - -/* 4.2.9 */ -/* Computation of the quantized reflection coefficients - */ - -/* 4.2.9.1 Interpolation of the LARpp[1..8] to get the LARp[1..8] - */ - -/* - * Within each frame of 160 analyzed speech samples the short term - * analysis and synthesis filters operate with four different sets of - * coefficients, derived from the previous set of decoded LARs(LARpp(j-1)) - * and the actual set of decoded LARs (LARpp(j)) - * - * (Initial value: LARpp(j-1)[1..8] = 0.) - */ - -static void Coefficients_0_12 P3((LARpp_j_1, LARpp_j, LARp), - register word * LARpp_j_1, - register word * LARpp_j, - register word * LARp) -{ - register int i; - register longword ltmp; - - for (i = 1; i <= 8; i++, LARp++, LARpp_j_1++, LARpp_j++) { - *LARp = GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 )); - *LARp = GSM_ADD( *LARp, SASR( *LARpp_j_1, 1)); - } -} - -static void Coefficients_13_26 P3((LARpp_j_1, LARpp_j, LARp), - register word * LARpp_j_1, - register word * LARpp_j, - register word * LARp) -{ - register int i; - register longword ltmp; - for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) { - *LARp = GSM_ADD( SASR( *LARpp_j_1, 1), SASR( *LARpp_j, 1 )); - } -} - -static void Coefficients_27_39 P3((LARpp_j_1, LARpp_j, LARp), - register word * LARpp_j_1, - register word * LARpp_j, - register word * LARp) -{ - register int i; - register longword ltmp; - - for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) { - *LARp = GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 )); - *LARp = GSM_ADD( *LARp, SASR( *LARpp_j, 1 )); - } -} - - -static void Coefficients_40_159 P2((LARpp_j, LARp), - register word * LARpp_j, - register word * LARp) -{ - register int i; - - for (i = 1; i <= 8; i++, LARp++, LARpp_j++) - *LARp = *LARpp_j; -} - -/* 4.2.9.2 */ - -static void LARp_to_rp P1((LARp), - register word * LARp) /* [0..7] IN/OUT */ -/* - * The input of this procedure is the interpolated LARp[0..7] array. - * The reflection coefficients, rp[i], are used in the analysis - * filter and in the synthesis filter. - */ -{ - register int i; - register word temp; - register longword ltmp; - - for (i = 1; i <= 8; i++, LARp++) { - - /* temp = GSM_ABS( *LARp ); - * - * if (temp < 11059) temp <<= 1; - * else if (temp < 20070) temp += 11059; - * else temp = GSM_ADD( temp >> 2, 26112 ); - * - * *LARp = *LARp < 0 ? -temp : temp; - */ - - if (*LARp < 0) { - temp = *LARp == MIN_WORD ? MAX_WORD : -(*LARp); - *LARp = - ((temp < 11059) ? temp << 1 - : ((temp < 20070) ? temp + 11059 - : GSM_ADD( temp >> 2, 26112 ))); - } else { - temp = *LARp; - *LARp = (temp < 11059) ? temp << 1 - : ((temp < 20070) ? temp + 11059 - : GSM_ADD( temp >> 2, 26112 )); - } - } -} - - -/* 4.2.10 */ -static void Short_term_analysis_filtering P4((S,rp,k_n,s), - struct gsm_state * S, - register word * rp, /* [0..7] IN */ - register int k_n, /* k_end - k_start */ - register word * s /* [0..n-1] IN/OUT */ -) -/* - * This procedure computes the short term residual signal d[..] to be fed - * to the RPE-LTP loop from the s[..] signal and from the local rp[..] - * array (quantized reflection coefficients). As the call of this - * procedure can be done in many ways (see the interpolation of the LAR - * coefficient), it is assumed that the computation begins with index - * k_start (for arrays d[..] and s[..]) and stops with index k_end - * (k_start and k_end are defined in 4.2.9.1). This procedure also - * needs to keep the array u[0..7] in memory for each call. - */ -{ - register word * u = S->u; - register int i; - register word di, zzz, ui, sav, rpi; - register longword ltmp; - - for (; k_n--; s++) { - - di = sav = *s; - - for (i = 0; i < 8; i++) { /* YYY */ - - ui = u[i]; - rpi = rp[i]; - u[i] = sav; - - zzz = GSM_MULT_R(rpi, di); - sav = GSM_ADD( ui, zzz); - - zzz = GSM_MULT_R(rpi, ui); - di = GSM_ADD( di, zzz ); - } - - *s = di; - } -} - -#if defined(USE_FLOAT_MUL) && defined(FAST) - -static void Fast_Short_term_analysis_filtering P4((S,rp,k_n,s), - struct gsm_state * S, - register word * rp, /* [0..7] IN */ - register int k_n, /* k_end - k_start */ - register word * s /* [0..n-1] IN/OUT */ -) -{ - register word * u = S->u; - register int i; - - float uf[8], - rpf[8]; - - register float scalef = 3.0517578125e-5; - register float sav, di, temp; - - for (i = 0; i < 8; ++i) { - uf[i] = u[i]; - rpf[i] = rp[i] * scalef; - } - for (; k_n--; s++) { - sav = di = *s; - for (i = 0; i < 8; ++i) { - register float rpfi = rpf[i]; - register float ufi = uf[i]; - - uf[i] = sav; - temp = rpfi * di + ufi; - di += rpfi * ufi; - sav = temp; - } - *s = di; - } - for (i = 0; i < 8; ++i) u[i] = uf[i]; -} -#endif /* ! (defined (USE_FLOAT_MUL) && defined (FAST)) */ - -static void Short_term_synthesis_filtering P5((S,rrp,k,wt,sr), - struct gsm_state * S, - register word * rrp, /* [0..7] IN */ - register int k, /* k_end - k_start */ - register word * wt, /* [0..k-1] IN */ - register word * sr /* [0..k-1] OUT */ -) -{ - register word * v = S->v; - register int i; - register word sri, tmp1, tmp2; - register longword ltmp; /* for GSM_ADD & GSM_SUB */ - - while (k--) { - sri = *wt++; - for (i = 8; i--;) { - - /* sri = GSM_SUB( sri, gsm_mult_r( rrp[i], v[i] ) ); - */ - tmp1 = rrp[i]; - tmp2 = v[i]; - tmp2 = ( tmp1 == MIN_WORD && tmp2 == MIN_WORD - ? MAX_WORD - : 0x0FFFF & (( (longword)tmp1 * (longword)tmp2 - + 16384) >> 15)) ; - - sri = GSM_SUB( sri, tmp2 ); - - /* v[i+1] = GSM_ADD( v[i], gsm_mult_r( rrp[i], sri ) ); - */ - tmp1 = ( tmp1 == MIN_WORD && sri == MIN_WORD - ? MAX_WORD - : 0x0FFFF & (( (longword)tmp1 * (longword)sri - + 16384) >> 15)) ; - - v[i+1] = GSM_ADD( v[i], tmp1); - } - *sr++ = v[0] = sri; - } -} - - -#if defined(FAST) && defined(USE_FLOAT_MUL) - -static void Fast_Short_term_synthesis_filtering P5((S,rrp,k,wt,sr), - struct gsm_state * S, - register word * rrp, /* [0..7] IN */ - register int k, /* k_end - k_start */ - register word * wt, /* [0..k-1] IN */ - register word * sr /* [0..k-1] OUT */ -) -{ - register word * v = S->v; - register int i; - - float va[9], rrpa[8]; - register float scalef = 3.0517578125e-5, temp; - - for (i = 0; i < 8; ++i) { - va[i] = v[i]; - rrpa[i] = (float)rrp[i] * scalef; - } - while (k--) { - register float sri = *wt++; - for (i = 8; i--;) { - sri -= rrpa[i] * va[i]; - if (sri < -32768.) sri = -32768.; - else if (sri > 32767.) sri = 32767.; - - temp = va[i] + rrpa[i] * sri; - if (temp < -32768.) temp = -32768.; - else if (temp > 32767.) temp = 32767.; - va[i+1] = temp; - } - *sr++ = va[0] = sri; - } - for (i = 0; i < 9; ++i) v[i] = va[i]; -} - -#endif /* defined(FAST) && defined(USE_FLOAT_MUL) */ - -void Gsm_Short_Term_Analysis_Filter P3((S,LARc,s), - - struct gsm_state * S, - - word * LARc, /* coded log area ratio [0..7] IN */ - word * s /* signal [0..159] IN/OUT */ -) -{ - word * LARpp_j = S->LARpp[ S->j ]; - word * LARpp_j_1 = S->LARpp[ S->j ^= 1 ]; - - word LARp[8]; - -#undef FILTER -#if defined(FAST) && defined(USE_FLOAT_MUL) -# define FILTER (* (S->fast \ - ? Fast_Short_term_analysis_filtering \ - : Short_term_analysis_filtering )) - -#else -# define FILTER Short_term_analysis_filtering -#endif - - Decoding_of_the_coded_Log_Area_Ratios( LARc, LARpp_j ); - - Coefficients_0_12( LARpp_j_1, LARpp_j, LARp ); - LARp_to_rp( LARp ); - FILTER( S, LARp, 13, s); - - Coefficients_13_26( LARpp_j_1, LARpp_j, LARp); - LARp_to_rp( LARp ); - FILTER( S, LARp, 14, s + 13); - - Coefficients_27_39( LARpp_j_1, LARpp_j, LARp); - LARp_to_rp( LARp ); - FILTER( S, LARp, 13, s + 27); - - Coefficients_40_159( LARpp_j, LARp); - LARp_to_rp( LARp ); - FILTER( S, LARp, 120, s + 40); -} - -void Gsm_Short_Term_Synthesis_Filter P4((S, LARcr, wt, s), - struct gsm_state * S, - - word * LARcr, /* received log area ratios [0..7] IN */ - word * wt, /* received d [0..159] IN */ - - word * s /* signal s [0..159] OUT */ -) -{ - word * LARpp_j = S->LARpp[ S->j ]; - word * LARpp_j_1 = S->LARpp[ S->j ^=1 ]; - - word LARp[8]; - -#undef FILTER -#if defined(FAST) && defined(USE_FLOAT_MUL) - -# define FILTER (* (S->fast \ - ? Fast_Short_term_synthesis_filtering \ - : Short_term_synthesis_filtering )) -#else -# define FILTER Short_term_synthesis_filtering -#endif - - Decoding_of_the_coded_Log_Area_Ratios( LARcr, LARpp_j ); - - Coefficients_0_12( LARpp_j_1, LARpp_j, LARp ); - LARp_to_rp( LARp ); - FILTER( S, LARp, 13, wt, s ); - - Coefficients_13_26( LARpp_j_1, LARpp_j, LARp); - LARp_to_rp( LARp ); - FILTER( S, LARp, 14, wt + 13, s + 13 ); - - Coefficients_27_39( LARpp_j_1, LARpp_j, LARp); - LARp_to_rp( LARp ); - FILTER( S, LARp, 13, wt + 27, s + 27 ); - - Coefficients_40_159( LARpp_j, LARp ); - LARp_to_rp( LARp ); - FILTER(S, LARp, 120, wt + 40, s + 40); -} diff --git a/src/audio/gsm/table.c b/src/audio/gsm/table.c deleted file mode 100644 index 16a04118c13c0e6080ddaf146046bcf95c07ea24..0000000000000000000000000000000000000000 --- a/src/audio/gsm/table.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -/* Most of these tables are inlined at their point of use. - */ - -/* 4.4 TABLES USED IN THE FIXED POINT IMPLEMENTATION OF THE RPE-LTP - * CODER AND DECODER - * - * (Most of them inlined, so watch out.) - */ - -#define GSM_TABLE_C -#include "private.h" -#include "gsm.h" - -/* Table 4.1 Quantization of the Log.-Area Ratios - */ -/* i 1 2 3 4 5 6 7 8 */ -word gsm_A[8] = {20480, 20480, 20480, 20480, 13964, 15360, 8534, 9036}; -word gsm_B[8] = { 0, 0, 2048, -2560, 94, -1792, -341, -1144}; -word gsm_MIC[8] = { -32, -32, -16, -16, -8, -8, -4, -4 }; -word gsm_MAC[8] = { 31, 31, 15, 15, 7, 7, 3, 3 }; - - -/* Table 4.2 Tabulation of 1/A[1..8] - */ -word gsm_INVA[8]={ 13107, 13107, 13107, 13107, 19223, 17476, 31454, 29708 }; - - -/* Table 4.3a Decision level of the LTP gain quantizer - */ -/* bc 0 1 2 3 */ -word gsm_DLB[4] = { 6554, 16384, 26214, 32767 }; - - -/* Table 4.3b Quantization levels of the LTP gain quantizer - */ -/* bc 0 1 2 3 */ -word gsm_QLB[4] = { 3277, 11469, 21299, 32767 }; - - -/* Table 4.4 Coefficients of the weighting filter - */ -/* i 0 1 2 3 4 5 6 7 8 9 10 */ -word gsm_H[11] = {-134, -374, 0, 2054, 5741, 8192, 5741, 2054, 0, -374, -134 }; - - -/* Table 4.5 Normalized inverse mantissa used to compute xM/xmax - */ -/* i 0 1 2 3 4 5 6 7 */ -word gsm_NRFAC[8] = { 29128, 26215, 23832, 21846, 20165, 18725, 17476, 16384 }; - - -/* Table 4.6 Normalized direct mantissa used to compute xM/xmax - */ -/* i 0 1 2 3 4 5 6 7 */ -word gsm_FAC[8] = { 18431, 20479, 22527, 24575, 26623, 28671, 30719, 32767 }; diff --git a/src/audio/gsm/toast.c b/src/audio/gsm/toast.c deleted file mode 100644 index bea46827f6aec079a315c324e73d297ee80f7ea0..0000000000000000000000000000000000000000 --- a/src/audio/gsm/toast.c +++ /dev/null @@ -1,800 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include "toast.h" - -/* toast -- lossy sound compression using the gsm library. - */ - -char * progname; - -int f_decode = 0; /* decode rather than encode (-d) */ -int f_cat = 0; /* write to stdout; implies -p (-c) */ -int f_force = 0; /* don't ask about replacements (-f) */ -int f_precious = 0; /* avoid deletion of original (-p) */ -int f_fast = 0; /* use faster fpt algorithm (-F) */ -int f_verbose = 0; /* debugging (-V) */ -int f_ltp_cut = 0; /* LTP cut-off margin (-C) */ - -struct stat instat; /* stat (inname) */ - -FILE *in, *out; -char *inname, *outname; - -/* - * The function (*output)() writes a frame of 160 samples given as - * 160 signed 16 bit values (gsm_signals) to <out>. - * The function (*input)() reads one such frame from <in>. - * The function (*init_output)() begins output (e.g. writes a header)., - * The function (*init_input)() begins input (e.g. skips a header). - * - * There are different versions of input, output, init_input and init_output - * for different formats understood by toast; which ones are used - * depends on the command line arguments and, in their absence, the - * filename; the fallback is #defined in toast.h - * - * The specific implementations of input, output, init_input and init_output - * for a format `foo' live in toast_foo.c. - */ - -int (*output ) P((gsm_signal *)), - (*input ) P((gsm_signal *)); -int (*init_input) P((void)), - (*init_output) P((void)); - -static int generic_init P0() { return 0; } /* NOP */ - -struct fmtdesc { - - char * name, * longname, * suffix; - - int (* init_input ) P((void)), - (* init_output) P((void)); - - int (* input ) P((gsm_signal * )), - (* output) P((gsm_signal * )); - -} f_audio = { - "audio", - "8 kHz, 8 bit u-law encoding with Sun audio header", ".au", - audio_init_input, - audio_init_output, - ulaw_input, - ulaw_output -}, f_ulaw = { - "u-law", "plain 8 kHz, 8 bit u-law encoding", ".u", - generic_init, - generic_init, - ulaw_input, - ulaw_output - -}, f_alaw = { - "A-law", "8 kHz, 8 bit A-law encoding", ".A", - generic_init, - generic_init, - alaw_input, - alaw_output - -}, f_linear = { - "linear", - "16 bit (13 significant) signed 8 kHz signal", ".l", - generic_init, - generic_init, - linear_input, - linear_output -}; - -struct fmtdesc * alldescs[] = { - &f_audio, - &f_alaw, - &f_ulaw, - &f_linear, - (struct fmtdesc *)NULL -}; - -#define DEFAULT_FORMAT f_ulaw /* default audio format, others */ - /* are: f_alaw,f_audio,f_linear */ -struct fmtdesc * f_format = 0; - -/* - * basename + suffix of a pathname - */ -static char * endname P1((name), char * name) -{ - if (name) { - char * s = strrchr(name, '/'); - if (s && s[1]) name = s + 1; - } - return name; - -} - -/* - * Try to figure out what we're supposed to do from the argv[0], if - * any, and set the parameters accordingly. - */ -static void parse_argv0 P1((av0), char * av0 ) -{ - int l; - - progname = av0 = endname(av0 ? av0 : "toast"); - - /* If the name starts with `un', we want to decode, not code. - * If the name ends in `cat', we want to write to stdout, - * and decode as well. - */ - - if (!strncmp(av0, "un", 2)) f_decode = 1; - if ( (l = strlen(av0)) >= 3 /* strlen("cat") */ - && !strcmp( av0 + l - 3, "cat" )) f_cat = f_decode = 1; -} - - -/* - * Check whether the name (possibly generated by appending - * .gsm to something else) is short enough for this system. - */ -static int length_okay P1((name), char * name) -{ - long max_filename_length = 0; - char * end; - - /* If our _pathname_ is too long, we'll usually not be - * able to open the file at all -- don't worry about that. - * - * But if the _filename_ is too long, there is danger of - * silent truncation on some systems, which results - * in the target replacing the source! - */ - - if (!name) return 0; - end = endname(name); - -#ifdef NAME_MAX - max_filename_length = NAME_MAX; -#else -#ifdef _PC_NAME_MAX -#ifdef USE_PATHCONF - { char * s, tmp; - - /* s = dirname(name) - */ - if ((s = end) > name) { - if (s > name + 1) s--; - tmp = s; - *s = 0; - } - - errno = 0; - max_filename_length = pathconf(s > name ? name : ".", - _PC_NAME_MAX); - if (max_filename_length == -1 && errno) { - perror( s > name ? name : "." ); - fprintf(stderr, - "%s: cannot get dynamic filename length limit for %s.\n", - progname, s > name ? name : "."); - return 0; - } - if (s > name) *s = tmp; - } -#endif /* USE_PATHCONF */ -#endif /* _PC_NAME_MAX */ -#endif /* !NAME_MAX */ - - if (max_filename_length > 0 && strlen(end) > max_filename_length) { - fprintf(stderr, - "%s: filename \"%s\" is too long (maximum is %ld)\n", - progname, endname(name), max_filename_length ); - return 0; - } - - return 1; -} - -/* - * Return a pointer the suffix of a string, if any. - * A suffix alone has no suffix, an empty suffix can not be had. - */ -static char * suffix P2((name, suf), char *name, char * suf) -{ - size_t nlen = strlen(name); - size_t slen = strlen(suf); - - if (!slen || nlen <= slen) return (char *)0; - name += nlen - slen; - return memcmp(name, suf, slen) ? (char *)0 : name; -} - - -static void catch_signals P1((fun), SIGHANDLER_T (*fun) ()) -{ -#ifdef SIGHUP - signal( SIGHUP, fun ); -#endif -#ifdef SIGINT - signal( SIGINT, fun ); -#endif -#ifdef SIGPIPE - signal( SIGPIPE, fun ); -#endif -#ifdef SIGTERM - signal( SIGTERM, fun ); -#endif -#ifdef SIGXFSZ - signal( SIGXFSZ, fun ); -#endif -} - -static SIGHANDLER_T onintr P0() -{ - char * tmp = outname; - -#ifdef HAS_SYSV_SIGNALS - catch_signals( SIG_IGN ); -#endif - - outname = (char *)0; - if (tmp) (void)unlink(tmp); - - exit(1); -} - -/* - * Allocate some memory and complain if it fails. - */ -static char * emalloc P1((len), size_t len) -{ - char * s; - if (!(s = malloc(len))) { - fprintf(stderr, "%s: failed to malloc %d bytes -- abort\n", - progname, len); - onintr(); - exit(1); - } - return s; -} - -static char* normalname P3((name, want, cut), char *name, char *want,char *cut) -{ - size_t maxlen; - char * s, * p; - - p = (char *)0; - if (!name) return p; - - maxlen = strlen(name) + 1 + strlen(want) + strlen(cut); - p = strcpy(emalloc(maxlen), name); - - if (s = suffix(p, cut)) strcpy(s, want); - else if (*want && !suffix(p, want)) strcat(p, want); - - return p; -} - -/* - * Generate a `plain' (non-encoded) name from a given name. - */ -static char * plainname P1((name), char *name) -{ - return normalname(name, "", SUFFIX_TOASTED ); -} - -/* - * Generate a `code' name from a given name. - */ -static char * codename P1((name), char *name) -{ - return normalname( name, SUFFIX_TOASTED, "" ); -} - -/* - * If we're supposed to ask (fileno (stderr) is a tty, and f_force not - * set), ask the user whether to overwrite a file or not. - */ -static int ok_to_replace P1(( name ), char * name) -{ - int reply, c; - - if (f_force) return 1; /* YES, do replace */ - if (!isatty(fileno(stderr))) return 0; /* NO, don't replace */ - - fprintf(stderr, - "%s already exists; do you wish to overwrite %s (y or n)? ", - name, name); - fflush(stderr); - - for (c = reply = getchar(); c != '\n' && c != EOF; c = getchar()) ; - if (reply == 'y') return 1; - - fprintf(stderr, "\tnot overwritten\n"); - return 0; -} - -static void update_mode P0() -{ - if (!instat.st_nlink) return; /* couldn't stat in */ - -#ifdef HAS_FCHMOD - if (fchmod(fileno(out), instat.st_mode & 07777)) { - perror(outname); - fprintf(stderr, "%s: could not change file mode of \"%s\"\n", - progname, outname); - } -#else -#ifdef HAS_CHMOD - if (outname && chmod(outname, instat.st_mode & 07777)) { - perror(outname); - fprintf(stderr, "%s: could not change file mode of \"%s\"\n", - progname, outname); - } -#endif /* HAS_CHMOD */ -#endif /* HAS_FCHMOD */ -} - -static void update_own P0() -{ - if (!instat.st_nlink) return; /* couldn't stat in */ -#ifdef HAS_FCHOWN - (void)fchown(fileno(out), instat.st_uid, instat.st_gid); -#else -#ifdef HAS_CHOWN - (void)chown(outname, instat.st_uid, instat.st_gid); -#endif /* HAS_CHOWN */ -#endif /* HAS_FCHOWN */ -} - -static void update_times P0() -{ - if (!instat.st_nlink) return; /* couldn't stat in */ - -#ifdef HAS_UTIMES - if (outname) { - struct timeval tv[2]; - - tv[0].tv_sec = instat.st_atime; - tv[1].tv_sec = instat.st_mtime; - tv[0].tv_usec = tv[1].tv_usec = 0; - (void) utimes(outname, tv); - } -#else -#ifdef HAS_UTIME - - if (outname) { - -#ifdef HAS_UTIMBUF - struct utimbuf ut; - - ut.actime = instat.st_atime; - ut.modtime = instat.st_mtime; - -# ifdef HAS_UTIMEUSEC - ut.acusec = instat.st_ausec; - ut.modusec = instat.st_musec; -# endif /* HAS_UTIMEUSEC */ - - (void) utime(outname, &ut); - -#else /* UTIMBUF */ - - time_t ut[2]; - - ut[0] = instat.st_atime; - ut[1] = instat.st_mtime; - - (void) utime(outname, ut); - -#endif /* UTIMBUF */ - } -#endif /* HAS_UTIME */ -#endif /* HAS_UTIMES */ -} - - -static int okay_as_input P3((name,f,st), char* name, FILE* f, struct stat * st) -{ -# ifdef HAS_FSTAT - if (fstat(fileno(f), st) < 0) -# else - if (stat(name, st) < 0) -# endif - { - perror(name); - fprintf(stderr, "%s: cannot stat \"%s\"\n", progname, name); - return 0; - } - - if (!S_ISREG(st->st_mode)) { - fprintf(stderr, - "%s: \"%s\" is not a regular file -- unchanged.\n", - progname, name); - return 0; - } - if (st->st_nlink > 1 && !f_cat && !f_precious) { - fprintf(stderr, - "%s: \"%s\" has %s other link%s -- unchanged.\n", - progname,name,st->st_nlink - 1,"s" + (st->st_nlink<=2)); - return 0; - } - return 1; -} - -static void prepare_io P1(( desc), struct fmtdesc * desc) -{ - output = desc->output; - input = desc->input; - - init_input = desc->init_input; - init_output = desc->init_output; -} - -static struct fmtdesc * grok_format P1((name), char * name) -{ - char * c; - struct fmtdesc ** f; - - if (name) { - c = plainname(name); - - for (f = alldescs; *f; f++) { - if ( (*f)->suffix - && *(*f)->suffix - && suffix(c, (*f)->suffix)) { - - free(c); - return *f; - } - } - - free(c); - } - return (struct fmtdesc *)0; -} - -static int open_input P2((name, st), char * name, struct stat * st) -{ - struct fmtdesc * f = f_format; - - st->st_nlink = 0; /* indicates `undefined' value */ - if (!name) { - inname = (char *)NULL; - in = stdin; -#ifdef HAS__FSETMODE - _fsetmode(in, "b"); -#endif - } - else { - if (f_decode) inname = codename(name); - else { - if (!f_cat && suffix(name, SUFFIX_TOASTED)) { - fprintf(stderr, - "%s: %s already has \"%s\" suffix -- unchanged.\n", - progname, name, SUFFIX_TOASTED ); - return 0; - } - inname = strcpy(emalloc(strlen(name)+1), name); - } - if (!(in = fopen(inname, READ))) { - perror(inname); /* not guaranteed to be valid here */ - fprintf(stderr, "%s: cannot open \"%s\" for reading\n", - progname, inname); - return 0; - } - if (!okay_as_input(inname, in, st)) return 0; - if (!f) f = grok_format(inname); - } - prepare_io( f ? f : & DEFAULT_FORMAT ); - return 1; -} - -static int open_output P1((name), char *name) -{ - if (!name || f_cat) { - out = stdout; - outname = (char *)NULL; -#ifdef HAS__FSETMODE - _fsetmode(out, "b"); -#endif - } - else { - int outfd = -1; - char * o; - - o = (*(f_decode ? plainname : codename))(name); - if (!length_okay(o)) return 0; - if ((outfd = open(o, O_WRITE_EXCL, 0666)) >= 0) - out = fdopen(outfd, WRITE); - else if (errno != EEXIST) out = (FILE *)NULL; - else if (ok_to_replace(o)) out = fopen(o, WRITE); - else return 0; - - if (!out) { - perror(o); - fprintf(stderr, - "%s: can't open \"%s\" for writing\n", - progname, o); - if (outfd >= 0) (void)close(outfd); - return 0; - } - - outname = o; - } - return 1; -} - -static int process_encode P0() -{ - gsm r; - gsm_signal s[ 160 ]; - gsm_frame d; - - int cc; - - if (!(r = gsm_create())) { - perror(progname); - return -1; - } - (void)gsm_option(r, GSM_OPT_FAST, &f_fast); - (void)gsm_option(r, GSM_OPT_VERBOSE, &f_verbose); - (void)gsm_option(r, GSM_OPT_LTP_CUT, &f_ltp_cut); - - while ((cc = (*input)(s)) > 0) { - if (cc < sizeof(s) / sizeof(*s)) - memset((char *)(s+cc), 0, sizeof(s)-(cc * sizeof(*s))); - gsm_encode(r, s, d); - if (fwrite((char *)d, sizeof(d), 1, out) != 1) { - perror(outname ? outname : "stdout"); - fprintf(stderr, "%s: error writing to %s\n", - progname, outname ? outname : "stdout"); - gsm_destroy(r); - return -1; - } - } - if (cc < 0) { - perror(inname ? inname : "stdin"); - fprintf(stderr, "%s: error reading from %s\n", - progname, inname ? inname : "stdin"); - gsm_destroy(r); - return -1; - } - gsm_destroy(r); - - return 0; -} - -static int process_decode P0() -{ - gsm r; - gsm_frame s; - gsm_signal d[ 160 ]; - - int cc; - - if (!(r = gsm_create())) { /* malloc failed */ - perror(progname); - return -1; - } - (void)gsm_option(r, GSM_OPT_FAST, &f_fast); - (void)gsm_option(r, GSM_OPT_VERBOSE, &f_verbose); - - while ((cc = fread(s, 1, sizeof(s), in)) > 0) { - - if (cc != sizeof(s)) { - if (cc >= 0) fprintf(stderr, - "%s: incomplete frame (%d byte%s missing) from %s\n", - progname, sizeof(s) - cc, - "s" + (sizeof(s) - cc == 1), - inname ? inname : "stdin" ); - gsm_destroy(r); - errno = 0; - return -1; - } - if (gsm_decode(r, s, d)) { - fprintf(stderr, "%s: bad frame in %s\n", - progname, inname ? inname : "stdin"); - gsm_destroy(r); - errno = 0; - return -1; - } - - if ((*output)(d) < 0) { - perror(outname); - fprintf(stderr, "%s: error writing to %s\n", - progname, outname); - gsm_destroy(r); - return -1; - } - } - - if (cc < 0) { - perror(inname ? inname : "stdin" ); - fprintf(stderr, "%s: error reading from %s\n", progname, - inname ? inname : "stdin"); - gsm_destroy(r); - return -1; - } - - gsm_destroy(r); - return 0; -} - -static int process P1((name), char * name) -{ - int step = 0; - - out = (FILE *)0; - in = (FILE *)0; - - outname = (char *)0; - inname = (char *)0; - - if (!open_input(name, &instat) || !open_output(name)) - goto err; - - if ((*(f_decode ? init_output : init_input))()) { - fprintf(stderr, "%s: error %s %s\n", - progname, - f_decode ? "writing header to" : "reading header from", - f_decode ? (outname ? outname : "stdout") - : (inname ? inname : "stdin")); - goto err; - } - - if ((*(f_decode ? process_decode : process_encode))()) - goto err; - - if (fflush(out) < 0 || ferror(out)) { - perror(outname ? outname : "stdout"); - fprintf(stderr, "%s: error writing \"%s\"\n", progname, - outname ? outname:"stdout"); - goto err; - } - - if (out != stdout) { - - update_times(); - update_mode (); - update_own (); - - if (fclose(out) < 0) { - perror(outname); - fprintf(stderr, "%s: error writing \"%s\"\n", - progname, outname); - goto err; - } - if (outname != name) free(outname); - outname = (char *)0; - } - out = (FILE *)0; - if (in != stdin) { - (void)fclose(in), in = (FILE *)0; - if (!f_cat && !f_precious) { - if (unlink(inname) < 0) { - perror(inname); - fprintf(stderr, - "%s: source \"%s\" not deleted.\n", - progname, inname); - } - goto err; - } - if (inname != name) free(inname); - inname = (char *)0; - } - return 0; - - /* - * Error handling and cleanup. - */ -err: - if (out && out != stdout) { - (void)fclose(out), out = (FILE *)0; - if (unlink(outname) < 0 && errno != ENOENT && errno != EINTR) { - perror(outname); - fprintf(stderr, "%s: could not unlink \"%s\"\n", - progname, outname); - } - } - if (in && in != stdin) (void)fclose(in), in = (FILE *)0; - - if (inname && inname != name) free(inname); - if (outname && outname != name) free(outname); - - return -1; -} - -static void version P0() -{ - printf( "%s 1.0, version %s\n", - progname, - "$Id$" ); -} - -static void help P0() -{ - printf("Usage: %s [-fcpdhvaulsFC] [files...]\n", progname); - printf("\n"); - - printf(" -f force Replace existing files without asking\n"); - printf(" -c cat Write to stdout, do not remove source files\n"); - printf(" -d decode Decode data (default is encode)\n"); - printf(" -p precious Do not delete the source\n"); - printf("\n"); - - printf(" -u u-law Force 8 kHz/8 bit u-law in/output format\n"); - printf(" -s sun .au Force Sun .au u-law in/output format\n"); - printf(" -a A-law Force 8 kHz/8 bit A-law in/output format\n"); - printf(" -l linear Force 16 bit linear in/output format\n"); - printf("\n"); - - printf(" -F fast Sacrifice conformance to performance\n"); - printf(" -C cutoff Ignore most samples during LTP\n"); - printf(" -v version Show version information\n"); - printf(" -h help Print this text\n"); - printf("\n"); -} - - -static void set_format P1((f), struct fmtdesc * f) -{ - if (f_format && f_format != f) { - fprintf( stderr, - "%s: only one of -[uals] is possible (%s -h for help)\n", - progname, progname); - exit(1); - } - - f_format = f; -} - -int main P2((ac, av), int ac, char **av) -{ - int opt; - extern int optind; - extern char * optarg; - - parse_argv0(*av); - - while ((opt = getopt(ac, av, "fcdpvhuaslVFC:")) != EOF) switch (opt) { - - case 'd': f_decode = 1; break; - case 'f': f_force = 1; break; - case 'c': f_cat = 1; break; - case 'p': f_precious = 1; break; - case 'F': f_fast = 1; break; - case 'C': f_ltp_cut = 100; break; -#ifndef NDEBUG - case 'V': f_verbose = 1; break; /* undocumented */ -#endif - - case 'u': set_format( &f_ulaw ); break; - case 'l': set_format( &f_linear ); break; - case 'a': set_format( &f_alaw ); break; - case 's': set_format( &f_audio ); break; - - case 'v': version(); exit(0); - case 'h': help(); exit(0); - - default: - usage: - fprintf(stderr, - "Usage: %s [-fcpdhvuaslFC] [files...] (-h for help)\n", - progname); - exit(1); - } - - f_precious |= f_cat; - - av += optind; - ac -= optind; - - catch_signals(onintr); - - if (ac <= 0) process( (char *)0 ); - else while (ac--) process( *av++ ); - - exit(0); -} diff --git a/src/audio/gsm/toast.h b/src/audio/gsm/toast.h deleted file mode 100644 index 1eaeb6c5668655358b437ccc58e13aad37969ce3..0000000000000000000000000000000000000000 --- a/src/audio/gsm/toast.h +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#ifndef TOAST_H -#define TOAST_H /* Guard against multiple includes */ - -#include "config.h" - -#include <sys/types.h> -#include <sys/stat.h> - -#include <stdio.h> -#include <ctype.h> -#include <signal.h> - -#include <errno.h> -#ifndef HAS_ERRNO_DECL - extern int errno; -#endif - -#ifdef HAS_LIMITS_H -#include <limits.h> -#endif - -#ifdef HAS_FCNTL_H -# include <fcntl.h> -#endif - -#ifdef HAS_UTIME -# ifdef HAS_UTIME_H -# include <utime.h> -# endif -#endif - -#include "gsm.h" - -#ifndef S_ISREG -#define S_ISREG(x) ((x) & S_IFREG) -#endif /* S_ISREG */ - - -# define READ "rb" -# define WRITE "wb" -#ifdef O_BINARY -# define O_WRITE_EXCL O_WRONLY|O_CREAT|O_EXCL|O_BINARY -#else -# define O_WRITE_EXCL O_WRONLY|O_CREAT|O_EXCL -#endif - -#ifndef SIGHANDLER_T -#define SIGHANDLER_T void /* what does a signal handler return? */ -#endif - - -#ifdef HAS_STRING_H -#include <string.h> -#else -# ifdef HAS_STRINGS_H -# include <strings.h> -# else -# include "proto.h" - - extern int strlen P((char *)); - extern char * strcpy P((char *, char *)); - extern char * strcat P((char *, char *)); - extern char * strrchr P((char *, int)); - -# include "unproto.h" -# endif -#endif - - -#ifdef HAS_STDLIB_H -#include <stdlib.h> -#else -# include "proto.h" -# ifdef HAS_MALLOC_H -# include <malloc.h> -# else - extern char * malloc P((unsigned)); -# endif - extern int exit P((int)); -# include "unproto.h" -#endif - - -#ifdef HAS_UNISTD_H -# include <unistd.h> -#endif - -/* - * This suffix is tacked onto/removed from filenames - * similar to the way freeze and compress do it. - */ -#define SUFFIX_TOASTED ".gsm" - -#include "proto.h" - -extern int audio_init_input P((void)), audio_init_output P((void)); -extern int ulaw_input P((gsm_signal*)), ulaw_output P((gsm_signal *)); -extern int alaw_input P((gsm_signal*)), alaw_output P((gsm_signal *)); -extern int linear_input P((gsm_signal*)), linear_output P((gsm_signal *)); - -#endif /* TOAST_H */ diff --git a/src/audio/gsm/toast_alaw.c b/src/audio/gsm/toast_alaw.c deleted file mode 100644 index 98917372e1730683e08218c56f9b5784955eef8a..0000000000000000000000000000000000000000 --- a/src/audio/gsm/toast_alaw.c +++ /dev/null @@ -1,334 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include "toast.h" - -/* toast_alaw.c -- manipulate A-law encoded sound. - */ - -extern FILE * in, * out; - -#define A2S(x) (a2s[ (unsigned char )(x) ]) -#define S2A(x) (s2a[ ((unsigned short)(x)) >> 4 ]) - -static unsigned short a2s[] = { - - 60032, 60288, 59520, 59776, 61056, 61312, 60544, 60800, - 57984, 58240, 57472, 57728, 59008, 59264, 58496, 58752, - 62784, 62912, 62528, 62656, 63296, 63424, 63040, 63168, - 61760, 61888, 61504, 61632, 62272, 62400, 62016, 62144, - 43520, 44544, 41472, 42496, 47616, 48640, 45568, 46592, - 35328, 36352, 33280, 34304, 39424, 40448, 37376, 38400, - 54528, 55040, 53504, 54016, 56576, 57088, 55552, 56064, - 50432, 50944, 49408, 49920, 52480, 52992, 51456, 51968, - 65192, 65208, 65160, 65176, 65256, 65272, 65224, 65240, - 65064, 65080, 65032, 65048, 65128, 65144, 65096, 65112, - 65448, 65464, 65416, 65432, 65512, 65528, 65480, 65496, - 65320, 65336, 65288, 65304, 65384, 65400, 65352, 65368, - 64160, 64224, 64032, 64096, 64416, 64480, 64288, 64352, - 63648, 63712, 63520, 63584, 63904, 63968, 63776, 63840, - 64848, 64880, 64784, 64816, 64976, 65008, 64912, 64944, - 64592, 64624, 64528, 64560, 64720, 64752, 64656, 64688, - 5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736, - 7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784, - 2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368, - 3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392, - 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944, - 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136, - 11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472, - 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568, - 344, 328, 376, 360, 280, 264, 312, 296, - 472, 456, 504, 488, 408, 392, 440, 424, - 88, 72, 120, 104, 24, 8, 56, 40, - 216, 200, 248, 232, 152, 136, 184, 168, - 1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184, - 1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696, - 688, 656, 752, 720, 560, 528, 624, 592, - 944, 912, 1008, 976, 816, 784, 880, 848 - -}; - - -static unsigned char s2a[] = { - - 213,212,215,214,209,208,211,210,221,220,223,222,217,216,219,218, - 197,196,199,198,193,192,195,194,205,204,207,206,201,200,203,202, - 245,245,244,244,247,247,246,246,241,241,240,240,243,243,242,242, - 253,253,252,252,255,255,254,254,249,249,248,248,251,251,250,250, - 229,229,229,229,228,228,228,228,231,231,231,231,230,230,230,230, - 225,225,225,225,224,224,224,224,227,227,227,227,226,226,226,226, - 237,237,237,237,236,236,236,236,239,239,239,239,238,238,238,238, - 233,233,233,233,232,232,232,232,235,235,235,235,234,234,234,234, - 149,149,149,149,149,149,149,149,148,148,148,148,148,148,148,148, - 151,151,151,151,151,151,151,151,150,150,150,150,150,150,150,150, - 145,145,145,145,145,145,145,145,144,144,144,144,144,144,144,144, - 147,147,147,147,147,147,147,147,146,146,146,146,146,146,146,146, - 157,157,157,157,157,157,157,157,156,156,156,156,156,156,156,156, - 159,159,159,159,159,159,159,159,158,158,158,158,158,158,158,158, - 153,153,153,153,153,153,153,153,152,152,152,152,152,152,152,152, - 155,155,155,155,155,155,155,155,154,154,154,154,154,154,154,154, - 133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133, - 132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132, - 135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135, - 134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134, - 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, - 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, - 131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131, - 130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130, - 141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, - 140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140, - 143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143, - 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, - 137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137, - 136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136, - 139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, - 138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138, - 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181, - 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181, - 180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180, - 180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180, - 183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183, - 183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183, - 182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182, - 182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182, - 177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177, - 177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177, - 176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176, - 176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176, - 179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179, - 179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179, - 178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178, - 178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178, - 189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189, - 189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189, - 188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188, - 188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188, - 191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191, - 191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191, - 190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190, - 190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190, - 185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185, - 185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185, - 184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184, - 184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184, - 187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187, - 187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187, - 186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186, - 186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186, - 165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165, - 165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165, - 165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165, - 165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165, - 164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164, - 164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164, - 164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164, - 164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164, - 167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167, - 167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167, - 167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167, - 167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167, - 166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166, - 166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166, - 166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166, - 166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166, - 161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161, - 161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161, - 161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161, - 161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161, - 160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160, - 160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160, - 160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160, - 160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160, - 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163, - 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163, - 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163, - 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163, - 162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162, - 162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162, - 162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162, - 162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162, - 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173, - 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173, - 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173, - 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173, - 172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172, - 172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172, - 172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172, - 172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172, - 175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175, - 175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175, - 175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175, - 175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175, - 174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174, - 174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174, - 174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174, - 174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174, - 169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169, - 169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169, - 169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169, - 169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169, - 168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168, - 168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168, - 168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168, - 168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168, - 171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171, - 171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171, - 171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171, - 171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171, - 170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170, - 170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170, - 170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170, - 170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, - 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, - 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, - 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, - 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, - 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, - 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, - 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, - 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, - 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, - 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, - 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, - 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, - 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, - 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, - 106,106,106,106,107,107,107,107,104,104,104,104,105,105,105,105, - 110,110,110,110,111,111,111,111,108,108,108,108,109,109,109,109, - 98, 98, 98, 98, 99, 99, 99, 99, 96, 96, 96, 96, 97, 97, 97, 97, - 102,102,102,102,103,103,103,103,100,100,100,100,101,101,101,101, - 122,122,123,123,120,120,121,121,126,126,127,127,124,124,125,125, - 114,114,115,115,112,112,113,113,118,118,119,119,116,116,117,117, - 74, 75, 72, 73, 78, 79, 76, 77, 66, 67, 64, 65, 70, 71, 68, 69, - 90, 91, 88, 89, 94, 95, 92, 93, 82, 83, 80, 81, 86, 87, 84, 85 -}; - -int alaw_input P1((buf), gsm_signal * buf) -{ - int i, c; - - for (i = 0; i < 160 && (c = fgetc(in)) != EOF; i++) buf[i] = A2S( c ); - if (c == EOF && ferror(in)) return -1; - return i; -} - -int alaw_output P1((buf), gsm_signal * buf) -{ - int i; - - for (i = 0; i < 160; i++, buf++) - if (fputc( S2A( *buf ), out) == EOF) return -1; - return 0; -} - diff --git a/src/audio/gsm/toast_audio.c b/src/audio/gsm/toast_audio.c deleted file mode 100644 index 42300e3a9d6c3983e739505c40f0b9c70df2fbbe..0000000000000000000000000000000000000000 --- a/src/audio/gsm/toast_audio.c +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include "toast.h" - -/* toast_audio -- functions to manipulate SunOS audio files. - * - * This is reverse engineered from our present soundfiles - * and in no way portable, durable or aesthetically pleasing. - */ - -extern FILE * in, * out; -extern char * inname; -extern char * progname; - -extern int (*output) P((gsm_signal *)), - (*input ) P((gsm_signal *)); - -extern int alaw_input P((gsm_signal *)), - ulaw_input P((gsm_signal *)), - linear_input P((gsm_signal *)); - -extern int ulaw_output P((gsm_signal *)); - -static int put_u32 P2((f, u), FILE * f, unsigned long u) -{ - /* Write a 32-bit unsigned value msb first. - */ - if ( putc( (char)((u>>24) & 0x0FF), f) == EOF - || putc( (char)((u>>16) & 0x0FF), f) == EOF - || putc( (char)((u>> 8) & 0x0FF), f) == EOF - || putc( (char)( u & 0x0FF), f) == EOF) return -1; - - return 0; -} - -static int get_u32 P2((f, up), FILE * f, unsigned long * up) -{ - /* Read a 32-bit unsigned value msb first. - */ - int i; - unsigned long u; - - if ( (i = getc(f)) == EOF - || ((u = (unsigned char)i), (i = getc(f)) == EOF) - || ((u = (u<<8)|(unsigned char)i), (i = getc(f)) == EOF) - || ((u = (u<<8)|(unsigned char)i), (i = getc(f)) == EOF)) return -1; - *up = (u<<8)|(unsigned char)i; - return 0; -} - -int audio_init_input P0() -{ - unsigned long len, enc; /* unsigned 32 bits */ - - if ( fgetc(in) != '.' - || fgetc(in) != 's' - || fgetc(in) != 'n' - || fgetc(in) != 'd' - || get_u32( in, &len ) - || get_u32( in, &enc ) /* skip this */ - || get_u32( in, &enc )) { - fprintf(stderr, - "%s: bad (missing?) header in Sun audio file \"%s\";\n\ - Try one of -u, -a, -l instead (%s -h for help).\n", - progname, inname ? inname : "stdin", progname); - return -1; - } - - switch (enc) { - case 1: input = ulaw_input; break; - case 2: input = alaw_input; break; - case 3: input = linear_input; break; - default: - fprintf(stderr, -"%s: warning: file format #%lu for %s not implemented, defaulting to u-law.\n", - progname, enc, inname); - input = ulaw_input; - break; - } - - while (len > 4*4) - if (getc(in) == EOF) { - fprintf(stderr, - "%s: EOF in header of Sun audio file \"%s\";\n\ - Try one of -u, -a, -l instead (%s -h for help).\n", - progname, inname ? inname : "stdin", progname); - return -1; - } - else len--; - - return 0; -} - -int audio_init_output P0() -{ - if ( fputs(".snd", out) == EOF - || put_u32(out, 32) - || put_u32(out, ~(unsigned long)0) - || put_u32(out, 1) - || put_u32(out, 8000) - || put_u32(out, 1) - || put_u32(out, 0) - || put_u32(out, 0)) return -1; - - return 0; -} - diff --git a/src/audio/gsm/toast_lin.c b/src/audio/gsm/toast_lin.c deleted file mode 100644 index b9f9c890e2f0c42cad4bdacff39accc879279a7d..0000000000000000000000000000000000000000 --- a/src/audio/gsm/toast_lin.c +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include "toast.h" - -/* toast_linear.c -- read and write 16 bit linear sound in host byte order. - */ - -extern FILE *in, *out; - -int linear_input (buf) gsm_signal * buf; -{ - return fread( (char *)buf, sizeof(*buf), 160, in ); -} - -int linear_output P1((buf), gsm_signal * buf) -{ - return -( fwrite( (char *)buf, sizeof(*buf), 160, out ) != 160 ); -} diff --git a/src/audio/gsm/toast_ulaw.c b/src/audio/gsm/toast_ulaw.c deleted file mode 100644 index 987de113627f0e14edaa41cc87e4066123d82486..0000000000000000000000000000000000000000 --- a/src/audio/gsm/toast_ulaw.c +++ /dev/null @@ -1,621 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include "toast.h" - -/* toast_ulaw -- functions to manipulate u-law encoded sound. - */ - -extern FILE *in, *out; - -#define U2S(x) (u2s[ (unsigned char)(x) ]) -#define S2U(x) (s2u[ ((unsigned short)(x)) >> 3 ]) - -static unsigned short u2s[] = { - 33280, 34308, 35336, 36364, 37393, 38421, 39449, 40477, - 41505, 42534, 43562, 44590, 45618, 46647, 47675, 48703, - 49474, 49988, 50503, 51017, 51531, 52045, 52559, 53073, - 53587, 54101, 54616, 55130, 55644, 56158, 56672, 57186, - 57572, 57829, 58086, 58343, 58600, 58857, 59114, 59371, - 59628, 59885, 60142, 60399, 60656, 60913, 61171, 61428, - 61620, 61749, 61877, 62006, 62134, 62263, 62392, 62520, - 62649, 62777, 62906, 63034, 63163, 63291, 63420, 63548, - 63645, 63709, 63773, 63838, 63902, 63966, 64030, 64095, - 64159, 64223, 64287, 64352, 64416, 64480, 64544, 64609, - 64657, 64689, 64721, 64753, 64785, 64818, 64850, 64882, - 64914, 64946, 64978, 65010, 65042, 65075, 65107, 65139, - 65163, 65179, 65195, 65211, 65227, 65243, 65259, 65275, - 65291, 65308, 65324, 65340, 65356, 65372, 65388, 65404, - 65416, 65424, 65432, 65440, 65448, 65456, 65464, 65472, - 65480, 65488, 65496, 65504, 65512, 65520, 65528, 0, - 32256, 31228, 30200, 29172, 28143, 27115, 26087, 25059, - 24031, 23002, 21974, 20946, 19918, 18889, 17861, 16833, - 16062, 15548, 15033, 14519, 14005, 13491, 12977, 12463, - 11949, 11435, 10920, 10406, 9892, 9378, 8864, 8350, - 7964, 7707, 7450, 7193, 6936, 6679, 6422, 6165, - 5908, 5651, 5394, 5137, 4880, 4623, 4365, 4108, - 3916, 3787, 3659, 3530, 3402, 3273, 3144, 3016, - 2887, 2759, 2630, 2502, 2373, 2245, 2116, 1988, - 1891, 1827, 1763, 1698, 1634, 1570, 1506, 1441, - 1377, 1313, 1249, 1184, 1120, 1056, 992, 927, - 879, 847, 815, 783, 751, 718, 686, 654, - 622, 590, 558, 526, 494, 461, 429, 397, - 373, 357, 341, 325, 309, 293, 277, 261, - 245, 228, 212, 196, 180, 164, 148, 132, - 120, 112, 104, 96, 88, 80, 72, 64, - 56, 48, 40, 32, 24, 16, 8, 0 -}; - -static unsigned char s2u[] = { -0377,0376,0375,0374,0373,0372,0371,0370,0367,0366,0365,0364,0363,0362,0361, -0360,0357,0357,0356,0356,0355,0355,0354,0354,0353,0353,0352,0352,0351,0351, -0350,0350,0347,0347,0346,0346,0345,0345,0344,0344,0343,0343,0342,0342,0341, -0341,0340,0340,0337,0337,0337,0337,0336,0336,0336,0336,0335,0335,0335,0335, -0334,0334,0334,0334,0333,0333,0333,0333,0332,0332,0332,0332,0331,0331,0331, -0331,0330,0330,0330,0330,0327,0327,0327,0327,0326,0326,0326,0326,0325,0325, -0325,0325,0324,0324,0324,0324,0323,0323,0323,0323,0322,0322,0322,0322,0321, -0321,0321,0321,0320,0320,0320,0320,0317,0317,0317,0317,0317,0317,0317,0317, -0316,0316,0316,0316,0316,0316,0316,0316,0315,0315,0315,0315,0315,0315,0315, -0315,0314,0314,0314,0314,0314,0314,0314,0314,0313,0313,0313,0313,0313,0313, -0313,0313,0312,0312,0312,0312,0312,0312,0312,0312,0311,0311,0311,0311,0311, -0311,0311,0311,0310,0310,0310,0310,0310,0310,0310,0310,0307,0307,0307,0307, -0307,0307,0307,0307,0306,0306,0306,0306,0306,0306,0306,0306,0305,0305,0305, -0305,0305,0305,0305,0305,0304,0304,0304,0304,0304,0304,0304,0304,0303,0303, -0303,0303,0303,0303,0303,0303,0303,0302,0302,0302,0302,0302,0302,0302,0302, -0301,0301,0301,0301,0301,0301,0301,0301,0300,0300,0300,0300,0300,0300,0300, -0300,0277,0277,0277,0277,0277,0277,0277,0277,0277,0277,0277,0277,0277,0277, -0277,0277,0276,0276,0276,0276,0276,0276,0276,0276,0276,0276,0276,0276,0276, -0276,0276,0276,0275,0275,0275,0275,0275,0275,0275,0275,0275,0275,0275,0275, -0275,0275,0275,0275,0274,0274,0274,0274,0274,0274,0274,0274,0274,0274,0274, -0274,0274,0274,0274,0274,0273,0273,0273,0273,0273,0273,0273,0273,0273,0273, -0273,0273,0273,0273,0273,0273,0272,0272,0272,0272,0272,0272,0272,0272,0272, -0272,0272,0272,0272,0272,0272,0272,0271,0271,0271,0271,0271,0271,0271,0271, -0271,0271,0271,0271,0271,0271,0271,0271,0270,0270,0270,0270,0270,0270,0270, -0270,0270,0270,0270,0270,0270,0270,0270,0270,0267,0267,0267,0267,0267,0267, -0267,0267,0267,0267,0267,0267,0267,0267,0267,0267,0266,0266,0266,0266,0266, -0266,0266,0266,0266,0266,0266,0266,0266,0266,0266,0266,0265,0265,0265,0265, -0265,0265,0265,0265,0265,0265,0265,0265,0265,0265,0265,0265,0264,0264,0264, -0264,0264,0264,0264,0264,0264,0264,0264,0264,0264,0264,0264,0264,0263,0263, -0263,0263,0263,0263,0263,0263,0263,0263,0263,0263,0263,0263,0263,0263,0262, -0262,0262,0262,0262,0262,0262,0262,0262,0262,0262,0262,0262,0262,0262,0262, -0262,0261,0261,0261,0261,0261,0261,0261,0261,0261,0261,0261,0261,0261,0261, -0261,0261,0260,0260,0260,0260,0260,0260,0260,0260,0260,0260,0260,0260,0260, -0260,0260,0260,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257, -0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257, -0257,0257,0257,0257,0257,0256,0256,0256,0256,0256,0256,0256,0256,0256,0256, -0256,0256,0256,0256,0256,0256,0256,0256,0256,0256,0256,0256,0256,0256,0256, -0256,0256,0256,0256,0256,0256,0256,0255,0255,0255,0255,0255,0255,0255,0255, -0255,0255,0255,0255,0255,0255,0255,0255,0255,0255,0255,0255,0255,0255,0255, -0255,0255,0255,0255,0255,0255,0255,0255,0255,0254,0254,0254,0254,0254,0254, -0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,0254, -0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,0253,0253,0253,0253, -0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253, -0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0252,0252, -0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252, -0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252, -0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251, -0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251, -0251,0251,0251,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250, -0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250, -0250,0250,0250,0250,0250,0247,0247,0247,0247,0247,0247,0247,0247,0247,0247, -0247,0247,0247,0247,0247,0247,0247,0247,0247,0247,0247,0247,0247,0247,0247, -0247,0247,0247,0247,0247,0247,0247,0246,0246,0246,0246,0246,0246,0246,0246, -0246,0246,0246,0246,0246,0246,0246,0246,0246,0246,0246,0246,0246,0246,0246, -0246,0246,0246,0246,0246,0246,0246,0246,0246,0245,0245,0245,0245,0245,0245, -0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,0245, -0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,0244,0244,0244,0244, -0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244, -0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0243,0243, -0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243, -0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243, -0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242, -0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242, -0242,0242,0242,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241, -0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241, -0241,0241,0241,0241,0241,0240,0240,0240,0240,0240,0240,0240,0240,0240,0240, -0240,0240,0240,0240,0240,0240,0240,0240,0240,0240,0240,0240,0240,0240,0240, -0240,0240,0240,0240,0240,0240,0240,0237,0237,0237,0237,0237,0237,0237,0237, -0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237, -0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237, -0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237, -0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0236,0236,0236,0236, -0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236, -0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236, -0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236, -0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236, -0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235, -0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235, -0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235, -0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235, -0235,0235,0235,0235,0235,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234, -0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234, -0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234, -0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234, -0234,0234,0234,0234,0234,0234,0234,0234,0234,0233,0233,0233,0233,0233,0233, -0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233, -0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233, -0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233, -0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0232,0232, -0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232, -0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232, -0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232, -0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232, -0232,0232,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231, -0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231, -0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231, -0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231, -0231,0231,0231,0231,0231,0231,0231,0230,0230,0230,0230,0230,0230,0230,0230, -0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230, -0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230, -0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230, -0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0227,0227,0227,0227, -0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227, -0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227, -0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227, -0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227, -0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226, -0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226, -0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226, -0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226, -0226,0226,0226,0226,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225, -0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225, -0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225, -0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225, -0225,0225,0225,0225,0225,0225,0225,0225,0225,0224,0224,0224,0224,0224,0224, -0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224, -0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224, -0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224, -0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0223,0223, -0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223, -0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223, -0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223, -0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223, -0223,0223,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222, -0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222, -0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222, -0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222, -0222,0222,0222,0222,0222,0222,0221,0221,0221,0221,0221,0221,0221,0221,0221, -0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221, -0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221, -0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221, -0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0220,0220,0220,0220, -0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220, -0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220, -0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220, -0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220, -0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217, -0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217, -0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217, -0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217, -0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217, -0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217, -0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217, -0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217, -0217,0217,0217,0217,0217,0217,0217,0217,0217,0216,0216,0216,0216,0216,0216, -0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216, -0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216, -0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216, -0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216, -0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216, -0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216, -0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216, -0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216, -0216,0216,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215, -0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215, -0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215, -0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215, -0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215, -0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215, -0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215, -0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215, -0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0214,0214,0214,0214, -0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214, -0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214, -0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214, -0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214, -0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214, -0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214, -0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214, -0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214, -0214,0214,0214,0214,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213, -0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213, -0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213, -0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213, -0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213, -0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213, -0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213, -0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213, -0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0212,0212, -0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212, -0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212, -0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212, -0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212, -0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212, -0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212, -0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212, -0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212, -0212,0212,0212,0212,0212,0212,0211,0211,0211,0211,0211,0211,0211,0211,0211, -0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211, -0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211, -0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211, -0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211, -0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211, -0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211, -0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211, -0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211, -0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210, -0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210, -0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210, -0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210, -0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210, -0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210, -0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210, -0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210, -0210,0210,0210,0210,0210,0210,0210,0210,0207,0207,0207,0207,0207,0207,0207, -0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207, -0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207, -0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207, -0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207, -0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207, -0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207, -0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207, -0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207, -0207,0207,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206, -0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206, -0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206, -0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206, -0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206, -0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206, -0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206, -0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206, -0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0205,0205,0205,0205,0205, -0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205, -0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205, -0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205, -0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205, -0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205, -0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205, -0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205, -0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205, -0205,0205,0205,0205,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204, -0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204, -0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204, -0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204, -0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204, -0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204, -0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204, -0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204, -0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0203,0203,0203, -0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203, -0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203, -0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203, -0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203, -0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203, -0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203, -0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203, -0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203, -0203,0203,0203,0203,0203,0203,0202,0202,0202,0202,0202,0202,0202,0202,0202, -0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202, -0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202, -0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202, -0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202, -0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202, -0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202, -0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202, -0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0201, -0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201, -0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201, -0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201, -0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201, -0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201, -0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201, -0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201, -0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201, -0201,0201,0201,0201,0201,0201,0201,0201,0200,0200,0200,0200,0200,0200,0200, -0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200, -0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200, -0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200, -0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200, -0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200, -0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200, -0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200, -0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200, -0200,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, -0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, -0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, -0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, -0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, -0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, -0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, -0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, -0000,0000,0000,0000,0000,0000,0000,0000,0000,0001,0001,0001,0001,0001,0001, -0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001, -0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001, -0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001, -0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001, -0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001, -0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001, -0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001, -0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001, -0001,0001,0001,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002, -0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002, -0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002, -0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002, -0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002, -0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002, -0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002, -0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002, -0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0003,0003,0003,0003, -0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003, -0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003, -0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003, -0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003, -0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003, -0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003, -0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003, -0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003, -0003,0003,0003,0003,0003,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004, -0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004, -0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004, -0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004, -0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004, -0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004, -0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004, -0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004, -0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0005,0005, -0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005, -0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005, -0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005, -0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005, -0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005, -0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005, -0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005, -0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005, -0005,0005,0005,0005,0005,0005,0005,0006,0006,0006,0006,0006,0006,0006,0006, -0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006, -0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006, -0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006, -0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006, -0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006, -0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006, -0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006, -0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006, -0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007, -0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007, -0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007, -0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007, -0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007, -0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007, -0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007, -0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007, -0007,0007,0007,0007,0007,0007,0007,0007,0007,0010,0010,0010,0010,0010,0010, -0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010, -0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010, -0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010, -0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010, -0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010, -0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010, -0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010, -0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010, -0010,0010,0010,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011, -0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011, -0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011, -0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011, -0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011, -0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011, -0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011, -0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011, -0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0012,0012,0012,0012, -0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012, -0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012, -0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012, -0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012, -0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012, -0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012, -0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012, -0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012, -0012,0012,0012,0012,0012,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013, -0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013, -0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013, -0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013, -0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013, -0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013, -0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013, -0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013, -0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0014,0014, -0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014, -0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014, -0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014, -0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014, -0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014, -0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014, -0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014, -0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014, -0014,0014,0014,0014,0014,0014,0014,0015,0015,0015,0015,0015,0015,0015,0015, -0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015, -0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015, -0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015, -0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015, -0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015, -0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015, -0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015, -0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015, -0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016, -0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016, -0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016, -0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016, -0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016, -0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016, -0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016, -0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016, -0016,0016,0016,0016,0016,0016,0016,0016,0016,0017,0017,0017,0017,0017,0017, -0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017, -0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017, -0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017, -0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017, -0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017, -0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017, -0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017, -0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017, -0017,0017,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020, -0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020, -0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020, -0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020, -0020,0020,0020,0020,0020,0020,0021,0021,0021,0021,0021,0021,0021,0021,0021, -0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021, -0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021, -0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021, -0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0022,0022,0022,0022, -0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022, -0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022, -0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022, -0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022, -0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023, -0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023, -0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023, -0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023, -0023,0023,0023,0023,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024, -0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024, -0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024, -0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024, -0024,0024,0024,0024,0024,0024,0024,0024,0024,0025,0025,0025,0025,0025,0025, -0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025, -0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025, -0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025, -0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0026,0026, -0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026, -0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026, -0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026, -0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026, -0026,0026,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027, -0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027, -0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027, -0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027, -0027,0027,0027,0027,0027,0027,0030,0030,0030,0030,0030,0030,0030,0030,0030, -0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030, -0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030, -0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030, -0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0031,0031,0031,0031, -0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031, -0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031, -0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031, -0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031, -0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032, -0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032, -0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032, -0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032, -0032,0032,0032,0032,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033, -0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033, -0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033, -0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033, -0033,0033,0033,0033,0033,0033,0033,0033,0034,0034,0034,0034,0034,0034,0034, -0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034, -0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034, -0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034, -0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0035,0035, -0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035, -0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035, -0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035, -0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035, -0035,0035,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036, -0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036, -0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036, -0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036, -0036,0036,0036,0036,0036,0036,0037,0037,0037,0037,0037,0037,0037,0037,0037, -0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037, -0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037, -0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037, -0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0040,0040,0040,0040,0040, -0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040, -0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0041,0041, -0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041, -0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041, -0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042, -0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042, -0042,0042,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043, -0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043, -0043,0043,0043,0043,0044,0044,0044,0044,0044,0044,0044,0044,0044,0044,0044, -0044,0044,0044,0044,0044,0044,0044,0044,0044,0044,0044,0044,0044,0044,0044, -0044,0044,0044,0044,0044,0044,0045,0045,0045,0045,0045,0045,0045,0045,0045, -0045,0045,0045,0045,0045,0045,0045,0045,0045,0045,0045,0045,0045,0045,0045, -0045,0045,0045,0045,0045,0045,0045,0045,0046,0046,0046,0046,0046,0046,0046, -0046,0046,0046,0046,0046,0046,0046,0046,0046,0046,0046,0046,0046,0046,0046, -0046,0046,0046,0046,0046,0046,0046,0046,0046,0046,0047,0047,0047,0047,0047, -0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047, -0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0050,0050, -0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050, -0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050, -0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051, -0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051, -0051,0051,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052, -0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052, -0052,0052,0052,0052,0053,0053,0053,0053,0053,0053,0053,0053,0053,0053,0053, -0053,0053,0053,0053,0053,0053,0053,0053,0053,0053,0053,0053,0053,0053,0053, -0053,0053,0053,0053,0053,0053,0054,0054,0054,0054,0054,0054,0054,0054,0054, -0054,0054,0054,0054,0054,0054,0054,0054,0054,0054,0054,0054,0054,0054,0054, -0054,0054,0054,0054,0054,0054,0054,0054,0055,0055,0055,0055,0055,0055,0055, -0055,0055,0055,0055,0055,0055,0055,0055,0055,0055,0055,0055,0055,0055,0055, -0055,0055,0055,0055,0055,0055,0055,0055,0055,0055,0056,0056,0056,0056,0056, -0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0056, -0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0057,0057,0057, -0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057, -0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057, -0060,0060,0060,0060,0060,0060,0060,0060,0060,0060,0060,0060,0060,0060,0060, -0060,0061,0061,0061,0061,0061,0061,0061,0061,0061,0061,0061,0061,0061,0061, -0061,0061,0062,0062,0062,0062,0062,0062,0062,0062,0062,0062,0062,0062,0062, -0062,0062,0062,0063,0063,0063,0063,0063,0063,0063,0063,0063,0063,0063,0063, -0063,0063,0063,0063,0064,0064,0064,0064,0064,0064,0064,0064,0064,0064,0064, -0064,0064,0064,0064,0064,0065,0065,0065,0065,0065,0065,0065,0065,0065,0065, -0065,0065,0065,0065,0065,0065,0066,0066,0066,0066,0066,0066,0066,0066,0066, -0066,0066,0066,0066,0066,0066,0066,0067,0067,0067,0067,0067,0067,0067,0067, -0067,0067,0067,0067,0067,0067,0067,0067,0070,0070,0070,0070,0070,0070,0070, -0070,0070,0070,0070,0070,0070,0070,0070,0070,0071,0071,0071,0071,0071,0071, -0071,0071,0071,0071,0071,0071,0071,0071,0071,0071,0072,0072,0072,0072,0072, -0072,0072,0072,0072,0072,0072,0072,0072,0072,0072,0072,0073,0073,0073,0073, -0073,0073,0073,0073,0073,0073,0073,0073,0073,0073,0073,0073,0074,0074,0074, -0074,0074,0074,0074,0074,0074,0074,0074,0074,0074,0074,0074,0074,0075,0075, -0075,0075,0075,0075,0075,0075,0075,0075,0075,0075,0075,0075,0075,0075,0075, -0076,0076,0076,0076,0076,0076,0076,0076,0076,0076,0076,0076,0076,0076,0076, -0076,0077,0077,0077,0077,0077,0077,0077,0077,0077,0077,0077,0077,0077,0077, -0077,0077,0100,0100,0100,0100,0100,0100,0100,0100,0101,0101,0101,0101,0101, -0101,0101,0101,0102,0102,0102,0102,0102,0102,0102,0102,0103,0103,0103,0103, -0103,0103,0103,0103,0104,0104,0104,0104,0104,0104,0104,0104,0105,0105,0105, -0105,0105,0105,0105,0105,0106,0106,0106,0106,0106,0106,0106,0106,0107,0107, -0107,0107,0107,0107,0107,0107,0110,0110,0110,0110,0110,0110,0110,0110,0111, -0111,0111,0111,0111,0111,0111,0111,0112,0112,0112,0112,0112,0112,0112,0112, -0113,0113,0113,0113,0113,0113,0113,0113,0114,0114,0114,0114,0114,0114,0114, -0114,0115,0115,0115,0115,0115,0115,0115,0115,0116,0116,0116,0116,0116,0116, -0116,0116,0117,0117,0117,0117,0117,0117,0117,0117,0120,0120,0120,0120,0121, -0121,0121,0121,0122,0122,0122,0122,0123,0123,0123,0123,0124,0124,0124,0124, -0125,0125,0125,0125,0126,0126,0126,0126,0127,0127,0127,0127,0130,0130,0130, -0130,0131,0131,0131,0131,0132,0132,0132,0132,0133,0133,0133,0133,0134,0134, -0134,0134,0135,0135,0135,0135,0136,0136,0136,0136,0137,0137,0137,0137,0140, -0140,0141,0141,0142,0142,0143,0143,0144,0144,0145,0145,0146,0146,0147,0147, -0150,0150,0150,0151,0151,0152,0152,0153,0153,0154,0154,0155,0155,0156,0156, -0157,0157,0160,0161,0162,0163,0164,0165,0166,0167,0170,0171,0172,0173,0174, -0175,0176 -}; - -int ulaw_input P1((buf), gsm_signal * buf) -{ - int i, c; - - for (i = 0; i < 160 && (c = fgetc(in)) != EOF; i++) buf[i] = U2S(c); - if (c == EOF && ferror(in)) return -1; - return i; -} - -int ulaw_output P1((buf), gsm_signal * buf) -{ - int i; - - for(i = 0; i < 160; i++, buf++) - if (fputc( (char)S2U( (unsigned short)*buf ), out) == EOF) - return -1; - return 0; -} diff --git a/src/audio/gsm/unproto.h b/src/audio/gsm/unproto.h deleted file mode 100644 index ccd565109b11b68fbd0eeec4856d9ea541ac251a..0000000000000000000000000000000000000000 --- a/src/audio/gsm/unproto.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/*$Header$*/ - -#ifdef PROTO_H /* sic */ -#undef PROTO_H - -#undef P -#undef P0 -#undef P1 -#undef P2 -#undef P3 -#undef P4 -#undef P5 -#undef P6 -#undef P7 -#undef P8 - -#endif /* PROTO_H */ diff --git a/src/audio/gsmcodec.cpp b/src/audio/gsmcodec.cpp index 471ba0accadec5809f5de4e853bd555d5e96b936..a340882103b1a281b1fb4091d2b0989ac8f596af 100644 --- a/src/audio/gsmcodec.cpp +++ b/src/audio/gsmcodec.cpp @@ -19,30 +19,35 @@ */ #include <iostream> -#include "gsmcodec.h" +#include <gsm/gsm.h> +#include "audiocodec.h" #include "../global.h" + +class Gsm : public AudioCodec { +public: // 3 GSM A 8000 1 [RFC3551] -Gsm::Gsm(int payload) : AudioCodec(payload, "GSM") +Gsm(int payload = 0) +: AudioCodec(payload, "GSM") { - _description = "GSM"; - + //_description = "GSM"; _clockRate = 8000; _channel = 1; + if (!(_decode_gsmhandle = gsm_create() )) _debug("ERROR: decode_gsm_create\n"); if (!(_encode_gsmhandle = gsm_create() )) _debug("AudioCodec: ERROR: encode_gsm_create\n"); + } -Gsm::~Gsm (void) +~Gsm (void) { gsm_destroy(_decode_gsmhandle); gsm_destroy(_encode_gsmhandle); } -int -Gsm::codecDecode (short *dst, unsigned char *src, unsigned int size) +virtual int codecDecode (short *dst, unsigned char *src, unsigned int size) { (void)size; if (gsm_decode(_decode_gsmhandle, (gsm_byte*)src, (gsm_signal*)dst) < 0) { @@ -51,12 +56,25 @@ Gsm::codecDecode (short *dst, unsigned char *src, unsigned int size) return 320; } -int -Gsm::codecEncode (unsigned char *dst, short *src, unsigned int size) +virtual int codecEncode (unsigned char *dst, short *src, unsigned int size) { (void)size; - gsm_encode(_encode_gsmhandle, (gsm_signal*)src, (gsm_byte*)dst); + gsm_encode(_encode_gsmhandle, (gsm_signal*)src, (gsm_byte*)dst); return 33; } +private: + gsm _decode_gsmhandle; + gsm _encode_gsmhandle; + +}; + +// the class factories +extern "C" AudioCodec* create() { + return new Gsm(3); +} + +extern "C" void destroy(AudioCodec* a) { + delete a; +} diff --git a/src/audio/gsmcodec.h b/src/audio/gsmcodec.h index 2d6573a045713b70eb0d5665e151ba5fcb808be8..3cea0c9c7e44e1861b452ee3d5e089dc40577b3f 100644 --- a/src/audio/gsmcodec.h +++ b/src/audio/gsmcodec.h @@ -21,10 +21,12 @@ #ifndef __GSM_H__ #define __GSM_H__ +#include <gsm.h> + #include "audiocodec.h" -extern "C" { +/*extern "C" { #include "gsm/gsm.h" -} +}*/ /** * GSM audio codec C++ class (over gsm/gsm.h) @@ -37,6 +39,7 @@ public: int codecDecode (short *, unsigned char *, unsigned int); int codecEncode (unsigned char *, short *, unsigned int); + void test(); private: gsm _decode_gsmhandle; diff --git a/src/audio/ulaw.cpp b/src/audio/ulaw.cpp index 97bb9c7fa4f4f7cdf3576ecc838c8497c0bfc737..594b64e9cdac95d4328fc738c96d0574d6aaf008 100644 --- a/src/audio/ulaw.cpp +++ b/src/audio/ulaw.cpp @@ -1,49 +1,96 @@ -/** - * Copyright (C) 2004-2005 Savoir-Faire Linux inc. - * Author: Yan Morin <yan.morin@savoirfairelinux.com> - * Author: Laurielle Lea <laurielle.lea@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 "g711.h" -#include "ulaw.h" - -// 0 PCMU A 8000 1 [RFC3551] -Ulaw::Ulaw(int payload) - : AudioCodec(payload, "PCMU") -{ - _description = "G711u"; - - _clockRate = 8000; - _channel = 1; -} +#include "common.h" +#include "audiocodec.h" -Ulaw::~Ulaw (void) -{ -} +class Ulaw : public AudioCodec { +public: + // 0 PCMU A 8000 1 [RFC3551] + Ulaw(int payload=0) + : AudioCodec(payload, "PCMU") + { + _clockRate = 8000; + _channel = 1; + } -int -Ulaw::codecDecode (short *dst, unsigned char *src, unsigned int size) -{ - return G711::ULawDecode (dst, src, size); -} -int -Ulaw::codecEncode (unsigned char *dst, short *src, unsigned int size) -{ - return G711::ULawEncode (dst, src, size); + virtual int codecDecode (short *dst, unsigned char *src, unsigned int size) { + int16* end = dst+size; + while(dst<end) + *dst++ = ULawDecode(*src++); + return size<<1; + } + + virtual int codecEncode (unsigned char *dst, short *src, unsigned int size) { + size >>= 1; + uint8* end = dst+size; + while(dst<end) + *dst++ = ULawEncode(*src++); + return size; + } + + int ULawDecode(uint8 ulaw) + { + ulaw ^= 0xff; // u-law has all bits inverted for transmission + int linear = ulaw&0x0f; + linear <<= 3; + linear |= 0x84; // Set MSB (0x80) and a 'half' bit (0x04) to place PCM value in middle of range + + uint shift = ulaw>>4; + shift &= 7; + linear <<= shift; + linear -= 0x84; // Subract uLaw bias + + if(ulaw&0x80) + return -linear; + else + return linear; + } + + uint8 ULawEncode(int16 pcm16) + { + int p = pcm16; + uint u; // u-law value we are forming + + if(p<0) + { + p = ~p; + u = 0x80^0x10^0xff; // Sign bit = 1 (^0x10 because this will get inverted later) ^0xff ^0xff to invert final u-Law code + } + else{ + u = 0x00^0x10^0xff; // Sign bit = 0 (-0x10 because this amount extra will get added later) ^0xff to invert final u-Law code + } + + p += 0x84; // Add uLaw bias + + if(p>0x7f00) + p = 0x7f00; // Clip to 15 bits + // Calculate segment and interval numbers + p >>= 3; // Shift down to 13bit + if(p>=0x100) + { + p >>= 4; + u ^= 0x40; + } + if(p>=0x40) + { + p >>= 2; + u ^= 0x20; + } + if(p>=0x20) + { + p >>= 1; + u ^= 0x10; + } + u ^= p; // u now equal to encoded u-law value (with all bits inverted) + + return u; + } +}; + +// the class factories +extern "C" AudioCodec* create() { + return new Ulaw(0); } +extern "C" void destroy(AudioCodec* a) { + delete a; +} diff --git a/src/audio/ulaw.h b/src/audio/ulaw.h index 3f90448a5c5d577120f1742c2fcfab0c790e93fa..c79979e857b56b3272376dc003463e7f77ffcd3a 100644 --- a/src/audio/ulaw.h +++ b/src/audio/ulaw.h @@ -34,6 +34,7 @@ public: int codecDecode(short *, unsigned char *, unsigned int); int codecEncode(unsigned char *, short *, unsigned int); + void test(); }; #endif // __ULAW_H__ diff --git a/src/call.cpp b/src/call.cpp index b19a198dedf623a8c9cf71ac89d59275b8ed2357..36428177aa7fe3790d75b88138650d0786c5805b 100644 --- a/src/call.cpp +++ b/src/call.cpp @@ -25,7 +25,7 @@ Call::Call(const CallID& id, Call::CallType type) : _id(id), _type(type), { _connectionState = Call::Disconnected; _callState = Call::Inactive; - _audioCodec = 0; + //_audioCodec = 0; _localAudioPort = 0; _localExternalAudioPort = 0; _remoteAudioPort = 0; @@ -65,7 +65,7 @@ Call::getState() return _callState; } -CodecDescriptorMap& +CodecDescriptor& Call::getCodecMap() { return _codecMap; @@ -99,7 +99,7 @@ Call::getRemoteIp() return _remoteIPAddress; } -AudioCodec* +CodecType Call::getAudioCodec() { ost::MutexLock m(_callMutex); diff --git a/src/call.h b/src/call.h index 7794be68153b20f56c67ad6fd280165f114f0b8a..a01fe6173c0f6c2dea128c2e8ae84672a26056dd 100644 --- a/src/call.h +++ b/src/call.h @@ -121,8 +121,8 @@ public: // AUDIO /** Set internal codec Map: initialization only, not protected */ - void setCodecMap(const CodecDescriptorMap& map) { _codecMap = map; } - CodecDescriptorMap& getCodecMap(); + void setCodecMap(const CodecDescriptor& map) { _codecMap = map; } + CodecDescriptor& getCodecMap(); /** Set my IP [not protected] */ void setLocalIp(const std::string& ip) { _localIPAddress = ip; } @@ -149,7 +149,7 @@ public: const std::string& getRemoteIp(); /** Return audio codec [mutex protected] */ - AudioCodec* getAudioCodec(); + CodecType getAudioCodec(); @@ -164,13 +164,14 @@ protected: void setRemoteAudioPort(unsigned int port) { _remoteAudioPort = port; } /** Set the audio codec used. [not protected] */ - void setAudioCodec(AudioCodec* audioCodec) { _audioCodec = audioCodec; } + void setAudioCodec(CodecType audioCodec) { _audioCodec = audioCodec; } /** Codec Map */ - CodecDescriptorMap _codecMap; + CodecDescriptor _codecMap; /** Codec pointer */ - AudioCodec* _audioCodec; + //AudioCodec* _audioCodec; + CodecType _audioCodec; bool _audioStarted; diff --git a/src/global.h b/src/global.h index 06a3206afeca7765781a66c055c98dd2f86b1dc1..0f13cf1c46dee2bcad9a9afa133ad99c25c81710 100644 --- a/src/global.h +++ b/src/global.h @@ -72,4 +72,14 @@ typedef short int16; #define CHANNELS 2 #define SIZEBUF 1024*1024 +// Codecs payloads, as defined in RFC3551 +// http://www.iana.org/assignments/rtp-parameters +// http://www.gnu.org/software/ccrtp/doc/refman/html/formats_8h.html#a0 +/*#define PAYLOAD_CODEC_ULAW 0 // PCMU 8000 +#define PAYLOAD_CODEC_ALAW 8 // PCMA 8000 +#define PAYLOAD_CODEC_GSM 3 // GSM 8000 +// http://www.ietf.org/rfc/rfc3952.txt +#define PAYLOAD_CODEC_ILBC 97*/ + + #endif // __GLOBAL_H__ diff --git a/src/iaxcall.cpp b/src/iaxcall.cpp index 314f57a3512c975c67a8db3f52c280253c825893..e522e028a1466e9c785e3d04f8d51a38a238e1ef 100644 --- a/src/iaxcall.cpp +++ b/src/iaxcall.cpp @@ -34,20 +34,29 @@ void IAXCall::setFormat(int format) { _format = format; - switch(format) { - case AST_FORMAT_ULAW: + /*case AST_FORMAT_ULAW: setAudioCodec(_codecMap.getCodec(PAYLOAD_CODEC_ULAW)); break; case AST_FORMAT_GSM: setAudioCodec(_codecMap.getCodec(PAYLOAD_CODEC_GSM)); break; case AST_FORMAT_ALAW: setAudioCodec(_codecMap.getCodec(PAYLOAD_CODEC_ALAW)); break; case AST_FORMAT_ILBC: - setAudioCodec(_codecMap.getCodec(PAYLOAD_CODEC_ILBC)); break; + setAudioCodec(_codecMap.getCodec(PAYLOAD_CODEC_ILBC_20)); break; + case AST_FORMAT_SPEEX: + setAudioCodec(_codecMap.getCodec(PAYLOAD_CODEC_SPEEX)); break;*/ + case AST_FORMAT_ULAW: + setAudioCodec(PAYLOAD_CODEC_ULAW); break; + case AST_FORMAT_GSM: + setAudioCodec(PAYLOAD_CODEC_GSM); break; + case AST_FORMAT_ALAW: + setAudioCodec(PAYLOAD_CODEC_ALAW); break; + case AST_FORMAT_ILBC: + setAudioCodec(PAYLOAD_CODEC_ILBC_20); break; case AST_FORMAT_SPEEX: - setAudioCodec(_codecMap.getCodec(PAYLOAD_CODEC_SPEEX)); break; + setAudioCodec(PAYLOAD_CODEC_SPEEX); break; default: - setAudioCodec(NULL); + setAudioCodec((CodecType) -1); break; } } @@ -56,7 +65,7 @@ IAXCall::setFormat(int format) int IAXCall::getSupportedFormat() { - CodecMap map = getCodecMap().getMap(); + CodecMap map = getCodecMap().getCodecMap(); int format = 0; CodecMap::iterator iter = map.begin(); @@ -68,7 +77,7 @@ IAXCall::getSupportedFormat() format |= AST_FORMAT_GSM; break; case PAYLOAD_CODEC_ALAW: format |= AST_FORMAT_ALAW; break; - case PAYLOAD_CODEC_ILBC: + case PAYLOAD_CODEC_ILBC_20: format |= AST_FORMAT_ILBC; break; case PAYLOAD_CODEC_SPEEX: format |= AST_FORMAT_SPEEX; break; @@ -84,7 +93,7 @@ IAXCall::getSupportedFormat() int IAXCall::getFirstMatchingFormat(int needles) { - CodecMap map = getCodecMap().getMap(); + CodecMap map = getCodecMap().getCodecMap(); int format = 0; CodecMap::iterator iter = map.begin(); @@ -96,7 +105,7 @@ IAXCall::getFirstMatchingFormat(int needles) format = AST_FORMAT_GSM; break; case PAYLOAD_CODEC_ALAW: format = AST_FORMAT_ALAW; break; - case PAYLOAD_CODEC_ILBC: + case PAYLOAD_CODEC_ILBC_20: format = AST_FORMAT_ILBC; break; case PAYLOAD_CODEC_SPEEX: format = AST_FORMAT_SPEEX; break; diff --git a/src/iaxvoiplink.cpp b/src/iaxvoiplink.cpp index 2996b750382b07e1ab1c36f1a6850d1ae6a3b9eb..517e32ff075bfa373b5f510d6e299baefb6fe351 100644 --- a/src/iaxvoiplink.cpp +++ b/src/iaxvoiplink.cpp @@ -29,6 +29,7 @@ #include <samplerate.h> #include <iax/iax-client.h> #include <math.h> +#include <dlfcn.h> #define IAX_BLOCKING 1 @@ -227,13 +228,61 @@ IAXVoIPLink::getEvent() _evThread->sleep(3); } +AudioCodec* +IAXVoIPLink::loadCodec(int payload) +{ + using std::cerr; + + switch(payload) + { + case 0: + handle_codec = dlopen("codec_ulaw.so", RTLD_LAZY); + break; + case 3: + handle_codec = dlopen("codec_gsm.so", RTLD_LAZY); + break; + case 8: + handle_codec = dlopen("codec_alaw.so", RTLD_LAZY); + break; + case 97: + handle_codec = dlopen("codec_ilbc.so", RTLD_LAZY); + break; + } + if(!handle_codec){ + cerr<<"cannot load library: "<< dlerror() <<'\n'; + } + // reset errors + dlerror(); + + // load the symbols + create_t* create_codec = (create_t*)dlsym(handle_codec, "create"); + const char* dlsym_error = dlerror(); + if(dlsym_error){ + cerr << "Cannot load symbol create: " << dlsym_error << '\n'; + } + return create_codec(); +} + +void +IAXVoIPLink::unloadCodec(AudioCodec* audiocodec) +{ + using std::cerr; + + destroy_t* destroy_codec = (destroy_t*) dlsym(handle_codec, "destroy"); + const char* dlsym_error = dlerror(); + if(dlsym_error){ + cerr << "Cannot load symbol destroy" << dlsym_error << '\n'; + } + destroy_codec(audiocodec); + dlclose(handle_codec); +} void IAXVoIPLink::sendAudioFromMic(void) { - IAXCall* currentCall = getIAXCall(Manager::instance().getCurrentCallId()); - AudioCodec* audiocodec = NULL; + IAXCall* currentCall = getIAXCall(Manager::instance().getCurrentCallId()); + if (!currentCall) { // Let's mind our own business. return; @@ -249,8 +298,7 @@ IAXVoIPLink::sendAudioFromMic(void) return; } - audiocodec = currentCall->getAudioCodec(); - + AudioCodec* audiocodec = loadCodec(currentCall->getAudioCodec()); if (!audiocodec) { // Audio codec still not determined. if (audiolayer) { @@ -285,6 +333,7 @@ IAXVoIPLink::sendAudioFromMic(void) // Audio ici est PARFAIT int16* toIAX = NULL; + //if (audiolayer->getSampleRate() != audiocodec->getClockRate() && nbSample) { if (audiolayer->getSampleRate() != audiocodec->getClockRate() && nbSample) { SRC_DATA src_data; #ifdef DATAFORMAT_IS_FLOAT @@ -302,7 +351,7 @@ IAXVoIPLink::sendAudioFromMic(void) src_data.input_frames = nbSample; src_data.output_frames = (int) floor(factord * nbSample); src_data.data_out = _floatBuffer8000; - src_data.end_of_input = 0; /* More data to come */ + src_data.end_of_input = 0; src_process(_src_state_mic, &src_data); @@ -328,17 +377,17 @@ IAXVoIPLink::sendAudioFromMic(void) // NOTE: L'audio ici est bon. - /* + // // LE PROBLÈME est dans cette snippet de fonction: // C'est une fonction destructrice ! On n'en veut pas! - if ( nbSample < (IAX__20S_8KHZ_MAX - 10) ) { // if only 10 is missing, it's ok + //if ( nbSample < (IAX__20S_8KHZ_MAX - 10) ) { // if only 10 is missing, it's ok // fill end with 0... - _debug("begin: %p, nbSample: %d\n", toIAX, nbSample); - _debug("has to fill: %d chars at %p\n", (IAX__20S_8KHZ_MAX-nbSample)*sizeof(int16), toIAX + nbSample); - memset(toIAX + nbSample, 0, (IAX__20S_8KHZ_MAX-nbSample)*sizeof(int16)); - nbSample = IAX__20S_8KHZ_MAX; - } - */ + //_debug("begin: %p, nbSample: %d\n", toIAX, nbSample); + //_debug("has to fill: %d chars at %p\n", (IAX__20S_8KHZ_MAX-nbSample)*sizeof(int16), toIAX + nbSample); + //memset(toIAX + nbSample, 0, (IAX__20S_8KHZ_MAX-nbSample)*sizeof(int16)); + //nbSample = IAX__20S_8KHZ_MAX; + //} + //_debug("AR: Nb sample: %d int, [0]=%d [1]=%d [2]=%d\n", nbSample, toIAX[0], toIAX[1], toIAX[2]); // NOTE: Le son dans toIAX (nbSamle*sizeof(int16)) est mauvais, // s'il passe par le snippet précédent. @@ -365,6 +414,7 @@ IAXVoIPLink::sendAudioFromMic(void) } _mutexIAX.leaveMutex(); } + unloadCodec(audiocodec); } @@ -746,7 +796,7 @@ IAXVoIPLink::iaxHandleCallEvent(iax_event* event, IAXCall* call) /* Handle audio event, VOICE packet received */ void IAXVoIPLink::iaxHandleVoiceEvent(iax_event* event, IAXCall* call) -{ +{ // If we receive datalen == 0, some things of the jitter buffer in libiax2/iax.c // were triggered if (!event->datalen) { @@ -754,18 +804,17 @@ IAXVoIPLink::iaxHandleVoiceEvent(iax_event* event, IAXCall* call) //_debug("IAX: Skipping empty jitter-buffer interpolated packet\n"); return; } +AudioCodec* audiocodec; if (audiolayer) { - AudioCodec* audiocodec = call->getAudioCodec(); // On-the-fly codec changing (normally, when we receive a full packet) // as per http://tools.ietf.org/id/draft-guy-iax-03.txt // - subclass holds the voiceformat property. if (event->subclass && event->subclass != call->getFormat()) { call->setFormat(event->subclass); - audiocodec = call->getAudioCodec(); } - + audiocodec = loadCodec(call->getAudioCodec()); //_debug("Receive: len=%d, format=%d, _receiveDataDecoded=%p\n", event->datalen, call->getFormat(), _receiveDataDecoded); unsigned char* data = (unsigned char*)event->data; @@ -798,7 +847,7 @@ IAXVoIPLink::iaxHandleVoiceEvent(iax_event* event, IAXCall* call) src_data.input_frames = nbSample; src_data.output_frames = (int) floor(factord * nbSample); src_data.src_ratio = factord; - src_data.end_of_input = 0; /* More data will come */ + src_data.end_of_input = 0; src_short_to_float_array(_receiveDataDecoded, _floatBuffer8000, nbSample); // samplerate convert, go! @@ -826,6 +875,8 @@ IAXVoIPLink::iaxHandleVoiceEvent(iax_event* event, IAXCall* call) } else { _debug("IAX: incoming audio, but no sound card open"); } + unloadCodec(audiocodec); + } diff --git a/src/iaxvoiplink.h b/src/iaxvoiplink.h index b0f5ea17a48d8e6b2095392510bd55077da6db2b..c0fe8c30a83224db7ca791d4534838c849323a3c 100644 --- a/src/iaxvoiplink.h +++ b/src/iaxvoiplink.h @@ -152,6 +152,21 @@ private: */ int iaxCodecMapToFormat(IAXCall* call); + /** + * Dynamically load an audio codec + * @return audiocodec a pointer on an audiocodec object + */ + AudioCodec* loadCodec(int payload); + + /** + * Destroy and close the pointer on the codec + * @param audiocodec the codec you want to unload + */ + void unloadCodec(AudioCodec* audiocodec); + + /** pointer on function **/ + void* handle_codec; + /** Threading object */ EventThread* _evThread; diff --git a/src/managerimpl.cpp b/src/managerimpl.cpp index 858e0233a000635993bb94f8150542eaaa6b26d6..26d99bc9dc013d58ff9045d08b261028752f4c2c 100644 --- a/src/managerimpl.cpp +++ b/src/managerimpl.cpp @@ -122,6 +122,7 @@ ManagerImpl::init() initAudioDriver(); selectAudioDriver(); + // Initialize the list of supported audio codecs initAudioCodec(); AudioLayer *audiolayer = getAudioDriver(); @@ -166,6 +167,7 @@ ManagerImpl::isCurrentCall(const CallID& callId) { bool ManagerImpl::hasCurrentCall() { ost::MutexLock m(_currentCallMutex); + _debug("Current call ID = %s\n", _currentCallId2.c_str()); if ( _currentCallId2 != "") { return true; } @@ -220,10 +222,10 @@ bool ManagerImpl::answerCall(const CallID& id) { stopTone(false); - if (hasCurrentCall()) + /*if (hasCurrentCall()) { onHoldCall(getCurrentCallId()); - } + }*/ AccountID accountid = getAccountFromCall( id ); if (accountid == AccountNULL) { _debug("Answering Call: Call doesn't exists\n"); @@ -611,6 +613,7 @@ ManagerImpl::incomingCall(Call* call, const AccountID& accountId) associateCallToAccount(call->getCallId(), accountId); if ( !hasCurrentCall() ) { + _debug("INCOMING CALL!!!!!!\n"); call->setConnectionState(Call::Ringing); ringtone(); switchCall(call->getCallId()); @@ -990,7 +993,7 @@ ManagerImpl::behindNat(const std::string& svr, int port) { StunAddress4 stunSvrAddr; stunSvrAddr.addr = 0; - + // Convert char* to StunAddress4 structure bool ret = stunParseServerName ((char*)svr.data(), stunSvrAddr); if (!ret) { @@ -1055,9 +1058,9 @@ ManagerImpl::initConfigFile (void) fill_config_int(DRIVER_NAME_OUT, DFT_DRIVER_STR); fill_config_int(DRIVER_SAMPLE_RATE, DFT_SAMPLE_RATE); fill_config_int(DRIVER_FRAME_SIZE, DFT_FRAME_SIZE); - fill_config_str(CODEC1, DFT_CODEC1); - fill_config_str(CODEC2, DFT_CODEC2); - fill_config_str(CODEC3, DFT_CODEC3); + //fill_config_str(CODEC1, DFT_CODEC1); + //fill_config_str(CODEC2, DFT_CODEC2); + //fill_config_str(CODEC3, DFT_CODEC3); fill_config_str(RING_CHOICE, DFT_RINGTONE); fill_config_int(VOLUME_SPKR, DFT_VOL_SPKR_STR); fill_config_int(VOLUME_MICRO, DFT_VOL_MICRO_STR); @@ -1084,15 +1087,14 @@ ManagerImpl::initConfigFile (void) void ManagerImpl::initAudioCodec (void) { - _debugInit("Active Codecs"); - _codecDescriptorMap.setActive(getConfigString("Audio", "Codecs.codec1")); - //_codecDescriptorMap.setActive(getConfigString("Audio", "Codec.codec2")); - //_codecDescriptorMap.setActive(getConfigString("Audio", "Codec.codec3")); + _debugInit("Active Codecs List"); + _codecDescriptorMap.init(); } void ManagerImpl::setPreferedCodec(const ::DBus::String& codec_name) -{ +{ _debug("Set Prefered Order\n"); + /* std::vector<std::string> list = getCodecList(); std::string tmp; int i=0; @@ -1101,12 +1103,10 @@ ManagerImpl::setPreferedCodec(const ::DBus::String& codec_name) tmp = list[0]; list[0] = list[i]; list[i] = tmp; - _codecDescriptorMap.setActive(list[0]); - _codecDescriptorMap.setInactive(list[1]); - _codecDescriptorMap.setInactive(list[2]); setConfig("Audio", "Codecs.codec1", list[0]); setConfig("Audio", "Codecs.codec2", list[1]); setConfig("Audio", "Codecs.codec3", list[2]); +*/ } std::string @@ -1120,8 +1120,8 @@ ManagerImpl::getDefaultCodecList( void ) { std::vector< std::string > v; std::string desc=DFT_CODEC1; - std::string rate=""+clockRate(desc); - printf("%s\n",rate.c_str()); + //std::string rate=""+clockRate(desc); + //printf("%s\n",rate.c_str()); v.push_back(DFT_CODEC1); // G711u v.push_back(DFT_CODEC2); // G711a v.push_back(DFT_CODEC3); // GSM @@ -1130,35 +1130,41 @@ ManagerImpl::getDefaultCodecList( void ) unsigned int ManagerImpl::clockRate(std::string& name) -{ - CodecMap codecs = _codecDescriptorMap.getMap(); +{/* + CodecMap codecs = _codecDescriptorMap.getCodecMap(); CodecMap::iterator iter = codecs.begin(); while(iter!=codecs.end()) { if(iter->second!=NULL) { - if(iter->second->getDescription() == name) - return iter->second->getClockRate(); - } - iter++; + if(iter->second == name) + //return iter->second->getClockRate(); + return 1; } + iter++; + }*/ return -1; } /** - * Get the list of codecs. - * Contains all the codecs supported, with order set by the user. + * Send the list of codecs to the client through DBus. */ std::vector< std::string > ManagerImpl::getCodecList( void ) { + std::vector< std::string > v; - std::string desc=getConfigString(AUDIO, "Codecs.codec1"); - //std::string rate=clockRate(desc).strstream(); - //printf("%s\n",rate.c_str()); - v.push_back(getConfigString(AUDIO, "Codecs.codec1")); - v.push_back( getConfigString(AUDIO, "Codecs.codec2")); - v.push_back( getConfigString(AUDIO, "Codecs.codec3")); + CodecMap codecs = _codecDescriptorMap.getCodecMap(); + CodecMap::iterator iter = codecs.begin(); + while(iter!=codecs.end()) + { + if(iter->first!=-1) + { + printf("codec: %s\n", iter->second.data()); + v.push_back(iter->second.data()); + } + iter++; + } return v; } @@ -1476,19 +1482,20 @@ ManagerImpl::setConfig(const std::string& section, const std::string& name, int bool ManagerImpl::getConfigList(const std::string& sequenceId, const std::string& name) { + /* bool returnValue = false; TokenList tk; if (name == "codecdescriptor") { - CodecMap map = _codecDescriptorMap.getMap(); + CodecMap map = _codecDescriptorMap.getCodecMap(); CodecMap::iterator iter = map.begin(); while( iter != map.end() ) { tk.clear(); std::ostringstream strType; strType << iter->first; tk.push_back(strType.str()); - if (iter->second) { - tk.push_back(iter->second->getDescription()); + if (iter->second != -1) { + tk.push_back(iter->second); } else { tk.push_back(strType.str()); } @@ -1521,7 +1528,8 @@ ManagerImpl::getConfigList(const std::string& sequenceId, const std::string& nam } else if (name == "countrytones") { returnValue = getCountryTones(sequenceId); } - return returnValue; + return returnValue;*/ + return true; } //THREAD=Main diff --git a/src/managerimpl.h b/src/managerimpl.h index cfdac255d8d374668cc6df419384003ef412b361..38d25a22c884ddb8b9537b9cdc2cb0ec9a23666c 100644 --- a/src/managerimpl.h +++ b/src/managerimpl.h @@ -110,7 +110,7 @@ public: /** * Get a descriptor map of codec available */ - CodecDescriptorMap& getCodecDescriptorMap(void) {return _codecDescriptorMap;} + CodecDescriptor& getCodecDescriptorMap(void) {return _codecDescriptorMap;} /** * Functions which occur with a user's action @@ -513,7 +513,7 @@ private: DTMF* _dtmfKey; // map of codec (for configlist request) - CodecDescriptorMap _codecDescriptorMap; + CodecDescriptor _codecDescriptorMap; ///////////////////// // Protected by Mutex diff --git a/src/sipaccount.cpp b/src/sipaccount.cpp index d2d2def8253d71241f4b04dc9d0ab32f4aee8313..a00184ee3aaedd7580812551e2861ac85ba7c7ab 100644 --- a/src/sipaccount.cpp +++ b/src/sipaccount.cpp @@ -20,7 +20,7 @@ #include "sipaccount.h" #include "sipvoiplink.h" #include "manager.h" - +#include "user_cfg.h" SIPAccount::SIPAccount(const AccountID& accountID) : Account(accountID) @@ -43,8 +43,7 @@ SIPAccount::registerVoIPLink() int useStun = Manager::instance().getConfigInt(_accountID,SIP_USE_STUN); SIPVoIPLink* thislink = dynamic_cast<SIPVoIPLink*> (_link); - - thislink->setStunServer(Manager::instance().getConfigString(_accountID,SIP_STUN_SERVER)); + thislink->setStunServer(Manager::instance().getConfigString(_accountID,DFT_STUN_SERVER)); thislink->setUseStun( useStun!=0 ? true : false); _link->init(); diff --git a/src/sipcall.cpp b/src/sipcall.cpp index 37f2b84d4e6ce7eef3af11fc1eda2ac240704d24..b81b0773b9675c5444da132c3df0ac4e32f28b6d 100644 --- a/src/sipcall.cpp +++ b/src/sipcall.cpp @@ -76,6 +76,7 @@ SIPCall::SIPCallInvite(eXosip_event_t *event) } if (!setAudioCodecFromSDP(remote_med, event->tid)) { + _debug("SIP Failure: unable to set audio codecs from the remote SDP\n"); sdp_message_free (remote_sdp); return false; } @@ -90,7 +91,6 @@ SIPCall::SIPCallInvite(eXosip_event_t *event) _debug("< Sending Answer 415 : unsupported media type\n"); eXosip_call_send_answer (event->tid, 415, NULL); } else { - sdp_message_t *local_sdp = eXosip_get_sdp_info(answer); sdp_media_t *local_med = NULL; if (local_sdp != NULL) { @@ -283,11 +283,12 @@ SIPCall::SIPCallAnsweredWithoutHold(eXosip_event_t* event) #else char *tmp = (char*) osip_list_get (&(remote_med->m_payloads), 0); #endif - setAudioCodec(0); + setAudioCodec((CodecType)-1); if (tmp != NULL) { int payload = atoi (tmp); _debug(" Remote Payload: %d\n", payload); - setAudioCodec(_codecMap.getCodec((CodecType)payload)); // codec builder for the mic + //setAudioCodec(_codecMap.getCodecName((CodecType)payload)); // codec builder for the mic + setAudioCodec((CodecType)payload); // codec builder for the mic } /* @@ -352,17 +353,21 @@ SIPCall::sdp_complete_message(sdp_message_t * remote_sdp, osip_message_t * msg) remote_med_m_payloads = &(remote_med->m_payloads); #endif - while (!osip_list_eol(remote_med_m_payloads, iPayload)) { + while (!osip_list_eol(remote_med_m_payloads, iPayload) && iPayload < 2) { tmp = (char *)osip_list_get(remote_med_m_payloads, iPayload); if (tmp!=NULL) { int payload = atoi(tmp); - AudioCodec* audiocodec = _codecMap.getCodec((CodecType)payload); - if (audiocodec != NULL && audiocodec->isActive()) { + _debug("remote payload = %s\n", tmp); + CodecType audiocodec = (CodecType)payload; + //if (audiocodec != NULL && audiocodec->isActive()) { + if (audiocodec != (CodecType)-1 && _codecMap.isSupported(audiocodec)) { listCodec << payload << " "; - listRtpMap << "a=rtpmap:" << payload << " " << audiocodec->getCodecName() << "/" << audiocodec->getClockRate(); - if ( audiocodec->getChannel() != 1) { + //listRtpMap << "a=rtpmap:" << payload << " " << audiocodec->getCodecName() << "/" << audiocodec->getClockRate(); + listRtpMap << "a=rtpmap:" << payload << " " << _codecMap.getCodecName(audiocodec) << "/" << 8000; + // TODO: manage a way to get the channel infos + /*if ( audiocodec->getChannel() != 1) { listRtpMap << "/" << audiocodec->getChannel(); - } + }*/ listRtpMap << "\r\n"; } } @@ -581,7 +586,7 @@ SIPCall::setAudioCodecFromSDP(sdp_media_t* remote_med, int tid) if (tmp != NULL ) { int payload = atoi(tmp); // stop if we find a correct codec - if (_codecMap.getCodec((CodecType)payload) != NULL){ + if (_codecMap.isSupported((CodecType)payload)){ break; } } @@ -589,13 +594,13 @@ SIPCall::setAudioCodecFromSDP(sdp_media_t* remote_med, int tid) pos++; } - setAudioCodec(0); + setAudioCodec((CodecType)-1); if (tmp != NULL) { int payload = atoi (tmp); _debug(" Payload: %d\n", payload); - setAudioCodec(_codecMap.getCodec((CodecType)payload)); // codec builder for the mic + setAudioCodec((CodecType)payload); // codec builder for the mic } - if (getAudioCodec() == 0) { + if (getAudioCodec() == (CodecType) -1) { _debug("SIPCall Failure: Unable to set codec\n"); _debug("< Sending 415 Unsupported media type\n"); eXosip_lock(); diff --git a/src/sipvoiplink.cpp b/src/sipvoiplink.cpp index 3288cb8886988267704ca42ba359ee7bb0023c7f..a23936925f8a3175b57aded06d56b17ee332ed22 100644 --- a/src/sipvoiplink.cpp +++ b/src/sipvoiplink.cpp @@ -947,22 +947,24 @@ SIPVoIPLink::SIPStartCall(SIPCall* call, const std::string& subject) int nbChannel; // Set rtpmap according to the supported codec order - CodecMap map = call->getCodecMap().getMap(); + CodecMap map = call->getCodecMap().getCodecMap(); + //CodecMap map = Manager::instance().getCodecDescriptorMap(); CodecMap::iterator iter = map.begin(); while(iter != map.end()) { - if (iter->second!=0 && iter->second->isActive()) { - payload = iter->first; + //if (iter->second!=0 && iter->second->isActive()) { + if(iter->first != -1){ + payload = iter->first; // add each payload in the list of payload media_audio << payload << " "; rtpmap_attr << "a=rtpmap:" << payload << " " << - iter->second->getCodecName().data() << "/" << iter->second->getClockRate(); + iter->second.data() << "/" << 8000; //iter->second->getClockRate(); - nbChannel = iter->second->getChannel(); + /*nbChannel = iter->second->getChannel(); if (nbChannel!=1) { rtpmap_attr << "/" << nbChannel; - } + }*/ rtpmap_attr << "\r\n"; } // go to next codec diff --git a/src/user_cfg.h b/src/user_cfg.h index 497674b9140c5c448271dc10358c6075ad07ee3d..d6ad4ae94dc11680745c7e580f2be9255fe7eae5 100644 --- a/src/user_cfg.h +++ b/src/user_cfg.h @@ -56,8 +56,8 @@ #define PLAY_TONES "DTMF.playTones" #define PULSE_LENGTH "DTMF.pulseLength" #define SEND_DTMF_AS "DTMF.sendDTMFas" -//#define STUN_SERVER "STUN.STUNserver" -//#define USE_STUN "STUN.useStun" +#define STUN_SERVER "STUN.STUNserver" +#define USE_STUN "STUN.useStun" #define DRIVER_NAME "Drivers.driverName" #define DRIVER_NAME_IN "Drivers.driverNameIn" #define DRIVER_NAME_OUT "Drivers.driverNameOut" @@ -67,6 +67,7 @@ #define CODEC1 "Codecs.codec1" #define CODEC2 "Codecs.codec2" #define CODEC3 "Codecs.codec3" +#define CODEC4 "Codecs.codec4" #define RING_CHOICE "Rings.ringChoice" #define ACCOUNT_SIP_COUNT_DEFAULT 4 #define ACCOUNT_IAX_COUNT_DEFAULT 4 @@ -100,6 +101,7 @@ #define DFT_CODEC1 "G711u" #define DFT_CODEC2 "G711a" #define DFT_CODEC3 "GSM" +#define DFT_CODEC4 "iLBC" #define DFT_RINGTONE "konga.ul" #define DFT_SKIN "metal" #define DFT_ZONE "North America"