Added missing files

git-svn-id: http://svn.drobilla.net/lad@132 a436a847-0d15-0410-975c-d299462d15a1
This commit is contained in:
dave 2006-09-13 14:59:22 +00:00
parent d2dda2185b
commit c79d4740bd
3 changed files with 199 additions and 1 deletions

View File

@ -0,0 +1,123 @@
/* This file is part of Ingen. Copyright (C) 2006 Dave Robillard.
*
* Ingen is free software; you can redistribute it and/or modify it under the
* terms of the GNU General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option) any later
* version.
*
* Ingen is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef ATOM_H
#define ATOM_H
#include <cassert>
#include <cstring>
#include <lo/lo.h>
/** An OSC atom (fundamental data types OSC messages are composed of).
*/
class Atom {
public:
enum Type {
NIL,
INT,
FLOAT,
STRING,
BLOB
};
Atom() : _type(NIL), _blob_val(0) {}
Atom(int32_t val) : _type(INT), _int_val(val) {}
Atom(float val) : _type(FLOAT), _float_val(val) {}
Atom(const char* val) : _type(STRING), _string_val(strdup(val)) {}
Atom(void* val) : _type(BLOB), _blob_size(sizeof(val)), _blob_val(malloc(_blob_size))
{ memcpy(_blob_val, val, sizeof(_blob_size)); }
~Atom()
{
if (_type == STRING)
free(_string_val);
else if (_type == BLOB)
free(_blob_val);
}
// Gotta love C++ boilerplate:
Atom(const Atom& copy)
: _type(copy._type)
, _blob_size(copy._blob_size)
{
switch (_type) {
case NIL: _blob_val = 0; break;
case INT: _int_val = copy._int_val; break;
case FLOAT: _float_val = copy._float_val; break;
case STRING: _string_val = strdup(copy._string_val); break;
case BLOB: _blob_val = malloc(_blob_size);
memcpy(_blob_val, copy._blob_val, _blob_size);
break;
default: break;
}
}
Atom& operator=(const Atom& other)
{
if (_type == BLOB)
free(_blob_val);
else if (_type == STRING)
free(_string_val);
_type = other._type;
_blob_size = other._blob_size;
switch (_type) {
case NIL: _blob_val = 0; break;
case INT: _int_val = other._int_val; break;
case FLOAT: _float_val = other._float_val; break;
case STRING: _string_val = strdup(other._string_val); break;
case BLOB: _blob_val = malloc(_blob_size);
memcpy(_blob_val, other._blob_val, _blob_size);
break;
default: break;
}
return *this;
}
/** Type of this atom. Always check this before attempting to get the
* value - attempting to get the incorrectly typed value is a fatal error.
*/
Type type() const { return _type; }
inline int32_t get_int32() const { assert(_type == INT); return _int_val; }
inline float get_float() const { assert(_type == FLOAT); return _float_val; }
inline const char* get_string() const { assert(_type == STRING); return _string_val; }
inline const void* get_blob() const { assert(_type == BLOB); return _blob_val; }
inline operator bool() const { return (_type != NIL); }
private:
Type _type;
size_t _blob_size; ///< always a multiple of 32
union {
int32_t _int_val;
float _float_val;
char* _string_val;
void* _blob_val;
};
};
#endif // ATOM_H

View File

@ -0,0 +1,73 @@
/* This file is part of Ingen. Copyright (C) 2006 Dave Robillard.
*
* Ingen is free software; you can redistribute it and/or modify it under the
* terms of the GNU General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option) any later
* version.
*
* Ingen is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef LIBLO_ATOM_H
#define LIBLO_ATOM_H
#include <lo/lo.h>
#include "util/Atom.h"
/** Support for serializing an Atom to/from liblo messages.
*
* (Here to prevent a unnecessary liblo dependency on Atom).
*/
class LibloAtom {
public:
static void lo_message_add_atom(lo_message m, const Atom& atom) {
switch (atom.type()) {
//case NIL:
// (see below)
//break;
case Atom::INT:
lo_message_add_int32(m, atom.get_int32());
break;
case Atom::FLOAT:
lo_message_add_float(m, atom.get_float());
break;
case Atom::STRING:
lo_message_add_string(m, atom.get_string());
break;
case Atom::BLOB:
// FIXME: is this okay? what does liblo do?
lo_message_add_blob(m, const_cast<void*>(atom.get_blob()));
break;
default: // This catches Atom::Type::NIL too
lo_message_add_nil(m);
break;
}
}
static Atom lo_arg_to_atom(char type, lo_arg* arg) {
switch (type) {
case 'i':
return Atom(arg->i);
case 'f':
return Atom(arg->f);
case 's':
return Atom(&arg->s);
//case 'b'
// FIXME: How to get a blob from a lo_arg?
//return Atom(arg->b);
default:
return Atom();
}
}
};
#endif // LIBLO_ATOM_H

View File

@ -2,4 +2,6 @@ EXTRA_DIST = \
CountedPtr.h \
Path.h \
Queue.h \
Semaphore.h
Semaphore.h \
Atom.h \
LibloAtom.h