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