| |
1 /* |
| |
2 * gaim |
| |
3 * |
| |
4 * Gaim is the legal property of its developers, whose names are too numerous |
| |
5 * to list here. Please refer to the COPYRIGHT file distributed with this |
| |
6 * source distribution. |
| |
7 * |
| |
8 * This program is free software; you can redistribute it and/or modify |
| |
9 * it under the terms of the GNU General Public License as published by |
| |
10 * the Free Software Foundation; either version 2 of the License, or |
| |
11 * (at your option) any later version. |
| |
12 * |
| |
13 * This program is distributed in the hope that it will be useful, |
| |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| |
16 * GNU General Public License for more details. |
| |
17 * |
| |
18 * You should have received a copy of the GNU General Public License |
| |
19 * along with this program; if not, write to the Free Software |
| |
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| |
21 * |
| |
22 */ |
| |
23 #include "internal.h" |
| |
24 |
| |
25 #include "blist.h" |
| |
26 #include "prefs.h" |
| |
27 #include "sound.h" |
| |
28 |
| |
29 static GaimSoundUiOps *sound_ui_ops = NULL; |
| |
30 |
| |
31 #define STATUS_AVAILABLE 1 |
| |
32 #define STATUS_AWAY 2 |
| |
33 |
| |
34 static gboolean |
| |
35 gaim_sound_play_required(const GaimAccount *account) |
| |
36 { |
| |
37 gint pref_status = gaim_prefs_get_int("/core/sound/while_status"); |
| |
38 |
| |
39 if (pref_status == 3) |
| |
40 { |
| |
41 /* Play sounds: Always */ |
| |
42 return TRUE; |
| |
43 } |
| |
44 |
| |
45 if (account != NULL) |
| |
46 { |
| |
47 GaimStatus *status = gaim_account_get_active_status(account); |
| |
48 |
| |
49 if (gaim_status_is_online(status)) |
| |
50 { |
| |
51 gboolean available = gaim_status_is_available(status); |
| |
52 return (( available && pref_status == STATUS_AVAILABLE) || |
| |
53 (!available && pref_status == STATUS_AWAY)); |
| |
54 } |
| |
55 } |
| |
56 |
| |
57 /* We get here a couple of ways. Either the request has been OK'ed |
| |
58 * by gaim_sound_play_event() and we're here because the UI has |
| |
59 * called gaim_sound_play_file(), or we're here for something |
| |
60 * not related to an account (like testing a sound). */ |
| |
61 return TRUE; |
| |
62 } |
| |
63 |
| |
64 void |
| |
65 gaim_sound_play_file(const char *filename, const GaimAccount *account) |
| |
66 { |
| |
67 if (!gaim_sound_play_required(account)) |
| |
68 return; |
| |
69 |
| |
70 if(sound_ui_ops && sound_ui_ops->play_file) |
| |
71 sound_ui_ops->play_file(filename); |
| |
72 } |
| |
73 |
| |
74 void |
| |
75 gaim_sound_play_event(GaimSoundEventID event, const GaimAccount *account) |
| |
76 { |
| |
77 if (!gaim_sound_play_required(account)) |
| |
78 return; |
| |
79 |
| |
80 if(sound_ui_ops && sound_ui_ops->play_event) { |
| |
81 int plugin_return; |
| |
82 |
| |
83 plugin_return = GPOINTER_TO_INT(gaim_signal_emit_return_1( |
| |
84 gaim_sounds_get_handle(), "playing-sound-event", |
| |
85 event, account)); |
| |
86 |
| |
87 if (plugin_return) |
| |
88 return; |
| |
89 else |
| |
90 sound_ui_ops->play_event(event); |
| |
91 } |
| |
92 } |
| |
93 |
| |
94 void |
| |
95 gaim_sound_set_ui_ops(GaimSoundUiOps *ops) |
| |
96 { |
| |
97 if(sound_ui_ops && sound_ui_ops->uninit) |
| |
98 sound_ui_ops->uninit(); |
| |
99 |
| |
100 sound_ui_ops = ops; |
| |
101 |
| |
102 if(sound_ui_ops && sound_ui_ops->init) |
| |
103 sound_ui_ops->init(); |
| |
104 } |
| |
105 |
| |
106 GaimSoundUiOps * |
| |
107 gaim_sound_get_ui_ops(void) |
| |
108 { |
| |
109 return sound_ui_ops; |
| |
110 } |
| |
111 |
| |
112 void |
| |
113 gaim_sound_init() |
| |
114 { |
| |
115 void *handle = gaim_sounds_get_handle(); |
| |
116 |
| |
117 /********************************************************************** |
| |
118 * Register signals |
| |
119 **********************************************************************/ |
| |
120 |
| |
121 gaim_signal_register(handle, "playing-sound-event", |
| |
122 gaim_marshal_BOOLEAN__INT_POINTER, |
| |
123 gaim_value_new(GAIM_TYPE_BOOLEAN), 2, |
| |
124 gaim_value_new(GAIM_TYPE_INT), |
| |
125 gaim_value_new(GAIM_TYPE_SUBTYPE, |
| |
126 GAIM_SUBTYPE_ACCOUNT)); |
| |
127 |
| |
128 gaim_prefs_add_none("/core/sound"); |
| |
129 gaim_prefs_add_int("/core/sound/while_status", STATUS_AVAILABLE); |
| |
130 } |
| |
131 |
| |
132 void |
| |
133 gaim_sound_uninit() |
| |
134 { |
| |
135 if(sound_ui_ops && sound_ui_ops->uninit) |
| |
136 sound_ui_ops->uninit(); |
| |
137 |
| |
138 gaim_signals_unregister_by_instance(gaim_sounds_get_handle()); |
| |
139 } |
| |
140 |
| |
141 void * |
| |
142 gaim_sounds_get_handle() |
| |
143 { |
| |
144 static int handle; |
| |
145 |
| |
146 return &handle; |
| |
147 } |