Sun, 26 Dec 2004 00:46:26 +0000
[gaim-migrate @ 11669]
I split the status-saving code into it's own little API, because it
really is separate from the other status.c
savedstatuses.c sits on top of the rest of the status API.
And you can delete saved statuses now.
| 5684 | 1 | /* |
|
10297
b36800725b7a
[gaim-migrate @ 11480]
Evan Schoenberg <evands@pidgin.im>
parents:
10158
diff
changeset
|
2 | * @file gtksound.h GTK+ Sound |
|
b36800725b7a
[gaim-migrate @ 11480]
Evan Schoenberg <evands@pidgin.im>
parents:
10158
diff
changeset
|
3 | * @ingroup gtkui |
|
b36800725b7a
[gaim-migrate @ 11480]
Evan Schoenberg <evands@pidgin.im>
parents:
10158
diff
changeset
|
4 | * |
| 5684 | 5 | * gaim |
| 6 | * | |
| 8046 | 7 | * Gaim is the legal property of its developers, whose names are too numerous |
| 8 | * to list here. Please refer to the COPYRIGHT file distributed with this | |
| 9 | * source distribution. | |
| 5684 | 10 | * |
| 11 | * This program is free software; you can redistribute it and/or modify | |
| 12 | * it under the terms of the GNU General Public License as published by | |
| 13 | * the Free Software Foundation; either version 2 of the License, or | |
| 14 | * (at your option) any later version. | |
| 15 | * | |
| 16 | * This program is distributed in the hope that it will be useful, | |
| 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 19 | * GNU General Public License for more details. | |
| 20 | * | |
| 21 | * You should have received a copy of the GNU General Public License | |
| 22 | * along with this program; if not, write to the Free Software | |
| 23 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 24 | * | |
| 25 | */ | |
| 9791 | 26 | #include "internal.h" |
| 27 | #include "gtkgaim.h" | |
| 5684 | 28 | |
|
5872
754c63f29b77
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5794
diff
changeset
|
29 | #ifdef _WIN32 |
| 5684 | 30 | #include <windows.h> |
| 31 | #include <mmsystem.h> | |
| 32 | #endif | |
| 33 | ||
| 34 | #ifdef USE_AO | |
|
5872
754c63f29b77
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5794
diff
changeset
|
35 | # include <ao/ao.h> |
|
754c63f29b77
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5794
diff
changeset
|
36 | # include <audiofile.h> |
| 5684 | 37 | #endif /* USE_AO */ |
| 38 | ||
| 39 | #ifdef USE_NAS_AUDIO | |
|
5872
754c63f29b77
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5794
diff
changeset
|
40 | # include <audio/audiolib.h> |
|
754c63f29b77
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5794
diff
changeset
|
41 | # include <audio/soundlib.h> |
| 5684 | 42 | #endif /* USE_NAS_AUDIO */ |
| 43 | ||
|
5872
754c63f29b77
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5794
diff
changeset
|
44 | #include "debug.h" |
|
754c63f29b77
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5794
diff
changeset
|
45 | #include "notify.h" |
| 5684 | 46 | #include "prefs.h" |
|
5872
754c63f29b77
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5794
diff
changeset
|
47 | #include "sound.h" |
|
7465
17e1e9e996ad
[gaim-migrate @ 8078]
Mark Doliner <markdoliner@pidgin.im>
parents:
7464
diff
changeset
|
48 | #include "util.h" |
| 5684 | 49 | |
|
5872
754c63f29b77
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5794
diff
changeset
|
50 | #include "gtksound.h" |
| 5684 | 51 | |
| 52 | struct gaim_sound_event { | |
| 53 | char *label; | |
| 54 | char *pref; | |
| 55 | char *def; | |
| 56 | }; | |
| 57 | ||
|
10074
4fab99572bf1
[gaim-migrate @ 11054]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9791
diff
changeset
|
58 | #define PLAY_SOUND_TIMEOUT 15000 |
| 5684 | 59 | |
|
10320
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
60 | static guint mute_login_sounds_timeout = 0; |
| 5684 | 61 | static gboolean mute_login_sounds = FALSE; |
| 6199 | 62 | static gboolean sound_initialized = FALSE; |
| 5684 | 63 | |
| 64 | static struct gaim_sound_event sounds[GAIM_NUM_SOUNDS] = { | |
| 10158 | 65 | {N_("Buddy logs in"), "login", "login.wav"}, |
| 66 | {N_("Buddy logs out"), "logout", "logout.wav"}, | |
| 5684 | 67 | {N_("Message received"), "im_recv", "receive.wav"}, |
| 68 | {N_("Message received begins conversation"), "first_im_recv", "receive.wav"}, | |
| 69 | {N_("Message sent"), "send_im", "send.wav"}, | |
| 10158 | 70 | {N_("Person enters chat"), "join_chat", "login.wav"}, |
| 71 | {N_("Person leaves chat"), "left_chat", "logout.wav"}, | |
| 5684 | 72 | {N_("You talk in chat"), "send_chat_msg", "send.wav"}, |
| 73 | {N_("Others talk in chat"), "chat_msg_recv", "receive.wav"}, | |
| 74 | /* this isn't a terminator, it's the buddy pounce default sound event ;-) */ | |
| 10158 | 75 | {NULL, "pounce_default", "alert.wav"}, |
| 76 | {N_("Someone says your name in chat"), "nick_said", "alert.wav"} | |
| 5684 | 77 | }; |
| 78 | ||
| 79 | #ifdef USE_AO | |
| 80 | static int ao_driver = -1; | |
| 81 | #endif /* USE_AO */ | |
| 82 | ||
|
10320
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
83 | static gboolean |
|
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
84 | mute_login_sounds_cb(gpointer data) |
|
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
85 | { |
|
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
86 | mute_login_sounds = FALSE; |
|
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
87 | mute_login_sounds_timeout = 0; |
|
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
88 | return FALSE; |
|
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
89 | } |
|
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
90 | |
|
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
91 | /* |
|
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
92 | * We mute sounds for the 10 seconds after you log in so that |
|
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
93 | * you don't get flooded with sounds when the blist shows all |
|
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
94 | * your buddies logging in. |
|
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
95 | */ |
|
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
96 | static void |
|
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
97 | account_signon_cb(GaimConnection *gc, gpointer data) |
|
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
98 | { |
|
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
99 | if (mute_login_sounds_timeout != 0) |
|
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
100 | g_source_remove(mute_login_sounds_timeout); |
|
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
101 | mute_login_sounds = TRUE; |
|
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
102 | mute_login_sounds_timeout = gaim_timeout_add(10000, mute_login_sounds_cb, NULL); |
|
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
103 | } |
|
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
104 | |
|
10322
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
105 | static void |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
106 | _pref_sound_method_changed(const char *name, GaimPrefType type, |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
107 | gpointer val, gpointer data) { |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
108 | if(type != GAIM_PREF_STRING || strcmp(name, "/gaim/gtk/sound/method")) |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
109 | return; |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
110 | |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
111 | sound_initialized = TRUE; |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
112 | |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
113 | #ifdef USE_AO |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
114 | ao_driver = -1; |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
115 | |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
116 | if(!strcmp(val, "esd")) |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
117 | ao_driver = ao_driver_id("esd"); |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
118 | else if(!strcmp(val, "arts")) |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
119 | ao_driver = ao_driver_id("arts"); |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
120 | else if(!strcmp(val, "automatic")) |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
121 | ao_driver = ao_default_driver_id(); |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
122 | |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
123 | if(ao_driver != -1) { |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
124 | ao_info *info = ao_driver_info(ao_driver); |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
125 | gaim_debug_info("sound", |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
126 | "Sound output driver loaded: %s\n", info->name); |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
127 | } |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
128 | #endif /* USE_AO */ |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
129 | #ifdef USE_NAS |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
130 | if (!strcmp(val, "nas")) |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
131 | gaim_debug_info("sound", |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
132 | "Sound output driver loaded: NAS output\n"); |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
133 | #endif /* USE_NAS */ |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
134 | } |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
135 | |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
136 | const char * |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
137 | gaim_gtk_sound_get_event_option(GaimSoundEventID event) |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
138 | { |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
139 | if(event >= GAIM_NUM_SOUNDS) |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
140 | return 0; |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
141 | |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
142 | return sounds[event].pref; |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
143 | } |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
144 | |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
145 | char * |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
146 | gaim_gtk_sound_get_event_label(GaimSoundEventID event) |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
147 | { |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
148 | if(event >= GAIM_NUM_SOUNDS) |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
149 | return NULL; |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
150 | |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
151 | return sounds[event].label; |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
152 | } |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
153 | |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
154 | void * |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
155 | gaim_gtk_sound_get_handle() |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
156 | { |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
157 | static int handle; |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
158 | |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
159 | return &handle; |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
160 | } |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
161 | |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
162 | static void |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
163 | gaim_gtk_sound_init(void) |
| 5684 | 164 | { |
|
10320
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
165 | void *gtk_sound_handle = gaim_gtk_sound_get_handle(); |
|
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
166 | |
|
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
167 | gaim_signal_connect(gaim_connections_get_handle(), "signed-on", |
|
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
168 | gtk_sound_handle, GAIM_CALLBACK(account_signon_cb), |
|
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
169 | NULL); |
|
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
10297
diff
changeset
|
170 | |
| 5684 | 171 | gaim_prefs_add_none("/gaim/gtk/sound"); |
| 172 | gaim_prefs_add_none("/gaim/gtk/sound/enabled"); | |
| 173 | gaim_prefs_add_none("/gaim/gtk/sound/file"); | |
| 174 | gaim_prefs_add_bool("/gaim/gtk/sound/enabled/login", TRUE); | |
| 175 | gaim_prefs_add_string("/gaim/gtk/sound/file/login", ""); | |
| 176 | gaim_prefs_add_bool("/gaim/gtk/sound/enabled/logout", TRUE); | |
| 177 | gaim_prefs_add_string("/gaim/gtk/sound/file/logout", ""); | |
| 178 | gaim_prefs_add_bool("/gaim/gtk/sound/enabled/im_recv", TRUE); | |
| 179 | gaim_prefs_add_string("/gaim/gtk/sound/file/im_recv", ""); | |
| 180 | gaim_prefs_add_bool("/gaim/gtk/sound/enabled/first_im_recv", FALSE); | |
| 181 | gaim_prefs_add_string("/gaim/gtk/sound/file/first_im_recv", ""); | |
| 182 | gaim_prefs_add_bool("/gaim/gtk/sound/enabled/send_im", TRUE); | |
| 183 | gaim_prefs_add_string("/gaim/gtk/sound/file/send_im", ""); | |
| 184 | gaim_prefs_add_bool("/gaim/gtk/sound/enabled/join_chat", FALSE); | |
| 185 | gaim_prefs_add_string("/gaim/gtk/sound/file/join_chat", ""); | |
| 186 | gaim_prefs_add_bool("/gaim/gtk/sound/enabled/left_chat", FALSE); | |
| 187 | gaim_prefs_add_string("/gaim/gtk/sound/file/left_chat", ""); | |
| 188 | gaim_prefs_add_bool("/gaim/gtk/sound/enabled/send_chat_msg", FALSE); | |
| 189 | gaim_prefs_add_string("/gaim/gtk/sound/file/send_chat_msg", ""); | |
| 190 | gaim_prefs_add_bool("/gaim/gtk/sound/enabled/chat_msg_recv", FALSE); | |
| 191 | gaim_prefs_add_string("/gaim/gtk/sound/file/chat_msg_recv", ""); | |
| 192 | gaim_prefs_add_bool("/gaim/gtk/sound/enabled/nick_said", FALSE); | |
| 193 | gaim_prefs_add_string("/gaim/gtk/sound/file/nick_said", ""); | |
|
7460
e8591fd0275f
[gaim-migrate @ 8073]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
194 | gaim_prefs_add_bool("/gaim/gtk/sound/enabled/pounce_default", TRUE); |
|
e8591fd0275f
[gaim-migrate @ 8073]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
195 | gaim_prefs_add_string("/gaim/gtk/sound/file/pounce_default", ""); |
|
8633
fdbdbbb2eed3
[gaim-migrate @ 9385]
Mark Doliner <markdoliner@pidgin.im>
parents:
8632
diff
changeset
|
196 | gaim_prefs_add_bool("/gaim/gtk/sound/conv_focus", TRUE); |
|
10074
4fab99572bf1
[gaim-migrate @ 11054]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9791
diff
changeset
|
197 | gaim_prefs_add_bool("/gaim/gtk/sound/mute", FALSE); |
| 5684 | 198 | gaim_prefs_add_string("/gaim/gtk/sound/command", ""); |
| 199 | gaim_prefs_add_string("/gaim/gtk/sound/method", "automatic"); | |
| 200 | ||
| 201 | #ifdef USE_AO | |
|
10322
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
202 | gaim_debug_info("sound", "Initializing sound output drivers.\n"); |
| 5684 | 203 | ao_initialize(); |
| 204 | #endif /* USE_AO */ | |
| 205 | ||
|
10087
e5b80a38939d
[gaim-migrate @ 11098]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
10074
diff
changeset
|
206 | gaim_prefs_connect_callback(gaim_gtk_sound_get_handle(), "/gaim/gtk/sound/method", |
|
5794
ebdbb7dc6658
[gaim-migrate @ 6219]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
207 | _pref_sound_method_changed, NULL); |
| 5684 | 208 | } |
| 209 | ||
|
10322
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
210 | static void |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
211 | gaim_gtk_sound_uninit(void) |
| 5684 | 212 | { |
| 213 | #ifdef USE_AO | |
| 214 | ao_shutdown(); | |
| 215 | #endif | |
| 6199 | 216 | sound_initialized = FALSE; |
| 5684 | 217 | } |
| 218 | ||
|
10322
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
219 | #ifdef USE_NAS_AUDIO |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
220 | static gboolean |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
221 | play_file_nas(const char *filename) |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
222 | { |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
223 | AuServer *nas_serv; |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
224 | gboolean ret = FALSE; |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
225 | |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
226 | if((nas_serv = AuOpenServer(NULL, 0, NULL, 0, NULL, NULL))) { |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
227 | ret = AuSoundPlaySynchronousFromFile(nas_serv, filename, 100); |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
228 | AuCloseServer(nas_serv); |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
229 | } |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
230 | |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
231 | return ret; |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
232 | } |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
233 | |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
234 | #endif /* USE_NAS_AUDIO */ |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
235 | |
|
10074
4fab99572bf1
[gaim-migrate @ 11054]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9791
diff
changeset
|
236 | #if defined(USE_NAS_AUDIO) || defined(USE_AO) |
|
10322
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
237 | static gboolean |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
238 | expire_old_child(gpointer data) |
|
10074
4fab99572bf1
[gaim-migrate @ 11054]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9791
diff
changeset
|
239 | { |
|
4fab99572bf1
[gaim-migrate @ 11054]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9791
diff
changeset
|
240 | int ret; |
|
4fab99572bf1
[gaim-migrate @ 11054]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9791
diff
changeset
|
241 | pid_t pid = GPOINTER_TO_INT(data); |
|
4fab99572bf1
[gaim-migrate @ 11054]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9791
diff
changeset
|
242 | |
|
4fab99572bf1
[gaim-migrate @ 11054]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9791
diff
changeset
|
243 | ret = waitpid(pid, NULL, WNOHANG | WUNTRACED); |
|
4fab99572bf1
[gaim-migrate @ 11054]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9791
diff
changeset
|
244 | |
|
4fab99572bf1
[gaim-migrate @ 11054]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9791
diff
changeset
|
245 | if(ret == 0) { |
|
4fab99572bf1
[gaim-migrate @ 11054]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9791
diff
changeset
|
246 | if(kill(pid, SIGKILL) < 0) |
|
10322
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
247 | gaim_debug_error("gtksound", "Killing process %d failed (%s)\n", |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
248 | pid, strerror(errno)); |
|
10074
4fab99572bf1
[gaim-migrate @ 11054]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9791
diff
changeset
|
249 | } |
|
4fab99572bf1
[gaim-migrate @ 11054]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9791
diff
changeset
|
250 | |
|
4fab99572bf1
[gaim-migrate @ 11054]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9791
diff
changeset
|
251 | return FALSE; /* do not run again */ |
|
4fab99572bf1
[gaim-migrate @ 11054]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9791
diff
changeset
|
252 | } |
|
4fab99572bf1
[gaim-migrate @ 11054]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9791
diff
changeset
|
253 | #endif |
|
4fab99572bf1
[gaim-migrate @ 11054]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9791
diff
changeset
|
254 | |
|
10322
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
255 | static void |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
256 | gaim_gtk_sound_play_file(const char *filename) |
| 5684 | 257 | { |
| 258 | const char *method; | |
| 259 | #if defined(USE_NAS_AUDIO) || defined(USE_AO) | |
| 260 | pid_t pid; | |
| 261 | #ifdef USE_AO | |
| 262 | AFfilehandle file; | |
| 263 | #endif | |
| 264 | #endif | |
| 265 | ||
| 6199 | 266 | if (!sound_initialized) |
| 267 | gaim_prefs_trigger_callback("/gaim/gtk/sound/method"); | |
| 268 | ||
|
10074
4fab99572bf1
[gaim-migrate @ 11054]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9791
diff
changeset
|
269 | if (gaim_prefs_get_bool("/gaim/gtk/sound/mute")) |
| 5684 | 270 | return; |
| 271 | ||
| 272 | method = gaim_prefs_get_string("/gaim/gtk/sound/method"); | |
| 273 | ||
|
10074
4fab99572bf1
[gaim-migrate @ 11054]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9791
diff
changeset
|
274 | if (!strcmp(method, "none")) { |
|
4fab99572bf1
[gaim-migrate @ 11054]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9791
diff
changeset
|
275 | return; |
|
4fab99572bf1
[gaim-migrate @ 11054]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9791
diff
changeset
|
276 | } else if (!strcmp(method, "beep")) { |
| 5684 | 277 | gdk_beep(); |
| 278 | return; | |
| 279 | } | |
| 280 | ||
| 281 | if (!g_file_test(filename, G_FILE_TEST_EXISTS)) { | |
| 282 | char *tmp = g_strdup_printf(_("Unable to play sound because the chosen file (%s) does not exist."), filename); | |
| 283 | gaim_notify_error(NULL, NULL, tmp, NULL); | |
| 284 | g_free(tmp); | |
| 285 | return; | |
| 286 | } | |
| 287 | ||
| 288 | #ifndef _WIN32 | |
| 289 | if (!strcmp(method, "custom")) { | |
| 290 | const char *sound_cmd; | |
| 291 | char *command; | |
| 292 | GError *error = NULL; | |
| 293 | ||
| 294 | sound_cmd = gaim_prefs_get_string("/gaim/gtk/sound/command"); | |
| 295 | ||
| 296 | if (!sound_cmd || *sound_cmd == '\0') { | |
| 297 | gaim_notify_error(NULL, NULL, | |
| 298 | _("Unable to play sound because the " | |
| 299 | "'Command' sound method has been chosen, " | |
| 300 | "but no command has been set."), NULL); | |
| 301 | return; | |
| 302 | } | |
| 303 | ||
| 7464 | 304 | if(strstr(sound_cmd, "%s")) |
| 305 | command = gaim_strreplace(sound_cmd, "%s", filename); | |
| 306 | else | |
| 307 | command = g_strdup_printf("%s %s", sound_cmd, filename); | |
| 5684 | 308 | |
| 309 | if(!g_spawn_command_line_async(command, &error)) { | |
| 310 | char *tmp = g_strdup_printf(_("Unable to play sound because the configured sound command could not be launched: %s"), error->message); | |
| 311 | gaim_notify_error(NULL, NULL, tmp, NULL); | |
| 312 | g_free(tmp); | |
| 313 | g_error_free(error); | |
| 314 | } | |
| 315 | ||
| 316 | g_free(command); | |
| 317 | return; | |
| 318 | } | |
| 319 | #if defined(USE_NAS_AUDIO) || defined(USE_AO) | |
| 320 | pid = fork(); | |
| 321 | if (pid < 0) | |
| 322 | return; | |
| 323 | else if (pid == 0) { | |
| 324 | #ifdef USE_NAS_AUDIO | |
| 325 | if (!strcmp(method, "nas")) { | |
| 326 | if (play_file_nas(filename)) | |
| 327 | _exit(0); | |
| 328 | } | |
| 329 | #endif /* USE_NAS_AUDIO */ | |
| 330 | ||
| 331 | #ifdef USE_AO | |
| 332 | file = afOpenFile(filename, "rb", NULL); | |
| 333 | if(file) { | |
| 334 | ao_device *device; | |
| 335 | ao_sample_format format; | |
| 336 | int in_fmt; | |
| 337 | int bytes_per_frame; | |
| 338 | ||
| 339 | format.rate = afGetRate(file, AF_DEFAULT_TRACK); | |
| 340 | format.channels = afGetChannels(file, AF_DEFAULT_TRACK); | |
| 341 | afGetSampleFormat(file, AF_DEFAULT_TRACK, &in_fmt, | |
| 342 | &format.bits); | |
| 343 | ||
| 344 | /* XXX: libao doesn't seem to like 8-bit sounds, so we'll | |
| 345 | * let libaudiofile make them a bit better for us */ | |
| 346 | if(format.bits == 8) | |
| 347 | format.bits = 16; | |
| 348 | ||
| 349 | afSetVirtualSampleFormat(file, AF_DEFAULT_TRACK, | |
| 350 | AF_SAMPFMT_TWOSCOMP, format.bits); | |
| 351 | ||
| 352 | #if __BYTE_ORDER == __BIG_ENDIAN | |
| 353 | format.byte_format = AO_FMT_BIG; | |
| 354 | afSetVirtualByteOrder(file, AF_DEFAULT_TRACK, | |
| 355 | AF_BYTEORDER_BIGENDIAN); | |
| 356 | #elif __BYTE_ORDER == __LITTLE_ENDIAN | |
| 357 | format.byte_format = AO_FMT_LITTLE; | |
| 358 | afSetVirtualByteOrder(file, AF_DEFAULT_TRACK, | |
| 359 | AF_BYTEORDER_LITTLEENDIAN); | |
| 360 | #endif | |
| 361 | ||
| 362 | bytes_per_frame = format.bits * format.channels / 8; | |
| 363 | ||
| 364 | device = ao_open_live(ao_driver, &format, NULL); | |
| 365 | ||
| 366 | if(device) { | |
| 367 | int frames_read; | |
| 368 | char buf[4096]; | |
| 369 | int buf_frames = sizeof(buf) / bytes_per_frame; | |
| 370 | ||
| 371 | while((frames_read = afReadFrames(file, AF_DEFAULT_TRACK, | |
| 372 | buf, buf_frames))) { | |
| 373 | if(!ao_play(device, buf, frames_read * bytes_per_frame)) | |
| 374 | break; | |
| 375 | } | |
| 376 | ao_close(device); | |
| 377 | } | |
| 378 | afCloseFile(file); | |
| 379 | } | |
| 380 | ao_shutdown(); | |
| 381 | #endif /* USE_AO */ | |
| 382 | _exit(0); | |
|
10074
4fab99572bf1
[gaim-migrate @ 11054]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9791
diff
changeset
|
383 | } else { |
|
4fab99572bf1
[gaim-migrate @ 11054]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9791
diff
changeset
|
384 | gaim_timeout_add(PLAY_SOUND_TIMEOUT, expire_old_child, GINT_TO_POINTER(pid)); |
| 5684 | 385 | } |
| 386 | #else /* USE_NAS_AUDIO || USE_AO */ | |
| 387 | gdk_beep(); | |
| 388 | return; | |
| 389 | #endif /* USE_NAS_AUDIO || USE_AO */ | |
| 390 | #else /* _WIN32 */ | |
|
10322
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
391 | gaim_debug_info("sound", "Playing %s\n", filename); |
| 5684 | 392 | |
| 393 | if (!PlaySound(filename, 0, SND_ASYNC | SND_FILENAME)) | |
|
10322
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
394 | gaim_debug_error("sound", "Error playing sound.\n"); |
| 5684 | 395 | #endif /* _WIN32 */ |
| 396 | } | |
| 397 | ||
|
10322
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
398 | static void |
|
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
399 | gaim_gtk_sound_play_event(GaimSoundEventID event) |
| 5684 | 400 | { |
| 401 | char *enable_pref; | |
| 402 | char *file_pref; | |
| 403 | ||
| 404 | if ((event == GAIM_SOUND_BUDDY_ARRIVE) && mute_login_sounds) | |
| 405 | return; | |
| 406 | ||
| 407 | if (event >= GAIM_NUM_SOUNDS) { | |
|
10322
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
408 | gaim_debug_error("sound", "got request for unknown sound: %d\n", event); |
| 5684 | 409 | return; |
| 410 | } | |
| 411 | ||
| 412 | enable_pref = g_strdup_printf("/gaim/gtk/sound/enabled/%s", | |
| 413 | sounds[event].pref); | |
| 414 | file_pref = g_strdup_printf("/gaim/gtk/sound/file/%s", sounds[event].pref); | |
| 415 | ||
| 416 | /* check NULL for sounds that don't have an option, ie buddy pounce */ | |
| 417 | if (gaim_prefs_get_bool(enable_pref)) { | |
| 418 | char *filename = g_strdup(gaim_prefs_get_string(file_pref)); | |
| 419 | if(!filename || !strlen(filename)) { | |
| 420 | if(filename) g_free(filename); | |
| 421 | filename = g_build_filename(DATADIR, "sounds", "gaim", sounds[event].def, NULL); | |
| 422 | } | |
| 423 | ||
| 424 | gaim_sound_play_file(filename); | |
| 425 | g_free(filename); | |
| 426 | } | |
| 427 | ||
| 428 | g_free(enable_pref); | |
| 429 | g_free(file_pref); | |
| 430 | } | |
| 431 | ||
| 432 | static GaimSoundUiOps sound_ui_ops = | |
| 433 | { | |
| 434 | gaim_gtk_sound_init, | |
|
10322
06e23196da4b
[gaim-migrate @ 11529]
Mark Doliner <markdoliner@pidgin.im>
parents:
10320
diff
changeset
|
435 | gaim_gtk_sound_uninit, |
| 5684 | 436 | gaim_gtk_sound_play_file, |
| 437 | gaim_gtk_sound_play_event | |
| 438 | }; | |
| 439 | ||
|
7035
76bca80cd91d
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
6778
diff
changeset
|
440 | GaimSoundUiOps * |
|
76bca80cd91d
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
6778
diff
changeset
|
441 | gaim_gtk_sound_get_ui_ops(void) |
| 5684 | 442 | { |
| 443 | return &sound_ui_ops; | |
| 444 | } |