ext/cdaudio/gstcdaudio.c: Added uri handler for cd://

Original commit message from CVS:
* ext/cdaudio/gstcdaudio.c: (_do_init), (gst_cdaudio_base_init),
(gst_cdaudio_get_event_masks), (gst_cdaudio_send_event),
(gst_cdaudio_query), (plugin_init), (cdaudio_uri_get_type),
(cdaudio_uri_get_protocols), (cdaudio_uri_get_uri),
(cdaudio_uri_set_uri), (cdaudio_uri_handler_init):
Added uri handler for cd://
Port to new API.
This commit is contained in:
Wim Taymans 2004-10-18 13:45:12 +00:00
parent b917cfce01
commit e0a3b0aa08
2 changed files with 135 additions and 63 deletions

View file

@ -1,3 +1,13 @@
2004-10-18 Wim Taymans <wim@fluendo.com>
* ext/cdaudio/gstcdaudio.c: (_do_init), (gst_cdaudio_base_init),
(gst_cdaudio_get_event_masks), (gst_cdaudio_send_event),
(gst_cdaudio_query), (plugin_init), (cdaudio_uri_get_type),
(cdaudio_uri_get_protocols), (cdaudio_uri_get_uri),
(cdaudio_uri_set_uri), (cdaudio_uri_handler_init):
Added uri handler for cd://
Port to new API.
2004-10-18 Wim Taymans <wim@fluendo.com> 2004-10-18 Wim Taymans <wim@fluendo.com>
* gst/playback/gstdecodebin.c: (gst_decode_bin_class_init), * gst/playback/gstdecodebin.c: (gst_decode_bin_class_init),

View file

@ -20,6 +20,7 @@
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
#include "config.h" #include "config.h"
#endif #endif
#include <string.h>
#include <cdaudio.h> #include <cdaudio.h>
#include <gst/gst.h> #include <gst/gst.h>
@ -39,6 +40,7 @@ struct _GstCDAudio
/* properties */ /* properties */
gchar *device; gchar *device;
gchar *uri;
gint cd_desc; gint cd_desc;
gulong discid; gulong discid;
@ -99,51 +101,48 @@ static const GstQueryType *gst_cdaudio_get_query_types (GstElement * element);
static gboolean gst_cdaudio_query (GstElement * element, GstQueryType type, static gboolean gst_cdaudio_query (GstElement * element, GstQueryType type,
GstFormat * format, gint64 * value); GstFormat * format, gint64 * value);
static void cdaudio_uri_handler_init (gpointer g_iface, gpointer iface_data);
static GstFormat track_format; static GstFormat track_format;
static GstFormat sector_format; static GstFormat sector_format;
static GstElementClass *parent_class; static GstBinClass *parent_class;
static guint gst_cdaudio_signals[LAST_SIGNAL] = { 0 }; static guint gst_cdaudio_signals[LAST_SIGNAL] = { 0 };
static GstElementDetails gst_cdaudio_details = { static GstElementDetails gst_cdaudio_details = {
"CD Player", "CD Player",
"Generic/Bin", "Generic/Bin",
"LGPL",
"Play CD audio through the CD Drive", "Play CD audio through the CD Drive",
VERSION, "Wim Taymans <wim@fluendo.com>",
"Wim Taymans <wim.taymans@chello.be>",
"(C) 2002",
}; };
GType static void
gst_cdaudio_get_type (void) _do_init (GType cdaudio_type)
{ {
static GType gst_cdaudio_type = 0; static const GInterfaceInfo urihandler_info = {
cdaudio_uri_handler_init,
NULL,
NULL,
};
if (!gst_cdaudio_type) { g_type_add_interface_static (cdaudio_type, GST_TYPE_URI_HANDLER,
static const GTypeInfo gst_cdaudio_info = { &urihandler_info);
sizeof (GstCDAudioClass), }
NULL,
NULL,
(GClassInitFunc) gst_cdaudio_class_init,
NULL,
NULL,
sizeof (GstCDAudio),
0,
(GInstanceInitFunc) gst_cdaudio_init,
NULL
};
gst_cdaudio_type =
g_type_register_static (GST_TYPE_BIN, "GstCDAudio", &gst_cdaudio_info,
0);
track_format = gst_format_register ("track", "CD track"); GST_BOILERPLATE_FULL (GstCDAudio, gst_cdaudio, GstBin, GST_TYPE_BIN, _do_init);
sector_format = gst_format_register ("sector", "CD sector");
}
return gst_cdaudio_type; static void
gst_cdaudio_base_init (gpointer g_class)
{
GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
gst_element_class_set_details (element_class, &gst_cdaudio_details);
/* Register the track and sector format */
track_format = gst_format_register ("track", "CD track");
sector_format = gst_format_register ("sector", "CD sector");
} }
static void static void
@ -289,13 +288,15 @@ print_track_info (GstCDAudio * cdaudio)
{ {
gint i; gint i;
for (i = 0; i < cdaudio->info.disc_total_tracks; i++) { /*
g_print ("%d %d %d %d:%02d\n", i, for (i = 0; i < cdaudio->info.disc_total_tracks; i++) {
cdaudio->info.disc_track[i].track_length.frames, g_print ("%d %d %d %d:%02d\n", i,
cdaudio->info.disc_track[i].track_pos.frames, cdaudio->info.disc_track[i].track_length.frames,
cdaudio->info.disc_track[i].track_length.minutes, cdaudio->info.disc_track[i].track_pos.frames,
cdaudio->info.disc_track[i].track_length.seconds); cdaudio->info.disc_track[i].track_length.minutes,
} cdaudio->info.disc_track[i].track_length.seconds);
}
*/
} }
static GstElementStateReturn static GstElementStateReturn
@ -367,16 +368,21 @@ gst_cdaudio_change_state (GstElement * element)
return GST_STATE_SUCCESS; return GST_STATE_SUCCESS;
} }
GST_ELEMENT_EVENT_MASK_FUNCTION (gst_cdaudio_get_event_masks, static const GstEventMask *
{ gst_cdaudio_get_event_masks (GstElement * element)
GST_EVENT_SEEK, GST_SEEK_FLAG_FLUSH} {
static const GstEventMask masks[] = {
{GST_EVENT_SEEK, GST_SEEK_METHOD_SET |
GST_SEEK_METHOD_CUR | GST_SEEK_METHOD_END | GST_SEEK_FLAG_FLUSH},
{GST_EVENT_SEEK_SEGMENT, GST_SEEK_METHOD_SET |
GST_SEEK_METHOD_CUR | GST_SEEK_METHOD_END | GST_SEEK_FLAG_FLUSH},
{0,}
};
, { return masks;
GST_EVENT_SEEK_SEGMENT, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SEGMENT_LOOP} }
) static gboolean
gboolean
gst_cdaudio_send_event (GstElement * element, GstEvent * event) gst_cdaudio_send_event (GstElement * element, GstEvent * event)
{ {
GstCDAudio *cdaudio; GstCDAudio *cdaudio;
@ -389,8 +395,9 @@ gst_cdaudio_send_event (GstElement * element, GstEvent * event)
switch (GST_EVENT_SEEK_FORMAT (event)) { switch (GST_EVENT_SEEK_FORMAT (event)) {
case GST_FORMAT_TIME: case GST_FORMAT_TIME:
{ {
cd_play_pos (cdaudio->cd_desc, 1, if (cd_play_pos (cdaudio->cd_desc, 1,
GST_EVENT_SEEK_OFFSET (event) / (60 * GST_SECOND)); (gint) (GST_EVENT_SEEK_OFFSET (event) / (GST_SECOND))) == -1)
res = FALSE;
break; break;
} }
default: default:
@ -457,9 +464,9 @@ gst_cdaudio_query (GstElement * element, GstQueryType type,
cdaudio = GST_CDAUDIO (element); cdaudio = GST_CDAUDIO (element);
/* take new snapshot every 100000 miliseconds */ /* take new snapshot every 1000 miliseconds */
seconds = g_timer_elapsed (cdaudio->timer, &micros); seconds = g_timer_elapsed (cdaudio->timer, &micros);
if (micros > 100000 || seconds > 1) { if (micros > 1000 || seconds > 1) {
cd_stat (cdaudio->cd_desc, &cdaudio->info); cd_stat (cdaudio->cd_desc, &cdaudio->info);
g_timer_start (cdaudio->timer); g_timer_start (cdaudio->timer);
} }
@ -507,24 +514,79 @@ gst_cdaudio_query (GstElement * element, GstQueryType type,
} }
static gboolean static gboolean
plugin_init (GModule * module, GstPlugin * plugin) plugin_init (GstPlugin * plugin)
{ {
GstElementFactory *factory; if (!gst_element_register (plugin, "cdaudio", GST_RANK_NONE,
GST_TYPE_CDAUDIO))
factory = return FALSE;
gst_element_factory_new ("cdaudio", GST_TYPE_CDAUDIO,
&gst_cdaudio_details);
g_return_val_if_fail (factory != NULL, FALSE);
gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (factory));
gst_plugin_set_longname (plugin, "CD Player");
return TRUE; return TRUE;
} }
GstPluginDesc plugin_desc = { /*** GSTURIHANDLER INTERFACE *************************************************/
GST_VERSION_MAJOR,
GST_VERSION_MINOR, static guint
"cdaudio", cdaudio_uri_get_type (void)
plugin_init {
}; return GST_URI_SRC;
}
static gchar **
cdaudio_uri_get_protocols (void)
{
static gchar *protocols[] = { "cd", NULL };
return protocols;
}
static const gchar *
cdaudio_uri_get_uri (GstURIHandler * handler)
{
GstCDAudio *cdaudio = GST_CDAUDIO (handler);
return cdaudio->uri;
}
static gboolean
cdaudio_uri_set_uri (GstURIHandler * handler, const gchar * uri)
{
gchar *protocol, *location;
gboolean ret;
ret = TRUE;
//GstCDAudio *cdaudio = GST_CDAUDIO(handler);
protocol = gst_uri_get_protocol (uri);
if (strcmp (protocol, "cd") != 0) {
g_free (protocol);
return FALSE;
}
g_free (protocol);
location = gst_uri_get_location (uri);
/*
cdaudio->uri_track = strtol(location,NULL,10);
if (cdaudio->uri_track > 0) {
cdaudio->seek_request = cdaudio->uri_track;
}
*/
g_free (location);
return ret;
}
static void
cdaudio_uri_handler_init (gpointer g_iface, gpointer iface_data)
{
GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface;
iface->get_type = cdaudio_uri_get_type;
iface->get_protocols = cdaudio_uri_get_protocols;
iface->get_uri = cdaudio_uri_get_uri;
iface->set_uri = cdaudio_uri_set_uri;
}
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
GST_VERSION_MINOR,
"cdaudio",
"Play CD audio through the CD Drive",
plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN)