Mercurial > pidgin.yaz
changeset 4429:bf770f11132b
[gaim-migrate @ 4704]
(15:41:59) Robot101: the hunk that got left out in the cold.
its a good thing when things compile
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Sun, 26 Jan 2003 20:41:49 +0000 |
parents | b5669740e34c |
children | 801830dec409 |
files | configure.ac configure.in src/aim.c src/browser.c src/gaimrc.c src/prefs.c src/sound.c src/ui.h |
diffstat | 8 files changed, 234 insertions(+), 701 deletions(-) [+] |
line wrap: on
line diff
--- a/configure.ac Sun Jan 26 19:39:43 2003 +0000 +++ b/configure.ac Sun Jan 26 20:41:49 2003 +0000 @@ -122,10 +122,7 @@ AC_DEFINE_UNQUOTED(STATIC_PROTO_INIT, $extern_init void static_proto_init() { $load_proto }, [Loads static protocol plugin module initialization functions.]) -AC_ARG_ENABLE(esd, [ --disable-esd Turn off ESD (default=auto)],,enable_esd=yes) -AC_ARG_ENABLE(nas, [ --enable-nas Enable NAS (Network Audio System) support],,enable_nas=no) -AC_ARG_ENABLE(artsc, [ --disable-artsc Turn off ArtsC (default=auto)],,enable_artsc=yes) - +AC_ARG_ENABLE(audio, [ --disable-audio compile without libao/libaudiofile for sound playing],,enable_audio=yes) AC_ARG_ENABLE(plugins, [ --disable-plugins compile without plugin support],,enable_plugins=yes) AC_ARG_ENABLE(perl, [ --disable-perl compile without perl scripting],,enable_perl=yes) AC_ARG_ENABLE(gtkspell, [ --disable-gtkspell compile without GtkSpell automatic spell checking],,enable_gtkspell=yes) @@ -274,45 +271,28 @@ fi fi -if test "$enable_nas" = yes ; then - AC_DEFINE(NAS_SOUND, 1, [Define if we have NAS sound support.]) - SOUND_LIBS="-laudio -lXt" -fi -if test "$enable_esd" = yes ; then - AM_PATH_GESD - if test "$no_esd" != yes ; then - old_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $ESD_CFLAGS" - AC_TRY_COMPILE(,[#include <esd.h>], - [ - AC_DEFINE(ESD_SOUND, 1, [Define if we have ESD sound support.]) - SOUND_LIBS="$SOUND_LIBS $ESD_LIBS" - ],[ - enable_esd=no - CFLAGS="$old_CFLAGS" - ]) +if test "$enable_audio" = yes ; then + AC_CHECK_HEADERS(ao/ao.h, found_ao_lib=true, found_ao_lib=false) + if test "$found_ao_lib" = "true"; then + AC_CHECK_LIB(ao, ao_initialize, found_ao_lib=true, found_ao_lib=false) + fi + + AC_CHECK_HEADERS(audiofile.h, found_af_lib=true, found_af_lib=false) + if test "$found_af_lib" = "true"; then + AC_CHECK_LIB(audiofile, afOpenFile, found_af_lib=true, found_af_lib=false) + fi + + if test "$found_ao_lib" = "true" -a "$found_af_lib" = "true"; then + SOUND_LIBS="-lao -laudiofile" + AC_SUBST(SOUND_LIBS) + AC_DEFINE(USE_AO, 1, [Define if we're using libao and libaudiofile for sound playing]) + enable_audio=yes else - enable_esd=no - fi + enable_audio=no + fi +else + enable_audio=no fi -if test "x$enable_artsc" = "xyes"; then - AM_PATH_ARTSC - if test "x$no_artsc" != "xyes" ; then - old_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $ARTSC_CFLAGS" - AC_TRY_COMPILE(,[#include <artsc.h>], - [ - AC_DEFINE(ARTSC_SOUND, 1, [Define if we have artsc sound support.]) - SOUND_LIBS="$SOUND_LIBS $ARTSC_LIBS" - ],[ - enable_artsc=no - CFLAGS="$old_CFLAGS" - ]) - else - enable_artsc=no - fi -fi -AC_SUBST(SOUND_LIBS) if test "$ac_cv_cygwin" = yes ; then LDADD="$LDADD -static" @@ -442,20 +422,16 @@ echo Build Protocol Plugins........ : $enable_prpls echo Protocols to link statically.. : $STATIC_PRPLS echo -echo UI Library.................... : GTK 2.0 +echo UI Library.................... : GTK 2.x echo echo Build with Plugin support..... : $enable_plugins echo Build with Perl support....... : $enable_perl -echo -echo Build with GtkSpell............: $enable_gtkspell +echo Build with Audio support...... : $enable_audio +echo Build with GtkSpell support... : $enable_gtkspell echo echo Use XScreenSaver Extension.... : $enable_xss echo Use X Session Management...... : $enable_sm echo -echo Build with ESD................ : $enable_esd -echo Build with NAS................ : $enable_nas -echo Build with ArtsC.............. : $enable_artsc -echo echo Print debugging messages...... : $enable_debug echo eval eval echo Gaim will be installed in $bindir.
--- a/configure.in Sun Jan 26 19:39:43 2003 +0000 +++ b/configure.in Sun Jan 26 20:41:49 2003 +0000 @@ -112,16 +112,13 @@ AC_DEFINE_UNQUOTED(STATIC_PROTO_INIT, $extern_init void static_proto_init() { $load_proto }, [Loads static protocol plugin module initialization functions.]) -AC_ARG_ENABLE(esd, [ --disable-esd Turn off ESD (default=auto)],,enable_esd=yes) -AC_ARG_ENABLE(nas, [ --enable-nas Enable NAS (Network Audio System) support],,enable_nas=no) -AC_ARG_ENABLE(artsc, [ --disable-artsc Turn off ArtsC (default=auto)],,enable_artsc=yes) - +AC_ARG_ENABLE(audio, [ --disable-audio compile without libao/libaudiofile for sound playing],,enable_audio=yes) AC_ARG_ENABLE(plugins, [ --disable-plugins compile without plugin support],,enable_plugins=yes) AC_ARG_ENABLE(perl, [ --disable-perl compile without perl scripting],,enable_perl=yes) AC_ARG_ENABLE(gtkspell, [ --disable-gtkspell compile without GtkSpell automatic spell checking],,enable_gtkspell=yes) - AC_ARG_ENABLE(debug, [ --enable-debug compile with debugging support],,enable_debug=no) AC_ARG_ENABLE(screensaver, [ --disable-screensaver compile without X screensaver extension],,enable_xss=yes) +AC_ARG_ENABLE(sm, [ --disable-sm compile without X session management support],,enable_sm=yes) AC_ARG_WITH(krb4, [ --with-krb4=PREFIX Compile Zephyr plugin with Kerberos 4 support],kerberos="$withval",kerberos="no") if test "$enable_debug" = yes ; then @@ -248,45 +245,28 @@ fi fi -if test "$enable_nas" = yes ; then - AC_DEFINE(NAS_SOUND, 1, [Define if we have NAS sound support.]) - SOUND_LIBS="-laudio -lXt" -fi -if test "$enable_esd" = yes ; then - AM_PATH_GESD - if test "$no_esd" != yes ; then - old_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $ESD_CFLAGS" - AC_TRY_COMPILE(,[#include <esd.h>], - [ - AC_DEFINE(ESD_SOUND, 1, [Define if we have ESD sound support.]) - SOUND_LIBS="$SOUND_LIBS $ESD_LIBS" - ],[ - enable_esd=no - CFLAGS="$old_CFLAGS" - ]) +if test "$enable_audio" = yes ; then + AC_CHECK_HEADERS(ao/ao.h, found_ao_lib=true, found_ao_lib=false) + if test "$found_ao_lib" = "true"; then + AC_CHECK_LIB(ao, ao_initialize, found_ao_lib=true, found_ao_lib=false) + fi + + AC_CHECK_HEADERS(audiofile.h, found_af_lib=true, found_af_lib=false) + if test "$found_af_lib" = "true"; then + AC_CHECK_LIB(audiofile, afOpenFile, found_af_lib=true, found_af_lib=false) + fi + + if test "$found_ao_lib" = "true" -a "$found_af_lib" = "true"; then + SOUND_LIBS="-lao -laudiofile" + AC_SUBST(SOUND_LIBS) + AC_DEFINE(USE_AO, 1, [Define if we're using libao and libaudiofile for sound playing]) + enable_audio=yes else - enable_esd=no - fi + enable_audio=no + fi +else + enable_audio=no fi -if test "x$enable_artsc" = "xyes"; then - AM_PATH_ARTSC - if test "x$no_artsc" != "xyes" ; then - old_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $ARTSC_CFLAGS" - AC_TRY_COMPILE(,[#include <artsc.h>], - [ - AC_DEFINE(ARTSC_SOUND, 1, [Define if we have artsc sound support.]) - SOUND_LIBS="$SOUND_LIBS $ARTSC_LIBS" - ],[ - enable_artsc=no - CFLAGS="$old_CFLAGS" - ]) - else - enable_artsc=no - fi -fi -AC_SUBST(SOUND_LIBS) if test "$ac_cv_cygwin" = yes ; then LDADD="$LDADD -static" @@ -418,18 +398,15 @@ echo Build Protocol Plugins........ : $enable_prpls echo Protocols to link statically.. : $STATIC_PRPLS echo -echo UI Library.................... : GTK 2.0 +echo UI Library.................... : GTK 2.x echo echo Build with Plugin support..... : $enable_plugins echo Build with Perl support....... : $enable_perl -echo -echo Build with GtkSpell............: $enable_gtkspell +echo Build with Audio support...... : $enable_audio +echo Build with GtkSpell support... : $enable_gtkspell echo echo Use XScreenSaver Extension.... : $enable_xss -echo -echo Build with ESD................ : $enable_esd -echo Build with NAS................ : $enable_nas -echo Build with ArtsC.............. : $enable_artsc +echo Use X Session Management...... : $enable_sm echo echo Print debugging messages...... : $enable_debug echo
--- a/src/aim.c Sun Jan 26 19:39:43 2003 +0000 +++ b/src/aim.c Sun Jan 26 20:41:49 2003 +0000 @@ -896,6 +896,8 @@ gtk_main(); core_quit(); /* don't need ui_quit here because ui doesn't create anything */ + /* maybe we do now? -Robot101 */ + sound_quit(); #ifdef _WIN32 wgaim_cleanup(); #endif
--- a/src/browser.c Sun Jan 26 19:39:43 2003 +0000 +++ b/src/browser.c Sun Jan 26 20:41:49 2003 +0000 @@ -487,263 +487,106 @@ gdk_x11_xatom_to_atom (XA_STRING), 8, GDK_PROP_MODE_REPLACE, (unsigned char *)command, strlen(command)); - while (!done) { - GdkEvent *event; - - event = gdk_event_get(); - - if (!event) - continue; - - if (event->any.window != window) { - gtk_main_do_event(event); - continue; - } - - if (event->type == GDK_DESTROY && event->any.window == window) { - - /* Print to warn user... */ - debug_printf("%s: window 0x%x was destroyed.\n", progname, (unsigned int)window); - result = 6; - done = True; - } else if (event->type == GDK_PROPERTY_NOTIFY && - event->property.state == GDK_PROPERTY_NEW_VALUE && - event->property.window == window && - event->property.atom == GDKA_MOZILLA_RESPONSE) { - GdkAtom actual_type; - gint actual_format, nitems; - unsigned char *data = 0; - - result = gdk_property_get(window, GDKA_MOZILLA_RESPONSE, - gdk_x11_xatom_to_atom (XA_STRING), 0, - (65536 / sizeof(long)), - 1, &actual_type, &actual_format, &nitems, &data); - - - if (result == Success && data && *data) { - debug_printf("%s: (server sent " MOZILLA_RESPONSE_PROP - " \"%s\" to 0x%x.)\n", - progname, data, (unsigned int)window); - } + gdk_window_add_filter(window, (GdkFilterFunc) netscape_response_cb, window); +} - if (result != Success) { - debug_printf("%s: failed reading " MOZILLA_RESPONSE_PROP - " from window 0x%0x.\n", progname, (unsigned int)window); - result = 6; - done = True; - } else if (!data || strlen((char *)data) < 5) { - debug_printf("%s: invalid data on " MOZILLA_RESPONSE_PROP - " property of window 0x%0x.\n", - progname, (unsigned int)window); - result = 6; - done = True; - } else if (*data == '1') { /* positive preliminary reply */ - debug_printf("%s: %s\n", progname, data + 4); - /* keep going */ - done = False; - } else if (!strncmp((char *)data, "200", 3)) { - result = 0; - done = True; - } else if (*data == '2') { - debug_printf("%s: %s\n", progname, data + 4); - result = 0; - done = True; - } else if (*data == '3') { - debug_printf("%s: internal error: " - "server wants more information? (%s)\n", progname, data); - result = 3; - done = True; - } else if (*data == '4' || *data == '5') { - debug_printf("%s: %s\n", progname, data + 4); - result = (*data - '0'); - done = True; - } else { - debug_printf("%s: unrecognised " MOZILLA_RESPONSE_PROP - " from window 0x%x: %s\n", - progname, (unsigned int)window, data); - result = 6; - done = True; - } - - if (data) - g_free(data); - } else if (event->type == GDK_PROPERTY_NOTIFY && - event->property.window == window && - event->property.state == GDK_PROPERTY_DELETE && - event->property.atom == GDKA_MOZILLA_COMMAND) { - debug_printf("%s: (server 0x%x has accepted " - MOZILLA_COMMAND_PROP ".)\n", progname, (unsigned int)window); - } - gdk_event_free(event); +static gboolean netscape_command(const char *command) +{ + GdkWindow *window = NULL; + + if (netscape_lock) { + debug_printf("netscape_command() is currently in use.\n"); + return FALSE; } - if (new_command) - g_free(new_command); - - return result; -} - - -gboolean check_netscape(gpointer data) -{ - char *msg = data; - int status; - GdkWindow *window; + netscape_lock = 1; mozilla_remote_init_atoms(); window = mozilla_remote_find_window(); - if (window && (GDK_WINDOW_OBJECT(window)->destroyed == FALSE)) { - - XSelectInput(gdk_display, GDK_WINDOW_XWINDOW(window), - (PropertyChangeMask | StructureNotifyMask)); - - - mozilla_remote_obtain_lock(window); - - status = mozilla_remote_command(window, msg, False); - - if (status != 6) - mozilla_remote_free_lock(window); - + if (window == NULL || (GDK_WINDOW_OBJECT(window)->destroyed == TRUE)) { + debug_printf("Remote window absent or unsuitable.\n"); netscape_lock = 0; - - g_free(msg); return FALSE; - } else - return TRUE; -} - - -static void netscape_command(char *command) -{ - int status; - pid_t pid; - GdkWindow *window; - - if (netscape_lock) - return; - - netscape_lock = 1; - - - - mozilla_remote_init_atoms(); - window = mozilla_remote_find_window(); - - if (window && (GDK_WINDOW_OBJECT(window)->destroyed == FALSE)) { - - XSelectInput(gdk_display, GDK_WINDOW_XWINDOW(window), - (PropertyChangeMask | StructureNotifyMask)); - - mozilla_remote_obtain_lock(window); - - status = mozilla_remote_command(window, command, False); - - if (status != 6) - mozilla_remote_free_lock(window); - - netscape_lock = 0; - - gdk_window_destroy(window); - } else { - pid = fork(); - if (pid == 0) { - char *args[2]; - int e; - - args[0] = g_strdup("netscape"); - args[1] = NULL; - e = execvp(args[0], args); - printf("Hello%d\n", getppid()); - - _exit(0); - } else { - char *tmp = g_strdup(command); - g_timeout_add(200, check_netscape, tmp); - } } + mozilla_remote_command(window, command, False); + + netscape_lock = 0; + return TRUE; } void open_url(GtkWidget *w, char *url) { - gchar *space_free_url; - - if (web_browser == BROWSER_NETSCAPE) { - char *command; - - if (misc_options & OPT_MISC_BROWSER_POPUP) - command = g_strdup_printf("OpenURL(%s, new-window)", url); - else - command = g_strdup_printf("OpenURL(%s)", url); - - netscape_command(command); - g_free(command); -/* fixme: GNOME helper * - * } else if (web_browser == BROWSER_GNOME) { * - * gnome_url_show(url); */ - } else { - pid_t pid; - - pid = fork(); - - if (pid == 0) { - /* args will be allocated below but we don't bother - * freeing it since we're just going to exec and - * exit */ - char **args=NULL; - char command[1024]; - - if (web_browser == BROWSER_OPERA) { - args = g_new(char *, 4); - args[0] = "opera"; - args[1] = "-newwindow"; - args[2] = url; - args[3] = NULL; - } else if (web_browser == BROWSER_KONQ) { - args = g_new(char *, 4); - args[0] = "kfmclient"; - args[1] = "openURL"; - args[2] = url; - args[3] = NULL; - } else if (web_browser == BROWSER_GALEON) { - args = g_new(char *, 4); - args[0] = "galeon"; - if (misc_options & OPT_MISC_BROWSER_POPUP) { - args[1] = "-w"; - args[2] = url; - args[3] = NULL; - } else { - args[1] = url; - args[2] = NULL; - } - } else if (web_browser == BROWSER_MOZILLA) { - args = g_new(char *, 4); - args[0] = "mozilla"; - args[1] = url; - args[2] = NULL; - } else if (web_browser == BROWSER_MANUAL) { - if(strcmp(web_command,"") == 0) - _exit(0); - space_free_url = g_strdelimit(url, " ", '+'); - g_snprintf(command, sizeof(command), web_command, space_free_url); - g_free(space_free_url); - args = g_strsplit(command, " ", 0); + char *command = NULL; + GError *error = NULL; + + switch (web_browser) { + case BROWSER_NETSCAPE: { + char *args = NULL; + + if (misc_options & OPT_MISC_BROWSER_POPUP) + args = g_strdup_printf("OpenURL(%s, new-window)", url); + else + args = g_strdup_printf("OpenURL(%s)", url); + + if (netscape_command(args)) { + g_free(args); + return; } - execvp(args[0], args); - _exit(0); - } + /* if netscape is running ... + command = g_strdup_printf("netscape -remote %s", args); */ + + command = g_strdup_printf("netscape %s", url); + g_free(args); + } break; + + case BROWSER_OPERA: + command = g_strdup_printf("opera -newwindow %s", url); + break; + + case BROWSER_KONQ: + command = g_strdup_printf("kfmclient openURL %s", url); + break; + + case BROWSER_GALEON: + command = g_strdup_printf("galeon -w %s", url); + command = g_strdup_printf("galeon %s", url); + break; + + case BROWSER_MOZILLA: + command = g_strdup_printf("mozilla %s", url); + break; + + case BROWSER_MANUAL: { + char *space_free_url = NULL; + + if (!web_command[0]) { + do_error_dialog(_("Unable to launch your browser because the 'Manual' browser command has been chosen, but no command has been set."), NULL, GAIM_ERROR); + return; + } + + space_free_url = g_strdelimit(url, " ", '+'); + command = g_strdup_printf("%s %s", web_command, space_free_url); + g_free(space_free_url); + } break; } + + if (g_spawn_command_line_async(command, &error) == FALSE) { + char *tmp = g_strdup_printf(_("There was an error launching your chosen browser: %s"), error->message); + do_error_dialog(tmp, NULL, GAIM_ERROR); + g_free(tmp); + g_error_free(error); + } + + g_free(command); } void add_bookmark(GtkWidget *w, char *url) { if (web_browser == BROWSER_NETSCAPE) { - char *command = g_malloc(1024); - - g_snprintf(command, 1024, "AddBookmark(%s)", url); + char *command = g_strdup_printf("AddBookmark(%s)", url); netscape_command(command); g_free(command);
--- a/src/gaimrc.c Sun Jan 26 19:39:43 2003 +0000 +++ b/src/gaimrc.c Sun Jan 26 20:41:49 2003 +0000 @@ -820,8 +820,8 @@ } /* this is where we do bugs and compatibility stuff */ - if (!(sound_options & (OPT_SOUND_BEEP | OPT_SOUND_ESD | OPT_SOUND_NORMAL | OPT_SOUND_NAS | OPT_SOUND_ARTSC | OPT_SOUND_CMD))) - sound_options |= OPT_SOUND_ESD | OPT_SOUND_NORMAL | OPT_SOUND_NAS | OPT_SOUND_ARTSC; + if (!(sound_options & (OPT_SOUND_BEEP | OPT_SOUND_NORMAL | OPT_SOUND_CMD))) + sound_options |= OPT_SOUND_NORMAL; if (conv_size.width == 0 && conv_size.height == 0 && @@ -1244,10 +1244,7 @@ OPT_SOUND_RECV | OPT_SOUND_SEND | OPT_SOUND_SILENT_SIGNON | - OPT_SOUND_NORMAL | - OPT_SOUND_NAS | - OPT_SOUND_ARTSC | - OPT_SOUND_ESD; + OPT_SOUND_NORMAL; #ifdef USE_SCREENSAVER report_idle = IDLE_SCREENSAVER;
--- a/src/prefs.c Sun Jan 26 19:39:43 2003 +0000 +++ b/src/prefs.c Sun Jan 26 20:41:49 2003 +0000 @@ -956,19 +956,12 @@ #ifndef _WIN32 vbox = make_frame (ret, _("Sound Method")); dd = gaim_dropdown(vbox, _("_Method"), &sound_options, OPT_SOUND_BEEP | - OPT_SOUND_ESD | OPT_SOUND_ARTSC | OPT_SOUND_NAS | OPT_SOUND_NORMAL | + OPT_SOUND_NORMAL | OPT_SOUND_CMD, _("Console beep"), OPT_SOUND_BEEP, -#ifdef ESD_SOUND - "ESD", OPT_SOUND_ESD, +#ifdef USE_AO + _("Automatic"), OPT_SOUND_NORMAL, #endif -#ifdef ARTSC_SOUND - "ArtsC", OPT_SOUND_ARTSC, -#endif -#ifdef NAS_SOUND - "NAS", OPT_SOUND_NAS, -#endif - _("Internal"), OPT_SOUND_NORMAL, _("Command"), OPT_SOUND_CMD, NULL); gtk_size_group_add_widget(sg, dd); gtk_misc_set_alignment(GTK_MISC(dd), 0, 0);
--- a/src/sound.c Sun Jan 26 19:39:43 2003 +0000 +++ b/src/sound.c Sun Jan 26 20:41:49 2003 +0000 @@ -40,17 +40,10 @@ #include <sys/types.h> #include <sys/stat.h> -#ifdef ESD_SOUND -#include <esd.h> -#endif - -#ifdef ARTSC_SOUND -#include <artsc.h> -#endif - -#ifdef NAS_SOUND -#include <audio/audiolib.h> -#endif +#ifdef USE_AO +#include <ao/ao.h> +#include <audiofile.h> +#endif /* USE_AO */ #include "gaim.h" @@ -58,6 +51,10 @@ #include "win32dep.h" #endif +#ifdef USE_AO +static gboolean ao_initialized = FALSE; +#endif /* USE_AO */ + gboolean mute_sounds = 0; /* description, option bit, default sound file * @@ -79,370 +76,109 @@ {N_("Someone says your name in chat"), OPT_SOUND_CHAT_NICK, "redalert.wav"} }; -#ifndef _WIN32 -static int check_dev(char *dev) -{ - struct stat stat_buf; - uid_t user = getuid(); - gid_t group = getgid(), other_groups[32]; - int i, numgroups; - - if ((numgroups = getgroups(32, other_groups)) == -1) - return 0; - if (stat(dev, &stat_buf)) - return 0; - if (user == stat_buf.st_uid && stat_buf.st_mode & S_IWUSR) - return 1; - if (stat_buf.st_mode & S_IWGRP) { - if (group == stat_buf.st_gid) - return 1; - for (i = 0; i < numgroups; i++) - if (other_groups[i] == stat_buf.st_gid) - return 1; - } - if (stat_buf.st_mode & S_IWOTH) - return 1; - return 0; -} - -static void play_audio_file(char *file) -{ - /* here we can assume that we can write to /dev/audio */ - char *buf; - struct stat info; - int fd = open(file, O_RDONLY); - if (fd <= 0) { - return; - } - fstat(fd, &info); - if (info.st_size < 24) - return; - buf = malloc(info.st_size + 1); - read(fd, buf, 24); - read(fd, buf, info.st_size - 24); - close(fd); - - fd = open("/dev/audio", O_WRONLY | O_EXCL | O_NDELAY); - if (fd < 0) { - free(buf); - return; - } - write(fd, buf, info.st_size - 24); - free(buf); - close(fd); -} - -static int can_play_audio() -{ - return check_dev("/dev/audio"); -} - -#ifdef ESD_SOUND - -int esd_fd; - -static int can_play_esd() -{ - esd_format_t format = ESD_BITS16 | ESD_STREAM | ESD_PLAY | ESD_MONO; - - esd_fd = esd_play_stream(format, 8012, NULL, "gaim"); - - if (esd_fd < 0) { - return 0; - } - - return 1; -} - -#endif /* ESD_SOUND */ - -#ifdef ARTSC_SOUND - -/* -** This routine converts from ulaw to 16 bit linear. -** -** Craig Reese: IDA/Supercomputing Research Center -** 29 September 1989 -** -** References: -** 1) CCITT Recommendation G.711 (very difficult to follow) -** 2) MIL-STD-188-113,"Interoperability and Performance Standards -** for Analog-to_Digital Conversion Techniques," -** 17 February 1987 -** -** Input: 8 bit ulaw sample -** Output: signed 16 bit linear sample -** Z-note -- this is from libaudiofile. Thanks guys! -*/ - -static int _af_ulaw2linear(unsigned char ulawbyte) -{ - static int exp_lut[8] = { 0, 132, 396, 924, 1980, 4092, 8316, 16764 }; - int sign, exponent, mantissa, sample; - - ulawbyte = ~ulawbyte; - sign = (ulawbyte & 0x80); - exponent = (ulawbyte >> 4) & 0x07; - mantissa = ulawbyte & 0x0F; - sample = exp_lut[exponent] + (mantissa << (exponent + 3)); - if (sign != 0) - sample = -sample; - - return (sample); -} - -static int play_artsc(unsigned char *data, int size) -{ - arts_stream_t stream; - guint16 *lineardata; - int result = 1; - int error; - int i; - - lineardata = g_malloc(size * 2); - - for (i = 0; i < size; i++) { - lineardata[i] = _af_ulaw2linear(data[i]); - } - - stream = arts_play_stream(8012, 16, 1, "gaim"); - - error = arts_write(stream, lineardata, size); - if (error < 0) { - result = 0; - } - - arts_close_stream(stream); - - g_free(lineardata); - - arts_free(); - - return result; -} - -static int can_play_artsc() -{ - int error; - - error = arts_init(); - if (error < 0) - return 0; - - return 1; -} - -static int artsc_play_file(char *file) -{ - struct stat stat_buf; - unsigned char *buf = NULL; - int result = 0; - int fd = -1; - - if (!can_play_artsc()) - return 0; - - fd = open(file, O_RDONLY); - if (fd < 0) - return 0; - - if (fstat(fd, &stat_buf)) { - close(fd); - return 0; - } - - if (!stat_buf.st_size) { - close(fd); - return 0; - } - - buf = g_malloc(stat_buf.st_size); - if (!buf) { - close(fd); - return 0; - } - - if (read(fd, buf, stat_buf.st_size) < 0) { - g_free(buf); - close(fd); - return 0; - } - - result = play_artsc(buf, stat_buf.st_size); - - g_free(buf); - close(fd); - return result; -} - -#endif /* ARTSC_SOUND */ - -#ifdef NAS_SOUND - -char nas_server[] = "localhost"; -AuServer *nas_serv = NULL; - -static AuBool NasEventHandler(AuServer * aud, AuEvent * ev, AuEventHandlerRec * handler) -{ - AuElementNotifyEvent *event = (AuElementNotifyEvent *) ev; - - if (ev->type == AuEventTypeElementNotify) { - switch (event->kind) { - case AuElementNotifyKindState: - switch (event->cur_state) { - case AuStateStop: - _exit(0); - } - break; - } - } - return AuTrue; -} - - -static int play_nas(unsigned char *data, int size) -{ - AuDeviceID device = AuNone; - AuFlowID flow; - AuElement elements[3]; - int i, n, w; - - /* look for an output device */ - for (i = 0; i < AuServerNumDevices(nas_serv); i++) { - if ((AuDeviceKind(AuServerDevice(nas_serv, i)) == - AuComponentKindPhysicalOutput) && - AuDeviceNumTracks(AuServerDevice(nas_serv, i)) == 1) { - device = AuDeviceIdentifier(AuServerDevice(nas_serv, i)); - break; - } - } - - if (device == AuNone) - return 0; - - if (!(flow = AuCreateFlow(nas_serv, NULL))) - return 0; - - - AuMakeElementImportClient(&elements[0], 8012, AuFormatULAW8, 1, AuTrue, size, size / 2, 0, NULL); - AuMakeElementExportDevice(&elements[1], 0, device, 8012, AuUnlimitedSamples, 0, NULL); - AuSetElements(nas_serv, flow, AuTrue, 2, elements, NULL); - - AuStartFlow(nas_serv, flow, NULL); - - AuWriteElement(nas_serv, flow, 0, size, data, AuTrue, NULL); - - AuRegisterEventHandler(nas_serv, AuEventHandlerIDMask, 0, flow, NasEventHandler, NULL); - - while (1) { - AuHandleEvents(nas_serv); - } - - return 1; -} - -static int can_play_nas() -{ - if ((nas_serv = AuOpenServer(NULL, 0, NULL, 0, NULL, NULL))) - return 1; - return 0; -} - -static int play_nas_file(char *file) -{ - struct stat stat_buf; - char *buf; - int ret; - int fd = open(file, O_RDONLY); - if (fd <= 0) - return 0; - - if (!can_play_nas()) - return 0; - - if (stat(file, &stat_buf)) - return 0; - - if (!stat_buf.st_size) - return 0; - - buf = malloc(stat_buf.st_size); - read(fd, buf, stat_buf.st_size); - ret = play_nas(buf, stat_buf.st_size); - free(buf); - return ret; -} - -#endif /* NAS_SOUND */ - -#endif /* !_WIN32 */ - void play_file(char *filename) { #ifndef _WIN32 - int pid; +#ifdef USE_AO + int ao_driver; +#endif /* USE_AO */ + pid_t pid; #endif + if (awaymessage && !(sound_options & OPT_SOUND_WHEN_AWAY)) return; /* check here in case a buddy pounce plays a file while away */ - + if (sound_options & OPT_SOUND_BEEP) { gdk_beep(); return; } - else if (sound_options & OPT_SOUND_NORMAL) { - debug_printf("attempting to play audio file with internal method -- this is unlikely to work\n"); +#ifndef _WIN32 + if (!g_file_test(filename, G_FILE_TEST_EXISTS)) { + gchar *tmp = g_strdup_printf(_("Unable to play sound because the chosen filename (%s) does not exist."), filename); + do_error_dialog(tmp, NULL, GAIM_ERROR); + g_free(tmp); + return; } -#ifndef _WIN32 + + if (sound_options & OPT_SOUND_CMD) { + gchar *command = NULL; + GError *error = NULL; + + if (!sound_cmd[0]) { + do_error_dialog(_("Unable to play sound because the 'Command' sound method has been chosen, but no command has been set."), NULL, GAIM_ERROR); + return; + } + + command = g_strdup_printf(sound_cmd, filename); + + if (g_spawn_command_line_async(command, &error) == FALSE) { + gchar *tmp = g_strdup_printf(_("Unable to play sound because the configured sound command could not be launched: %s"), error->message); + do_error_dialog(tmp, NULL, GAIM_ERROR); + g_free(tmp); + g_error_free(error); + } + + g_free(command); + return; + } + +#ifdef USE_AO + if (!ao_initialized) { + ao_initialize(); + } + + ao_driver = ao_default_driver_id(); + + if (ao_driver == -1) { + do_error_dialog(_("Unable to play sound because no suitable driver could be found."), NULL, GAIM_ERROR); + return; + } + pid = fork(); if (pid < 0) return; else if (pid == 0) { - alarm(30); - - if ((sound_options & OPT_SOUND_CMD) && sound_cmd[0]) { - char *args[4]; - char command[4096]; + AFfilehandle file = afOpenFile(filename, "rb", NULL); + if(file) { + ao_device *device; + ao_sample_format format; - g_snprintf(command, sizeof(command), sound_cmd, filename); + int in_fmt; + int bytes_per_frame; + + format.rate = afGetRate(file, AF_DEFAULT_TRACK); + format.channels = afGetChannels(file, AF_DEFAULT_TRACK); + afGetSampleFormat(file, AF_DEFAULT_TRACK, &in_fmt, + &format.bits); + + bytes_per_frame = format.bits * format.channels / 8; - args[0] = "sh"; - args[1] = "-c"; - args[2] = command; - args[3] = NULL; - execvp(args[0], args); - _exit(0); - } -#ifdef ESD_SOUND - else if (sound_options & OPT_SOUND_ESD) { - if (esd_play_file(NULL, filename, 1)) - _exit(0); + device = ao_open_live(ao_driver, &format, NULL); + + if (device) { + int frames_read; + char buf[4096]; + int buf_frames = sizeof(buf) / bytes_per_frame; + + while((frames_read = afReadFrames(file, AF_DEFAULT_TRACK, + buf, buf_frames))) { + if(!ao_play(device, buf, frames_read * bytes_per_frame)) + break; + } + ao_close(device); + } + + ao_shutdown(); + afCloseFile(file); } -#endif - -#ifdef ARTSC_SOUND - else if (sound_options & OPT_SOUND_ARTSC) { - if (artsc_play_file(filename)) - _exit(0); - } -#endif - -#ifdef NAS_SOUND - else if (sound_options & OPT_SOUND_NAS) { - if (play_nas_file(filename)) - _exit(0); - } -#endif - - else if ((sound_options & OPT_SOUND_NORMAL) && - can_play_audio()) { - play_audio_file(filename); - _exit(0); - } - _exit(0); } +#else /* USE_AO */ + gdk_beep(); +#endif /* USE_AO */ + #else /* _WIN32 */ debug_printf("Playing %s\n", filename); if (!PlaySound(filename, 0, SND_ASYNC | SND_FILENAME)) @@ -450,13 +186,21 @@ #endif } +void sound_quit() { +#ifdef USE_AO + if (ao_initialized) { + ao_shutdown(); + } +#endif +} + extern int logins_not_muted; void play_sound(int sound) { if (mute_sounds) return; - + if ((sound == SND_BUDDY_ARRIVE) && !logins_not_muted) return;