/* * Copyright (C) 2005 by the gtk2-perl team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * $Id$ */ #include "gst2perl.h" /* ------------------------------------------------------------------------- */ SV * newSVGstClockTime (GstClockTime time) { return newSVGUInt64 (time); } GstClockTime SvGstClockTime (SV *time) { return SvGUInt64 (time); } /* ------------------------------------------------------------------------- */ SV * newSVGstClockTimeDiff (GstClockTimeDiff diff) { return newSVGInt64 (diff); } GstClockTimeDiff SvGstClockTimeDiff (SV *diff) { return SvGInt64 (diff); } /* ------------------------------------------------------------------------- */ SV * newSVGstClockID (GstClockID id) { SV *sv; if (id == NULL) return &PL_sv_undef; sv = newSV (0); return sv_setref_pv (sv, "GStreamer::ClockID", id); } GstClockID SvGstClockID (SV *sv) { return INT2PTR (GstClockID, SvIV (SvRV (sv))); } /* ------------------------------------------------------------------------- */ #include static GPerlCallback * gst2perl_clock_callback_create (SV *func, SV *data) { return gperl_callback_new (func, data, 0, NULL, 0); } static gboolean gst2perl_clock_callback (GstClock *clock, GstClockTime time, GstClockID id, gpointer user_data) { gboolean retval; GPerlCallback *callback; dGPERL_CALLBACK_MARSHAL_SP; callback = user_data; GPERL_CALLBACK_MARSHAL_INIT (callback); ENTER; SAVETMPS; PUSHMARK (SP); EXTEND (SP, 3); PUSHs (sv_2mortal (newSVGstClock (clock))); PUSHs (sv_2mortal (newSVGstClockTime (time))); /* We need to keep the clock id alive so we ref it to counter DESTROY's * unref */ PUSHs (sv_2mortal (newSVGstClockID (gst_clock_id_ref (id)))); if (callback->data) XPUSHs (sv_2mortal (newSVsv (callback->data))); PUTBACK; call_sv (callback->func, G_SCALAR); SPAGAIN; retval = POPi; PUTBACK; FREETMPS; LEAVE; return retval; } /* ------------------------------------------------------------------------- */ MODULE = GStreamer::Clock PACKAGE = GStreamer::Clock PREFIX = gst_clock_ BOOT: gperl_object_set_no_warn_unreg_subclass (GST_TYPE_CLOCK, TRUE); guint64 gst_clock_set_resolution (GstClock *clock, guint64 resolution); guint64 gst_clock_get_resolution (GstClock *clock); GstClockTime gst_clock_get_time (GstClock *clock); void gst_clock_set_calibration (GstClock *clock, GstClockTime internal, GstClockTime external, GstClockTime rate_num, GstClockTime rate_denom); # void gst_clock_get_calibration (GstClock *clock, GstClockTime *internal, GstClockTime *external, GstClockTime *rate_num, GstClockTime *rate_denom); void gst_clock_get_calibration (GstClock *clock, OUTLIST GstClockTime internal, OUTLIST GstClockTime external, OUTLIST GstClockTime rate_num, OUTLIST GstClockTime rate_denom); gboolean gst_clock_set_master (GstClock *clock, GstClock *master) C_ARGS: /* We need to keep master alive. */ clock, gst_object_ref (master) GstClock_ornull * gst_clock_get_master (GstClock *clock); # gboolean gst_clock_add_observation (GstClock *clock, GstClockTime slave, GstClockTime master, gdouble *r_squared); void gst_clock_add_observation (GstClock *clock, GstClockTime slave, GstClockTime master) PREINIT: gboolean retval; gdouble r_squared; PPCODE: retval = gst_clock_add_observation (clock, slave, master, &r_squared); EXTEND (sp, 2); PUSHs (sv_2mortal (newSVuv (retval))); PUSHs (sv_2mortal (newSVnv (r_squared))); GstClockTime gst_clock_get_internal_time (GstClock *clock); GstClockTime gst_clock_adjust_unlocked (GstClock *clock, GstClockTime internal); GstClockID gst_clock_new_single_shot_id (GstClock *clock, GstClockTime time); GstClockID gst_clock_new_periodic_id (GstClock *clock, GstClockTime start_time, GstClockTime interval); # --------------------------------------------------------------------------- # MODULE = GStreamer::Clock PACKAGE = GStreamer::ClockID PREFIX = gst_clock_id_ void DESTROY (id) GstClockID id CODE: gst_clock_id_unref (id); # GstClockID gst_clock_id_ref (GstClockID id); # void gst_clock_id_unref (GstClockID id); # gint gst_clock_id_compare_func (gconstpointer id1, gconstpointer id2); GstClockTime gst_clock_id_get_time (GstClockID id); # GstClockReturn gst_clock_id_wait (GstClockID id, GstClockTimeDiff *jitter); void gst_clock_id_wait (id) GstClockID id PREINIT: GstClockReturn retval = 0; GstClockTimeDiff jitter = 0; PPCODE: retval = gst_clock_id_wait (id, &jitter); EXTEND (sp, 2); PUSHs (sv_2mortal (newSVGstClockReturn (retval))); PUSHs (sv_2mortal (newSVGstClockTime (jitter))); # GstClockReturn gst_clock_id_wait_async (GstClockID id, GstClockCallback func, gpointer user_data); GstClockReturn gst_clock_id_wait_async (id, func, data=NULL); GstClockID id SV *func SV *data PREINIT: GPerlCallback *callback; CODE: callback = gst2perl_clock_callback_create (func, data); RETVAL = gst_clock_id_wait_async (id, gst2perl_clock_callback, callback); /* FIXME: When to free the callback? */ OUTPUT: RETVAL void gst_clock_id_unschedule (GstClockID id);