/*
This file is part of Ingen.
Copyright 2007-2012 David Robillard
Ingen is free software: you can redistribute it and/or modify it under the
terms of the GNU Affero General Public License as published by the Free
Software Foundation, either version 3 of the License, or 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 Affero General Public License for details.
You should have received a copy of the GNU Affero General Public License
along with Ingen. If not, see .
*/
#include
#include
#include
#include "raul/log.hpp"
#include "OSCSender.hpp"
#include "ingen_config.h"
using namespace std;
using namespace Raul;
namespace Ingen {
namespace Shared {
OSCSender::OSCSender(size_t max_packet_size)
: _bundle(NULL)
, _address(NULL)
, _max_packet_size(max_packet_size)
, _enabled(true)
{
}
void
OSCSender::bundle_begin()
{
assert(!_bundle);
lo_timetag t;
lo_timetag_now(&t);
_bundle = lo_bundle_new(t);
}
void
OSCSender::bundle_end()
{
assert(_bundle);
lo_send_bundle(_address, _bundle);
lo_bundle_free_messages(_bundle);
_bundle = NULL;
}
int
OSCSender::send(const char *path, const char *types, ...)
{
if (!_enabled)
return 0;
#ifdef RAUL_LOG_DEBUG
info << "[OSCSender] " << path << " (" << types << ")" << endl;
#endif
va_list args;
va_start(args, types);
lo_message msg = lo_message_new();
int ret = lo_message_add_varargs(msg, types, args);
if (!ret)
send_message(path, msg);
else
lo_message_free(msg);
va_end(args);
return ret;
}
void
OSCSender::send_message(const char* path, lo_message msg)
{
if (!_enabled) {
lo_message_free(msg);
return;
}
if (_bundle) {
if (lo_bundle_length(_bundle) + lo_message_length(msg, path) > _max_packet_size) {
warn << "Maximum bundle size reached, bundle split" << endl;
lo_send_bundle(_address, _bundle);
lo_bundle_free_messages(_bundle);
lo_timetag t;
lo_timetag_now(&t);
_bundle = lo_bundle_new(t);
}
lo_bundle_add_message(_bundle, path, msg);
} else {
lo_send_message(_address, path, msg);
lo_message_free(msg);
}
}
} // namespace Shared
} // namespace Ingen