comparison core/Midi.cpp @ 191:b3a306da03e0

Implemented Midi output
author Giulio Moro <giuliomoro@yahoo.it>
date Wed, 03 Feb 2016 01:18:30 +0000
parents 9108a0a34cb8
children 265a527f8be8
comparison
equal deleted inserted replaced
189:7144c5594d16 191:b3a306da03e0
7 7
8 #include "Midi.h" 8 #include "Midi.h"
9 #include <fcntl.h> 9 #include <fcntl.h>
10 #include <errno.h> 10 #include <errno.h>
11 11
12 #define kMidiInput 0
13 #define kMidiOutput 1
14
12 bool Midi::staticConstructed; 15 bool Midi::staticConstructed;
13 AuxiliaryTask Midi::midiInputTask; 16 AuxiliaryTask Midi::midiInputTask;
14 AuxiliaryTask Midi::midiOutputTask; 17 AuxiliaryTask Midi::midiOutputTask;
15 std::vector<Midi *> Midi::objAddrs(0); 18 std::vector<Midi *> Midi::objAddrs[2];
16 19
17 Midi::Midi(){ 20 Midi::Midi(){
18 outputPort = -1; 21 outputPort = -1;
19 inputPort = -1; 22 inputPort = -1;
20 size_t inputBytesInitialSize = 1000; 23 size_t inputBytesInitialSize = 1000;
21 inputBytes.resize(inputBytesInitialSize); 24 inputBytes.resize(inputBytesInitialSize);
25 outputBytes.resize(inputBytesInitialSize);
22 inputBytesWritePointer = 0; 26 inputBytesWritePointer = 0;
23 inputBytesReadPointer = inputBytes.size() - 1; 27 inputBytesReadPointer = inputBytes.size() - 1;
24 if(!staticConstructed){ 28 if(!staticConstructed){
25 staticConstructor(); 29 staticConstructor();
26 } 30 }
27 } 31 }
28 32
29 void Midi::staticConstructor(){ 33 void Midi::staticConstructor(){
30 staticConstructed = true; 34 staticConstructed = true;
31 midiInputTask = BeagleRT_createAuxiliaryTask(Midi::midiInputLoop, 50, "MidiInput"); 35 midiInputTask = BeagleRT_createAuxiliaryTask(Midi::midiInputLoop, 50, "MidiInput");
32 midiOutputTask = BeagleRT_createAuxiliaryTask(Midi::midiInputLoop, 50, "MidiOutupt"); 36 midiOutputTask = BeagleRT_createAuxiliaryTask(Midi::midiOutputLoop, 50, "MidiOutupt");
33 } 37 }
34 38
35 Midi::~Midi(){} 39 Midi::~Midi(){}
40 void Midi::midiInputLoop(){
41 printf("Midi input loop %d\n", objAddrs[kMidiInput].size());
42 for(unsigned int n = 0; n < objAddrs[kMidiInput].size(); n++){
43 objAddrs[kMidiInput][n] -> readInputLoop();
44 }
45 }
36 46
37 void Midi::midiInputLoop(){ 47 void Midi::midiOutputLoop(){
38 printf("Midi input loop %d\n", objAddrs.size()); 48 printf("Midi output loop %d\n", objAddrs[kMidiOutput].size());
39 for(unsigned int n = 0; n < objAddrs.size(); n++){ 49 for(unsigned int n = 0; n < objAddrs[kMidiOutput].size(); n++){
40 objAddrs[n] -> readInputLoop(); 50 objAddrs[kMidiOutput][n] -> writeOutputLoop();
41 } 51 }
42 } 52 }
43 53
44 void Midi::readInputLoop(){ 54 void Midi::readInputLoop(){
45 while(!gShouldStop){ 55 while(!gShouldStop){
46 int maxBytesToRead = inputBytes.size() - inputBytesWritePointer; 56 int maxBytesToRead = inputBytes.size() - inputBytesWritePointer;
47 int ret = read(inputPort, &inputBytes[inputBytesWritePointer], sizeof(midi_byte_t)*maxBytesToRead); 57 int ret = read(inputPort, &inputBytes[inputBytesWritePointer], sizeof(midi_byte_t)*maxBytesToRead);
48 static int count = 0;
49 count++;
50 if(ret < 0){ 58 if(ret < 0){
51 if(errno != EAGAIN){ // read() would return EAGAIN when no data are available to read just now 59 if(errno != EAGAIN){ // read() would return EAGAIN when no data are available to read just now
52 rt_printf("Error while reading midi %d\n", errno); 60 rt_printf("Error while reading midi %d\n", errno);
53 } 61 }
54 usleep(1000); 62 usleep(1000);
62 usleep(1000); 70 usleep(1000);
63 } // otherwise there might be more data ready to be read, so don't sleep 71 } // otherwise there might be more data ready to be read, so don't sleep
64 } 72 }
65 } 73 }
66 74
75 void Midi::writeOutputLoop(){
76 while(!gShouldStop){
77 usleep(1000);
78 int length = outputBytesWritePointer - outputBytesReadPointer;
79 if(length < 0){
80 length = outputBytes.size() - outputBytesReadPointer;
81 }
82 if(length == 0){ //nothing to be written
83 continue;
84 }
85 int ret;
86 ret = write(outputPort, &outputBytes[outputBytesReadPointer], sizeof(midi_byte_t)*length);
87 if(ret < 0){ //error occurred
88 // if(errno != EAGAIN){ // () would return EAGAIN when no data are available to read just now
89 // rt_printf("Error while writing midi %d\n", errno);
90 // }
91 rt_printf("error occurred while writing: %d\n", errno);
92 usleep(10000); //wait before retrying
93 continue;
94 }
95
96 // inputBytesWritePointer += ret;
97 // if(inputBytesWritePointer == inputBytes.size()){ //wrap pointer around
98 // inputBytesWritePointer = 0;
99 // }
100 // if(ret < maxBytesToRead){ //no more data to retrieve at the moment
101 // usleep(1000);
102 // } // otherwise there might be more data ready to be read, so don't sleep
103 }
104 }
67 int Midi::readFrom(int port){ 105 int Midi::readFrom(int port){
68 objAddrs.push_back(this); 106 objAddrs[kMidiInput].push_back(this);
69 inputPort = open("/dev/midi1", O_RDONLY | O_NONBLOCK | O_NOCTTY); 107 inputPort = open("/dev/midi1", O_RDONLY | O_NONBLOCK | O_NOCTTY);
70 if(inputPort < 0){ 108 if(inputPort < 0){
71 printf("Error occurred while opening midi port %d: %d", port, inputPort); 109 printf("Error occurred while opening midi input port %d: %d", port, inputPort);
72 return -1; 110 return -1;
73 } else { 111 } else {
74 printf("Reading from port %d\n", inputPort); 112 printf("Reading from port %d\n", port);
75 BeagleRT_scheduleAuxiliaryTask(midiInputTask); 113 BeagleRT_scheduleAuxiliaryTask(midiInputTask);
76 return 1; 114 return 1;
77 } 115 }
78 } 116 }
79 117
80 int Midi::getInput(){ 118 int Midi::writeTo(int port){
119 objAddrs[kMidiOutput].push_back(this);
120 outputPort = open("/dev/midi1", O_WRONLY, 0);
121 if(outputPort < 0){
122 printf("Error occurred while opening midi output port %d: %d", port, outputPort);
123 return -1;
124 } else {
125 printf("Writing to Midi port %d\n", port);
126 BeagleRT_scheduleAuxiliaryTask(midiOutputTask);
127 return 1;
128 }
129 }
130
131 int Midi::getInput(){
81 if(inputPort < 0) 132 if(inputPort < 0)
82 return -2; 133 return -2;
83 if(inputBytesReadPointer == inputBytesWritePointer){ 134 if(inputBytesReadPointer == inputBytesWritePointer){
84 return -1; // no bytes to read 135 return -1; // no bytes to read
85 } 136 }
87 if(inputBytesReadPointer == inputBytes.size()){ // wrap pointer 138 if(inputBytesReadPointer == inputBytes.size()){ // wrap pointer
88 inputBytesReadPointer = 0; 139 inputBytesReadPointer = 0;
89 } 140 }
90 return inputMessage; 141 return inputMessage;
91 } 142 }
143
144 int Midi::writeOutput(midi_byte_t byte){
145 return writeOutput(&byte, 1);
146 }
147
148 int Midi::writeOutput(midi_byte_t* bytes, unsigned int length){
149 int ret = write(outputPort, bytes, length);
150 if(ret < 0)
151 return -1;
152 else
153 return 1;
154 }