diff options
Diffstat (limited to 'muse_qt4_evolution/muse/midiplugin.cpp')
-rw-r--r-- | muse_qt4_evolution/muse/midiplugin.cpp | 625 |
1 files changed, 0 insertions, 625 deletions
diff --git a/muse_qt4_evolution/muse/midiplugin.cpp b/muse_qt4_evolution/muse/midiplugin.cpp deleted file mode 100644 index 1d13828d..00000000 --- a/muse_qt4_evolution/muse/midiplugin.cpp +++ /dev/null @@ -1,625 +0,0 @@ -//============================================================================= -// MusE -// Linux Music Editor -// $Id:$ -// -// Copyright (C) 2002-2006 by Werner Schweer and others -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License version 2. -// -// This program 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 this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -//============================================================================= - -#include <dlfcn.h> - -#include "al/al.h" -#include "al/xml.h" -#include "al/tempo.h" -#include "al/sig.h" -#include "midiplugin.h" -#include "ctrl.h" -#include "midiplugins/libmidiplugin/mempi.h" -#include "audio.h" -#include "gconfig.h" - -MidiPluginList midiPlugins; - -MempiHost mempiHost; - -//--------------------------------------------------------- -// division -//--------------------------------------------------------- - -int MempiHost::division() const - { - return config.division; - } - -//--------------------------------------------------------- -// tempo -//--------------------------------------------------------- - -int MempiHost::tempo(unsigned tick) const - { - return AL::tempomap.tempo(tick); - } - -//--------------------------------------------------------- -// tick2frame -//--------------------------------------------------------- - -unsigned MempiHost::tick2frame(unsigned tick) const - { - return AL::tempomap.tick2frame(tick); - } - -//--------------------------------------------------------- -// frame2tick -//--------------------------------------------------------- - -unsigned MempiHost::frame2tick(unsigned frame) const - { - return AL::tempomap.frame2tick(frame); - } - -//--------------------------------------------------------- -// bar -//--------------------------------------------------------- - -void MempiHost::bar(int t, int* bar, int* beat, unsigned* tick) const - { - AL::sigmap.tickValues(t, bar, beat, tick); - } - -//--------------------------------------------------------- -// bar2tick -//--------------------------------------------------------- - -unsigned MempiHost::bar2tick(int bar, int beat, int tick) const - { - return AL::sigmap.bar2tick(bar, beat, tick); - } - -//--------------------------------------------------------- -// MidiPlugin -//--------------------------------------------------------- - -MidiPlugin::MidiPlugin(const QFileInfo* f, const MEMPI_Function mf, - const MEMPI* d) : fi(*f) - { - mempi = mf; - plugin = d; - _instances = 0; - } - -//--------------------------------------------------------- -// instantiate -//--------------------------------------------------------- - -MidiPluginI* MidiPlugin::instantiate(MidiTrackBase* t) - { - if (plugin == 0) { - printf("initMidiPluginInstance: zero plugin\n"); - return 0; - } - ++_instances; - QString inst("-" + QString::number(_instances)); - QString s = name() + inst; - - Mempi* m = plugin->instantiate(s.toLatin1().data(), &mempiHost); - if (m->init()) { - delete m; - return 0; - } - MidiPluginI* mp = new MidiPluginI(this, t, m); - return mp; - } - -bool MidiPlugin::instantiate(MidiPluginI* mp) - { - if (plugin == 0) { - printf("initMidiPluginInstance: zero plugin\n"); - return 0; - } - ++_instances; - QString inst("-" + QString::number(_instances)); - QString s = name() + inst; - - Mempi* m = plugin->instantiate(s.toLatin1().data(), &mempiHost); - if (m->init()) { - delete m; - return true; - } - mp->setMempi(m); - return false; - } - -//--------------------------------------------------------- -// MidiPluginI -//--------------------------------------------------------- - -MidiPluginI::MidiPluginI(MidiPlugin* p, MidiTrackBase* t, Mempi* m) - { - _track = t; - _plugin = p; - mempi = m; - _on = true; - } - -//--------------------------------------------------------- -// MidiPluginI -//--------------------------------------------------------- - -MidiPluginI::MidiPluginI(MidiTrackBase* t) - { - _track = t; - _plugin = 0; - mempi = 0; - _on = true; - } - -//--------------------------------------------------------- -// MidiPluginI -//--------------------------------------------------------- - -MidiPluginI::~MidiPluginI() - { - if (mempi) - delete mempi; - } - -//--------------------------------------------------------- -// loadMidiPlugin -//--------------------------------------------------------- - -static void loadMidiPlugin(QFileInfo* fi) - { - if (debugMsg) - printf(" load midi plugin <%s>\n", fi->filePath().toAscii().data()); - void* handle = dlopen(fi->filePath().toLocal8Bit().data(), RTLD_NOW); - if (handle == 0) { - fprintf(stderr, "loadMidiPlugin::dlopen(%s) failed: %s\n", - fi->filePath().toLatin1().data(), dlerror()); - return; - } - MEMPI_Function mempi = (MEMPI_Function)dlsym(handle, "mempi_descriptor"); - - if (!mempi) { - const char *txt = dlerror(); - if (txt) { - fprintf(stderr, - "Unable to find mempi_descriptor() function in plugin " - "library file \"%s\": %s.\n" - "Are you sure this is a MEMPI plugin file?\n", - fi->filePath().toLatin1().data(), - txt); - return; - } - } - const MEMPI* descr = mempi(); - - if (descr == 0) { - fprintf(stderr, "Mempi::instantiate: no MEMPI descr found\n"); - return; - } - if (descr->majorMempiVersion != MEMPI_MAJOR_VERSION) { - fprintf(stderr, "Mempi::instantiate: bad MEMPI version %d, expected %d\n", - descr->majorMempiVersion, MEMPI_MAJOR_VERSION); - return; - } - midiPlugins.push_back(new MidiPlugin(fi, mempi, descr)); - } - -//--------------------------------------------------------- -// loadMidiPluginDir -//--------------------------------------------------------- - -static void loadMidiPluginDir(const QString& s) - { - if (debugMsg) - printf("scan midi plugin dir <%s>\n", s.toLatin1().data()); -#ifdef __APPLE__ - QDir pluginDir(s, QString("*.dylib"), 0, QDir::Files); -#else - QDir pluginDir(s, QString("*.so"), 0, QDir::Files); -#endif - if (pluginDir.exists()) { - QFileInfoList list = pluginDir.entryInfoList(); - for (int i = 0; i < list.size(); ++i) { - QFileInfo fi = list.at(i); - loadMidiPlugin(&fi); - } - } - } - -//--------------------------------------------------------- -// initMidiPlugins -// search for midi MEPI plugins -//--------------------------------------------------------- - -void initMidiPlugins() - { - loadMidiPluginDir(museGlobalLib + QString("/midiplugins")); - } - -//--------------------------------------------------------- -// find -//--------------------------------------------------------- - -MidiPlugin* MidiPluginList::find(const QString& /*file*/, const QString& name) - { - for (iMidiPlugin i = begin(); i != end(); ++i) { - if (name == (*i)->name()) - return *i; - } - printf("MidiPlugin <%s> not found\n", name.toLatin1().data()); - return 0; - } - -//--------------------------------------------------------- -// Pipeline -//--------------------------------------------------------- - -MidiPipeline::MidiPipeline() - : QList<MidiPluginI*>() - { - } - -//--------------------------------------------------------- -// isOn -//--------------------------------------------------------- - -bool MidiPipeline::isOn(int idx) const - { - MidiPluginI* p = (*this)[idx]; - if (p) - return p->on(); - return false; - } - -//--------------------------------------------------------- -// setOn -//--------------------------------------------------------- - -void MidiPipeline::setOn(int idx, bool flag) - { - MidiPluginI* p = (*this)[idx]; - if (p) { - p->setOn(flag); - } - } - -//--------------------------------------------------------- -// name -//--------------------------------------------------------- - -QString MidiPipeline::name(int idx) const - { - MidiPluginI* p = (*this)[idx]; - if (p) - return p->name(); - return QString("empty"); - } - -#if 0 -//--------------------------------------------------------- -// empty -//--------------------------------------------------------- - -bool MidiPipeline::empty(int idx) const - { - MidiPluginI* p = (*this)[idx]; - return p == 0; - } -#endif - -//--------------------------------------------------------- -// move -//--------------------------------------------------------- - -void MidiPipeline::move(int idx, bool up) - { - MidiPluginI* p1 = (*this)[idx]; - if (up) { - (*this)[idx] = (*this)[idx-1]; - (*this)[idx-1] = p1; - } - else { - (*this)[idx] = (*this)[idx+1]; - (*this)[idx+1] = p1; - } - } - -//--------------------------------------------------------- -// showGui -//--------------------------------------------------------- - -void MidiPipeline::showGui(int idx, bool flag) - { - MidiPluginI* p = (*this)[idx]; - if (p) - p->showGui(flag); - } - -//--------------------------------------------------------- -// guiVisible -//--------------------------------------------------------- - -bool MidiPipeline::guiVisible(int idx) const - { - MidiPluginI* p = (*this)[idx]; - if (p) - return p->guiVisible(); - return false; - } - -//--------------------------------------------------------- -// hasGui -//--------------------------------------------------------- - -bool MidiPipeline::hasGui(int idx) const - { - MidiPluginI* p = (*this)[idx]; - if (p) - return p->hasGui(); - return false; - } - -//--------------------------------------------------------- -// apply -//--------------------------------------------------------- - -void MidiPipeline::apply(unsigned from, unsigned to, MidiEventList* il, MidiEventList* ool) - { - MidiEventList oList; - MidiEventList* ol = &oList; - - bool swap = true; - for (iMidiPluginI i = begin(); i != end(); ++i) { - MidiPluginI* p = *i; - if (p == 0 || !p->on()) - continue; - if (swap) { - ol->clear(); - p->apply(from, to, il, ol); - } - else { - il->clear(); - p->apply(from, to, ol, il); - } - swap = !swap; - } - MidiEventList* l = swap ? il : ol; - for (iMidiEvent i = l->begin(); i != l->end(); ++i) - ool->insert(*i); - } - -//--------------------------------------------------------- -// apply -//--------------------------------------------------------- - -void MidiPluginI::apply(unsigned from, unsigned to, MidiEventList* il, MidiEventList* ol) - { - mempi->process(from, to, il, ol); - } - -//--------------------------------------------------------- -// saveConfiguration -//--------------------------------------------------------- - -void MidiPluginI::writeConfiguration(Xml& xml) - { - xml.stag(QString("midiPlugin file=\"%1\" name=\"%2\"") - .arg(_plugin->lib()).arg(_plugin->name())); - if (_on == false) - xml.tag("on", _on); - if (mempi->hasGui()) { - xml.tag("guiVisible", mempi->guiVisible()); - int x, y, w, h; - w = 0; - h = 0; - mempi->getGeometry(&x, &y, &w, &h); - if (h || w) - xml.tag("geometry", QRect(x, y, w, h)); - } - - //--------------------------------------------- - // dump current state of plugin - //--------------------------------------------- - - int len = 0; - const unsigned char* p; - mempi->getInitData(&len, &p); - if (len) { - xml.stag(QString("init len=\"%1\"").arg(len)); - xml.dump(len, p); - xml.etag("init"); - } - xml.etag("midiPlugin"); - } - -//--------------------------------------------------------- -// readConfiguration -// return true on error -//--------------------------------------------------------- - -bool MidiPluginI::readConfiguration(QDomNode node) - { - QDomElement e = node.toElement(); - QString file = e.attribute("file"); - QString label = e.attribute("name"); - - if (_plugin == 0) { - _plugin = midiPlugins.find(file, label); - if (_plugin == 0) - return true; - if (_plugin->instantiate(this)) - return true; - } - node = node.firstChild(); - while (!node.isNull()) { - e = node.toElement(); - int i = e.text().toInt(); - QString tag(e.tagName()); - if (tag == "on") { - bool flag = i; - _on = flag; - } - else if (tag == "guiVisible") { - showGui(i); - } - else if (tag == "geometry") { - QRect r(AL::readGeometry(node)); - mempi->setGeometry(r.x(), r.y(), r.width(), r.height()); - } - else if (tag == "init") { - int len = e.attribute("len","0").toInt(); - if (len) { - const char* s = e.text().toLatin1().data(); - unsigned char data[len]; - unsigned char* d = data; - int numberBase = 16; - for (int i = 0; i < len; ++i) { - char* endp; - *d++ = strtol(s, &endp, numberBase); - s = endp; - if (s == 0) - break; - } - mempi->setInitData(len, data); - } - } - else - printf("MusE:MidiPluginI: unknown tag %s\n", e.tagName().toLatin1().data()); - node = node.nextSibling(); - } - return false; - } - -//--------------------------------------------------------- -// showGui -//--------------------------------------------------------- - -void MidiPluginI::showGui() - { - mempi->showGui(!mempi->guiVisible()); - } - -void MidiPluginI::showGui(bool flag) - { - mempi->showGui(flag); - } - -//--------------------------------------------------------- -// guiVisible -//--------------------------------------------------------- - -bool MidiPluginI::guiVisible() const - { - return mempi->guiVisible(); - } - -//--------------------------------------------------------- -// MidiPluginDialog -//--------------------------------------------------------- - -MidiPluginDialog::MidiPluginDialog(QWidget* parent) - : QDialog(parent) - { - resize(QSize(550, 300)); - setModal(true); - setWindowTitle(tr("MusE: select midi plugin")); - QVBoxLayout* layout = new QVBoxLayout(this); - - pList = new QTreeWidget(this); - pList->setIndentation(0); - pList->setColumnCount(4); - pList->setSortingEnabled(true); - pList->setSelectionBehavior(QAbstractItemView::SelectRows); - pList->setSelectionMode(QAbstractItemView::SingleSelection); - pList->setAlternatingRowColors(true); - - QStringList headerLabels; - - headerLabels << tr("File") << tr("Name") << tr("Version") << tr("Description"); - pList->header()->resizeSection(0, 100); - pList->header()->resizeSection(1, 120); - pList->header()->resizeSection(2, 70); - pList->header()->setResizeMode(3, QHeaderView::Stretch); - pList->setHeaderLabels(headerLabels); - - fillPlugs(); - - layout->addWidget(pList); - - //--------------------------------------------------- - // Ok/Cancel Buttons - //--------------------------------------------------- - - QBoxLayout* w5 = new QHBoxLayout; - layout->addLayout(w5); - - QPushButton* okB = new QPushButton(tr("Ok")); - QPushButton* cancelB = new QPushButton(tr("Cancel")); - okB->setFixedWidth(80); - cancelB->setFixedWidth(80); - okB->setDefault(true); - w5->addStretch(100); - w5->addWidget(okB); - w5->addWidget(cancelB); - - connect(pList, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)), SLOT(accept())); - connect(cancelB, SIGNAL(clicked()), SLOT(reject())); - connect(okB, SIGNAL(clicked()), SLOT(accept())); - } - -//--------------------------------------------------------- -// getPlugin -//--------------------------------------------------------- - -MidiPlugin* MidiPluginDialog::getPlugin(QWidget* parent) - { - MidiPluginDialog* dialog = new MidiPluginDialog(parent); - if (dialog->exec()) - return dialog->value(); - return 0; - } - -//--------------------------------------------------------- -// value -//--------------------------------------------------------- - -MidiPlugin* MidiPluginDialog::value() - { - QTreeWidgetItem* item = pList->selectedItems().at(0); - if (item) - return midiPlugins.find(item->text(0), item->text(1)); - return 0; - } - -//--------------------------------------------------------- -// fillPlugs -//--------------------------------------------------------- - -void MidiPluginDialog::fillPlugs() - { - pList->clear(); - for (iMidiPlugin i = midiPlugins.begin(); i != midiPlugins.end(); ++i) { - if ((*i)->type() != MEMPI_FILTER) - continue; - QTreeWidgetItem* item = new QTreeWidgetItem; - item->setText(0, (*i)->lib()); - item->setText(1, (*i)->name()); - item->setText(2, (*i)->version()); - item->setText(3, (*i)->description()); - pList->addTopLevelItem(item); - } - } |