Browse Source

Change to use IPv6 compatible addressing

master
cancel 6 years ago
parent
commit
e093799b07
  1. 35
      osc_out.c
  2. 17
      osc_out.h
  3. 48
      tui_main.c

35
osc_out.c

@ -1,27 +1,37 @@
#include "osc_out.h" #include "osc_out.h"
//#include <sys/socket.h>
#include <arpa/inet.h>
#include <errno.h> #include <errno.h>
#include <netdb.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
struct Oosc_dev { struct Oosc_dev {
int fd; int fd;
struct sockaddr_in addr; struct addrinfo* addr;
}; };
Oosc_udp_create_error oosc_dev_create_udp(Oosc_dev** out_ptr, Oosc_udp_create_error oosc_dev_create_udp(Oosc_dev** out_ptr,
char const* dest_addr, U16 port) { char const* dest_addr,
int udpfd = socket(AF_INET, SOCK_DGRAM, 0); char const* dest_port) {
struct addrinfo hints;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_protocol = 0;
hints.ai_flags = AI_ADDRCONFIG;
struct addrinfo* addr = NULL;
int err = getaddrinfo(dest_addr, dest_port, &hints, &addr);
if (err != 0) {
fprintf(stderr, "Failed to get address info, error: %d\n", errno);
return Oosc_udp_create_error_getaddrinfo_failed;
}
int udpfd = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
if (udpfd < 0) { if (udpfd < 0) {
fprintf(stderr, "Failed to open UDP socket, error number: %d\n", errno); fprintf(stderr, "Failed to open UDP socket, error number: %d\n", errno);
freeaddrinfo(addr);
return Oosc_udp_create_error_couldnt_open_socket; return Oosc_udp_create_error_couldnt_open_socket;
} }
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(dest_addr);
addr.sin_port = htons((U16)port);
Oosc_dev* dev = malloc(sizeof(Oosc_dev)); Oosc_dev* dev = malloc(sizeof(Oosc_dev));
dev->fd = udpfd; dev->fd = udpfd;
dev->addr = addr; dev->addr = addr;
@ -31,12 +41,13 @@ Oosc_udp_create_error oosc_dev_create_udp(Oosc_dev** out_ptr,
void oosc_dev_destroy(Oosc_dev* dev) { void oosc_dev_destroy(Oosc_dev* dev) {
close(dev->fd); close(dev->fd);
freeaddrinfo(dev->addr);
free(dev); free(dev);
} }
void oosc_send_datagram(Oosc_dev* dev, char const* data, Usz size) { void oosc_send_datagram(Oosc_dev* dev, char const* data, Usz size) {
ssize_t res = sendto(dev->fd, data, size, 0, (struct sockaddr*)&dev->addr, ssize_t res =
sizeof(dev->addr)); sendto(dev->fd, data, size, 0, dev->addr->ai_addr, dev->addr->ai_addrlen);
if (res < 0) { if (res < 0) {
fprintf(stderr, "UDP message send failed\n"); fprintf(stderr, "UDP message send failed\n");
exit(1); exit(1);

17
osc_out.h

@ -4,11 +4,13 @@ typedef struct Oosc_dev Oosc_dev;
typedef enum { typedef enum {
Oosc_udp_create_error_ok = 0, Oosc_udp_create_error_ok = 0,
Oosc_udp_create_error_couldnt_open_socket = 1, Oosc_udp_create_error_getaddrinfo_failed = 1,
Oosc_udp_create_error_couldnt_open_socket = 2,
} Oosc_udp_create_error; } Oosc_udp_create_error;
Oosc_udp_create_error oosc_dev_create_udp(Oosc_dev** out_dev_ptr, Oosc_udp_create_error oosc_dev_create_udp(Oosc_dev** out_ptr,
char const* dest_addr, U16 port); char const* dest_addr,
char const* dest_port);
void oosc_dev_destroy(Oosc_dev* dev); void oosc_dev_destroy(Oosc_dev* dev);
// raw UDP datagram // raw UDP datagram
void oosc_send_datagram(Oosc_dev* dev, char const* data, Usz size); void oosc_send_datagram(Oosc_dev* dev, char const* data, Usz size);
@ -32,10 +34,11 @@ void susnote_list_clear(Susnote_list* sl);
void susnote_list_add_notes(Susnote_list* sl, Susnote const* restrict notes, void susnote_list_add_notes(Susnote_list* sl, Susnote const* restrict notes,
Usz count, Usz* restrict start_removed, Usz count, Usz* restrict start_removed,
Usz* restrict end_removed); Usz* restrict end_removed);
void susnote_list_advance_time(Susnote_list* sl, double delta_time, void susnote_list_advance_time(
Usz* restrict start_removed, Susnote_list* sl, double delta_time, Usz* restrict start_removed,
Usz* restrict end_removed, Usz* restrict end_removed,
// 1.0 if no notes remain or none shorter than 1.0 // 1.0 if no notes remain or none are shorter than 1.0
double* soonest_deadline); double* soonest_deadline);
// 1.0 if no notes remain or none shorter than 1.0
// Returns 1.0 if no notes remain or none are shorter than 1.0
double susnote_list_soonest_deadline(Susnote_list const* sl); double susnote_list_soonest_deadline(Susnote_list const* sl);

48
tui_main.c

@ -24,19 +24,19 @@ static void usage() {
" Default: 2\n" " Default: 2\n"
" -h or --help Print this message and exit.\n" " -h or --help Print this message and exit.\n"
"\n" "\n"
"OSC options:\n" "OSC/MIDI options:\n"
" --osc-server <address>\n" " --osc-server <hotname>\n"
" IP address to send OSC messages to.\n" " Hostname or IP address to send OSC messages to.\n"
" Default: 127.0.0.1\n" " Default: localhost\n"
"\n" "\n"
" --osc-port <number>\n" " --osc-port <number or service name>\n"
" UDP Port to send OSC messages to.\n" " UDP port (or service name) to send OSC messages to.\n"
" Default: none\n" " Default: none\n"
"\n" "\n"
" --osc-midi-bidule <path>\n" " --osc-midi-bidule <path>\n"
" Set MIDI to send to via OSC formatted for Plogue Bidule.\n" " Set MIDI to be sent via OSC formatted for Plogue Bidule.\n"
" The path argument is the path of the Plogue OSC MIDI device.\n" " The path argument is the path of the Plogue OSC MIDI device.\n"
" Example: /OSC_MIDI_0\n" " Example: /OSC_MIDI_0/MIDI\n"
); );
// clang-format on // clang-format on
} }
@ -566,13 +566,14 @@ bool app_is_draw_dirty(App_state* a) {
return a->is_draw_dirty || a->needs_remarking; return a->is_draw_dirty || a->needs_remarking;
} }
bool app_set_osc_udp(App_state* a, char const* dest_addr, U16 port) { bool app_set_osc_udp(App_state* a, char const* dest_addr,
char const* dest_port) {
if (a->oosc_dev) { if (a->oosc_dev) {
oosc_dev_destroy(a->oosc_dev); oosc_dev_destroy(a->oosc_dev);
a->oosc_dev = NULL; a->oosc_dev = NULL;
} }
Oosc_udp_create_error err = Oosc_udp_create_error err =
oosc_dev_create_udp(&a->oosc_dev, dest_addr, port); oosc_dev_create_udp(&a->oosc_dev, dest_addr, dest_port);
if (err) { if (err) {
return false; return false;
} }
@ -976,8 +977,8 @@ int main(int argc, char** argv) {
{NULL, 0, NULL, 0}}; {NULL, 0, NULL, 0}};
char* input_file = NULL; char* input_file = NULL;
int margin_thickness = 2; int margin_thickness = 2;
U16 osc_port = 0; char const* osc_ip_send_addr = NULL;
char const* osc_ip_send_addr = "127.0.0.1"; char const* osc_port = NULL;
Midi_mode midi_mode; Midi_mode midi_mode;
midi_mode_init(&midi_mode); midi_mode_init(&midi_mode);
for (;;) { for (;;) {
@ -1002,15 +1003,7 @@ int main(int argc, char** argv) {
osc_ip_send_addr = optarg; osc_ip_send_addr = optarg;
} break; } break;
case Argopt_osc_port: { case Argopt_osc_port: {
int osc_port0 = atoi(optarg); osc_port = optarg;
if (osc_port0 <= 0) {
fprintf(stderr, "OSC port must be greater than 0.\n");
return 1;
} else if (osc_port0 > UINT16_MAX) {
fprintf(stderr, "OSC port must be <= %d\n", (int)UINT16_MAX);
return 1;
}
osc_port = (U16)osc_port0;
} break; } break;
case Argopt_osc_midi_bidule: { case Argopt_osc_midi_bidule: {
midi_mode_set_osc_bidule(&midi_mode, optarg); midi_mode_set_osc_bidule(&midi_mode, optarg);
@ -1037,9 +1030,18 @@ int main(int argc, char** argv) {
App_state app_state; App_state app_state;
app_init(&app_state); app_init(&app_state);
if (osc_port != 0) { if (osc_ip_send_addr != NULL && osc_port == NULL) {
fprintf(stderr,
"An OSC server address was specified, but no OSC port was "
"specified.\n"
"OSC output is not possible without specifying an OSC port.\n");
app_deinit(&app_state);
exit(1);
}
if (osc_port != NULL) {
if (!app_set_osc_udp(&app_state, osc_ip_send_addr, osc_port)) { if (!app_set_osc_udp(&app_state, osc_ip_send_addr, osc_port)) {
fprintf(stderr, "Failed to open OSC UDP port %d\n", (int)osc_port); fprintf(stderr, "Failed to set up OSC networking\n");
app_deinit(&app_state);
exit(1); exit(1);
} }
} }

Loading…
Cancel
Save