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.
23 #include "rb-player.h"
24 #include "rb-player-gst.h"
25 #include "rb-marshal.h"
38 static guint signals
[LAST_SIGNAL
] = { 0 };
41 rb_player_interface_init (RBPlayerIface
*iface
)
45 G_TYPE_FROM_INTERFACE (iface
),
46 G_SIGNAL_RUN_LAST
| G_SIGNAL_NO_RECURSE
,
47 G_STRUCT_OFFSET (RBPlayerIface
, eos
),
49 g_cclosure_marshal_VOID__VOID
,
54 G_TYPE_FROM_INTERFACE (iface
),
56 G_STRUCT_OFFSET (RBPlayerIface
, info
),
58 rb_marshal_VOID__INT_POINTER
,
60 2, G_TYPE_INT
, G_TYPE_VALUE
);
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
),
67 g_cclosure_marshal_VOID__POINTER
,
73 G_TYPE_FROM_INTERFACE (iface
),
75 G_STRUCT_OFFSET (RBPlayerIface
, tick
),
77 g_cclosure_marshal_VOID__LONG
,
82 g_signal_new ("buffering",
83 G_TYPE_FROM_INTERFACE (iface
),
85 G_STRUCT_OFFSET (RBPlayerIface
, buffering
),
87 g_cclosure_marshal_VOID__UINT
,
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
),
97 g_cclosure_marshal_VOID__POINTER
,
104 rb_player_get_type (void)
106 static GType our_type
= 0;
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 */
121 our_type
= g_type_register_static (G_TYPE_INTERFACE
, "RBPlayer", &our_info
, 0);
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
);
136 rb_player_opened (RBPlayer
*player
)
138 RBPlayerIface
*iface
= RB_PLAYER_GET_IFACE (player
);
140 return iface
->opened (player
);
144 rb_player_close (RBPlayer
*player
, GError
**error
)
146 RBPlayerIface
*iface
= RB_PLAYER_GET_IFACE (player
);
148 return iface
->close (player
, error
);
152 rb_player_play (RBPlayer
*player
, GError
**error
)
154 RBPlayerIface
*iface
= RB_PLAYER_GET_IFACE (player
);
156 return iface
->play (player
, error
);
160 rb_player_pause (RBPlayer
*player
)
162 RBPlayerIface
*iface
= RB_PLAYER_GET_IFACE (player
);
164 iface
->pause (player
);
168 rb_player_playing (RBPlayer
*player
)
170 RBPlayerIface
*iface
= RB_PLAYER_GET_IFACE (player
);
172 return iface
->playing (player
);
176 rb_player_set_volume (RBPlayer
*player
, float volume
)
178 RBPlayerIface
*iface
= RB_PLAYER_GET_IFACE (player
);
180 iface
->set_volume (player
, volume
);
184 rb_player_get_volume (RBPlayer
*player
)
186 RBPlayerIface
*iface
= RB_PLAYER_GET_IFACE (player
);
188 return iface
->get_volume (player
);
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
);
202 rb_player_seekable (RBPlayer
*player
)
204 RBPlayerIface
*iface
= RB_PLAYER_GET_IFACE (player
);
206 return iface
->seekable (player
);
210 rb_player_set_time (RBPlayer
*player
, long time
)
212 RBPlayerIface
*iface
= RB_PLAYER_GET_IFACE (player
);
214 iface
->set_time (player
, time
);
218 rb_player_get_time (RBPlayer
*player
)
220 RBPlayerIface
*iface
= RB_PLAYER_GET_IFACE (player
);
222 return iface
->get_time (player
);
226 rb_player_new (GError
**error
)
228 return rb_player_gst_new (error
);
232 _rb_player_emit_eos (RBPlayer
*player
)
234 g_signal_emit (player
, signals
[EOS
], 0);
238 _rb_player_emit_info (RBPlayer
*player
,
239 RBMetaDataField field
,
242 g_signal_emit (player
, signals
[INFO
], 0, field
, value
);
246 _rb_player_emit_buffering (RBPlayer
*player
, guint progress
)
248 g_signal_emit (player
, signals
[BUFFERING
], 0, progress
);
252 _rb_player_emit_error (RBPlayer
*player
, GError
*error
)
254 g_signal_emit (player
, signals
[ERROR
], 0, error
);
258 _rb_player_emit_tick (RBPlayer
*player
, long elapsed
)
260 g_signal_emit (player
, signals
[TICK
], 0, elapsed
);
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
);
270 rb_player_error_quark (void)
272 static GQuark quark
= 0;
274 quark
= g_quark_from_static_string ("rb_player_error");