| 1 | /* GStreamer | 
| 2 |  * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu> | 
| 3 |  *               <2005> Wim Taymans <wim@fluendo.com> | 
| 4 |  * | 
| 5 |  * gsttask.h: Streaming tasks | 
| 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., 51 Franklin St, Fifth Floor, | 
| 20 |  * Boston, MA 02110-1301, USA. | 
| 21 |  */ | 
| 22 |  | 
| 23 | #ifndef __GST_TASK_H__ | 
| 24 | #define __GST_TASK_H__ | 
| 25 |  | 
| 26 | #include <gst/gstobject.h> | 
| 27 | #include <gst/gsttaskpool.h> | 
| 28 |  | 
| 29 | G_BEGIN_DECLS | 
| 30 |  | 
| 31 | /** | 
| 32 |  * GstTaskFunction: | 
| 33 |  * @user_data: user data passed to the function | 
| 34 |  * | 
| 35 |  * A function that will repeatedly be called in the thread created by | 
| 36 |  * a #GstTask. | 
| 37 |  */ | 
| 38 | typedef void         (*GstTaskFunction)          (gpointer user_data); | 
| 39 |  | 
| 40 | /* --- standard type macros --- */ | 
| 41 | #define GST_TYPE_TASK                   (gst_task_get_type ()) | 
| 42 | #define GST_TASK(task)                  (G_TYPE_CHECK_INSTANCE_CAST ((task), GST_TYPE_TASK, GstTask)) | 
| 43 | #define GST_IS_TASK(task)               (G_TYPE_CHECK_INSTANCE_TYPE ((task), GST_TYPE_TASK)) | 
| 44 | #define GST_TASK_CLASS(tclass)          (G_TYPE_CHECK_CLASS_CAST ((tclass), GST_TYPE_TASK, GstTaskClass)) | 
| 45 | #define GST_IS_TASK_CLASS(tclass)       (G_TYPE_CHECK_CLASS_TYPE ((tclass), GST_TYPE_TASK)) | 
| 46 | #define GST_TASK_GET_CLASS(task)        (G_TYPE_INSTANCE_GET_CLASS ((task), GST_TYPE_TASK, GstTaskClass)) | 
| 47 | #define GST_TASK_CAST(task)             ((GstTask*)(task)) | 
| 48 |  | 
| 49 | typedef struct _GstTask GstTask; | 
| 50 | typedef struct _GstTaskClass GstTaskClass; | 
| 51 | typedef struct _GstTaskPrivate GstTaskPrivate; | 
| 52 |  | 
| 53 | /** | 
| 54 |  * GstTaskState: | 
| 55 |  * @GST_TASK_STARTED: the task is started and running | 
| 56 |  * @GST_TASK_STOPPED: the task is stopped | 
| 57 |  * @GST_TASK_PAUSED: the task is paused | 
| 58 |  * | 
| 59 |  * The different states a task can be in | 
| 60 |  */ | 
| 61 | typedef enum { | 
| 62 |   GST_TASK_STARTED, | 
| 63 |   GST_TASK_STOPPED, | 
| 64 |   GST_TASK_PAUSED | 
| 65 | } GstTaskState; | 
| 66 |  | 
| 67 | /** | 
| 68 |  * GST_TASK_STATE: | 
| 69 |  * @task: Task to get the state of | 
| 70 |  * | 
| 71 |  * Get access to the state of the task. | 
| 72 |  */ | 
| 73 | #define GST_TASK_STATE(task)            (GST_TASK_CAST(task)->state) | 
| 74 |  | 
| 75 | /** | 
| 76 |  * GST_TASK_GET_COND: | 
| 77 |  * @task: Task to get the cond of | 
| 78 |  * | 
| 79 |  * Get access to the cond of the task. | 
| 80 |  */ | 
| 81 | #define GST_TASK_GET_COND(task)         (&GST_TASK_CAST(task)->cond) | 
| 82 | /** | 
| 83 |  * GST_TASK_WAIT: | 
| 84 |  * @task: Task to wait for | 
| 85 |  * | 
| 86 |  * Wait for the task cond to be signalled | 
| 87 |  */ | 
| 88 | #define GST_TASK_WAIT(task)             g_cond_wait(GST_TASK_GET_COND (task), GST_OBJECT_GET_LOCK (task)) | 
| 89 | /** | 
| 90 |  * GST_TASK_SIGNAL: | 
| 91 |  * @task: Task to signal | 
| 92 |  * | 
| 93 |  * Signal the task cond | 
| 94 |  */ | 
| 95 | #define GST_TASK_SIGNAL(task)           g_cond_signal(GST_TASK_GET_COND (task)) | 
| 96 | /** | 
| 97 |  * GST_TASK_BROADCAST: | 
| 98 |  * @task: Task to broadcast | 
| 99 |  * | 
| 100 |  * Send a broadcast signal to all waiting task conds | 
| 101 |  */ | 
| 102 | #define GST_TASK_BROADCAST(task)        g_cond_broadcast(GST_TASK_GET_COND (task)) | 
| 103 |  | 
| 104 | /** | 
| 105 |  * GST_TASK_GET_LOCK: | 
| 106 |  * @task: Task to get the lock of | 
| 107 |  * | 
| 108 |  * Get access to the task lock. | 
| 109 |  */ | 
| 110 | #define GST_TASK_GET_LOCK(task)         (GST_TASK_CAST(task)->lock) | 
| 111 |  | 
| 112 | /** | 
| 113 |  * GstTaskThreadFunc: | 
| 114 |  * @task: The #GstTask | 
| 115 |  * @thread: The #GThread | 
| 116 |  * @user_data: user data | 
| 117 |  * | 
| 118 |  * Custom GstTask thread callback functions that can be installed. | 
| 119 |  */ | 
| 120 | typedef void (*GstTaskThreadFunc) (GstTask *task, GThread *thread, gpointer user_data); | 
| 121 |  | 
| 122 | /** | 
| 123 |  * GstTask: | 
| 124 |  * @state: the state of the task | 
| 125 |  * @cond: used to pause/resume the task | 
| 126 |  * @lock: The lock taken when iterating the task function | 
| 127 |  * @func: the function executed by this task | 
| 128 |  * @user_data: user_data passed to the task function | 
| 129 |  * @notify: GDestroyNotify for @user_data | 
| 130 |  * @running: a flag indicating that the task is running | 
| 131 |  * | 
| 132 |  * The #GstTask object. | 
| 133 |  */ | 
| 134 | struct _GstTask { | 
| 135 |   GstObject      object; | 
| 136 |  | 
| 137 |   /*< public >*/ /* with LOCK */ | 
| 138 |   GstTaskState     state; | 
| 139 |   GCond            cond; | 
| 140 |  | 
| 141 |   GRecMutex       *lock; | 
| 142 |  | 
| 143 |   GstTaskFunction  func; | 
| 144 |   gpointer         user_data; | 
| 145 |   GDestroyNotify   notify; | 
| 146 |  | 
| 147 |   gboolean         running; | 
| 148 |  | 
| 149 |   /*< private >*/ | 
| 150 |   GThread         *thread; | 
| 151 |  | 
| 152 |   GstTaskPrivate  *priv; | 
| 153 |  | 
| 154 |   gpointer _gst_reserved[GST_PADDING]; | 
| 155 | }; | 
| 156 |  | 
| 157 | struct _GstTaskClass { | 
| 158 |   GstObjectClass parent_class; | 
| 159 |  | 
| 160 |   /*< private >*/ | 
| 161 |   GstTaskPool *pool; | 
| 162 |  | 
| 163 |   /*< private >*/ | 
| 164 |   gpointer _gst_reserved[GST_PADDING]; | 
| 165 | }; | 
| 166 |  | 
| 167 | GST_API | 
| 168 | void            gst_task_cleanup_all    (void); | 
| 169 |  | 
| 170 | GST_API | 
| 171 | GType           gst_task_get_type       (void); | 
| 172 |  | 
| 173 | GST_API | 
| 174 | GstTask*        gst_task_new            (GstTaskFunction func, | 
| 175 |                                          gpointer user_data, GDestroyNotify notify); | 
| 176 | GST_API | 
| 177 | void            gst_task_set_lock       (GstTask *task, GRecMutex *mutex); | 
| 178 |  | 
| 179 | GST_API | 
| 180 | GstTaskPool *   gst_task_get_pool       (GstTask *task); | 
| 181 |  | 
| 182 | GST_API | 
| 183 | void            gst_task_set_pool       (GstTask *task, GstTaskPool *pool); | 
| 184 |  | 
| 185 | GST_API | 
| 186 | void            gst_task_set_enter_callback  (GstTask *task, | 
| 187 |                                               GstTaskThreadFunc enter_func, | 
| 188 |                                               gpointer user_data, | 
| 189 |                                               GDestroyNotify notify); | 
| 190 | GST_API | 
| 191 | void            gst_task_set_leave_callback  (GstTask *task, | 
| 192 |                                               GstTaskThreadFunc leave_func, | 
| 193 |                                               gpointer user_data, | 
| 194 |                                               GDestroyNotify notify); | 
| 195 | GST_API | 
| 196 | GstTaskState    gst_task_get_state      (GstTask *task); | 
| 197 |  | 
| 198 | GST_API | 
| 199 | gboolean        gst_task_set_state      (GstTask *task, GstTaskState state); | 
| 200 |  | 
| 201 | GST_API | 
| 202 | gboolean        gst_task_start          (GstTask *task); | 
| 203 |  | 
| 204 | GST_API | 
| 205 | gboolean        gst_task_stop           (GstTask *task); | 
| 206 |  | 
| 207 | GST_API | 
| 208 | gboolean        gst_task_pause          (GstTask *task); | 
| 209 |  | 
| 210 | GST_API | 
| 211 | gboolean        gst_task_resume         (GstTask *task); | 
| 212 |  | 
| 213 | GST_API | 
| 214 | gboolean        gst_task_join           (GstTask *task); | 
| 215 |  | 
| 216 | G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstTask, gst_object_unref) | 
| 217 |  | 
| 218 | G_END_DECLS | 
| 219 |  | 
| 220 | #endif /* __GST_TASK_H__ */ | 
| 221 |  |