diff options
author | Christian Pointner <equinox@spreadspace.org> | 2015-10-13 02:27:56 +0200 |
---|---|---|
committer | Christian Pointner <equinox@spreadspace.org> | 2015-10-13 02:28:01 +0200 |
commit | 6bc291c0fd3e1760ca4bfeaf33b38cbb4b21830c (patch) | |
tree | 887c41ec771a48d3323c9d2a2e0d7f6c86c36736 /app/osc_client.c | |
parent | renamed files to prepare merge of code dirs (diff) |
merged app sources to single folder
Diffstat (limited to 'app/osc_client.c')
-rw-r--r-- | app/osc_client.c | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/app/osc_client.c b/app/osc_client.c new file mode 100644 index 0000000..a70eb67 --- /dev/null +++ b/app/osc_client.c @@ -0,0 +1,123 @@ +/* + * dolmetschctl + * + * + * Copyright (C) 2015 Christian Pointner <equinox@spreadspace.org> + * + * This file is part of dolmetschctl. + * + * dolmetschctl 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 + * any later version. + * + * dolmetschctl 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 dolmetschctl. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "config.h" + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <error.h> +#include <assert.h> + +#include "osc_client.h" +#include "midi_client.h" + + +static void print_error(int num, const char *msg, const char *path) +{ + error(0, 0, "liblo server error %d in path %s: %s", num, path, msg); +} + +static int lang_handler(const char *path, const char *types, lo_arg ** argv, + int argc, lo_message msg, void *user_data) +{ + osc_t* o = (osc_t*)user_data; + assert(o); + + if(argc != 1 || !lo_is_string_type((lo_type)types[0])) + return 1; + +// printf("got ack for: lang '%s'\n", &(argv[0]->s)); + midi_enqueue_cmd((midi_t*)o->m_, &(argv[0]->s)); + + return 0; +} + +int osc_init(osc_t* o, void* m, const char* host, const char* port) +{ + assert(o != NULL); + + o->server_ = NULL; + o->target_ = lo_address_new(host, port); + o->m_ = m; + + if(!port) + return 0; + + o->server_ = lo_server_new(NULL, print_error); + if(!o->server_) + return -1; + + if(!lo_server_add_method(o->server_, "/lang/ack", "s", lang_handler, (void*)o)) + return -1; + + return 0; +} + +int osc_switch_lang(osc_t* o, const char* lang) +{ + lo_send_from(o->target_, o->server_, LO_TT_IMMEDIATE, "/lang/switch", "s", lang); + return 0; +} + +int osc_get_poll_fd_count(osc_t* o) +{ + assert(o); + + if(!o->server_) + return 0; + + return 1; +} + +int osc_get_poll_fds(osc_t* o, struct pollfd *pfds, int npfds) +{ + assert(o); + + if(!o->server_) + return 0; + + pfds[0].fd = lo_server_get_socket_fd(o->server_); + pfds[0].events = POLLIN; + pfds[0].revents = 0; + + return 0; +} + +int osc_handle_revents(osc_t* o, struct pollfd *pfds, int npfds) +{ + assert(o); + + if(!o->server_) + return 0; + + if(pfds[0].revents & (POLLERR | POLLHUP | POLLNVAL)) { + error(0, 0, "OSC: got POLLERR, POLLHUP or POLLNVAL"); + return -1; + } + if(!(pfds[0].revents & POLLIN)) + return 0; + + lo_server_recv_noblock(o->server_, 0); + + return 0; +} |