midi-parser/src/streamer.cpp

58 lines
1.3 KiB
C++

#include "binary.hpp"
#include "device.hpp"
#include <iostream>
#include <ostream>
#include <string>
int main(int argc, char** argv) {
std::string data;
if(!binary::process_all(data, argc, argv)) {
std::cerr << "Usage: " << argv[0] << " device [midifile ...]?\n\n";
return 1;
}
unsigned at = 0;
Device device(argv[1]);
device.put(Device::Mode::e_serial);
for(;;) {
Device::Mode mode = (Device::Mode)device.get();
switch(mode) {
default: {
std::cout << "device: unknown (" << mode << ")" << std::endl;
break;
}
case Device::Mode::e_ready: {
device.put(Device::Mode::e_serial);
std::cout << "device: ready" << std::endl;
break;
}
case Device::Mode::e_jump: {
at = (device.get() & 0xff);
at = (at << 8) | (device.get() & 0xff);
at = (at << 8) | (device.get() & 0xff);
at = (at << 8) | (device.get() & 0xff);
std::cout << "device: jump (" << at << ")" << std::endl;
break;
}
case Device::Mode::e_read: {
unsigned len = (device.get() & 0xff);
if(len + at > data.length()) {
unsigned l = data.length() - at;
device.write(data.c_str() + at, l);
for(int i = 0; i < len - l; i++) {
device.put(0);
}
at += l;
} else {
device.write(data.c_str() + at, len);
at += len;
}
break;
}}
}
}