1 /*
2  * Copyright (c) 2012 Mark McCurry
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18  * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19  * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22  * DEALINGS IN THE SOFTWARE.
23  */
24 
25 #ifndef RTOSC_THREAD_LINK
26 #define RTOSC_THREAD_LINK
27 
28 #include <cstring>
29 #include <cassert>
30 #include <cstdio>
31 #include <rtosc/rtosc.h>
32 
33 namespace rtosc {
34 typedef const char *msg_t;
35 
36 /**
37  * ThreadLink - A simple wrapper around jack's ringbuffers desinged to make
38  * sending messages via rt-osc trivial.
39  * This class provides the basics of reading and writing events via fixed sized
40  * buffers, which can be specified at compile time.
41  */
42 class ThreadLink
43 {
44     public:
45         ThreadLink(size_t max_message_length, size_t max_messages);
46         ~ThreadLink(void);
47 
48         /**
49          * Write message to ringbuffer
50          * @see rtosc_message()
51          */
52         void write(const char *dest, const char *args, ...);
53 
54         /**
55          * Write an arary of arguments to ringbuffer
56          * @see rtosc_amessage()
57          */
58         void writeArray(const char *dest, const char *args, const rtosc_arg_t *aargs);
59 
60         /**
61          * Directly write message to ringbuffer
62          */
63         void raw_write(const char *msg);
64 
65         /**
66          * @returns true iff there is another message to be read in the buffer
67          */
68         bool hasNext(void) const;
69 
70         /**
71          * Read a new message from the ringbuffer
72          */
73         msg_t read(void);
74 
75         /**
76          * Peak at last message read without reading another
77          */
78         msg_t peak(void) const;
79 
80         /**
81          * Raw write buffer access for more complicated task
82          */
83         char *buffer(void);
84         /**
85          * Access to write buffer length
86          */
87         size_t buffer_size(void) const;
88     private:
89         const size_t MaxMsg;
90         const size_t BufferSize;
91         char *write_buffer;
92         char *read_buffer;
93 
94         struct internal_ringbuffer_t *ring;
95 };
96 };
97 #endif
98