aboutsummaryrefslogtreecommitdiff
path: root/include/pdp_queue.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/pdp_queue.h')
-rw-r--r--include/pdp_queue.h115
1 files changed, 115 insertions, 0 deletions
diff --git a/include/pdp_queue.h b/include/pdp_queue.h
new file mode 100644
index 0000000..81a6b7e
--- /dev/null
+++ b/include/pdp_queue.h
@@ -0,0 +1,115 @@
+/*
+ * Pure Data Packet - processor queue interface
+ * Copyright (c) by Tom Schouten <pdp@zzz.kotnet.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+
+#ifndef PDP_QUEUE_H
+#define PDP_QUEUE_H
+
+/********************* general purpose pd process queue class *********************/
+
+typedef void (*t_pdpmethod)(void *client);
+
+/* the process queue data record */
+typedef struct process_queue_struct
+{
+ void *x_owner; /* the object we are dealing with */
+ t_pdpmethod x_process; /* the process method */
+ t_pdpmethod x_callback; /* the function to be called when finished */
+ int *x_queue_id; /* place to store the queue id for task */
+} t_process_queue_item;
+
+
+/* a pd process queue object */
+typedef struct _pd_queue
+{
+ /* clock members */
+ t_clock *pdp_clock;
+ double deltime;
+
+ /* some bookkeeping vars */
+ long long ticks;
+ long long packets;
+
+ /* queue members */
+ t_process_queue_item *q; /* queue */
+ int mask;
+ int head; /* last entry in queue + 1 */
+ int tail; /* first entry in queque */
+ int curr; /* the object currently processed in other thread */
+
+ /* pthread vars */
+ pthread_mutex_t mut;
+ pthread_cond_t cond_dataready;
+ pthread_cond_t cond_processingdone;
+ pthread_t thread_id;
+
+ /* toggle for thread usage */
+ int use_thread;
+
+} t_pdp_procqueue;
+
+
+/* all symbols are C-style */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+void pdp_procqueue_wait(t_pdp_procqueue *q);
+void pdp_procqueue_finish(t_pdp_procqueue *q, int index);
+void pdp_procqueue_add(t_pdp_procqueue *q, void *owner, void *process, void *callback, int *queue_id);
+void pdp_procqueue_use_thread(t_pdp_procqueue* q, int t);
+void pdp_procqueue_init(t_pdp_procqueue *q, double milliseconds, int logsize);
+
+/********************* interface to pdp process queue singleton *********************/
+
+/* processor queue methods, callable from main pd thread */
+
+/* get the default queue */
+t_pdp_procqueue *pdp_queue_get_queue(void);
+
+
+
+#if 1
+
+/* add a method to the processing queue */
+void pdp_queue_add(void *owner, void *process, void *callback, int *queue_id);
+
+/* halt main tread until processing is done */
+void pdp_queue_wait(void);
+
+/* halt main tread until processing is done and remove
+ callback from queue(for destructors) */
+void pdp_queue_finish(int queue_id);
+
+#endif
+
+
+/* misc signals to pdp */
+void pdp_control_notify_drop(int packet);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif