aboutsummaryrefslogtreecommitdiffhomepage
path: root/backends/rtpmidi.c
blob: f77f93bf154dc0979fc328dcb0ef24b69843bf1c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <string.h>
#include <unistd.h>

#include "rtpmidi.h"

#define BACKEND_NAME "rtpmidi"

/** rtpMIDI backend w/ AppleMIDI support
 *
 * Global configuration
 * 	bind = 0.0.0.0
 * 	apple-bind = 0.0.0.1
 * 	mdns-bind = 0.0.0.0
 * 	mdns-name = mdns-name
 * 
 * Instance configuration
 * 	interface = 0
 * 	(opt) ssrc = X
 *
 * 	apple-session = session-name
 * 	apple-invite = invite-peer
 * 	apple-allow = *
 * or
 * 	connect = 
 * 	reply-any = 1
 */

static struct /*_rtpmidi_global*/ {
	int mdns_fd;
	char* mdns_name;
	size_t nfds;
	rtpmidi_fd* fds;
} cfg = {
	.mdns_fd = -1,
	.mdns_name = NULL,
	.nfds = 0,
	.fds = NULL
};

int init(){
	backend rtpmidi = {
		.name = BACKEND_NAME,
		.conf = rtpmidi_configure,
		.create = rtpmidi_instance,
		.conf_instance = rtpmidi_configure_instance,
		.channel = rtpmidi_channel,
		.handle = rtpmidi_set,
		.process = rtpmidi_handle,
		.start = rtpmidi_start,
		.shutdown = rtpmidi_shutdown
	};

	if(mm_backend_register(rtpmidi)){
		fprintf(stderr, "Failed to register rtpMIDI backend\n");
		return 1;
	}

	return 0;
}

static int rtpmidi_configure(char* option, char* value){
	if(!strcmp(option, "mdns-name")){
		if(cfg.mdns_name){
			free(cfg.mdns_name);
		}

		cfg.mdns_name = strdup(value);
		if(!cfg.mdns_name){
			fprintf(stderr, "Failed to allocate memory\n");
			return 1;
		}
		//TODO this should create the mdns broadcaster and responder socket
		return 0;
	}
	else if(!strcmp(option, "bind")){
		//TODO open listening control and data fds
	}

	fprintf(stderr, "Unknown rtpMIDI backend option %s\n", option);
	return 1;
}

static int rtpmidi_configure_instance(instance* inst, char* option, char* value){
	//TODO
	return 1;
}

static instance* rtpmidi_instance(){
	//TODO
	return NULL;
}

static channel* rtpmidi_channel(instance* inst, char* spec){
	//TODO
	return NULL;
}

static int rtpmidi_set(instance* inst, size_t num, channel** c, channel_value* v){
	//TODO
	return 1;
}

static int rtpmidi_handle(size_t num, managed_fd* fds){
	//TODO
	return 1;
}

static int rtpmidi_start(){
	//TODO
	return 1;
}

static int rtpmidi_shutdown(){
	size_t u;

	free(cfg.mdns_name);
	if(cfg.mdns_fd >= 0){
		close(cfg.mdns_fd);
	}

	for(u = 0; u < cfg.nfds; u++){
		if(cfg.fds[u].data >= 0){
			close(cfg.fds[u].data);
		}
		if(cfg.fds[u].control >= 0){
			close(cfg.fds[u].control);
		}
	}
	return 0;
}