*** empty log message ***
[rhythmbox.git] / backends / rb-player.c
blob634d5dd6141dbe3566810660e1a2f6b4bc2f883e
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
3 * Copyright (C) 2006 James Livingston <jrl@ids.org.au>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 #include <config.h>
23 #include "rb-player.h"
24 #include "rb-player-gst.h"
25 #include "rb-marshal.h"
27 /* Signals */
28 enum {
29 EOS,
30 INFO,
31 BUFFERING,
32 ERROR,
33 TICK,
34 EVENT,
35 LAST_SIGNAL
38 static guint signals[LAST_SIGNAL] = { 0 };
40 static void
41 rb_player_interface_init (RBPlayerIface *iface)
43 signals[EOS] =
44 g_signal_new ("eos",
45 G_TYPE_FROM_INTERFACE (iface),
46 G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE,
47 G_STRUCT_OFFSET (RBPlayerIface, eos),
48 NULL, NULL,
49 g_cclosure_marshal_VOID__VOID,
50 G_TYPE_NONE,
51 0);
52 signals[INFO] =
53 g_signal_new ("info",
54 G_TYPE_FROM_INTERFACE (iface),
55 G_SIGNAL_RUN_LAST,
56 G_STRUCT_OFFSET (RBPlayerIface, info),
57 NULL, NULL,
58 rb_marshal_VOID__INT_POINTER,
59 G_TYPE_NONE,
60 2, G_TYPE_INT, G_TYPE_VALUE);
61 signals[ERROR] =
62 g_signal_new ("error",
63 G_TYPE_FROM_INTERFACE (iface),
64 G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE,
65 G_STRUCT_OFFSET (RBPlayerIface, error),
66 NULL, NULL,
67 g_cclosure_marshal_VOID__POINTER,
68 G_TYPE_NONE,
70 G_TYPE_POINTER);
71 signals[TICK] =
72 g_signal_new ("tick",
73 G_TYPE_FROM_INTERFACE (iface),
74 G_SIGNAL_RUN_LAST,
75 G_STRUCT_OFFSET (RBPlayerIface, tick),
76 NULL, NULL,
77 g_cclosure_marshal_VOID__LONG,
78 G_TYPE_NONE,
80 G_TYPE_LONG);
81 signals[BUFFERING] =
82 g_signal_new ("buffering",
83 G_TYPE_FROM_INTERFACE (iface),
84 G_SIGNAL_RUN_LAST,
85 G_STRUCT_OFFSET (RBPlayerIface, buffering),
86 NULL, NULL,
87 g_cclosure_marshal_VOID__UINT,
88 G_TYPE_NONE,
90 G_TYPE_UINT);
91 signals[EVENT] =
92 g_signal_new ("event",
93 G_TYPE_FROM_INTERFACE (iface),
94 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
95 G_STRUCT_OFFSET (RBPlayerIface, event),
96 NULL, NULL,
97 g_cclosure_marshal_VOID__POINTER,
98 G_TYPE_NONE,
100 G_TYPE_POINTER);
103 GType
104 rb_player_get_type (void)
106 static GType our_type = 0;
108 if (!our_type) {
109 static const GTypeInfo our_info = {
110 sizeof (RBPlayerIface),
111 NULL, /* base_init */
112 NULL, /* base_finalize */
113 (GClassInitFunc)rb_player_interface_init,
114 NULL, /* class_finalize */
115 NULL, /* class_data */
118 NULL
121 our_type = g_type_register_static (G_TYPE_INTERFACE, "RBPlayer", &our_info, 0);
124 return our_type;
127 gboolean
128 rb_player_open (RBPlayer *player, const char *uri, GError **error)
130 RBPlayerIface *iface = RB_PLAYER_GET_IFACE (player);
132 return iface->open (player, uri, error);
135 gboolean
136 rb_player_opened (RBPlayer *player)
138 RBPlayerIface *iface = RB_PLAYER_GET_IFACE (player);
140 return iface->opened (player);
143 gboolean
144 rb_player_close (RBPlayer *player, GError **error)
146 RBPlayerIface *iface = RB_PLAYER_GET_IFACE (player);
148 return iface->close (player, error);
151 gboolean
152 rb_player_play (RBPlayer *player, GError **error)
154 RBPlayerIface *iface = RB_PLAYER_GET_IFACE (player);
156 return iface->play (player, error);
159 void
160 rb_player_pause (RBPlayer *player)
162 RBPlayerIface *iface = RB_PLAYER_GET_IFACE (player);
164 iface->pause (player);
167 gboolean
168 rb_player_playing (RBPlayer *player)
170 RBPlayerIface *iface = RB_PLAYER_GET_IFACE (player);
172 return iface->playing (player);
175 void
176 rb_player_set_volume (RBPlayer *player, float volume)
178 RBPlayerIface *iface = RB_PLAYER_GET_IFACE (player);
180 iface->set_volume (player, volume);
183 float
184 rb_player_get_volume (RBPlayer *player)
186 RBPlayerIface *iface = RB_PLAYER_GET_IFACE (player);
188 return iface->get_volume (player);
191 void
192 rb_player_set_replaygain (RBPlayer *player,
193 double track_gain, double track_peak,
194 double album_gain, double album_peak)
196 RBPlayerIface *iface = RB_PLAYER_GET_IFACE (player);
198 iface->set_replaygain (player, track_gain, track_peak, album_gain, album_peak);
201 gboolean
202 rb_player_seekable (RBPlayer *player)
204 RBPlayerIface *iface = RB_PLAYER_GET_IFACE (player);
206 return iface->seekable (player);
209 void
210 rb_player_set_time (RBPlayer *player, long time)
212 RBPlayerIface *iface = RB_PLAYER_GET_IFACE (player);
214 iface->set_time (player, time);
217 long
218 rb_player_get_time (RBPlayer *player)
220 RBPlayerIface *iface = RB_PLAYER_GET_IFACE (player);
222 return iface->get_time (player);
225 RBPlayer*
226 rb_player_new (GError **error)
228 return rb_player_gst_new (error);
231 void
232 _rb_player_emit_eos (RBPlayer *player)
234 g_signal_emit (player, signals[EOS], 0);
237 void
238 _rb_player_emit_info (RBPlayer *player,
239 RBMetaDataField field,
240 GValue *value)
242 g_signal_emit (player, signals[INFO], 0, field, value);
245 void
246 _rb_player_emit_buffering (RBPlayer *player, guint progress)
248 g_signal_emit (player, signals[BUFFERING], 0, progress);
251 void
252 _rb_player_emit_error (RBPlayer *player, GError *error)
254 g_signal_emit (player, signals[ERROR], 0, error);
257 void
258 _rb_player_emit_tick (RBPlayer *player, long elapsed)
260 g_signal_emit (player, signals[TICK], 0, elapsed);
263 void
264 _rb_player_emit_event (RBPlayer *player, const char *name, gpointer data)
266 g_signal_emit (player, signals[EVENT], g_quark_from_string (name), data);
269 GQuark
270 rb_player_error_quark (void)
272 static GQuark quark = 0;
273 if (!quark)
274 quark = g_quark_from_static_string ("rb_player_error");
276 return quark;