diff src/sound.c @ 5684:b61520e71679

[gaim-migrate @ 6104] sound is now really core/ui split. committer: Tailor Script <tailor@pidgin.im>
author Nathan Walp <nwalp@pidgin.im>
date Tue, 03 Jun 2003 03:33:20 +0000
parents 9cd94a5bec8e
children 059d95c67cda
line wrap: on
line diff
--- a/src/sound.c	Tue Jun 03 02:30:30 2003 +0000
+++ b/src/sound.c	Tue Jun 03 03:33:20 2003 +0000
@@ -1,7 +1,6 @@
 /*
  * gaim
  *
- * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net>
  * Copyright (C) 2003, Nathan Walp <faceprint@faceprint.com>
  *
  * This program is free software; you can redistribute it and/or modify
@@ -23,368 +22,57 @@
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
 
-#ifndef _WIN32
-#include <unistd.h>
-#else
-#include <windows.h>
-#include <mmsystem.h>
-#endif
-
-#ifdef HAVE_ENDIAN_H
-#include <endian.h>
-#endif
-
-#ifdef USE_AO
-#include <ao/ao.h>
-#include <audiofile.h>
-#endif /* USE_AO */
-#ifdef USE_NAS_AUDIO
-#include <audio/audiolib.h>
-#include <audio/soundlib.h>
-#endif /* USE_NAS_AUDIO */
-
-#include "gaim.h"
 #include "sound.h"
-#include "notify.h"
 #include "prefs.h"
+#include "gaim.h" /* XXX: this goes away when away messages become sane */
 
 #ifdef _WIN32
 #include "win32dep.h"
 #endif
 
-struct gaim_sound_event {
-	char *label;
-	char *pref;
-	char *def;
-};
-
-#ifdef USE_AO
-static gboolean ao_initialized=FALSE;
-static int ao_driver = -1;
-#endif /* USE_AO */
-
-
-static gboolean mute_login_sounds = FALSE;
-static gboolean mute_sounds = FALSE;
-static char *sound_cmd = NULL;
+static GaimSoundUiOps *sound_ui_ops = NULL;
 
-/* description, option bit, default sound file             *
- * set the option bit to 0 to have it not display in prefs *
- * the order here has to match the defines in gaim.h.      *
- *                                               -Robot101 */
-static struct gaim_sound_event sounds[GAIM_NUM_SOUNDS] = {
-	{N_("Buddy logs in"), "/gaim/gtk/sound/login", "arrive.wav"},
-	{N_("Buddy logs out"), "/gaim/gtk/sound/logout", "leave.wav"},
-	{N_("Message received"), "/gaim/gtk/sound/im_recv", "receive.wav"},
-	{N_("Message received begins conversation"), "/gaim/gtk/sound/first_im_recv", "receive.wav"},
-	{N_("Message sent"), "/gaim/gtk/sound/send_im", "send.wav"},
-	{N_("Person enters chat"), "/gaim/gtk/sound/join_chat", "arrive.wav"},
-	{N_("Person leaves chat"), "/gaim/gtk/sound/left_chat", "leave.wav"},
-	{N_("You talk in chat"), "/gaim/gtk/sound/send_chat_msg", "send.wav"},
-	{N_("Others talk in chat"), "/gaim/gtk/sound/chat_msg_recv", "receive.wav"},
-	/* this isn't a terminator, it's the buddy pounce default sound event ;-) */
-	{NULL, 0, "redalert.wav"},
-	{N_("Someone says your name in chat"), "/gaim/gtk/sound/nick_said", "redalert.wav"}
-};
-
-static char *sound_file[GAIM_NUM_SOUNDS];
-
-
-#ifdef USE_AO
-static void check_ao_init()
+void gaim_set_sound_ui_ops(GaimSoundUiOps *ops)
 {
-	if(!ao_initialized) {
-		gaim_debug(GAIM_DEBUG_INFO, "sound",
-				   "Initializing sound output drivers.\n");
-		ao_initialize();
-		ao_initialized = TRUE;
-	}
-}
-#endif /* USE_AO */
-
-void gaim_sound_change_output_method() {
-#ifdef USE_AO
-	ao_driver = -1;
-
-	if (gaim_prefs_get_bool("/core/sound/use_esd") ||
-		gaim_prefs_get_bool("/core/sound/use_arts") ||
-		gaim_prefs_get_bool("/core/sound/use_sys_default")) {
-
-		check_ao_init();
-
-		if (ao_driver == -1 && gaim_prefs_get_bool("/core/sound/use_esd"))
-			ao_driver = ao_driver_id("esd");
-
-		if (ao_driver == -1 && gaim_prefs_get_bool("/core/sound/use_arts"))
-			ao_driver = ao_driver_id("arts");
-
-		if (ao_driver == -1)
-			ao_driver = ao_default_driver_id();
-	}
-
-	if(ao_driver != -1) {
-		ao_info *info = ao_driver_info(ao_driver);
-		gaim_debug(GAIM_DEBUG_INFO, "sound",
-				   "Sound output driver loaded: %s\n", info->name);
-	}
-#endif /* USE_AO */
-#ifdef USE_NAS
-	if (gaim_prefs_get_bool("/core/sound/use_nas"))
-		gaim_debug(GAIM_DEBUG_INFO, "sound",
-				   "Sound output driver loaded: NAS output\n");
-#endif /* USE_NAS */
+	if(sound_ui_ops && sound_ui_ops->shutdown)
+		sound_ui_ops->shutdown();
+	sound_ui_ops = ops;
+	if(sound_ui_ops && sound_ui_ops->init)
+		sound_ui_ops->init();
 }
 
-void gaim_sound_quit()
+GaimSoundUiOps *gaim_get_sound_ui_ops(void)
 {
-#ifdef USE_AO
-	if(ao_initialized)
-		ao_shutdown();
-#endif
-}
-
-
-#ifdef USE_NAS_AUDIO
-static gboolean play_file_nas(const char *filename)
-{
-	AuServer *nas_serv;
-	gboolean ret = FALSE;
-
-	if((nas_serv = AuOpenServer(NULL, 0, NULL, 0, NULL, NULL))) {
-		ret = AuSoundPlaySynchronousFromFile(nas_serv, filename, 100);
-		AuCloseServer(nas_serv);
-	}
-
-	return ret;
+	return sound_ui_ops;
 }
 
-#endif /* USE_NAS_AUDIO */
+void gaim_sound_init()
+{
+	gaim_prefs_add_none("/core/sound");
+	gaim_prefs_add_bool("/core/sound/while_away", FALSE);
+}
 
-void gaim_sound_play_file(char *filename)
+void gaim_sound_shutdown()
 {
-#if defined(USE_NAS_AUDIO) || defined(USE_AO)
-	pid_t pid;
-#ifdef USE_AO
-	AFfilehandle file;
-#endif
-#endif
+	if(sound_ui_ops && sound_ui_ops->shutdown)
+		sound_ui_ops->shutdown();
+}
 
-	if (mute_sounds)
+void gaim_sound_play_file(const char *filename)
+{
+	if(awaymessage && !gaim_prefs_get_bool("/core/sound/while_away"))
 		return;
 
-	if (awaymessage && !gaim_prefs_get_bool("/core/sound/while_away"))
-		return; /* check here in case a buddy pounce plays a file while away */
-
-	if (gaim_prefs_get_bool("/core/sound/use_beep")) {
-		gdk_beep();
-		return;
-	}
-
-	if (!g_file_test(filename, G_FILE_TEST_EXISTS)) {
-		char *tmp = g_strdup_printf(_("Unable to play sound because the chosen file (%s) does not exist."), filename);
-		gaim_notify_error(NULL, NULL, tmp, NULL);
-		g_free(tmp);
-		return;
-	}
-
-#ifndef _WIN32
-	if (gaim_prefs_get_bool("/core/sound/use_custom")) {
-		const char *sound_cmd;
-		char *command;
-		GError *error = NULL;
-
-		sound_cmd = gaim_prefs_get_string("/core/sound/command");
-
-		if (!sound_cmd || *sound_cmd == '\0') {
-			gaim_notify_error(NULL, NULL,
-							  _("Unable to play sound because the "
-								"'Command' sound method has been chosen, "
-								"but no command has been set."), NULL);
-			return;
-		}
-
-		command = g_strdup_printf(sound_cmd, filename);
-
-		if(!g_spawn_command_line_async(command, &error)) {
-			char *tmp = g_strdup_printf(_("Unable to play sound because the configured sound command could not be launched: %s"), error->message);
-			gaim_notify_error(NULL, NULL, tmp, NULL);
-			g_free(tmp);
-			g_error_free(error);
-		}
-
-		g_free(command);
-		return;
-	}
-#if defined(USE_NAS_AUDIO) || defined(USE_AO)
-	pid = fork();
-	if (pid < 0)
-		return;
-	else if (pid == 0) {
-#ifdef USE_NAS_AUDIO
-		if (gaim_prefs_get_bool("/core/sound/use_nas")) {
-			if (play_file_nas(filename))
-				_exit(0);
-		}
-#endif /* USE_NAS_AUDIO */
-
-#ifdef USE_AO
-		file = afOpenFile(filename, "rb", NULL);
-		if(file) {
-			ao_device *device;
-			ao_sample_format format;
-			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);
-
-			/* XXX: libao doesn't seem to like 8-bit sounds, so we'll
-			 * let libaudiofile make them a bit better for us */
-			if(format.bits == 8)
-				format.bits = 16;
-
-			afSetVirtualSampleFormat(file, AF_DEFAULT_TRACK,
-					AF_SAMPFMT_TWOSCOMP, format.bits);
-
-#if __BYTE_ORDER == __BIG_ENDIAN
-			format.byte_format = AO_FMT_BIG;
-			afSetVirtualByteOrder(file, AF_DEFAULT_TRACK,
-					AF_BYTEORDER_BIGENDIAN);
-#elif __BYTE_ORDER == __LITTLE_ENDIAN
-			format.byte_format = AO_FMT_LITTLE;
-			afSetVirtualByteOrder(file, AF_DEFAULT_TRACK,
-					AF_BYTEORDER_LITTLEENDIAN);
-#endif
-
-			bytes_per_frame = format.bits * format.channels / 8;
-
-			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);
-			}
-			afCloseFile(file);
-		}
-		ao_shutdown();
-#endif /* USE_AO */
-		_exit(0);
-	}
-#else /* USE_NAS_AUDIO || USE_AO */
-	gdk_beep();
-	return;
-#endif /* USE_NAS_AUDIO || USE_AO */
-#else /* _WIN32 */
-	gaim_debug(GAIM_DEBUG_INFO, "sound", "Playing %s\n", filename);
-
-	if (!PlaySound(filename, 0, SND_ASYNC | SND_FILENAME))
-		gaim_debug(GAIM_DEBUG_ERROR, "sound", "Error playing sound.\n");
-#endif /* _WIN32 */
+	if(sound_ui_ops && sound_ui_ops->play_file)
+		sound_ui_ops->play_file(filename);
 }
 
 void gaim_sound_play_event(GaimSoundEventID event)
 {
-	if ((event == GAIM_SOUND_BUDDY_ARRIVE) && mute_login_sounds)
-		return;
-
-	if (event >= GAIM_NUM_SOUNDS) {
-		gaim_debug(GAIM_DEBUG_MISC, "sound",
-				   "got request for unknown sound: %d\n", event);
-		return;
-	}
-
-	/* check NULL for sounds that don't have an option, ie buddy pounce */
-	if (sounds[event].pref == NULL || gaim_prefs_get_bool(sounds[event].pref)) {
-		if (sound_file[event]) {
-			gaim_sound_play_file(sound_file[event]);
-		} else {
-			gchar *filename = NULL;
-
-			filename = g_build_filename(DATADIR, "sounds", "gaim", sounds[event].def, NULL);
-			gaim_sound_play_file(filename);
-			g_free(filename);
-		}
-	}
-}
-
-void gaim_sound_set_mute(gboolean mute)
-{
-	mute_sounds = mute;
-}
-
-gboolean gaim_sound_get_mute()
-{
-	return mute_sounds;
-}
-
-void gaim_sound_set_login_mute(gboolean mute)
-{
-	mute_login_sounds = mute;
-}
-
-void gaim_sound_set_event_file(GaimSoundEventID event, const char *filename)
-{
-	if(event >= GAIM_NUM_SOUNDS)
+	if(awaymessage && !gaim_prefs_get_bool("/core/sound/while_away"))
 		return;
 
-	if(sound_file[event])
-		g_free(sound_file[event]);
-
-	sound_file[event] = g_strdup(filename);
-}
-
-
-char *gaim_sound_get_event_file(GaimSoundEventID event)
-{
-	if(event >= GAIM_NUM_SOUNDS)
-		return NULL;
-
-	return sound_file[event];
-}
-
-const char *gaim_sound_get_event_option(GaimSoundEventID event)
-{
-	if(event >= GAIM_NUM_SOUNDS)
-		return 0;
-
-	return sounds[event].pref;
+	if(sound_ui_ops && sound_ui_ops->play_event)
+		sound_ui_ops->play_event(event);
 }
-
-char *gaim_sound_get_event_label(GaimSoundEventID event)
-{
-	if(event >= GAIM_NUM_SOUNDS)
-		return NULL;
-
-	return sounds[event].label;
-}
-
-
-void gaim_sound_set_command(const char *cmd)
-{
-	if(sound_cmd)
-		g_free(sound_cmd);
-	if(strlen(cmd) > 0)
-		sound_cmd = g_strdup(cmd);
-	else
-		sound_cmd = NULL;
-}
-
-char *gaim_sound_get_command()
-{
-	return sound_cmd;
-}
-