Mercurial > pidgin
annotate src/gtksound.c @ 13623:51d436a267ac
[gaim-migrate @ 16009]
Use the GSlice allocator (for logs and log sets) when compiling with glib 2.10 or greater and eliminate some unnecessary memory zeroing. This cuts the log loading time in half for one of Luke's contacts.
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Tue, 11 Apr 2006 16:06:24 +0000 |
parents | 47c12348cfd1 |
children | 988186eb1688 |
rev | line source |
---|---|
5684 | 1 /* |
10297
ec140184437b
[gaim-migrate @ 11480]
Luke Schierer <lschiere@pidgin.im>
parents:
10158
diff
changeset
|
2 * @file gtksound.h GTK+ Sound |
ec140184437b
[gaim-migrate @ 11480]
Luke Schierer <lschiere@pidgin.im>
parents:
10158
diff
changeset
|
3 * @ingroup gtkui |
ec140184437b
[gaim-migrate @ 11480]
Luke Schierer <lschiere@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
059d95c67cda
[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
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5794
diff
changeset
|
35 # include <ao/ao.h> |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5794
diff
changeset
|
36 # include <audiofile.h> |
5684 | 37 #endif /* USE_AO */ |
38 | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5794
diff
changeset
|
39 #include "debug.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5794
diff
changeset
|
40 #include "notify.h" |
5684 | 41 #include "prefs.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5794
diff
changeset
|
42 #include "sound.h" |
7465 | 43 #include "util.h" |
5684 | 44 |
11552
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
45 #include "gtkconv.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5794
diff
changeset
|
46 #include "gtksound.h" |
5684 | 47 |
48 struct gaim_sound_event { | |
49 char *label; | |
50 char *pref; | |
51 char *def; | |
52 }; | |
53 | |
10074 | 54 #define PLAY_SOUND_TIMEOUT 15000 |
5684 | 55 |
10320 | 56 static guint mute_login_sounds_timeout = 0; |
5684 | 57 static gboolean mute_login_sounds = FALSE; |
6199 | 58 static gboolean sound_initialized = FALSE; |
5684 | 59 |
60 static struct gaim_sound_event sounds[GAIM_NUM_SOUNDS] = { | |
10158 | 61 {N_("Buddy logs in"), "login", "login.wav"}, |
62 {N_("Buddy logs out"), "logout", "logout.wav"}, | |
5684 | 63 {N_("Message received"), "im_recv", "receive.wav"}, |
64 {N_("Message received begins conversation"), "first_im_recv", "receive.wav"}, | |
65 {N_("Message sent"), "send_im", "send.wav"}, | |
10158 | 66 {N_("Person enters chat"), "join_chat", "login.wav"}, |
67 {N_("Person leaves chat"), "left_chat", "logout.wav"}, | |
5684 | 68 {N_("You talk in chat"), "send_chat_msg", "send.wav"}, |
69 {N_("Others talk in chat"), "chat_msg_recv", "receive.wav"}, | |
70 /* this isn't a terminator, it's the buddy pounce default sound event ;-) */ | |
10158 | 71 {NULL, "pounce_default", "alert.wav"}, |
13550
47c12348cfd1
[gaim-migrate @ 15927]
Richard Laager <rlaager@wiktel.com>
parents:
13543
diff
changeset
|
72 {N_("Someone says your screen name in chat"), "nick_said", "alert.wav"} |
5684 | 73 }; |
74 | |
75 #ifdef USE_AO | |
76 static int ao_driver = -1; | |
77 #endif /* USE_AO */ | |
78 | |
10320 | 79 static gboolean |
11463 | 80 unmute_login_sounds_cb(gpointer data) |
10320 | 81 { |
82 mute_login_sounds = FALSE; | |
83 mute_login_sounds_timeout = 0; | |
84 return FALSE; | |
85 } | |
86 | |
11552
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
87 static gboolean |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
88 chat_nick_matches_name(GaimConversation *conv, const char *aname) |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
89 { |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
90 GaimConvChat *chat = NULL; |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
91 char *nick = NULL; |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
92 char *name = NULL; |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
93 gboolean ret = FALSE; |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
94 chat = gaim_conversation_get_chat_data(conv); |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
95 |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
96 if (chat==NULL) |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
97 return ret; |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
98 |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
99 nick = g_strdup(gaim_normalize(conv->account, chat->nick)); |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
100 name = g_strdup(gaim_normalize(conv->account, aname)); |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
101 |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
102 if (g_utf8_collate(nick, name) == 0) |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
103 ret = TRUE; |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
104 |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
105 g_free(nick); |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
106 g_free(name); |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
107 |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
108 return ret; |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
109 } |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
110 |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
111 /* |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
112 * play a sound event for a conversation, honoring make_sound flag |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
113 * of conversation and checking for focus if conv_focus pref is set |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
114 */ |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
115 static void |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
116 play_conv_event(GaimConversation *conv, GaimSoundEventID event) |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
117 { |
11642 | 118 /* If we should not play the sound for some reason, then exit early */ |
119 if (conv != NULL) | |
120 { | |
121 GaimGtkConversation *gtkconv; | |
122 GaimGtkWindow *win; | |
123 gboolean has_focus; | |
11552
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
124 |
11642 | 125 gtkconv = GAIM_GTK_CONVERSATION(conv); |
126 win = gtkconv->win; | |
11552
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
127 |
11642 | 128 has_focus = gaim_conversation_has_focus(conv); |
11552
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
129 |
11642 | 130 if (!gtkconv->make_sound || |
11687
941aa045f9f6
[gaim-migrate @ 13973]
Richard Laager <rlaager@wiktel.com>
parents:
11642
diff
changeset
|
131 (has_focus && !gaim_prefs_get_bool("/gaim/gtk/sound/conv_focus"))) |
11642 | 132 { |
133 return; | |
134 } | |
135 } | |
11552
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
136 |
11642 | 137 gaim_sound_play_event(event, conv ? gaim_conversation_get_account(conv) : NULL); |
11552
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
138 } |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
139 |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
140 static void |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
141 buddy_state_cb(GaimBuddy *buddy, GaimSoundEventID event) |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
142 { |
11642 | 143 gaim_sound_play_event(event, gaim_buddy_get_account(buddy)); |
11552
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
144 } |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
145 |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
146 static void |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
147 im_msg_received_cb(GaimAccount *account, char *sender, |
11581 | 148 char *message, GaimConversation *conv, |
11552
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
149 int flags, GaimSoundEventID event) |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
150 { |
12850
49b2347863b2
[gaim-migrate @ 15200]
Richard Laager <rlaager@wiktel.com>
parents:
12828
diff
changeset
|
151 if (flags & GAIM_MESSAGE_DELAYED) |
49b2347863b2
[gaim-migrate @ 15200]
Richard Laager <rlaager@wiktel.com>
parents:
12828
diff
changeset
|
152 return; |
49b2347863b2
[gaim-migrate @ 15200]
Richard Laager <rlaager@wiktel.com>
parents:
12828
diff
changeset
|
153 |
11552
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
154 if (conv==NULL) |
11642 | 155 gaim_sound_play_event(GAIM_SOUND_FIRST_RECEIVE, account); |
11552
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
156 else |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
157 play_conv_event(conv, event); |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
158 } |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
159 |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
160 static void |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
161 im_msg_sent_cb(GaimAccount *account, const char *receiver, |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
162 const char *message, GaimSoundEventID event) |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
163 { |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
164 GaimConversation *conv = gaim_find_conversation_with_account( |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
165 GAIM_CONV_TYPE_ANY, receiver, account); |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
166 play_conv_event(conv, event); |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
167 } |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
168 |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
169 static void |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
170 chat_buddy_join_cb(GaimConversation *conv, const char *name, |
12850
49b2347863b2
[gaim-migrate @ 15200]
Richard Laager <rlaager@wiktel.com>
parents:
12828
diff
changeset
|
171 GaimConvChatBuddyFlags flags, gboolean new_arrival, |
49b2347863b2
[gaim-migrate @ 15200]
Richard Laager <rlaager@wiktel.com>
parents:
12828
diff
changeset
|
172 GaimSoundEventID event) |
11552
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
173 { |
12850
49b2347863b2
[gaim-migrate @ 15200]
Richard Laager <rlaager@wiktel.com>
parents:
12828
diff
changeset
|
174 if (new_arrival && !chat_nick_matches_name(conv, name)) |
11552
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
175 play_conv_event(conv, event); |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
176 } |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
177 |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
178 static void |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
179 chat_buddy_left_cb(GaimConversation *conv, const char *name, |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
180 const char *reason, GaimSoundEventID event) |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
181 { |
11581 | 182 if (!chat_nick_matches_name(conv, name)) |
11552
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
183 play_conv_event(conv, event); |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
184 } |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
185 |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
186 static void |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
187 chat_msg_sent_cb(GaimAccount *account, const char *message, |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
188 int id, GaimSoundEventID event) |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
189 { |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
190 GaimConnection *conn = gaim_account_get_connection(account); |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
191 GaimConversation *conv = NULL; |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
192 |
11581 | 193 if (conn!=NULL) |
11552
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
194 conv = gaim_find_chat(conn,id); |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
195 |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
196 play_conv_event(conv, event); |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
197 } |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
198 |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
199 static void |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
200 chat_msg_received_cb(GaimAccount *account, char *sender, |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
201 char *message, GaimConversation *conv, |
12216 | 202 GaimMessageFlags flags, GaimSoundEventID event) |
11552
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
203 { |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
204 GaimConvChat *chat; |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
205 |
12850
49b2347863b2
[gaim-migrate @ 15200]
Richard Laager <rlaager@wiktel.com>
parents:
12828
diff
changeset
|
206 if (flags & GAIM_MESSAGE_DELAYED) |
49b2347863b2
[gaim-migrate @ 15200]
Richard Laager <rlaager@wiktel.com>
parents:
12828
diff
changeset
|
207 return; |
49b2347863b2
[gaim-migrate @ 15200]
Richard Laager <rlaager@wiktel.com>
parents:
12828
diff
changeset
|
208 |
11552
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
209 chat = gaim_conversation_get_chat_data(conv); |
13412
d93194613696
[gaim-migrate @ 15787]
Richard Laager <rlaager@wiktel.com>
parents:
13046
diff
changeset
|
210 g_return_if_fail(chat != NULL); |
11552
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
211 |
13412
d93194613696
[gaim-migrate @ 15787]
Richard Laager <rlaager@wiktel.com>
parents:
13046
diff
changeset
|
212 if (gaim_conv_chat_is_user_ignored(chat, sender)) |
11552
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
213 return; |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
214 |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
215 if (chat_nick_matches_name(conv, sender)) |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
216 return; |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
217 |
12216 | 218 if (flags & GAIM_MESSAGE_NICK || gaim_utf8_has_word(message, chat->nick)) |
11552
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
219 play_conv_event(conv, GAIM_SOUND_CHAT_NICK); |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
220 else |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
221 play_conv_event(conv, event); |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
222 } |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
223 |
10320 | 224 /* |
225 * We mute sounds for the 10 seconds after you log in so that | |
226 * you don't get flooded with sounds when the blist shows all | |
227 * your buddies logging in. | |
228 */ | |
229 static void | |
230 account_signon_cb(GaimConnection *gc, gpointer data) | |
231 { | |
232 if (mute_login_sounds_timeout != 0) | |
233 g_source_remove(mute_login_sounds_timeout); | |
234 mute_login_sounds = TRUE; | |
11463 | 235 mute_login_sounds_timeout = gaim_timeout_add(10000, unmute_login_sounds_cb, NULL); |
10320 | 236 } |
237 | |
10322 | 238 static void |
239 _pref_sound_method_changed(const char *name, GaimPrefType type, | |
12816 | 240 gconstpointer val, gpointer data) |
241 { | |
10322 | 242 if(type != GAIM_PREF_STRING || strcmp(name, "/gaim/gtk/sound/method")) |
243 return; | |
244 | |
245 sound_initialized = TRUE; | |
246 | |
247 #ifdef USE_AO | |
248 ao_driver = -1; | |
249 | |
250 if(!strcmp(val, "esd")) | |
251 ao_driver = ao_driver_id("esd"); | |
252 else if(!strcmp(val, "arts")) | |
253 ao_driver = ao_driver_id("arts"); | |
11082 | 254 else if(!strcmp(val, "nas")) |
255 ao_driver = ao_driver_id("nas"); | |
10322 | 256 else if(!strcmp(val, "automatic")) |
257 ao_driver = ao_default_driver_id(); | |
258 | |
259 if(ao_driver != -1) { | |
260 ao_info *info = ao_driver_info(ao_driver); | |
261 gaim_debug_info("sound", | |
262 "Sound output driver loaded: %s\n", info->name); | |
263 } | |
264 #endif /* USE_AO */ | |
265 } | |
266 | |
267 const char * | |
268 gaim_gtk_sound_get_event_option(GaimSoundEventID event) | |
269 { | |
270 if(event >= GAIM_NUM_SOUNDS) | |
271 return 0; | |
272 | |
273 return sounds[event].pref; | |
274 } | |
275 | |
276 char * | |
277 gaim_gtk_sound_get_event_label(GaimSoundEventID event) | |
278 { | |
279 if(event >= GAIM_NUM_SOUNDS) | |
280 return NULL; | |
281 | |
282 return sounds[event].label; | |
283 } | |
284 | |
285 void * | |
286 gaim_gtk_sound_get_handle() | |
287 { | |
288 static int handle; | |
289 | |
290 return &handle; | |
291 } | |
292 | |
293 static void | |
294 gaim_gtk_sound_init(void) | |
5684 | 295 { |
10320 | 296 void *gtk_sound_handle = gaim_gtk_sound_get_handle(); |
11552
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
297 void *blist_handle = gaim_blist_get_handle(); |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
298 void *conv_handle = gaim_conversations_get_handle(); |
10320 | 299 |
300 gaim_signal_connect(gaim_connections_get_handle(), "signed-on", | |
301 gtk_sound_handle, GAIM_CALLBACK(account_signon_cb), | |
302 NULL); | |
303 | |
5684 | 304 gaim_prefs_add_none("/gaim/gtk/sound"); |
305 gaim_prefs_add_none("/gaim/gtk/sound/enabled"); | |
306 gaim_prefs_add_none("/gaim/gtk/sound/file"); | |
307 gaim_prefs_add_bool("/gaim/gtk/sound/enabled/login", TRUE); | |
308 gaim_prefs_add_string("/gaim/gtk/sound/file/login", ""); | |
309 gaim_prefs_add_bool("/gaim/gtk/sound/enabled/logout", TRUE); | |
310 gaim_prefs_add_string("/gaim/gtk/sound/file/logout", ""); | |
311 gaim_prefs_add_bool("/gaim/gtk/sound/enabled/im_recv", TRUE); | |
312 gaim_prefs_add_string("/gaim/gtk/sound/file/im_recv", ""); | |
313 gaim_prefs_add_bool("/gaim/gtk/sound/enabled/first_im_recv", FALSE); | |
314 gaim_prefs_add_string("/gaim/gtk/sound/file/first_im_recv", ""); | |
315 gaim_prefs_add_bool("/gaim/gtk/sound/enabled/send_im", TRUE); | |
316 gaim_prefs_add_string("/gaim/gtk/sound/file/send_im", ""); | |
317 gaim_prefs_add_bool("/gaim/gtk/sound/enabled/join_chat", FALSE); | |
318 gaim_prefs_add_string("/gaim/gtk/sound/file/join_chat", ""); | |
319 gaim_prefs_add_bool("/gaim/gtk/sound/enabled/left_chat", FALSE); | |
320 gaim_prefs_add_string("/gaim/gtk/sound/file/left_chat", ""); | |
321 gaim_prefs_add_bool("/gaim/gtk/sound/enabled/send_chat_msg", FALSE); | |
322 gaim_prefs_add_string("/gaim/gtk/sound/file/send_chat_msg", ""); | |
323 gaim_prefs_add_bool("/gaim/gtk/sound/enabled/chat_msg_recv", FALSE); | |
324 gaim_prefs_add_string("/gaim/gtk/sound/file/chat_msg_recv", ""); | |
325 gaim_prefs_add_bool("/gaim/gtk/sound/enabled/nick_said", FALSE); | |
326 gaim_prefs_add_string("/gaim/gtk/sound/file/nick_said", ""); | |
7460
3973a09525b3
[gaim-migrate @ 8073]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
327 gaim_prefs_add_bool("/gaim/gtk/sound/enabled/pounce_default", TRUE); |
3973a09525b3
[gaim-migrate @ 8073]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
328 gaim_prefs_add_string("/gaim/gtk/sound/file/pounce_default", ""); |
8633 | 329 gaim_prefs_add_bool("/gaim/gtk/sound/conv_focus", TRUE); |
10074 | 330 gaim_prefs_add_bool("/gaim/gtk/sound/mute", FALSE); |
5684 | 331 gaim_prefs_add_string("/gaim/gtk/sound/command", ""); |
332 gaim_prefs_add_string("/gaim/gtk/sound/method", "automatic"); | |
12815
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
333 gaim_prefs_add_int("/gaim/gtk/sound/volume", 50); |
5684 | 334 |
335 #ifdef USE_AO | |
10322 | 336 gaim_debug_info("sound", "Initializing sound output drivers.\n"); |
5684 | 337 ao_initialize(); |
338 #endif /* USE_AO */ | |
339 | |
10087 | 340 gaim_prefs_connect_callback(gaim_gtk_sound_get_handle(), "/gaim/gtk/sound/method", |
5794
5e93fc46d1af
[gaim-migrate @ 6219]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
341 _pref_sound_method_changed, NULL); |
11552
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
342 |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
343 gaim_signal_connect(blist_handle, "buddy-signed-on", |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
344 gtk_sound_handle, GAIM_CALLBACK(buddy_state_cb), |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
345 GINT_TO_POINTER(GAIM_SOUND_BUDDY_ARRIVE)); |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
346 gaim_signal_connect(blist_handle, "buddy-signed-off", |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
347 gtk_sound_handle, GAIM_CALLBACK(buddy_state_cb), |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
348 GINT_TO_POINTER(GAIM_SOUND_BUDDY_LEAVE)); |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
349 gaim_signal_connect(conv_handle, "received-im-msg", |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
350 gtk_sound_handle, GAIM_CALLBACK(im_msg_received_cb), |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
351 GINT_TO_POINTER(GAIM_SOUND_RECEIVE)); |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
352 gaim_signal_connect(conv_handle, "sent-im-msg", |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
353 gtk_sound_handle, GAIM_CALLBACK(im_msg_sent_cb), |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
354 GINT_TO_POINTER(GAIM_SOUND_SEND)); |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
355 gaim_signal_connect(conv_handle, "chat-buddy-joined", |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
356 gtk_sound_handle, GAIM_CALLBACK(chat_buddy_join_cb), |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
357 GINT_TO_POINTER(GAIM_SOUND_CHAT_JOIN)); |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
358 gaim_signal_connect(conv_handle, "chat-buddy-left", |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
359 gtk_sound_handle, GAIM_CALLBACK(chat_buddy_left_cb), |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
360 GINT_TO_POINTER(GAIM_SOUND_CHAT_LEAVE)); |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
361 gaim_signal_connect(conv_handle, "sent-chat-msg", |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
362 gtk_sound_handle, GAIM_CALLBACK(chat_msg_sent_cb), |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
363 GINT_TO_POINTER(GAIM_SOUND_CHAT_YOU_SAY)); |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
364 gaim_signal_connect(conv_handle, "received-chat-msg", |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
365 gtk_sound_handle, GAIM_CALLBACK(chat_msg_received_cb), |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
366 GINT_TO_POINTER(GAIM_SOUND_CHAT_SAY)); |
5684 | 367 } |
368 | |
10322 | 369 static void |
370 gaim_gtk_sound_uninit(void) | |
5684 | 371 { |
372 #ifdef USE_AO | |
373 ao_shutdown(); | |
374 #endif | |
6199 | 375 sound_initialized = FALSE; |
11552
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
376 |
11d30825c1bb
[gaim-migrate @ 13812]
Gary Kramlich <grim@reaperworld.com>
parents:
11463
diff
changeset
|
377 gaim_signals_disconnect_by_handle(gaim_gtk_sound_get_handle()); |
5684 | 378 } |
379 | |
11463 | 380 #ifdef USE_AO |
10322 | 381 static gboolean |
382 expire_old_child(gpointer data) | |
10074 | 383 { |
384 int ret; | |
385 pid_t pid = GPOINTER_TO_INT(data); | |
386 | |
387 ret = waitpid(pid, NULL, WNOHANG | WUNTRACED); | |
388 | |
389 if(ret == 0) { | |
390 if(kill(pid, SIGKILL) < 0) | |
10322 | 391 gaim_debug_error("gtksound", "Killing process %d failed (%s)\n", |
392 pid, strerror(errno)); | |
10074 | 393 } |
394 | |
395 return FALSE; /* do not run again */ | |
396 } | |
12815
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
397 |
12930
33935a6320b8
[gaim-migrate @ 15283]
Richard Laager <rlaager@wiktel.com>
parents:
12850
diff
changeset
|
398 /* Uncomment the following line to enable debugging of clipping in the scaling. */ |
33935a6320b8
[gaim-migrate @ 15283]
Richard Laager <rlaager@wiktel.com>
parents:
12850
diff
changeset
|
399 /* #define DEBUG_CLIPPING */ |
33935a6320b8
[gaim-migrate @ 15283]
Richard Laager <rlaager@wiktel.com>
parents:
12850
diff
changeset
|
400 |
12815
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
401 static void |
13046
1becdaf72e6d
[gaim-migrate @ 15405]
Richard Laager <rlaager@wiktel.com>
parents:
13026
diff
changeset
|
402 scale_pcm_data(char *data, int nframes, int bits, int channels, |
12815
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
403 double intercept, double minclip, double maxclip, |
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
404 float scale) |
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
405 { |
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
406 int i; |
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
407 float v; |
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
408 gint16 *data16 = (gint16*)data; |
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
409 gint32 *data32 = (gint32*)data; |
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
410 gint64 *data64 = (gint64*)data; |
10074 | 411 |
13046
1becdaf72e6d
[gaim-migrate @ 15405]
Richard Laager <rlaager@wiktel.com>
parents:
13026
diff
changeset
|
412 switch(bits) { |
12815
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
413 case 16: |
13046
1becdaf72e6d
[gaim-migrate @ 15405]
Richard Laager <rlaager@wiktel.com>
parents:
13026
diff
changeset
|
414 for(i = 0; i < nframes * channels; i++) { |
12815
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
415 v = ((data16[i] - intercept) * scale) + intercept; |
12930
33935a6320b8
[gaim-migrate @ 15283]
Richard Laager <rlaager@wiktel.com>
parents:
12850
diff
changeset
|
416 #ifdef DEBUG_CLIPPING |
33935a6320b8
[gaim-migrate @ 15283]
Richard Laager <rlaager@wiktel.com>
parents:
12850
diff
changeset
|
417 if (v > maxclip) |
33935a6320b8
[gaim-migrate @ 15283]
Richard Laager <rlaager@wiktel.com>
parents:
12850
diff
changeset
|
418 printf("Clipping detected!\n"); |
13046
1becdaf72e6d
[gaim-migrate @ 15405]
Richard Laager <rlaager@wiktel.com>
parents:
13026
diff
changeset
|
419 else if (v < minclip) |
1becdaf72e6d
[gaim-migrate @ 15405]
Richard Laager <rlaager@wiktel.com>
parents:
13026
diff
changeset
|
420 printf("Clipping detected!\n"); |
12930
33935a6320b8
[gaim-migrate @ 15283]
Richard Laager <rlaager@wiktel.com>
parents:
12850
diff
changeset
|
421 #endif |
12815
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
422 v = CLAMP(v, minclip, maxclip); |
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
423 data16[i]=(gint16)v; |
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
424 } |
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
425 break; |
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
426 case 32: |
13046
1becdaf72e6d
[gaim-migrate @ 15405]
Richard Laager <rlaager@wiktel.com>
parents:
13026
diff
changeset
|
427 for(i = 0; i < nframes * channels; i++) { |
12815
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
428 v = ((data32[i] - intercept) * scale) + intercept; |
12930
33935a6320b8
[gaim-migrate @ 15283]
Richard Laager <rlaager@wiktel.com>
parents:
12850
diff
changeset
|
429 #ifdef DEBUG_CLIPPING |
33935a6320b8
[gaim-migrate @ 15283]
Richard Laager <rlaager@wiktel.com>
parents:
12850
diff
changeset
|
430 if (v > maxclip) |
33935a6320b8
[gaim-migrate @ 15283]
Richard Laager <rlaager@wiktel.com>
parents:
12850
diff
changeset
|
431 printf("Clipping detected!\n"); |
13046
1becdaf72e6d
[gaim-migrate @ 15405]
Richard Laager <rlaager@wiktel.com>
parents:
13026
diff
changeset
|
432 else if (v < minclip) |
1becdaf72e6d
[gaim-migrate @ 15405]
Richard Laager <rlaager@wiktel.com>
parents:
13026
diff
changeset
|
433 printf("Clipping detected!\n"); |
12930
33935a6320b8
[gaim-migrate @ 15283]
Richard Laager <rlaager@wiktel.com>
parents:
12850
diff
changeset
|
434 #endif |
12815
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
435 v = CLAMP(v, minclip, maxclip); |
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
436 data32[i]=(gint32)v; |
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
437 } |
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
438 break; |
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
439 case 64: |
13046
1becdaf72e6d
[gaim-migrate @ 15405]
Richard Laager <rlaager@wiktel.com>
parents:
13026
diff
changeset
|
440 for(i = 0; i < nframes * channels; i++) { |
12815
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
441 v = ((data64[i] - intercept) * scale) + intercept; |
12930
33935a6320b8
[gaim-migrate @ 15283]
Richard Laager <rlaager@wiktel.com>
parents:
12850
diff
changeset
|
442 #ifdef DEBUG_CLIPPING |
33935a6320b8
[gaim-migrate @ 15283]
Richard Laager <rlaager@wiktel.com>
parents:
12850
diff
changeset
|
443 if (v > maxclip) |
33935a6320b8
[gaim-migrate @ 15283]
Richard Laager <rlaager@wiktel.com>
parents:
12850
diff
changeset
|
444 printf("Clipping detected!\n"); |
13046
1becdaf72e6d
[gaim-migrate @ 15405]
Richard Laager <rlaager@wiktel.com>
parents:
13026
diff
changeset
|
445 else if (v < minclip) |
1becdaf72e6d
[gaim-migrate @ 15405]
Richard Laager <rlaager@wiktel.com>
parents:
13026
diff
changeset
|
446 printf("Clipping detected!\n"); |
12930
33935a6320b8
[gaim-migrate @ 15283]
Richard Laager <rlaager@wiktel.com>
parents:
12850
diff
changeset
|
447 #endif |
12815
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
448 v = CLAMP(v, minclip, maxclip); |
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
449 data64[i]=(gint64)v; |
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
450 } |
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
451 break; |
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
452 default: |
13046
1becdaf72e6d
[gaim-migrate @ 15405]
Richard Laager <rlaager@wiktel.com>
parents:
13026
diff
changeset
|
453 gaim_debug_warning("gtksound", "Scaling of %d bit pcm data not supported.\n", bits); |
12815
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
454 break; |
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
455 } |
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
456 } |
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
457 #endif /* USE_AO */ |
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
458 |
10322 | 459 static void |
460 gaim_gtk_sound_play_file(const char *filename) | |
5684 | 461 { |
462 const char *method; | |
11463 | 463 #ifdef USE_AO |
5684 | 464 pid_t pid; |
465 AFfilehandle file; | |
12815
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
466 int volume = 50; |
5684 | 467 #endif |
468 | |
6199 | 469 if (!sound_initialized) |
470 gaim_prefs_trigger_callback("/gaim/gtk/sound/method"); | |
471 | |
10074 | 472 if (gaim_prefs_get_bool("/gaim/gtk/sound/mute")) |
5684 | 473 return; |
474 | |
475 method = gaim_prefs_get_string("/gaim/gtk/sound/method"); | |
476 | |
10074 | 477 if (!strcmp(method, "none")) { |
478 return; | |
479 } else if (!strcmp(method, "beep")) { | |
5684 | 480 gdk_beep(); |
481 return; | |
482 } | |
483 | |
484 if (!g_file_test(filename, G_FILE_TEST_EXISTS)) { | |
485 char *tmp = g_strdup_printf(_("Unable to play sound because the chosen file (%s) does not exist."), filename); | |
486 gaim_notify_error(NULL, NULL, tmp, NULL); | |
487 g_free(tmp); | |
488 return; | |
489 } | |
490 | |
491 #ifndef _WIN32 | |
492 if (!strcmp(method, "custom")) { | |
493 const char *sound_cmd; | |
494 char *command; | |
495 GError *error = NULL; | |
496 | |
497 sound_cmd = gaim_prefs_get_string("/gaim/gtk/sound/command"); | |
498 | |
499 if (!sound_cmd || *sound_cmd == '\0') { | |
500 gaim_notify_error(NULL, NULL, | |
501 _("Unable to play sound because the " | |
502 "'Command' sound method has been chosen, " | |
503 "but no command has been set."), NULL); | |
504 return; | |
505 } | |
506 | |
7464 | 507 if(strstr(sound_cmd, "%s")) |
508 command = gaim_strreplace(sound_cmd, "%s", filename); | |
509 else | |
510 command = g_strdup_printf("%s %s", sound_cmd, filename); | |
5684 | 511 |
512 if(!g_spawn_command_line_async(command, &error)) { | |
513 char *tmp = g_strdup_printf(_("Unable to play sound because the configured sound command could not be launched: %s"), error->message); | |
514 gaim_notify_error(NULL, NULL, tmp, NULL); | |
515 g_free(tmp); | |
516 g_error_free(error); | |
517 } | |
518 | |
519 g_free(command); | |
520 return; | |
521 } | |
11463 | 522 #ifdef USE_AO |
12815
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
523 volume = gaim_prefs_get_int("/gaim/gtk/sound/volume"); |
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
524 volume = CLAMP(volume, 0, 100); |
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
525 |
5684 | 526 pid = fork(); |
527 if (pid < 0) | |
528 return; | |
529 else if (pid == 0) { | |
11463 | 530 /* Child process */ |
12930
33935a6320b8
[gaim-migrate @ 15283]
Richard Laager <rlaager@wiktel.com>
parents:
12850
diff
changeset
|
531 |
13046
1becdaf72e6d
[gaim-migrate @ 15405]
Richard Laager <rlaager@wiktel.com>
parents:
13026
diff
changeset
|
532 /* calculating the scaling factor: |
1becdaf72e6d
[gaim-migrate @ 15405]
Richard Laager <rlaager@wiktel.com>
parents:
13026
diff
changeset
|
533 * scale(x) = (x+30)^2 / 6400 |
1becdaf72e6d
[gaim-migrate @ 15405]
Richard Laager <rlaager@wiktel.com>
parents:
13026
diff
changeset
|
534 * scale(0) = 0.1406 (quiet) |
1becdaf72e6d
[gaim-migrate @ 15405]
Richard Laager <rlaager@wiktel.com>
parents:
13026
diff
changeset
|
535 * scale(50) = 1.0 (no scaling, normal volume) |
1becdaf72e6d
[gaim-migrate @ 15405]
Richard Laager <rlaager@wiktel.com>
parents:
13026
diff
changeset
|
536 * scale(100) = 2.6406 (roughly maximized without clipping) |
1becdaf72e6d
[gaim-migrate @ 15405]
Richard Laager <rlaager@wiktel.com>
parents:
13026
diff
changeset
|
537 */ |
1becdaf72e6d
[gaim-migrate @ 15405]
Richard Laager <rlaager@wiktel.com>
parents:
13026
diff
changeset
|
538 float scale = ( ((float)volume + 30) * ((float)volume + 30) ) / 6400; |
5684 | 539 file = afOpenFile(filename, "rb", NULL); |
540 if(file) { | |
541 ao_device *device; | |
542 ao_sample_format format; | |
543 int in_fmt; | |
544 int bytes_per_frame; | |
12815
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
545 double slope, intercept, minclip, maxclip; |
5684 | 546 |
547 format.rate = afGetRate(file, AF_DEFAULT_TRACK); | |
548 format.channels = afGetChannels(file, AF_DEFAULT_TRACK); | |
549 afGetSampleFormat(file, AF_DEFAULT_TRACK, &in_fmt, | |
550 &format.bits); | |
551 | |
12815
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
552 afGetPCMMapping(file, AF_DEFAULT_TRACK, &slope, |
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
553 &intercept, &minclip, &maxclip); |
a8bffa7fb6ac
[gaim-migrate @ 15163]
Richard Laager <rlaager@wiktel.com>
parents:
12411
diff
changeset
|
554 |
5684 | 555 /* XXX: libao doesn't seem to like 8-bit sounds, so we'll |
556 * let libaudiofile make them a bit better for us */ | |
557 if(format.bits == 8) | |
558 format.bits = 16; | |
559 | |
560 afSetVirtualSampleFormat(file, AF_DEFAULT_TRACK, | |
561 AF_SAMPFMT_TWOSCOMP, format.bits); | |
562 | |
12411
8c339d9f1bb4
[gaim-migrate @ 14718]
Richard Laager <rlaager@wiktel.com>
parents:
12216
diff
changeset
|
563 #if G_BYTE_ORDER == G_BIG_ENDIAN |
5684 | 564 format.byte_format = AO_FMT_BIG; |
565 afSetVirtualByteOrder(file, AF_DEFAULT_TRACK, | |
566 AF_BYTEORDER_BIGENDIAN); | |
12411
8c339d9f1bb4
[gaim-migrate @ 14718]
Richard Laager <rlaager@wiktel.com>
parents:
12216
diff
changeset
|
567 #elif G_BYTE_ORDER == G_LITTLE_ENDIAN |
5684 | 568 format.byte_format = AO_FMT_LITTLE; |
569 afSetVirtualByteOrder(file, AF_DEFAULT_TRACK, | |
570 AF_BYTEORDER_LITTLEENDIAN); | |
12411
8c339d9f1bb4
[gaim-migrate @ 14718]
Richard Laager <rlaager@wiktel.com>
parents:
12216
diff
changeset
|
571 #else |
8c339d9f1bb4
[gaim-migrate @ 14718]
Richard Laager <rlaager@wiktel.com>
parents:
12216
diff
changeset
|
572 #warning Unknown endianness |
5684 | 573 #endif |
574 | |
575 bytes_per_frame = format.bits * format.channels / 8; | |
576 | |
577 device = ao_open_live(ao_driver, &format, NULL); | |
578 | |
579 if(device) { | |
580 int frames_read; | |
581 char buf[4096]; | |
582 int buf_frames = sizeof(buf) / bytes_per_frame; | |
583 | |
584 while((frames_read = afReadFrames(file, AF_DEFAULT_TRACK, | |
585 buf, buf_frames))) { | |
13046
1becdaf72e6d
[gaim-migrate @ 15405]
Richard Laager <rlaager@wiktel.com>
parents:
13026
diff
changeset
|
586 /* no need to scale at volume == 50 */ |
1becdaf72e6d
[gaim-migrate @ 15405]
Richard Laager <rlaager@wiktel.com>
parents:
13026
diff
changeset
|
587 if(volume != 50) |
1becdaf72e6d
[gaim-migrate @ 15405]
Richard Laager <rlaager@wiktel.com>
parents:
13026
diff
changeset
|
588 scale_pcm_data(buf, frames_read, format.bits, format.channels, |
1becdaf72e6d
[gaim-migrate @ 15405]
Richard Laager <rlaager@wiktel.com>
parents:
13026
diff
changeset
|
589 intercept, minclip, maxclip, scale); |
5684 | 590 if(!ao_play(device, buf, frames_read * bytes_per_frame)) |
591 break; | |
592 } | |
593 ao_close(device); | |
594 } | |
595 afCloseFile(file); | |
596 } | |
597 ao_shutdown(); | |
598 _exit(0); | |
10074 | 599 } else { |
11463 | 600 /* Parent process */ |
10074 | 601 gaim_timeout_add(PLAY_SOUND_TIMEOUT, expire_old_child, GINT_TO_POINTER(pid)); |
5684 | 602 } |
11082 | 603 #else /* USE_AO */ |
5684 | 604 gdk_beep(); |
605 return; | |
11082 | 606 #endif /* USE_AO */ |
5684 | 607 #else /* _WIN32 */ |
10322 | 608 gaim_debug_info("sound", "Playing %s\n", filename); |
5684 | 609 |
10922
68083504217c
[gaim-migrate @ 12691]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10322
diff
changeset
|
610 if (G_WIN32_HAVE_WIDECHAR_API ()) { |
68083504217c
[gaim-migrate @ 12691]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10322
diff
changeset
|
611 wchar_t *wc_filename = g_utf8_to_utf16(filename, |
68083504217c
[gaim-migrate @ 12691]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10322
diff
changeset
|
612 -1, NULL, NULL, NULL); |
68083504217c
[gaim-migrate @ 12691]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10322
diff
changeset
|
613 if (!PlaySoundW(wc_filename, NULL, SND_ASYNC | SND_FILENAME)) |
68083504217c
[gaim-migrate @ 12691]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10322
diff
changeset
|
614 gaim_debug(GAIM_DEBUG_ERROR, "sound", "Error playing sound.\n"); |
68083504217c
[gaim-migrate @ 12691]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10322
diff
changeset
|
615 g_free(wc_filename); |
68083504217c
[gaim-migrate @ 12691]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10322
diff
changeset
|
616 } else { |
68083504217c
[gaim-migrate @ 12691]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10322
diff
changeset
|
617 char *l_filename = g_locale_from_utf8(filename, |
68083504217c
[gaim-migrate @ 12691]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10322
diff
changeset
|
618 -1, NULL, NULL, NULL); |
68083504217c
[gaim-migrate @ 12691]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10322
diff
changeset
|
619 if (!PlaySoundA(l_filename, NULL, SND_ASYNC | SND_FILENAME)) |
68083504217c
[gaim-migrate @ 12691]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10322
diff
changeset
|
620 gaim_debug(GAIM_DEBUG_ERROR, "sound", "Error playing sound.\n"); |
68083504217c
[gaim-migrate @ 12691]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10322
diff
changeset
|
621 g_free(l_filename); |
68083504217c
[gaim-migrate @ 12691]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10322
diff
changeset
|
622 } |
5684 | 623 #endif /* _WIN32 */ |
624 } | |
625 | |
10322 | 626 static void |
627 gaim_gtk_sound_play_event(GaimSoundEventID event) | |
5684 | 628 { |
629 char *enable_pref; | |
630 char *file_pref; | |
631 | |
632 if ((event == GAIM_SOUND_BUDDY_ARRIVE) && mute_login_sounds) | |
633 return; | |
634 | |
635 if (event >= GAIM_NUM_SOUNDS) { | |
10322 | 636 gaim_debug_error("sound", "got request for unknown sound: %d\n", event); |
5684 | 637 return; |
638 } | |
639 | |
640 enable_pref = g_strdup_printf("/gaim/gtk/sound/enabled/%s", | |
641 sounds[event].pref); | |
642 file_pref = g_strdup_printf("/gaim/gtk/sound/file/%s", sounds[event].pref); | |
643 | |
644 /* check NULL for sounds that don't have an option, ie buddy pounce */ | |
645 if (gaim_prefs_get_bool(enable_pref)) { | |
646 char *filename = g_strdup(gaim_prefs_get_string(file_pref)); | |
647 if(!filename || !strlen(filename)) { | |
648 if(filename) g_free(filename); | |
649 filename = g_build_filename(DATADIR, "sounds", "gaim", sounds[event].def, NULL); | |
650 } | |
651 | |
11642 | 652 gaim_sound_play_file(filename, NULL); |
5684 | 653 g_free(filename); |
654 } | |
655 | |
656 g_free(enable_pref); | |
657 g_free(file_pref); | |
658 } | |
659 | |
660 static GaimSoundUiOps sound_ui_ops = | |
661 { | |
662 gaim_gtk_sound_init, | |
10322 | 663 gaim_gtk_sound_uninit, |
5684 | 664 gaim_gtk_sound_play_file, |
665 gaim_gtk_sound_play_event | |
666 }; | |
667 | |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
6778
diff
changeset
|
668 GaimSoundUiOps * |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
6778
diff
changeset
|
669 gaim_gtk_sound_get_ui_ops(void) |
5684 | 670 { |
671 return &sound_ui_ops; | |
672 } |