aboutsummaryrefslogtreecommitdiffstats
path: root/ns/ext/osc/lv2_osc.c
diff options
context:
space:
mode:
Diffstat (limited to 'ns/ext/osc/lv2_osc.c')
-rw-r--r--ns/ext/osc/lv2_osc.c238
1 files changed, 0 insertions, 238 deletions
diff --git a/ns/ext/osc/lv2_osc.c b/ns/ext/osc/lv2_osc.c
deleted file mode 100644
index afea2c9..0000000
--- a/ns/ext/osc/lv2_osc.c
+++ /dev/null
@@ -1,238 +0,0 @@
-/* LV2 OSC Messages Extension
- * Copyright (C) 2007-2009 David Robillard
- *
- * This program 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 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <errno.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include "lv2_osc.h"
-#include "lv2_osc_print.h"
-
-/*#ifndef BIG_ENDIAN
- #ifndef LITTLE_ENDIAN
- #warning This code requires BIG_ENDIAN or LITTLE_ENDIAN to be defined
- #warning Assuming little endian. THIS MAY BREAK HORRIBLY!
- #endif
-#endif*/
-
-#define lv2_osc_swap32(x) \
-({ \
- uint32_t __x = (x); \
- ((uint32_t)( \
- (((uint32_t)(__x) & (uint32_t)0x000000ffUL) << 24) | \
- (((uint32_t)(__x) & (uint32_t)0x0000ff00UL) << 8) | \
- (((uint32_t)(__x) & (uint32_t)0x00ff0000UL) >> 8) | \
- (((uint32_t)(__x) & (uint32_t)0xff000000UL) >> 24) )); \
-})
-
-#define lv2_osc_swap64(x) \
-({ \
- uint64_t __x = (x); \
- ((uint64_t)( \
- (uint64_t)(((uint64_t)(__x) & (uint64_t)0x00000000000000ffULL) << 56) | \
- (uint64_t)(((uint64_t)(__x) & (uint64_t)0x000000000000ff00ULL) << 40) | \
- (uint64_t)(((uint64_t)(__x) & (uint64_t)0x0000000000ff0000ULL) << 24) | \
- (uint64_t)(((uint64_t)(__x) & (uint64_t)0x00000000ff000000ULL) << 8) | \
- (uint64_t)(((uint64_t)(__x) & (uint64_t)0x000000ff00000000ULL) >> 8) | \
- (uint64_t)(((uint64_t)(__x) & (uint64_t)0x0000ff0000000000ULL) >> 24) | \
- (uint64_t)(((uint64_t)(__x) & (uint64_t)0x00ff000000000000ULL) >> 40) | \
- (uint64_t)(((uint64_t)(__x) & (uint64_t)0xff00000000000000ULL) >> 56) )); \
-})
-
-
-/** Pad a size to a multiple of 32 bits */
-inline static uint32_t
-lv2_osc_pad_size(uint32_t size)
-{
- return size + 3 - ((size-1) % 4);
-}
-
-
-inline static uint32_t
-lv2_osc_string_size(const char *s)
-{
- return lv2_osc_pad_size((uint32_t)strlen(s) + 1);
-}
-
-
-static inline uint32_t
-lv2_osc_blob_size(const void* blob)
-{
- return sizeof(uint32_t) + lv2_osc_pad_size(*((uint32_t*)blob));
-}
-
-
-uint32_t
-lv2_osc_arg_size(char type, const LV2_OSC_Argument* arg)
-{
- switch (type) {
- case 'c':
- case 'i':
- case 'f':
- case 'S': // Symbol (URI-mapped integer)
- return 4;
-
- case 'h':
- case 'd':
- return 8;
-
- case 's':
- return lv2_osc_string_size(&arg->s);
-
- case 'b':
- return lv2_osc_blob_size(&arg->b);
-
- default:
- fprintf(stderr, "Warning: unknown OSC type '%c'.", type);
- return 0;
- }
-}
-
-
-void
-lv2_osc_argument_swap_byte_order(char type, LV2_OSC_Argument* arg)
-{
- switch (type) {
- case 'i':
- case 'f':
- case 'b':
- case 'c':
- *(int32_t*)arg = lv2_osc_swap32(*(int32_t*)arg);
- break;
-
- case 'h':
- case 'd':
- *(int64_t*)arg = lv2_osc_swap64(*(int64_t*)arg);
- break;
- }
-}
-
-
-/** Convert a message from network byte order to host byte order. */
-void
-lv2_osc_message_swap_byte_order(LV2_OSC_Event* msg)
-{
- const char* const types = lv2_osc_get_types(msg);
-
- for (uint32_t i=0; i < msg->argument_count; ++i)
- lv2_osc_argument_swap_byte_order(types[i], lv2_osc_get_argument(msg, i));
-}
-
-
-/** Not realtime safe, returned value must be free()'d by caller. */
-LV2_OSC_Event*
-lv2_osc_message_new(const char* path, const char* types, ...)
-{
- /* FIXME: path only */
-
- LV2_OSC_Event* result = malloc(sizeof(LV2_OSC_Event)
- + 4 + lv2_osc_string_size(path));
-
- const uint32_t path_size = lv2_osc_string_size(path);
- result->data_size = path_size + 4; // 4 for types
- result->argument_count = 0;
- result->types_offset = lv2_osc_string_size(path) + 1;
- (&result->data)[result->types_offset - 1] = ',';
- (&result->data)[result->types_offset] = '\0';
-
- memcpy(&result->data, path, strlen(path) + 1);
-
- return result;
-}
-
-
-/** Create a new LV2_OSC_Event from a raw OSC message.
- *
- * If \a out_buf is NULL, new memory will be allocated. Otherwise the returned
- * value will be equal to buf, unless there is insufficient space in which
- * case NULL is returned.
- */
-LV2_OSC_Event*
-lv2_osc_message_from_raw(uint32_t out_buf_size,
- void* out_buf,
- uint32_t raw_msg_size,
- void* raw_msg)
-{
- const uint32_t message_header_size = (sizeof(uint32_t) * 4);
-
- const uint32_t path_size = lv2_osc_string_size((char*)raw_msg);
- const uint32_t types_len = strlen((char*)(raw_msg + path_size + 1));
- uint32_t index_size = types_len * sizeof(uint32_t);
-
- if (out_buf == NULL) {
- out_buf_size = message_header_size + index_size + raw_msg_size;
- out_buf = malloc((size_t)out_buf_size);
- } else if (out_buf && out_buf_size < message_header_size + raw_msg_size) {
- return NULL;
- }
-
- LV2_OSC_Event* write_loc = (LV2_OSC_Event*)(out_buf);
- write_loc->argument_count = types_len;
- write_loc->data_size = index_size + raw_msg_size;
-
- // Copy raw message
- memcpy(&write_loc->data + index_size, raw_msg, raw_msg_size);
-
- write_loc->types_offset = index_size + path_size + 1;
- const char* const types = lv2_osc_get_types(write_loc);
-
- // Calculate/Write index
- uint32_t args_base_offset = write_loc->types_offset + lv2_osc_string_size(types) - 1;
- uint32_t arg_offset = 0;
-
- for (uint32_t i=0; i < write_loc->argument_count; ++i) {
- ((uint32_t*)&write_loc->data)[i] = args_base_offset + arg_offset;
- const LV2_OSC_Argument* const arg = (LV2_OSC_Argument*)(&write_loc->data + args_base_offset + arg_offset);
- // Special case because size is still big-endian
-#ifndef BIG_ENDIAN
- if (types[i] == 'b') // special case because size is still big-endian
- arg_offset += lv2_osc_swap32(*((int32_t*)arg));
- else
-#endif
- arg_offset += lv2_osc_arg_size(types[i], arg);
- }
-
- /*printf("Index:\n");
- for (uint32_t i=0; i < write_loc->argument_count; ++i) {
- printf("%u ", ((uint32_t*)&write_loc->data)[i]);
- }
- printf("\n");
-
- printf("Data:\n");
- for (uint32_t i=0; i < (write_loc->argument_count * 4) + size; ++i) {
- printf("%3u", i % 10);
- }
- printf("\n");
- for (uint32_t i=0; i < (write_loc->argument_count * 4) + size; ++i) {
- char c = *(((char*)&write_loc->data) + i);
- if (c >= 32 && c <= 126)
- printf("%3c", c);
- else
- printf("%3d", (int)c);
- }
- printf("\n");*/
-
- // Swap to host byte order if necessary
-#ifndef BIG_ENDIAN
- lv2_osc_message_swap_byte_order(write_loc);
-#endif
-
- printf("Created message:\n");
- lv2_osc_message_print(write_loc);
-
- return write_loc;
-}