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
|
/*
* 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 <error.h>
#include "mixer.h"
#include "midi.h"
#include "osc.h"
void print_version()
{
printf("%s\n", VERSION_STRING_0);
#if defined(__clang__)
printf("%s, using CLANG %s\n", VERSION_STRING_1, __clang_version__);
#elif defined(__GNUC__)
printf("%s, using GCC %d.%d.%d\n", VERSION_STRING_1, __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
#else
printf("%s\n", VERSION_STRING_1);
#endif
}
int main_loop(mixer_t* x, midi_t* m, osc_t* o)
{
int ret = 0;
printf("main_loop just started\n");
int mixer_npfds_offset = 0;
int mixer_npfds = mixer_get_poll_fd_count(x);
assert(mixer_npfds > 0);
int midi_npfds_offset = mixer_npfds_offset + mixer_npfds;
int midi_npfds = midi_get_poll_fd_count(m);
assert(midi_npfds > 0);
int osc_npfds_offset = midi_npfds_offset + midi_npfds;
int osc_npfds = osc_get_poll_fd_count(o);
assert(osc_npfds > 0);
int npfds = midi_npfds + osc_npfds + mixer_npfds;
struct pollfd *pfds = alloca(npfds * sizeof(struct pollfd));
if(!pfds) {
error(0, 0, "error while allocating poll fds - stack corrupted??");
return -1;
}
mixer_get_poll_fds(x, &(pfds[mixer_npfds_offset]), mixer_npfds);
midi_get_poll_fds(m, &(pfds[midi_npfds_offset]), midi_npfds);
osc_get_poll_fds(o, &(pfds[osc_npfds_offset]), osc_npfds);
mixer_print_langs(x);
printf("main_loop running with %d pollfds...\n", npfds);
for (;;) {
int err = poll(pfds, npfds, 200);
if(err < 0 && errno != EINTR) {
error(0, errno, "poll failed");
break;
}
if(err <= 0) {
// timeout or EINTR
continue;
}
ret = mixer_handle_revents(x, &(pfds[mixer_npfds_offset]), mixer_npfds);
if(ret)
break;
ret = midi_handle_revents(m, &(pfds[midi_npfds_offset]), midi_npfds);
if(ret)
break;
ret = osc_handle_revents(o, &(pfds[osc_npfds_offset]), osc_npfds);
if(ret)
break;
}
return ret;
}
int main(int argc, char* argv[])
{
mixer_t x;
if(mixer_init(&x, "qu24", "hw:2,0,0"))
return -1;
midi_t m;
if(midi_init(&m, "hw:3,0,0"))
return -1;
osc_t o;
if(osc_init(&o, "1200"))
return -1;
int ret = main_loop(&x, &m, &o);
return ret;
}
|