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
|
//=========================================================
// MusE
// Linux Music Editor
// software synthesizer helper library
// $Id: gui.cpp,v 1.7 2005/05/11 14:18:48 wschweer Exp $
//
// (C) Copyright 2004 Werner Schweer (ws@seh.de)
//=========================================================
#include "gui.h"
#include "muse/midi.h"
#include <unistd.h>
//---------------------------------------------------------
// MessGui
//---------------------------------------------------------
MessGui::MessGui()
{
//
// prepare for interprocess communication:
//
int filedes[2]; // 0 - reading 1 - writing
if (pipe(filedes) == -1) {
perror("thread:creating pipe4");
exit(-1);
}
readFd = filedes[0];
writeFd = filedes[1];
wFifoSize = 0;
wFifoWindex = 0;
wFifoRindex = 0;
rFifoSize = 0;
rFifoWindex = 0;
rFifoRindex = 0;
}
//---------------------------------------------------------
// MessGui
//---------------------------------------------------------
MessGui::~MessGui()
{
}
//---------------------------------------------------------
// readMessage
//---------------------------------------------------------
void MessGui::readMessage()
{
char c;
while (rFifoSize) {
::read(readFd, &c, 1);
processEvent(rFifo[rFifoRindex]);
rFifoRindex = (rFifoRindex + 1) % EVENT_FIFO_SIZE;
--rFifoSize;
}
}
//---------------------------------------------------------
// sendController
//---------------------------------------------------------
void MessGui::sendController(int ch, int idx, int val)
{
sendEvent(MidiEvent(0, ch, ME_CONTROLLER, idx, val));
}
//---------------------------------------------------------
// sendSysex
//---------------------------------------------------------
void MessGui::sendSysex(unsigned char* p, int n)
{
sendEvent(MidiEvent(0, ME_SYSEX, p, n));
}
//---------------------------------------------------------
// writeEvent
// send an event to synti gui
//---------------------------------------------------------
void MessGui::writeEvent(const MidiEvent& ev)
{
if (rFifoSize == EVENT_FIFO_SIZE) {
printf("event synti->gui fifo overflow\n");
return;
}
rFifo[rFifoWindex] = ev;
rFifoWindex = (rFifoWindex + 1) % EVENT_FIFO_SIZE;
++rFifoSize;
write(writeFd, "x", 1); // wakeup GUI
}
//---------------------------------------------------------
// sendEvent
//---------------------------------------------------------
void MessGui::sendEvent(const MidiEvent& ev)
{
if (wFifoSize == EVENT_FIFO_SIZE) {
printf("event gui->synti fifo overflow\n");
return;
}
wFifo[wFifoWindex] = ev;
wFifoWindex = (wFifoWindex + 1) % EVENT_FIFO_SIZE;
++wFifoSize;
}
//---------------------------------------------------------
// readEvent
// read event from synti gui
//---------------------------------------------------------
MidiEvent MessGui::readEvent()
{
MidiEvent ev = wFifo[wFifoRindex];
wFifoRindex = (wFifoRindex + 1) % EVENT_FIFO_SIZE;
--wFifoSize;
return ev;
}
|