28 #define OSC_MESSAGE_QUEUE_SIZE 1023 35 cerr <<
"ERROR: OSCQueue::oscError: liblo server error " << num
36 <<
" in path " << path <<
": " << msg << endl;
41 int argc, lo_message,
void *user_data)
43 OSCQueue *queue = static_cast<OSCQueue *>(user_data);
49 if (!queue->
parseOSCPath(path, target, targetData, method)) {
60 while (types && i < argc && types[i]) {
63 lo_arg *arg = argv[i];
66 case 'i': message.
addArg(arg->i);
break;
71 case 'f': message.
addArg(arg->f);
break;
72 case 'd': message.
addArg(arg->d);
break;
73 case 'c': message.
addArg(arg->c);
break;
74 case 't': message.
addArg(arg->i);
break;
75 case 's': message.
addArg(&arg->s);
break;
76 default: cerr <<
"WARNING: OSCQueue::oscMessageHandler: " 77 <<
"Unsupported OSC type '" << type <<
"'" 97 Profiler profiler(
"OSCQueue::OSCQueue");
102 lo_server_thread_add_method(
m_thread, NULL, NULL,
107 cout <<
"OSCQueue::OSCQueue: Base OSC URL is " 108 << lo_server_thread_get_url(
m_thread) << endl;
140 url = lo_server_thread_get_url(
m_thread);
163 int count = 0, max = 5;
166 cerr <<
"ERROR: OSCQueue::postMessage: OSC message queue is full and not clearing -- abandoning incoming message" << endl;
169 cerr <<
"WARNING: OSCQueue::postMessage: OSC message queue (capacity " <<
m_buffer.
getSize() <<
" is full!" << endl;
170 SVDEBUG <<
"Waiting for something to be processed" << endl;
181 SVDEBUG <<
"OSCQueue::postMessage: Posted OSC message: target " 183 <<
", method " << message.
getMethod() << endl;
191 while (path.startsWith(
"/")) {
192 path = path.right(path.length()-1);
198 target = path.section(
'/', i, i).toInt(&ok);
204 targetData = path.section(
'/', i, i).toInt(&ok);
212 method = path.section(
'/', i, -1);
214 if (method.contains(
'/')) {
215 cerr <<
"ERROR: OSCQueue::parseOSCPath: malformed path \"" 216 << path <<
"\" (should be target/data/method or " 217 <<
"target/method or method, where target and data " 218 <<
"are numeric)" << endl;
222 SVDEBUG <<
"OSCQueue::parseOSCPath: good path \"" << path <<
"\"" << endl;
RingBuffer< OSCMessage * > m_buffer
void addArg(QVariant arg)
int getMessagesAvailable() const
#define OSC_MESSAGE_QUEUE_SIZE
T readOne(int R=0)
Read one sample from the buffer, for reader R.
lo_server_thread m_thread
QString getMethod() const
int write(const T *source, int n)
Write n samples to the buffer.
QString getOSCURL() const
static int oscMessageHandler(const char *, const char *, lo_arg **, int, lo_message, void *)
void setMethod(QString method)
void setTarget(const int &target)
static void oscError(int, const char *, const char *)
void postMessage(OSCMessage)
int getTargetData() const
void setTargetData(const int &targetData)
int getReadSpace(int R=0) const
Return the amount of data available for reading by reader R, in samples.
int getWriteSpace() const
Return the amount of space available for writing, in samples.
bool parseOSCPath(QString path, int &target, int &targetData, QString &method)
Profile point instance class.
int getSize() const
Return the total capacity of the ring buffer in samples.