annotate framework/OSCScript.h @ 654:4f53620962d9 osc-script

Toward running an OSC script in batch
author Chris Cannam
date Mon, 25 Mar 2019 15:49:23 +0000
parents
children 94f518af106c
rev   line source
Chris@654 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@654 2
Chris@654 3 /*
Chris@654 4 Sonic Visualiser
Chris@654 5 An audio file viewer and annotation editor.
Chris@654 6 Centre for Digital Music, Queen Mary, University of London.
Chris@654 7
Chris@654 8 This program is free software; you can redistribute it and/or
Chris@654 9 modify it under the terms of the GNU General Public License as
Chris@654 10 published by the Free Software Foundation; either version 2 of the
Chris@654 11 License, or (at your option) any later version. See the file
Chris@654 12 COPYING included with this distribution for more information.
Chris@654 13 */
Chris@654 14
Chris@654 15 #ifndef SV_OSC_SCRIPT_H
Chris@654 16 #define SV_OSC_SCRIPT_H
Chris@654 17
Chris@654 18 #include <QThread>
Chris@654 19 #include <QFile>
Chris@654 20 #include <QTextStream>
Chris@654 21
Chris@654 22 #include "base/Debug.h"
Chris@654 23 #include "base/StringBits.h"
Chris@654 24 #include "data/osc/OSCQueue.h"
Chris@654 25 #include "data/osc/OSCMessage.h"
Chris@654 26
Chris@654 27 #include <stdexcept>
Chris@654 28
Chris@654 29 class OSCScript : public QThread
Chris@654 30 {
Chris@654 31 Q_OBJECT
Chris@654 32
Chris@654 33 public:
Chris@654 34 OSCScript(QString filename, OSCQueue *queue) :
Chris@654 35 m_filename(filename),
Chris@654 36 m_queue(queue),
Chris@654 37 m_abandoning(false) {
Chris@654 38 }
Chris@654 39
Chris@654 40 void run() override {
Chris@654 41
Chris@654 42 QFile f(m_filename);
Chris@654 43 if (!f.open(QFile::ReadOnly | QFile::Text)) {
Chris@654 44 SVCERR << "OSCScript: Failed to open script file \""
Chris@654 45 << m_filename << "\" for reading" << endl;
Chris@654 46 throw std::runtime_error("OSC script file not found");
Chris@654 47 }
Chris@654 48
Chris@654 49 if (!m_queue) {
Chris@654 50 SVCERR << "OSCScript: No OSC queue available" << endl;
Chris@654 51 throw std::runtime_error("OSC queue not running");
Chris@654 52 }
Chris@654 53
Chris@654 54 int lineno = 0;
Chris@654 55 QTextStream str(&f);
Chris@654 56
Chris@654 57 while (!str.atEnd() && !m_abandoning) {
Chris@654 58
Chris@654 59 ++lineno;
Chris@654 60
Chris@654 61 QString line = str.readLine().trimmed();
Chris@654 62 if (line == QString()) continue;
Chris@654 63
Chris@654 64 if (line[0] == '#') {
Chris@654 65 continue;
Chris@654 66
Chris@654 67 } else if (line[0].isDigit()) {
Chris@654 68 bool ok = false;
Chris@654 69 float pause = line.toFloat(&ok);
Chris@654 70 if (ok) {
Chris@654 71 SVCERR << "OSCScript: " << m_filename << ":" << lineno
Chris@654 72 << ": pausing for " << pause << " sec" << endl;
Chris@654 73 msleep(unsigned(round(pause * 1000.0f)));
Chris@654 74 continue;
Chris@654 75 } else {
Chris@654 76 SVCERR << "OSCScript: " << m_filename << ":" << lineno
Chris@654 77 << ": error: failed to parse sleep time, giving up"
Chris@654 78 << endl;
Chris@654 79 throw std::runtime_error("OSC script parse error");
Chris@654 80 }
Chris@654 81
Chris@654 82 } else if (line[0] == '/' && line.size() > 1) {
Chris@654 83 QStringList parts = StringBits::splitQuoted(line, ' ');
Chris@654 84 if (parts.empty()) {
Chris@654 85 SVCERR << "OSCScript: " << m_filename << ":" << lineno
Chris@654 86 << ": warning: empty command spec, ignoring"
Chris@654 87 << endl;
Chris@654 88 continue;
Chris@654 89 }
Chris@654 90 OSCMessage message;
Chris@654 91 message.setMethod(parts[0].mid(1));
Chris@654 92 for (int i = 1; i < parts.size(); ++i) {
Chris@654 93 message.addArg(parts[i]);
Chris@654 94 }
Chris@654 95 SVCERR << "OSCScript: " << m_filename << ":" << lineno
Chris@654 96 << ": invoking: \"" << parts[0] << "\"" << endl;
Chris@654 97 m_queue->postMessage(message);
Chris@654 98
Chris@654 99 } else {
Chris@654 100 SVCERR << "OSCScript: " << m_filename << ":" << lineno
Chris@654 101 << ": error: message expected" << endl;
Chris@654 102 throw std::runtime_error("OSC script parse error");
Chris@654 103 }
Chris@654 104 }
Chris@654 105
Chris@654 106 SVCERR << "OSCScript: " << m_filename << ": finished" << endl;
Chris@654 107 }
Chris@654 108
Chris@654 109 void abandon() {
Chris@654 110 m_abandoning = true;
Chris@654 111 }
Chris@654 112
Chris@654 113 private:
Chris@654 114 QString m_filename;
Chris@654 115 OSCQueue *m_queue; // I do not own this
Chris@654 116 bool m_abandoning;
Chris@654 117 };
Chris@654 118
Chris@654 119 #endif
Chris@654 120