Make clock use nanoseconds
[platform/upstream/gstreamer.git] / gst / gstclock.h
1 /* GStreamer
2  * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
3  *                    2000 Wim Taymans <wtay@chello.be>
4  *
5  * gstclock.h: Header for clock subsystem
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public
18  * License along with this library; if not, write to the
19  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20  * Boston, MA 02111-1307, USA.
21  */
22
23
24 #ifndef __GST_CLOCK_H__
25 #define __GST_CLOCK_H__
26
27 #ifdef __cplusplus
28 extern "C" {
29 #endif /* __cplusplus */
30
31 #include <gst/gstobject.h>
32
33 #define GST_TYPE_CLOCK \
34   (gst_clock_get_type())
35 #define GST_CLOCK(obj) \
36   (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CLOCK,GstClock))
37 #define GST_CLOCK_CLASS(klass) \
38   (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CLOCK,GstClockClass))
39 #define GST_IS_CLOCK(obj) \
40   (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CLOCK))
41 #define GST_IS_CLOCK_CLASS(obj) \
42   (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CLOCK))
43         
44 typedef guint64         GstClockTime;
45 typedef gint64          GstClockTimeDiff;
46 typedef gpointer        GstClockID;
47
48 #define GST_CLOCK_TIME_NONE  ((guint64)-1)
49
50 #define GST_SECOND  ((guint64)G_USEC_PER_SEC * 1000LL)
51 #define GST_MSECOND ((guint64)GST_SECOND/1000LL)
52 #define GST_USECOND ((guint64)GST_SECOND/1000000LL)
53 #define GST_NSECOND ((guint64)GST_SECOND/1000000000LL)
54
55 #define GST_CLOCK_DIFF(s, e)            (GstClockTimeDiff)((s)-(e))
56 #define GST_TIMEVAL_TO_TIME(tv)         ((tv).tv_sec * GST_SECOND + (tv).tv_usec * GST_USECOND)
57 #define GST_TIME_TO_TIMEVAL(t,tv)                       \
58 G_STMT_START {                                          \
59   (tv).tv_sec  = (t) / GST_SECOND;                      \
60   (tv).tv_usec = ((t) / GST_USECOND) % GST_MSECOND;     \
61 } G_STMT_END
62
63 typedef struct _GstClock        GstClock;
64 typedef struct _GstClockClass   GstClockClass;
65
66 typedef void (*GstClockCallback) (GstClock *clock, GstClockTime time, GstClockID id, gpointer user_data);
67
68 typedef enum
69 {
70   GST_CLOCK_STOPPED     = 0,
71   GST_CLOCK_TIMEOUT     = 1,
72   GST_CLOCK_EARLY       = 2,
73   GST_CLOCK_ERROR       = 3,
74 } GstClockReturn;
75
76 struct _GstClock {
77   GstObject      object;
78
79   GstClockTime   start_time;
80   GstClockTime   last_time;
81   gboolean       accept_discont;
82   gdouble        speed;
83   gboolean       active;
84   GList         *entries;
85   gboolean       async_supported;
86
87   GMutex        *active_mutex;
88   GCond         *active_cond;
89 };
90
91 struct _GstClockClass {
92   GstObjectClass        parent_class;
93
94   /* vtable */
95   GstClockTime          (*get_internal_time)    (GstClock *clock);
96
97   void                  (*set_resolution)       (GstClock *clock, guint64 resolution);
98   guint64               (*get_resolution)       (GstClock *clock);
99
100   /* signals */
101 };
102
103 GType                   gst_clock_get_type              (void);
104
105 void                    gst_clock_set_speed             (GstClock *clock, gdouble speed);
106 gdouble                 gst_clock_get_speed             (GstClock *clock);
107
108 void                    gst_clock_set_active            (GstClock *clock, gboolean active);
109 gboolean                gst_clock_is_active             (GstClock *clock);
110 void                    gst_clock_reset                 (GstClock *clock);
111 gboolean                gst_clock_handle_discont        (GstClock *clock, guint64 time);
112 gboolean                gst_clock_async_supported       (GstClock *clock);
113
114 GstClockTime            gst_clock_get_time              (GstClock *clock);
115
116 GstClockReturn          gst_clock_wait                  (GstClock *clock, GstClockTime time, GstClockTimeDiff *jitter);
117 GstClockID              gst_clock_wait_async            (GstClock *clock, GstClockTime time, 
118                                                          GstClockCallback func, gpointer user_data);
119 void                    gst_clock_cancel_wait_async     (GstClock *clock, GstClockID id);
120 GstClockID              gst_clock_notify_async          (GstClock *clock, GstClockTime interval, 
121                                                          GstClockCallback func, gpointer user_data);
122 void                    gst_clock_remove_notify_async   (GstClock *clock, GstClockID id);
123 GstClockReturn          gst_clock_wait_id               (GstClock *clock, GstClockID id, GstClockTimeDiff *jitter);
124
125 GstClockID              gst_clock_get_next_id           (GstClock *clock);
126 void                    gst_clock_unlock_id             (GstClock *clock, GstClockID id);
127
128 GstClockTime            gst_clock_id_get_time           (GstClockID id);
129
130 void                    gst_clock_set_resolution        (GstClock *clock, guint64 resolution);
131 guint64                 gst_clock_get_resolution        (GstClock *clock);
132
133 #ifdef __cplusplus
134 }
135 #endif /* __cplusplus */
136
137 #endif /* __GST_CLOCK_H__ */