1 /* Libvisual - The audio visualisation framework.
2  *
3  * Copyright (C) 2004, 2005, 2006 Dennis Smit <ds@nerds-incorporated.org>
4  *
5  * Authors: Dennis Smit <ds@nerds-incorporated.org>
6  *
7  * $Id: lv_ringbuffer.h,v 1.6 2006/01/22 13:23:37 synap Exp $
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU Lesser General Public License as
11  * published by the Free Software Foundation; either version 2.1
12  * of the License, or (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22  */
23 
24 #ifndef _LV_RINGBUFFER_H
25 #define _LV_RINGBUFFER_H
26 
27 #include <libvisual-0.4/libvisual/lv_common.h>
28 #include <libvisual-0.4/libvisual/lv_list.h>
29 #include <libvisual-0.4/libvisual/lv_buffer.h>
30 
31 VISUAL_BEGIN_DECLS
32 
33 #define VISUAL_RINGBUFFER(obj)				(VISUAL_CHECK_CAST ((obj), VisRingBuffer))
34 #define VISUAL_RINGBUFFER_ENTRY(obj)			(VISUAL_CHECK_CAST ((obj), VisRingBufferEntry))
35 
36 /**
37  * Enum defining the VisRingBufferEntryTypes.
38  */
39 typedef enum {
40 	VISUAL_RINGBUFFER_ENTRY_TYPE_NONE	= 0,	/**< State less entry. */
41 	VISUAL_RINGBUFFER_ENTRY_TYPE_BUFFER	= 1,	/**< Normal byte buffer. */
42 	VISUAL_RINGBUFFER_ENTRY_TYPE_FUNCTION	= 2	/**< Data retrieval using a callback. */
43 } VisRingBufferEntryType;
44 
45 typedef struct _VisRingBufferEntry VisRingBufferEntry;
46 typedef struct _VisRingBuffer VisRingBuffer;
47 
48 /**
49  * A VisRingBuffer data provider function needs this signature. It can be used to provide
50  * ringbuffer entry data on runtime through a callback.
51  *
52  * @arg ringbuffer The VisRingBuffer data structure.
53  * @arg entry The VisRingBufferEntry to which the callback entry is connected.
54  */
55 typedef VisBuffer *(*VisRingBufferDataFunc)(VisRingBuffer *ringbuffer, VisRingBufferEntry *entry);
56 
57 typedef void (*VisRingBufferDestroyFunc)(VisRingBufferEntry *entry);
58 
59 typedef int (*VisRingBufferSizeFunc)(VisRingBuffer *ringbuffer, VisRingBufferEntry *entry);
60 
61 
62 /**
63  * The VisRingBufferEntry data structure is an entry within the ringbuffer.
64  */
65 struct _VisRingBufferEntry {
66 	VisObject			 object;
67 
68 	VisRingBufferEntryType		 type;
69 	VisRingBufferDataFunc		 datafunc;
70 	VisRingBufferDestroyFunc	 destroyfunc;
71 	VisRingBufferSizeFunc		 sizefunc;
72 
73 	VisBuffer			*buffer;
74 
75 	void				*functiondata;
76 };
77 
78 /**
79  * The VisRingBuffer data structure holding the ringbuffer.
80  */
81 struct _VisRingBuffer {
82 	VisObject		 object;	/**< The VisObject data. */
83 
84 	VisList			*entries;	/**< The ring buffer entries list. */
85 };
86 
87 /* prototypes */
88 VisRingBuffer *visual_ringbuffer_new (void);
89 int visual_ringbuffer_init (VisRingBuffer *ringbuffer);
90 
91 int visual_ringbuffer_add_entry (VisRingBuffer *ringbuffer, VisRingBufferEntry *entry);
92 int visual_ringbuffer_add_buffer (VisRingBuffer *ringbuffer, VisBuffer *buffer);
93 int visual_ringbuffer_add_buffer_by_data (VisRingBuffer *ringbuffer, void *data, int nbytes);
94 int visual_ringbuffer_add_function (VisRingBuffer *ringbuffer,
95 		VisRingBufferDataFunc datafunc,
96 		VisRingBufferDestroyFunc destroyfunc,
97 		VisRingBufferSizeFunc sizefunc,
98 		void *functiondata);
99 
100 int visual_ringbuffer_get_size (VisRingBuffer *ringbuffer);
101 
102 VisList *visual_ringbuffer_get_list (VisRingBuffer *ringbuffer);
103 
104 int visual_ringbuffer_get_data (VisRingBuffer *ringbuffer, VisBuffer *data, int nbytes);
105 int visual_ringbuffer_get_data_offset (VisRingBuffer *ringbuffer, VisBuffer *data, int offset, int nbytes);
106 int visual_ringbuffer_get_data_from_end (VisRingBuffer *ringbuffer, VisBuffer *data, int nbytes);
107 
108 int visual_ringbuffer_get_data_without_wrap (VisRingBuffer *ringbuffer, VisBuffer *data, int nbytes);
109 
110 VisBuffer *visual_ringbuffer_get_data_new (VisRingBuffer *ringbuffer, int nbytes);
111 VisBuffer *visual_ringbuffer_get_data_new_without_wrap (VisRingBuffer *ringbuffer, int nbytes);
112 
113 VisRingBufferEntry *visual_ringbuffer_entry_new (VisBuffer *buffer);
114 int visual_ringbuffer_entry_init (VisRingBufferEntry *entry, VisBuffer *buffer);
115 VisRingBufferEntry *visual_ringbuffer_entry_new_function (
116 		VisRingBufferDataFunc datafunc,
117 		VisRingBufferDestroyFunc destroyfunc,
118 		VisRingBufferSizeFunc sizefunc,
119 		void *functiondata);
120 int visual_ringbuffer_entry_init_function (VisRingBufferEntry *entry,
121 		VisRingBufferDataFunc datafunc,
122 		VisRingBufferDestroyFunc destroyfunc,
123 		VisRingBufferSizeFunc sizefunc,
124 		void *functiondata);
125 void *visual_ringbuffer_entry_get_functiondata (VisRingBufferEntry *entry);
126 
127 VISUAL_END_DECLS
128 
129 #endif /* _LV_RINGBUFFER_H */
130