Mercurial > hg > beaglert
annotate examples/basic_libpd/ringbuffer.h @ 338:1802f99cd77f prerelease
Initial support for thread-safe libpd (stil missing updated libpd binary), untested
author | Giulio Moro <giuliomoro@yahoo.it> |
---|---|
date | Sun, 05 Jun 2016 21:46:44 +0100 |
parents | |
children |
rev | line source |
---|---|
giuliomoro@338 | 1 /* |
giuliomoro@338 | 2 * Copyright (c) 2012 Peter Brinkmann (peter.brinkmann@gmail.com) |
giuliomoro@338 | 3 * |
giuliomoro@338 | 4 * For information on usage and redistribution, and for a DISCLAIMER OF ALL |
giuliomoro@338 | 5 * WARRANTIES, see the file, "LICENSE.txt," in this distribution. |
giuliomoro@338 | 6 * |
giuliomoro@338 | 7 * See https://github.com/libpd/libpd/wiki for documentation |
giuliomoro@338 | 8 * |
giuliomoro@338 | 9 */ |
giuliomoro@338 | 10 |
giuliomoro@338 | 11 #ifndef __OPENSL_RING_BUFFER_H__ |
giuliomoro@338 | 12 #define __OPENSL_RING_BUFFER_H__ |
giuliomoro@338 | 13 |
giuliomoro@338 | 14 // Simple lock-free ring buffer implementation for one writer thread and one |
giuliomoro@338 | 15 // consumer thread. |
giuliomoro@338 | 16 typedef struct ring_buffer { |
giuliomoro@338 | 17 int size; |
giuliomoro@338 | 18 char *buf_ptr; |
giuliomoro@338 | 19 int write_idx; |
giuliomoro@338 | 20 int read_idx; |
giuliomoro@338 | 21 } ring_buffer; |
giuliomoro@338 | 22 |
giuliomoro@338 | 23 // Creates a ring buffer (returns NULL on failure). |
giuliomoro@338 | 24 ring_buffer *rb_create(int size); |
giuliomoro@338 | 25 |
giuliomoro@338 | 26 // Deletes a ring buffer. |
giuliomoro@338 | 27 void rb_free(ring_buffer *buffer); |
giuliomoro@338 | 28 |
giuliomoro@338 | 29 // Returns the number of bytes that can currently be written; safe to be called |
giuliomoro@338 | 30 // from any thread. |
giuliomoro@338 | 31 int rb_available_to_write(ring_buffer *buffer); |
giuliomoro@338 | 32 |
giuliomoro@338 | 33 // Returns the number of bytes that can currently be read; safe to be called |
giuliomoro@338 | 34 // from any thread. |
giuliomoro@338 | 35 int rb_available_to_read(ring_buffer *buffer); |
giuliomoro@338 | 36 |
giuliomoro@338 | 37 // Writes bytes from n sources to the ring buffer (if the ring buffer has |
giuliomoro@338 | 38 // enough space). The varargs are pairs of type (const char*, int) giving a |
giuliomoro@338 | 39 // pointer to a buffer and the number of bytes to be copied. Only to be called |
giuliomoro@338 | 40 // from a single writer thread. |
giuliomoro@338 | 41 // Returns 0 on success. |
giuliomoro@338 | 42 int rb_write_to_buffer(ring_buffer *buffer, int n, ...); |
giuliomoro@338 | 43 |
giuliomoro@338 | 44 // Reads the given number of bytes fromthe ring buffer to dest if the ring |
giuliomoro@338 | 45 // buffer has enough data. Only to be called from a single reader thread. |
giuliomoro@338 | 46 // Returns 0 on success. |
giuliomoro@338 | 47 int rb_read_from_buffer(ring_buffer *buffer, char *dest, int len); |
giuliomoro@338 | 48 |
giuliomoro@338 | 49 #endif |