diff options
-rw-r--r-- | muse/muse/audio.cpp | 7 | ||||
-rw-r--r-- | muse/muse/audioinput.cpp | 8 | ||||
-rw-r--r-- | muse/muse/audiooutput.cpp | 6 | ||||
-rw-r--r-- | muse/muse/audiotrack.cpp | 4 | ||||
-rw-r--r-- | muse/muse/audiotrack.h | 2 | ||||
-rw-r--r-- | muse/muse/driver/alsamidi.cpp | 125 | ||||
-rw-r--r-- | muse/muse/driver/alsamidi.h | 5 | ||||
-rw-r--r-- | muse/muse/driver/driver.h | 4 | ||||
-rw-r--r-- | muse/muse/driver/dummyaudio.cpp | 67 | ||||
-rw-r--r-- | muse/muse/driver/jack.cpp | 62 | ||||
-rw-r--r-- | muse/muse/driver/jackaudio.h | 7 | ||||
-rw-r--r-- | muse/muse/driver/port.h | 64 | ||||
-rw-r--r-- | muse/muse/fifo.h | 7 | ||||
-rw-r--r-- | muse/muse/importmidi.cpp | 1 | ||||
-rw-r--r-- | muse/muse/midiinport.cpp | 4 | ||||
-rw-r--r-- | muse/muse/midioutport.cpp | 4 | ||||
-rw-r--r-- | muse/muse/plugin.cpp | 4 | ||||
-rw-r--r-- | muse/muse/route.cpp | 26 | ||||
-rw-r--r-- | muse/muse/route.h | 13 | ||||
-rw-r--r-- | muse/muse/seqmsg.cpp | 12 | ||||
-rw-r--r-- | muse/muse/synth.h | 2 | ||||
-rw-r--r-- | muse/muse/track.cpp | 26 | ||||
-rw-r--r-- | muse/muse/track.h | 3 |
23 files changed, 263 insertions, 200 deletions
diff --git a/muse/muse/audio.cpp b/muse/muse/audio.cpp index b1185cf8..b3e77213 100644 --- a/muse/muse/audio.cpp +++ b/muse/muse/audio.cpp @@ -194,8 +194,9 @@ bool Audio::start() InputList* itl = song->inputs(); for (iAudioInput i = itl->begin(); i != itl->end(); ++i) { // printf("reconnecting input %s\n", (*i)->name().toLatin1().data()); - for (int x=0; x < (*i)->channels();x++) - (*i)->setJackPort(0, x); // zero out the old connection + for (int x=0; x < (*i)->channels();x++) { + (*i)->setJackPort(Port(), x); // zero out the old connection + } (*i)->activate1(); } @@ -203,7 +204,7 @@ bool Audio::start() for (iAudioOutput i = otl->begin(); i != otl->end(); ++i) { // printf("reconnecting output %s\n", (*i)->name().toLatin1().data()); for (int x=0; x < (*i)->channels();x++) - (*i)->setJackPort(0,x); // zero out the old connection + (*i)->setJackPort(Port(), x); // zero out the old connection (*i)->activate1(); } audioDriver->start(realTimePriority); diff --git a/muse/muse/audioinput.cpp b/muse/muse/audioinput.cpp index 92c0dfd8..d4c6a12e 100644 --- a/muse/muse/audioinput.cpp +++ b/muse/muse/audioinput.cpp @@ -53,7 +53,7 @@ AudioInput::AudioInput() AudioInput::~AudioInput() { for (int i = 0; i < _channels; ++i) { - if (jackPort(i)) + if (!jackPort(i).isZero()) audioDriver->unregisterPort(jackPort(i)); } // AudioInput does not own buffers (they are from JACK) @@ -104,10 +104,10 @@ void AudioInput::setName(const QString& s) { Track::setName(s); for (int i = 0; i < channels(); ++i) { - if (jackPort(i)) { + if (!jackPort(i).isZero()) { char buffer[128]; snprintf(buffer, 128, "%s-%d", _name.toAscii().data(), i); - if (jackPort(i)) + if (!jackPort(i).isZero()) audioDriver->setPortName(jackPort(i), buffer); } } @@ -123,7 +123,7 @@ void AudioInput::collectInputData() bufferEmpty = false; for (int ch = 0; ch < channels(); ++ch) { Port port = jackPort(ch); - if (port) + if (!port.isZero()) buffer[ch] = audioDriver->getBuffer(port, segmentSize); else { printf("NO JACK PORT\n"); diff --git a/muse/muse/audiooutput.cpp b/muse/muse/audiooutput.cpp index ff057474..2899cf7d 100644 --- a/muse/muse/audiooutput.cpp +++ b/muse/muse/audiooutput.cpp @@ -55,7 +55,7 @@ AudioOutput::AudioOutput() AudioOutput::~AudioOutput() { for (int i = 0; i < _channels; ++i) { - if (jackPort(i)) + if (!jackPort(i).isZero()) audioDriver->unregisterPort(jackPort(i)); } // AudioOutput does not own buffers (they are from JACK) @@ -106,7 +106,7 @@ void AudioOutput::setChannels(int n) void AudioOutput::silence(unsigned n) { for (int i = 0; i < channels(); ++i) { - if (jackPort(i)) + if (!jackPort(i).isZero()) buffer[i] = audioDriver->getBuffer(jackPort(i), n); else { printf("PANIC: silence(): no buffer from audio driver\n"); @@ -126,7 +126,7 @@ void AudioOutput::setName(const QString& s) { Track::setName(s); for (int i = 0; i < channels(); ++i) { - if (jackPort(i)) { + if (!jackPort(i).isZero()) { char buffer[128]; snprintf(buffer, 128, "%s-%d", _name.toAscii().data(), i); audioDriver->setPortName(jackPort(i), buffer); diff --git a/muse/muse/audiotrack.cpp b/muse/muse/audiotrack.cpp index e4ea6072..b6cb821d 100644 --- a/muse/muse/audiotrack.cpp +++ b/muse/muse/audiotrack.cpp @@ -70,6 +70,10 @@ AudioTrack::AudioTrack(TrackType t) AudioTrack::~AudioTrack() { + foreach(PluginI* plugin, *_prePipe) + delete plugin; + foreach(PluginI* plugin, *_postPipe) + delete plugin; delete _prePipe; delete _postPipe; for (int i = 0; i < MAX_CHANNELS; ++i) { diff --git a/muse/muse/audiotrack.h b/muse/muse/audiotrack.h index b702cf80..f6f5a89d 100644 --- a/muse/muse/audiotrack.h +++ b/muse/muse/audiotrack.h @@ -24,6 +24,8 @@ #include "fifo.h" #include "track.h" +class Pipeline; +class SndFile; class PluginI; class AuxPluginIF; diff --git a/muse/muse/driver/alsamidi.cpp b/muse/muse/driver/alsamidi.cpp index 810ace1e..be214068 100644 --- a/muse/muse/driver/alsamidi.cpp +++ b/muse/muse/driver/alsamidi.cpp @@ -119,10 +119,7 @@ QList<PortName> AlsaMidi::outputPorts(bool) if (client != snd_seq_client_id(alsaSeq)) { PortName pn; pn.name = QString(snd_seq_port_info_get_name(pinfo)); - snd_seq_addr_t* adr = new snd_seq_addr_t; - adr->port = snd_seq_port_info_get_port(pinfo); - adr->client = client; - pn.port = adr; + pn.port = Port(client, snd_seq_port_info_get_port(pinfo)); clientList.append(pn); } } @@ -156,10 +153,7 @@ QList<PortName> AlsaMidi::inputPorts(bool) if (client != snd_seq_client_id(alsaSeq)) { PortName pn; pn.name = QString(snd_seq_port_info_get_name(pinfo)); - snd_seq_addr_t* adr = new snd_seq_addr_t; - adr->port = snd_seq_port_info_get_port(pinfo); - adr->client = client; - pn.port = adr; + pn.port = Port(client, snd_seq_port_info_get_port(pinfo)); clientList.append(pn); } } @@ -174,27 +168,13 @@ QList<PortName> AlsaMidi::inputPorts(bool) Port AlsaMidi::registerOutPort(const QString& name, bool) { - int port = snd_seq_create_simple_port(alsaSeq, name.toLatin1().data(), + int alsaPort = snd_seq_create_simple_port(alsaSeq, name.toLatin1().data(), outCap | SND_SEQ_PORT_CAP_WRITE, SND_SEQ_PORT_TYPE_APPLICATION); - if (port < 0) { - perror("create port"); - exit(1); + if (alsaPort < 0) { + perror("cannot create alsa out port"); + return Port(); } - snd_seq_addr_t* adr = new snd_seq_addr_t; - adr->port = port; - adr->client = snd_seq_client_id(alsaSeq); - return adr; - } - -//--------------------------------------------------------- -// equal -//--------------------------------------------------------- - -bool AlsaMidi::equal(Port p1, Port p2) - { - snd_seq_addr_t* a1 = (snd_seq_addr_t*)(p1); - snd_seq_addr_t* a2 = (snd_seq_addr_t*)(p2); - return (a1->port == a2->port) && (a1->client == a2->client); + return Port(snd_seq_client_id(alsaSeq), alsaPort); } //--------------------------------------------------------- @@ -203,16 +183,13 @@ bool AlsaMidi::equal(Port p1, Port p2) Port AlsaMidi::registerInPort(const QString& name, bool) { - int port = snd_seq_create_simple_port(alsaSeq, name.toLatin1().data(), + int alsaPort = snd_seq_create_simple_port(alsaSeq, name.toLatin1().data(), inCap | SND_SEQ_PORT_CAP_READ, SND_SEQ_PORT_TYPE_APPLICATION); - if (port < 0) { - perror("create port"); - exit(1); + if (alsaPort < 0) { + perror("cannot create alsa in port"); + return Port(); } - snd_seq_addr_t* adr = new snd_seq_addr_t; - adr->port = port; - adr->client = snd_seq_client_id(alsaSeq); - return adr; + return Port(snd_seq_client_id(alsaSeq), alsaPort); } //--------------------------------------------------------- @@ -221,8 +198,7 @@ Port AlsaMidi::registerInPort(const QString& name, bool) void AlsaMidi::unregisterPort(Port port) { - snd_seq_delete_simple_port(alsaSeq, AlsaPort(port)->port); - delete (snd_seq_addr_t*)port; + snd_seq_delete_simple_port(alsaSeq, port.alsaPort()); } //--------------------------------------------------------- @@ -242,7 +218,7 @@ QString AlsaMidi::portName(Port p) { snd_seq_port_info_t* pinfo; snd_seq_port_info_alloca(&pinfo); - snd_seq_get_any_port_info(alsaSeq, AlsaPort(p)->client, AlsaPort(p)->port, pinfo); + snd_seq_get_any_port_info(alsaSeq, p.alsaClient(), p.alsaPort(), pinfo); return QString(snd_seq_port_info_get_name(pinfo)); } @@ -252,10 +228,6 @@ QString AlsaMidi::portName(Port p) Port AlsaMidi::findPort(const QString& name) { - snd_seq_addr_t* adr = new snd_seq_addr_t; - adr->port = 0; - adr->client = 0; - snd_seq_client_info_t* cinfo; snd_seq_client_info_alloca(&cinfo); snd_seq_client_info_set_client(cinfo, 0); @@ -268,14 +240,13 @@ Port AlsaMidi::findPort(const QString& name) while (snd_seq_query_next_port(alsaSeq, pinfo) >= 0) { const char* pn = snd_seq_port_info_get_name(pinfo); if (name == pn) { - snd_seq_addr_t* adr = new snd_seq_addr_t; - *adr = *snd_seq_port_info_get_addr(pinfo); - return adr; + return Port(snd_seq_port_info_get_client(pinfo), + snd_seq_port_info_get_port(pinfo)); } } } printf("AlsaMidi: port <%s> not found\n", name.toLatin1().data()); - return 0; + return Port(); } //--------------------------------------------------------- @@ -285,20 +256,22 @@ Port AlsaMidi::findPort(const QString& name) bool AlsaMidi::connect(Port src, Port dst) { - if (((AlsaPort)dst) == 0) { - printf("AlsaMidi::connect failed: invalid alsa port\n"); - return false; - } snd_seq_port_subscribe_t* sub; snd_seq_port_subscribe_alloca(&sub); - snd_seq_port_subscribe_set_sender(sub, (AlsaPort)src); - snd_seq_port_subscribe_set_dest(sub, (AlsaPort)dst); + snd_seq_addr_t s, d; + s.port = src.alsaPort(); + s.client = src.alsaClient(); + d.port = dst.alsaPort(); + d.client = dst.alsaClient(); + snd_seq_port_subscribe_set_sender(sub, &s); + snd_seq_port_subscribe_set_dest(sub, &d); + int rv = snd_seq_subscribe_port(alsaSeq, sub); if (rv < 0) { printf("AlsaMidi::connect(%d:%d, %d:%d) failed: %s\n", - ((AlsaPort)src)->client, ((AlsaPort)src)->port, - ((AlsaPort)dst)->client, ((AlsaPort)dst)->port, + src.alsaClient(), src.alsaPort(), + dst.alsaClient(), dst.alsaPort(), snd_strerror(rv)); return false; } @@ -314,8 +287,13 @@ bool AlsaMidi::disconnect(Port src, Port dst) { snd_seq_port_subscribe_t* sub; snd_seq_port_subscribe_alloca(&sub); - snd_seq_port_subscribe_set_sender(sub, (AlsaPort)src); - snd_seq_port_subscribe_set_dest(sub, (AlsaPort)dst); + snd_seq_addr_t s, d; + s.port = src.alsaPort(); + s.client = src.alsaClient(); + d.port = dst.alsaPort(); + d.client = dst.alsaClient(); + snd_seq_port_subscribe_set_sender(sub, &s); + snd_seq_port_subscribe_set_dest(sub, &d); int rv = snd_seq_unsubscribe_port(alsaSeq, sub); if (rv < 0) printf("AlsaMidi::disconnect() failed: %s\n", @@ -356,19 +334,19 @@ void AlsaMidi::getOutputPollFd(struct pollfd** p, int* n) void AlsaMidi::addConnection(snd_seq_connect_t* ev) { - Port rs = Port(&ev->sender); - Port rd = Port(&ev->dest); + Port rs(ev->sender.client, ev->sender.port); + Port rd(ev->dest.client, ev->dest.port); MidiOutPortList* opl = song->midiOutPorts(); for (iMidiOutPort i = opl->begin(); i != opl->end(); ++i) { MidiOutPort* oport = *i; Port src = oport->alsaPort(0); - if (equal(src, rs)) { + if (src == rs) { Route r(rd, Route::MIDIPORT); if (oport->outRoutes()->indexOf(r) == -1) { - snd_seq_addr_t* adr = new snd_seq_addr_t(ev->dest); - oport->outRoutes()->push_back(Route(Port(adr), -1, Route::MIDIPORT)); + Port port(ev->dest.client, ev->dest.port); + oport->outRoutes()->push_back(Route(port, -1, Route::MIDIPORT)); } break; } @@ -379,11 +357,11 @@ void AlsaMidi::addConnection(snd_seq_connect_t* ev) MidiInPort* iport = *i; Port dst = iport->alsaPort(); - if (equal(dst, rd)) { + if (dst == rd) { Route r(rs, Route::MIDIPORT); if (iport->inRoutes()->indexOf(r) == -1) { - snd_seq_addr_t* adr = new snd_seq_addr_t(ev->sender); - iport->inRoutes()->push_back(Route(Port(adr), -1, Route::MIDIPORT)); + Port port(ev->sender.client, ev->sender.port); + iport->inRoutes()->push_back(Route(port, -1, Route::MIDIPORT)); } break; } @@ -397,18 +375,18 @@ void AlsaMidi::addConnection(snd_seq_connect_t* ev) void AlsaMidi::removeConnection(snd_seq_connect_t* ev) { - Port rs = Port(&ev->sender); - Port rd = Port(&ev->dest); + Port rs(ev->sender.client, ev->sender.port); + Port rd(ev->dest.client, ev->dest.port); MidiInPortList* ipl = song->midiInPorts(); for (iMidiInPort i = ipl->begin(); i != ipl->end(); ++i) { MidiInPort* iport = *i; Port dst = iport->alsaPort(); - if (equal(dst, rd)) { + if (dst == rd) { RouteList* irl = iport->outRoutes(); for (iRoute r = irl->begin(); r != irl->end(); ++r) { - if (!r->disconnected && equal(r->port, rs)) { + if (!r->disconnected && (r->port == rs)) { iport->inRoutes()->erase(r); break; } @@ -422,10 +400,10 @@ void AlsaMidi::removeConnection(snd_seq_connect_t* ev) MidiOutPort* oport = *i; Port src = oport->alsaPort(); - if (equal(src, rs)) { + if (src == rs) { RouteList* orl = oport->outRoutes(); for (iRoute r = orl->begin(); r != orl->end(); ++r) { - if (!r->disconnected && equal(r->port, rd)) { + if (!r->disconnected && (r->port == rd)) { orl->erase(r); break; } @@ -509,11 +487,12 @@ void AlsaMidi::read(MidiSeq* seq) case SND_SEQ_EVENT_PITCHBEND: case SND_SEQ_EVENT_CONTROLLER: { - Port port = &ev->dest; + Port port(ev->dest.client, ev->dest.port); + MidiInPortList* mpl = song->midiInPorts(); for (iMidiInPort i = mpl->begin(); i != mpl->end(); ++i) { MidiInPort* inPort = *i; - if (equal(port, inPort->alsaPort())) { + if (port == inPort->alsaPort()) { inPort->eventReceived(ev); } } @@ -592,7 +571,7 @@ void AlsaMidi::putEvent(Port p, const MidiEvent& e) snd_seq_event_t event; memset(&event, 0, sizeof(event)); snd_seq_ev_set_direct(&event); - snd_seq_ev_set_source(&event, ((snd_seq_addr_t*)p)->port); + snd_seq_ev_set_source(&event, p.alsaPort()); snd_seq_ev_set_dest(&event, SND_SEQ_ADDRESS_SUBSCRIBERS, 0); switch(e.type()) { diff --git a/muse/muse/driver/alsamidi.h b/muse/muse/driver/alsamidi.h index b68c4783..9c59f5dc 100644 --- a/muse/muse/driver/alsamidi.h +++ b/muse/muse/driver/alsamidi.h @@ -21,16 +21,12 @@ #ifndef __ALSAMIDI_H__ #define __ALSAMIDI_H__ -// #include <config.h> #include <alsa/asoundlib.h> - #include "driver.h" class MidiSeq; class MidiEvent; -typedef snd_seq_addr_t* AlsaPort; - //--------------------------------------------------------- // AlsaMidi //--------------------------------------------------------- @@ -55,7 +51,6 @@ class AlsaMidi : public Driver { virtual void setPortName(Port p, const QString& n); virtual QString portName(Port); virtual Port findPort(const QString& name); - virtual bool equal(Port, Port); virtual bool connect(Port, Port); virtual bool disconnect(Port, Port); diff --git a/muse/muse/driver/driver.h b/muse/muse/driver/driver.h index d7147b52..a165cea0 100644 --- a/muse/muse/driver/driver.h +++ b/muse/muse/driver/driver.h @@ -21,7 +21,8 @@ #ifndef __DRIVER_H__ #define __DRIVER_H__ -typedef void* Port; +#include <jack/midiport.h> +#include "port.h" struct PortName { Port port; @@ -55,7 +56,6 @@ class Driver { virtual bool connect(Port, Port) = 0; virtual bool disconnect(Port, Port) = 0; - virtual bool equal(Port, Port) = 0; virtual void putEvent(Port, const MidiEvent&) = 0; }; diff --git a/muse/muse/driver/dummyaudio.cpp b/muse/muse/driver/dummyaudio.cpp index 7550cc61..796e8b58 100644 --- a/muse/muse/driver/dummyaudio.cpp +++ b/muse/muse/driver/dummyaudio.cpp @@ -58,7 +58,7 @@ class DummyAudio : public AudioDriver { return lrint((curTime()-startTime) * AL::sampleRate); } - virtual float* getBuffer(void* /*port*/, unsigned long nframes) + virtual float* getBuffer(Port /*port*/, unsigned long nframes) { if (nframes > dummyFrames) { fprintf(stderr, "error: segment size > %d\n", dummyFrames); @@ -73,58 +73,60 @@ class DummyAudio : public AudioDriver { virtual void registerClient() {} - virtual void* registerOutPort(const QString& s, bool) { + virtual Port registerOutPort(const QString& s, bool) { iPorts.push_back(QString(s)); - return (void*)(iPorts.size() + 3000); + Port port(0, iPorts.size() + 3000); + return port; } - virtual void* registerInPort(const QString& s, bool) { + virtual Port registerInPort(const QString& s, bool) { oPorts.push_back(QString(s)); - return (void*)(oPorts.size() + 4000); + Port port(0, oPorts.size() + 40); + return port; } - virtual void unregisterPort(void*) { + virtual void unregisterPort(Port) { /* if (long(p) >= 100) - oPorts.erase(oPorts.begin() + (long(p)-4000)); + oPorts.erase(oPorts.begin() + (long(p)-40)); else - iPorts.erase(iPorts.begin() + long(p)-3000); + iPorts.erase(iPorts.begin() + long(p)-30); */ } - virtual bool connect(void*, void*) { return true; } - virtual bool disconnect(void*, void*) { return true; } - virtual void setPortName(void*, const QString&) {} - virtual void* findPort(const QString& s) { + virtual bool connect(Port, Port) { return true; } + virtual bool disconnect(Port, Port) { return true; } + virtual void setPortName(Port, const QString&) {} + virtual Port findPort(const QString& s) { if (s == "input1") - return (void*)1000; + return Port(0, 10); if (s == "input2") - return (void*)1001; + return Port(0, 11); if (s == "output1") - return (void*)2000; + return Port(0, 20); if (s == "output2") - return (void*)2001; + return Port(0, 21); int k = 0; for (std::vector<QString>::const_iterator i = iPorts.begin(); i != iPorts.end(); ++i, ++k) { if (s == *i) - return (void*)(3000+k); + return Port(0, 30+k); } k = 0; for (std::vector<QString>::const_iterator i = oPorts.begin(); i != oPorts.end(); ++i, ++k) { if (s == *i) - return (void*)(4000+k); + return Port(0, 40); } - return 0; + return Port(); } - virtual QString portName(void* p) { - if (long(p) == 1000) + virtual QString portName(Port port) { + if (port.alsaPort() == 10) return QString("input1"); - if (long(p) == 1001) + if (port.alsaPort() == 11) return QString("input2"); - if (long(p) == 2000) + if (port.alsaPort() == 20) return QString("output1"); - if (long(p) == 2001) + if (port.alsaPort() == 21) return QString("output2"); - if (long(p) >= 4000) - return QString(oPorts[long(p)-4000]); + if (port.alsaPort() >= 40) + return QString(oPorts[port.alsaPort() - 40]); else - return QString(iPorts[long(p)-3000]); + return QString(iPorts[port.alsaPort() - 30]); } virtual unsigned getCurFrame() { return pos; } virtual int realtimePriority() const { return 40; } @@ -139,9 +141,6 @@ class DummyAudio : public AudioDriver { pos = n; } virtual void setFreewheel(bool) {} - virtual bool equal(Port a, Port b) { - return a == b; - } virtual void putEvent(Port, const MidiEvent&) {} }; @@ -168,10 +167,10 @@ QList<PortName> DummyAudio::outputPorts(bool midi) if (!midi) { PortName p1; p1.name = QString("output1"); - p1.port = (void*)100; + p1.port = Port(0, 100); PortName p2; p2.name = QString("output2"); - p2.port = (void*)101; + p2.port = Port(0, 101); clientList.append(p1); clientList.append(p2); } @@ -188,10 +187,10 @@ QList<PortName> DummyAudio::inputPorts(bool midi) if (!midi) { PortName p1; p1.name = QString("input1"); - p1.port = (void*)0; + p1.port = Port(0, 0); PortName p2; p2.name = QString("input2"); - p2.port = (void*)1; + p2.port = Port(0, 1); clientList.append(p1); clientList.append(p2); } diff --git a/muse/muse/driver/jack.cpp b/muse/muse/driver/jack.cpp index e939046d..b90958f0 100644 --- a/muse/muse/driver/jack.cpp +++ b/muse/muse/driver/jack.cpp @@ -322,7 +322,7 @@ void JackAudio::graphChanged() RouteList* irl = it->inRoutes(); for (int channel = 0; channel < channels; ++channel) { - jack_port_t* port = (jack_port_t*)(it->jackPort(channel)); + jack_port_t* port = it->jackPort(channel).jackPort(); if (port == 0) continue; const char** ports = jack_port_get_all_connections(_client, port); @@ -334,7 +334,7 @@ void JackAudio::graphChanged() foreach (Route r, *irl) { if (r.channel != channel) continue; - const char* name = jack_port_name((jack_port_t*)r.port); + const char* name = jack_port_name(r.port.jackPort()); bool found = false; for (const char** pn = ports; pn && *pn; ++pn) { if (strcmp(*pn, name) == 0) { @@ -360,7 +360,7 @@ void JackAudio::graphChanged() foreach(Route r, *irl) { if (r.channel != channel) continue; - const char* name = jack_port_name((jack_port_t*)r.port); + const char* name = jack_port_name(r.port.jackPort()); if (strcmp(*pn, name) == 0) { found = true; break; @@ -368,7 +368,7 @@ void JackAudio::graphChanged() } if (!found) { RouteRoute a; - Port port = jack_port_by_name(_client, *pn); + Port port(jack_port_by_name(_client, *pn)); a.src = Route(port, channel, Route::AUDIOPORT); a.dst = Route(it, channel); ra.append(a); @@ -395,7 +395,7 @@ void JackAudio::graphChanged() AudioOutput* it = *ii; int channels = it->channels(); for (int channel = 0; channel < channels; ++channel) { - jack_port_t* port = (jack_port_t*)(it->jackPort(channel)); + jack_port_t* port = it->jackPort(channel).jackPort(); if (port == 0) continue; const char** ports = jack_port_get_all_connections(_client, port); @@ -408,7 +408,7 @@ void JackAudio::graphChanged() foreach(Route r, *rl) { if (r.channel != channel) continue; - const char* name = jack_port_name((jack_port_t*)r.port); + const char* name = jack_port_name(r.port.jackPort()); bool found = false; const char** pn = ports; while (pn && *pn) { @@ -437,7 +437,7 @@ void JackAudio::graphChanged() for (iRoute irl = rl->begin(); irl != rl->end(); ++irl) { if (irl->channel != channel) continue; - const char* name = jack_port_name((jack_port_t*)irl->port); + const char* name = jack_port_name(irl->port.jackPort()); if (strcmp(*pn, name) == 0) { found = true; break; @@ -446,7 +446,7 @@ void JackAudio::graphChanged() if (!found) { RouteRoute a; a.src = Route(it, channel); - Port port = jack_port_by_name(_client, *pn); + Port port(jack_port_by_name(_client, *pn)); a.dst = Route(port, channel, Route::AUDIOPORT); ra.append(a); } @@ -495,8 +495,10 @@ void JackAudio::registerClient() Port JackAudio::registerInPort(const QString& name, bool midi) { const char* type = midi ? JACK_DEFAULT_MIDI_TYPE : JACK_DEFAULT_AUDIO_TYPE; - void* p = jack_port_register(_client, name.toLatin1().data(), type, JackPortIsInput, 0); -// printf("JACK: registerInPort<%s>: <%s> %p\n", type, name.toLatin1().data(), p); + Port p(jack_port_register(_client, name.toLatin1().data(), type, JackPortIsInput, 0)); +// printf("JACK: registerInPort<%s>: <%s> %p\n", type, name.toLatin1().data(), p.jackPort()); + if (!p.jackPort()) + p.setZero(); return p; } @@ -507,12 +509,14 @@ Port JackAudio::registerInPort(const QString& name, bool midi) Port JackAudio::registerOutPort(const QString& name, bool midi) { const char* type = midi ? JACK_DEFAULT_MIDI_TYPE : JACK_DEFAULT_AUDIO_TYPE; - void* p = jack_port_register(_client, name.toLatin1().data(), type, JackPortIsOutput, 0); -// printf("JACK: registerOutPort<%s>: <%s> %p\n", type, name.toLatin1().data(), p); + Port p(jack_port_register(_client, name.toLatin1().data(), type, JackPortIsOutput, 0)); +// printf("JACK: registerOutPort<%s>: <%s> %p\n", type, name.toLatin1().data(), p.jackPort()); if (midi) { jack_nframes_t nframes = jack_get_buffer_size(_client); - jack_midi_reset_new_port(jack_port_get_buffer((jack_port_t*)p, nframes), nframes); + jack_midi_reset_new_port(jack_port_get_buffer(p.jackPort(), nframes), nframes); } + if (!p.jackPort()) + p.setZero(); return p; } @@ -533,12 +537,12 @@ void exitJackAudio() bool JackAudio::connect(Port src, Port dst) { - if (src == 0 || dst == 0) { + if (src.isZero() || dst.isZero()) { fprintf(stderr, "JackAudio::connect(1): unknown jack ports\n"); return false; } - const char* sn = jack_port_name((jack_port_t*) src); - const char* dn = jack_port_name((jack_port_t*) dst); + const char* sn = jack_port_name(src.jackPort()); + const char* dn = jack_port_name(dst.jackPort()); // printf("jack connect <%s>%p - <%s>%p\n", sn, src, dn, dst); @@ -553,10 +557,10 @@ bool JackAudio::connect(Port src, Port dst) if (rv == EEXIST) fprintf(stderr, " connection already made\n"); else { - int pf = jack_port_flags((jack_port_t*)src); + int pf = jack_port_flags(src.jackPort()); if (!(pf & JackPortIsOutput)) fprintf(stderr, " src is not an output port\n"); - pf = jack_port_flags((jack_port_t*)dst); + pf = jack_port_flags(dst.jackPort()); if (!(pf & JackPortIsInput)) fprintf(stderr, " dst is not an input port\n"); } @@ -571,8 +575,8 @@ bool JackAudio::connect(Port src, Port dst) bool JackAudio::disconnect(Port src, Port dst) { - const char* sn = jack_port_name((jack_port_t*) src); - const char* dn = jack_port_name((jack_port_t*) dst); + const char* sn = jack_port_name(src.jackPort()); + const char* dn = jack_port_name(dst.jackPort()); // printf("jack disconnect <%s>%p - <%s>%p\n", sn, src, dn, dst); @@ -629,7 +633,7 @@ QList<PortName> JackAudio::outputPorts(bool midi) continue; PortName pn; pn.name = QString(buffer); - pn.port = port; + pn.port = Port(port); clientList.append(pn); } return clientList; @@ -652,7 +656,7 @@ QList<PortName> JackAudio::inputPorts(bool midi) continue; PortName pn; pn.name = QString(buffer); - pn.port = port; + pn.port = Port(port); clientList.append(pn); } return clientList; @@ -662,9 +666,9 @@ QList<PortName> JackAudio::inputPorts(bool midi) // portName //--------------------------------------------------------- -QString JackAudio::portName(void* port) +QString JackAudio::portName(Port port) { - const char *nameStrPtr = jack_port_name((jack_port_t*)port); + const char* nameStrPtr = jack_port_name(port.jackPort()); QString s(nameStrPtr); return s; } @@ -677,8 +681,8 @@ void JackAudio::unregisterPort(Port p) { if (_client) { // printf("JACK: unregister Port %p\n", p); - if (jack_port_unregister(_client, (jack_port_t*)p)) - fprintf(stderr, "jack unregister port %p failed\n", p); + if (jack_port_unregister(_client, p.jackPort())) + fprintf(stderr, "jack unregister port %p failed\n", p.jackPort()); } } @@ -729,7 +733,7 @@ void JackAudio::seekTransport(unsigned frame) Port JackAudio::findPort(const QString& name) { - void* p = jack_port_by_name(_client, name.toLatin1().data()); + Port p(jack_port_by_name(_client, name.toLatin1().data())); // printf("Jack::findPort <%s>, %p\n", name.toLatin1().data(), p); return p; } @@ -818,7 +822,7 @@ void JackAudio::putEvent(Port port, const MidiEvent& e) printf("MidiOut<%s>: jackMidi: ", portName(port).toLatin1().data()); e.dump(); } - void* pb = jack_port_get_buffer((jack_port_t*)port, segmentSize); + void* pb = jack_port_get_buffer(port.jackPort(), segmentSize); unsigned ft; if (transportState == JackTransportRolling) { ft = e.time() - pos.frame; @@ -868,7 +872,7 @@ void JackAudio::putEvent(Port port, const MidiEvent& e) void JackAudio::startMidiCycle(Port port) { - void* port_buf = jack_port_get_buffer((jack_port_t*)port, segmentSize); + void* port_buf = jack_port_get_buffer(port.jackPort(), segmentSize); jack_midi_clear_buffer(port_buf, segmentSize); } diff --git a/muse/muse/driver/jackaudio.h b/muse/muse/driver/jackaudio.h index e350ca0a..43da338b 100644 --- a/muse/muse/driver/jackaudio.h +++ b/muse/muse/driver/jackaudio.h @@ -21,8 +21,6 @@ #ifndef __JACKAUDIO_H__ #define __JACKAUDIO_H__ -#include <jack/jack.h> -#include <jack/midiport.h> #include "audiodev.h" //--------------------------------------------------------- @@ -46,7 +44,7 @@ class JackAudio : public AudioDriver { virtual void stop (); virtual void zeroClientPtr() { _client = 0; } virtual float* getBuffer(Port port, unsigned long nframes) { - return (float*)jack_port_get_buffer((jack_port_t*)port, nframes); + return (float*)jack_port_get_buffer(port.jackPort(), nframes); } virtual QList<PortName> outputPorts(bool midi); @@ -63,7 +61,7 @@ class JackAudio : public AudioDriver { virtual bool connect(Port, Port); virtual bool disconnect(Port, Port); virtual void setPortName(Port p, const QString& n) { - jack_port_set_name((jack_port_t*)p, n.toLatin1().data()); + jack_port_set_name(p.jackPort(), n.toLatin1().data()); } virtual Port findPort(const QString& name); virtual QString portName(Port); @@ -77,7 +75,6 @@ class JackAudio : public AudioDriver { return jack_transport_query(_client, pos); } void graphChanged(); - virtual bool equal(Port a, Port b) { return a == b; } virtual void putEvent(Port, const MidiEvent&); virtual void startMidiCycle(Port); virtual unsigned int getCurFrame() { return pos.frame; } diff --git a/muse/muse/driver/port.h b/muse/muse/driver/port.h new file mode 100644 index 00000000..7386a7f3 --- /dev/null +++ b/muse/muse/driver/port.h @@ -0,0 +1,64 @@ +//============================================================================= +// 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. +//============================================================================= + +#ifndef __PORT_H__ +#define __PORT_H__ + +#include <jack/jack.h> + +class Port { + enum { JACK_TYPE, ALSA_TYPE, ZERO_TYPE } type; + union { + jack_port_t* _jackPort; + struct { + unsigned char _alsaPort; + unsigned char _alsaClient; + }; + }; + public: + Port() { + type = ZERO_TYPE; + } + Port(jack_port_t* p) { + _jackPort = p; + type = JACK_TYPE; + } + Port(unsigned char client, unsigned char port) { + _alsaPort = port; + _alsaClient = client; + type = ALSA_TYPE; + } + void setZero() { type = ZERO_TYPE; } + bool isZero() const { return type == ZERO_TYPE; } + bool operator==(const Port& p) const { + if (type == JACK_TYPE) + return _jackPort == p._jackPort; + else if (type == ALSA_TYPE) + return _alsaPort == p._alsaPort && _alsaClient == p._alsaClient; + else + return true; + } + unsigned char alsaPort() const { return _alsaPort; } + unsigned char alsaClient() const { return _alsaClient; } + jack_port_t* jackPort() const { return _jackPort; } + }; + +#endif + diff --git a/muse/muse/fifo.h b/muse/muse/fifo.h index e719d813..b4c49288 100644 --- a/muse/muse/fifo.h +++ b/muse/muse/fifo.h @@ -18,11 +18,8 @@ // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. //============================================================================= -#ifndef __AUDIONODE_H__ -#define __AUDIONODE_H__ - -class Pipeline; -class SndFile; +#ifndef __FIFO_H__ +#define __FIFO_H__ const int FIFO_BUFFER = 256; diff --git a/muse/muse/importmidi.cpp b/muse/muse/importmidi.cpp index 09d5a11f..80dfa9fd 100644 --- a/muse/muse/importmidi.cpp +++ b/muse/muse/importmidi.cpp @@ -40,6 +40,7 @@ #include "arranger/arranger.h" #include "midictrl.h" #include "midichannel.h" +#include "midiinport.h" #include "midioutport.h" //--------------------------------------------------------- diff --git a/muse/muse/midiinport.cpp b/muse/muse/midiinport.cpp index 25a2faee..6fc3288c 100644 --- a/muse/muse/midiinport.cpp +++ b/muse/muse/midiinport.cpp @@ -53,9 +53,9 @@ MidiInPort::~MidiInPort() void MidiInPort::setName(const QString& s) { Track::setName(s); - if (alsaPort(0)) + if (!alsaPort(0).isZero()) midiDriver->setPortName(alsaPort(), s); - if (jackPort(0)) + if (!jackPort(0).isZero()) audioDriver->setPortName(jackPort(), s); } diff --git a/muse/muse/midioutport.cpp b/muse/muse/midioutport.cpp index 9fadaa71..bc3b7968 100644 --- a/muse/muse/midioutport.cpp +++ b/muse/muse/midioutport.cpp @@ -73,9 +73,9 @@ MidiOutPort::~MidiOutPort() void MidiOutPort::setName(const QString& s) { Track::setName(s); - if (alsaPort()) + if (!alsaPort().isZero()) midiDriver->setPortName(alsaPort(), s); - if (jackPort()) + if (!jackPort().isZero()) audioDriver->setPortName(jackPort(), s); for (int ch = 0; ch < MIDI_CHANNELS; ++ch) _channel[ch]->setDefaultName(); diff --git a/muse/muse/plugin.cpp b/muse/muse/plugin.cpp index 6cd28e62..5f7b128e 100644 --- a/muse/muse/plugin.cpp +++ b/muse/muse/plugin.cpp @@ -167,8 +167,10 @@ PluginI::PluginI(AudioTrack* t) PluginI::~PluginI() { - if (_plugin) + if (_plugin) { deactivate(); + _plugin->incInstances(-1); + } if (_gui) delete _gui; if (pif) { diff --git a/muse/muse/route.cpp b/muse/muse/route.cpp index 22b6b3f1..8748f009 100644 --- a/muse/muse/route.cpp +++ b/muse/muse/route.cpp @@ -280,6 +280,15 @@ void Song::readRoute(QDomNode n) else printf("MusE:readRoute: unknown tag %s\n", e.tagName().toLatin1().data()); } + if (!s.isValid()) { // source port not found + printf("invalid source port\n"); + return; + } + if (!d.isValid()) { // destination port not found + printf("invalid destination port\n"); + return; + } + if (s.type == Route::AUDIOPORT) s.channel = d.channel; if (d.type == Route::AUDIOPORT) @@ -314,11 +323,10 @@ bool Route::operator==(const Route& a) const case SYNTIPORT: return channel == a.channel && track == a.track; case MIDIPORT: - return midiDriver->equal(port, a.port); case JACKMIDIPORT: - return audioDriver->equal(port, a.port); + return port == a.port; case AUDIOPORT: - return channel == a.channel && audioDriver->equal(port, a.port); + return (channel == a.channel) && (port == a.port); case AUXPLUGIN: return plugin == a.plugin; } @@ -410,20 +418,20 @@ void Route::read(QDomNode node) else if (st == "AUDIOPORT") { type = Route::AUDIOPORT; port = audioDriver->findPort(s); - if (port == 0) - printf("Route::read(): audioport not found\n"); + if (port.isZero()) + printf("Route::read(): audioport <%s> not found\n", s.toLatin1().data()); } else if (st == "JACKMIDIPORT") { type = Route::JACKMIDIPORT; port = audioDriver->findPort(s); - if (port == 0) - printf("Route::read(): jack midiport not found\n"); + if (port.isZero()) + printf("Route::read(): jack midiport <%s> not found\n", s.toLatin1().data()); } else if (st == "MIDIPORT") { type = Route::MIDIPORT; port = midiDriver->findPort(s); - if (port == 0) - printf("Route::read(): midiport not found\n"); + if (port.isZero()) + printf("Route::read(): midiport <%s> not found\n", s.toLatin1().data()); } else if (st == "SYNTIPORT") { type = Route::SYNTIPORT; diff --git a/muse/muse/route.h b/muse/muse/route.h index 5d17c5c0..70ed536b 100644 --- a/muse/muse/route.h +++ b/muse/muse/route.h @@ -29,8 +29,7 @@ namespace AL { }; using AL::Xml; - -typedef void* Port; +#include "driver/driver.h" // Routing Types: // @@ -61,9 +60,9 @@ struct Route { enum RouteType { TRACK, AUDIOPORT, MIDIPORT, JACKMIDIPORT, SYNTIPORT, AUXPLUGIN}; + Port port; union { Track* track; - Port port; AuxPluginIF* plugin; }; int channel; // route to/from JACK can specify a channel to connect to @@ -79,6 +78,14 @@ struct Route { Route(Track*, int, RouteType t = TRACK); Route(AuxPluginIF*); + bool isPortType() const { + return type==AUDIOPORT || type == MIDIPORT || type == JACKMIDIPORT; + } + bool isValid() const { + return (isPortType() && !port.isZero()) + || ((type == TRACK || type == SYNTIPORT) && track) + || ((type == AUXPLUGIN) && plugin); + } QString name() const; void read(QDomNode node); void write(Xml&, const char* name) const; diff --git a/muse/muse/seqmsg.cpp b/muse/muse/seqmsg.cpp index d3a5cd4c..c21080ff 100644 --- a/muse/muse/seqmsg.cpp +++ b/muse/muse/seqmsg.cpp @@ -208,12 +208,12 @@ void Audio::msgSetChannels(AudioTrack* node, int n) if (node->type() == Track::AUDIO_INPUT) { AudioInput* ai = (AudioInput*)node; for (int i = 0; i < mc; ++i) { - if (i < n && ai->jackPort(i) == 0) { + if (i < n && ai->jackPort(i).isZero()) { char buffer[128]; snprintf(buffer, 128, "%s-%d", name.toLatin1().data(), i); ai->setJackPort(audioDriver->registerInPort(QString(buffer), false), i); } - else if ((i >= n) && ai->jackPort(i)) { + else if ((i >= n) && ai->jackPort(i).isZero()) { RouteList* ir = node->inRoutes(); for (iRoute ii = ir->begin(); ii != ir->end(); ++ii) { Route r = *ii; @@ -223,14 +223,14 @@ void Audio::msgSetChannels(AudioTrack* node, int n) } } audioDriver->unregisterPort(ai->jackPort(i)); - ai->setJackPort(0, i); + ai->setJackPort(Port(), i); } } } else if (node->type() == Track::AUDIO_OUTPUT) { AudioOutput* ao = (AudioOutput*)node; for (int i = 0; i < mc; ++i) { - void* jp = ao->jackPort(i); + void* jp = ao->jackPort(i).jackPort(); if (i < n && jp == 0) { char buffer[128]; snprintf(buffer, 128, "%s-%d", name.toLatin1().data(), i); @@ -245,8 +245,8 @@ void Audio::msgSetChannels(AudioTrack* node, int n) break; } } - audioDriver->unregisterPort(jp); - ao->setJackPort(0, i); + audioDriver->unregisterPort(ao->jackPort(i)); + ao->setJackPort(Port(), i); } } } diff --git a/muse/muse/synth.h b/muse/muse/synth.h index 6ce90f95..f538842d 100644 --- a/muse/muse/synth.h +++ b/muse/muse/synth.h @@ -136,7 +136,7 @@ class SynthI : public AudioTrack, public MidiInstrument public: SynthI(); virtual ~SynthI(); - SynthI* clone() const { return 0; } +// SynthI* clone() const { return 0; } SynthIF* sif() const { return _sif; } bool initInstance(Synth* s); diff --git a/muse/muse/track.cpp b/muse/muse/track.cpp index bcb3ff3c..f2937450 100644 --- a/muse/muse/track.cpp +++ b/muse/muse/track.cpp @@ -113,8 +113,6 @@ void Track::init() _meter[i] = 0.0f; _peak[i] = 0.0f; _peakTimer[i] = 0; - _alsaPort[i] = 0; - _jackPort[i] = 0; } } @@ -136,10 +134,14 @@ Track::Track(Track::TrackType t) Track::~Track() { delete _parts; - if (_alsaPort) - midiDriver->unregisterPort(_alsaPort); - if (_jackPort) - audioDriver->unregisterPort(_jackPort); + + for (int i = 0; i < MAX_CHANNELS; ++i) { + if (!_alsaPort[i].isZero()) + midiDriver->unregisterPort(_alsaPort[i]); + if (!_jackPort[i].isZero()) + audioDriver->unregisterPort(_jackPort[i]); + } + } //--------------------------------------------------------- @@ -733,6 +735,8 @@ MidiTrackBase::MidiTrackBase(TrackType t) MidiTrackBase::~MidiTrackBase() { + foreach(MidiPluginI* plugin, *_pipeline) + delete plugin; delete _pipeline; } @@ -977,9 +981,9 @@ void Track::resetAllMeter() void Track::activate1() { if (isMidiTrack()) { - if (alsaPort(0)) + if (!alsaPort(0).isZero()) printf("Track::activate1() midi: alsa port already active!\n"); - if (jackPort(0)) + if (!jackPort(0).isZero()) printf("Track::activate1() midi: jack port already active!\n"); if (type() == MIDI_OUT) { _alsaPort[0] = midiDriver->registerInPort(_name, true); @@ -993,7 +997,7 @@ void Track::activate1() } for (int i = 0; i < channels(); ++i) { - if (jackPort(i)) + if (!jackPort(i).isZero()) printf("Track::activate1(): already active!\n"); else { QString s(QString("%1-%2").arg(_name).arg(i)); @@ -1087,11 +1091,11 @@ void Track::deactivate() } } for (int i = 0; i < channels(); ++i) { - if (_jackPort[i]) { + if (!_jackPort[i].isZero()) { audioDriver->unregisterPort(_jackPort[i]); _jackPort[i] = 0; } - if (_alsaPort[i]) { + if (!_alsaPort[i].isZero()) { midiDriver->unregisterPort(_alsaPort[i]); _alsaPort[i] = 0; } diff --git a/muse/muse/track.h b/muse/muse/track.h index 0dcc3410..f3f28d18 100644 --- a/muse/muse/track.h +++ b/muse/muse/track.h @@ -21,6 +21,7 @@ #ifndef __TRACK_H__ #define __TRACK_H__ +#include "driver/port.h" #include "al/pos.h" #include "route.h" #include "ctrl.h" @@ -35,8 +36,6 @@ namespace AL { using AL::Xml; using AL::TType; -typedef void* Port; - class DrumMap; class MidiPipeline; class MidiEvent; |