summaryrefslogtreecommitdiff
path: root/apps/dolmetschctl.c
blob: b8f9197475169f15b2b90d73d79404a1bb03800a (plain) (blame)
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
/*
 *  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 "osc.h"
#include "midi.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(osc_t* o, midi_t* m)
{
  int ret = 0;

  printf("main_loop just started\n");

  int midi_npfds_offset = 0;
  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;
  struct pollfd *pfds = alloca(npfds * sizeof(struct pollfd));


  midi_get_poll_fds(m, &(pfds[midi_npfds_offset]), midi_npfds);
  osc_get_poll_fds(o, &(pfds[osc_npfds_offset]), osc_npfds);

  printf("main_loop running...\n");
  for (;;) {
    int err = poll(pfds, npfds, 200);
    if(err < 0) {
      if(errno == EINTR)
        continue;

      error(0, errno, "poll failed");
      break;
    }
    if(err == 0) {
          // timeout is reached
      continue;
    }

    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[])
{
  osc_t o;
  if(osc_init(&o, "1200"))
    return -1;

  midi_t m;
  if(midi_init(&m, "hw:2,0,0"))
    return -1;

  int ret = main_loop(&o, &m);

  return ret;
}