[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    extragear/multimedia/kmid
From:       Pedro Lopez-Cabanillas <pedro.lopez.cabanillas () gmail ! com>
Date:       2010-08-02 14:26:20
Message-ID: 20100802142620.E5F44AC7A9 () svn ! kde ! org
[Download RAW message or body]

SVN commit 1158327 by pedrol:

Fix in Windows backend for initial MIDI program changes, muted MIDI channels, locked \
channels and MIDI reset messages.

 M  +14 -5     src/kmid2.cpp  
 M  +9 -0      win/winmidiobject.cpp  
 M  +1 -1      win/winmidiobject.h  
 M  +43 -10    win/winmidioutput.cpp  
 M  +2 -1      win/winmidioutput.h  


--- trunk/extragear/multimedia/kmid/src/kmid2.cpp #1158326:1158327
@@ -1452,6 +1452,8 @@
 
 void KMid2::slotLoadSongSettings()
 {
+    int vol, pitch, skew, pgm;
+    bool locked;
     if (!m_songName.isEmpty()) {
         QString fileName = QString("songlib/%1.cfg").arg(m_songName);
         KConfig songSettings(KStandardDirs::locateLocal("appdata", fileName, \
false)); @@ -1461,15 +1463,15 @@
         if (!encoding.isEmpty())
             slotSelectEncoding(encoding);
 
-        int vol = grp.readEntry("volume", 100);
+        vol = grp.readEntry("volume", 100);
         m_volumeSlider->setValue(vol);
         m_volumeSlider->setToolTip(QString::number(vol*1.0, 'f', 0) + '%');
 
-        int pitch = grp.readEntry("pitch", 0);
+        pitch = grp.readEntry("pitch", 0);
         m_pitchSlider->setValue(pitch);
         m_pitchSlider->setToolTip(QString::number(pitch));
 
-        int skew = grp.readEntry("timeskew", 100);
+        skew = grp.readEntry("timeskew", 100);
         m_tempoSlider->setValue(skew);
         m_tempoSlider->setToolTip(QString::number(sliderToTempoFactor(skew),'f',0)+'%');
  
@@ -1486,8 +1488,15 @@
                 }
                 m_channels->setMuteChannel(i, grp.readEntry("muted", false));
                 m_channels->setSoloChannel(i, grp.readEntry("solo", false));
-                m_channels->setPatchChannel(i, grp.readEntry("patch", -1));
-                m_channels->setLockChannel(i, grp.readEntry("locked", false));
+
+                pgm = grp.readEntry("patch", -1);
+                m_channels->setPatchChannel(i, pgm);
+                if (pgm > -1)
+                    m_midiout->sendProgram(i, pgm);
+
+                locked = grp.readEntry("locked", false);
+                m_channels->setLockChannel(i, locked);
+                m_midiout->setLocked(i, locked);
             }
         }
         displayLyrics();
--- trunk/extragear/multimedia/kmid/win/winmidiobject.cpp #1158326:1158327
@@ -303,6 +303,7 @@
                 d->m_out->setInitialTempo(d->m_initialTempo);
             d->m_out->sendResetMessage();
             d->m_out->resetControllers();
+            sendInitialProgramChanges();
             d->m_out->songOutput();
             if (d->m_out->play())
                 updateState( PlayingState );
@@ -808,6 +809,14 @@
         return QVariant();
     }
 
+    void WinMIDIObject::sendInitialProgramChanges()
+    {
+        kDebug();
+        for (int i = 0; i < MIDI_CHANNELS; ++i) {
+            int patch(d->m_channelPatches[i]);
+            d->m_out->sendInitialProgram(i, patch);
 }
+    }
+}
 
 #include "winmidiobject.moc"
--- trunk/extragear/multimedia/kmid/win/winmidiobject.h #1158326:1158327
@@ -67,7 +67,7 @@
         virtual bool guessTextEncoding();
         QVariant songProperty(const QString& key);
         QVariant channelProperty(int channel, const QString& key);
-
+        void sendInitialProgramChanges();
         void emitShortEvSignals(qint64 ticks, const WinMIDIPacket& packet);
 
     public Q_SLOTS:
--- trunk/extragear/multimedia/kmid/win/winmidioutput.cpp #1158326:1158327
@@ -79,6 +79,7 @@
         {
             for (int chan = 0; chan < MIDI_CHANNELS; ++chan) {
                 m_lastpgm[chan] = 0;
+                m_lockedpgm[chan] = 0;
                 m_volumeShift[chan] = 1.0;
                 m_volume[chan] = 100;
                 m_muted[chan] = false;
@@ -132,9 +133,9 @@
 
         void transformProgramEvent(WinMIDIPacket &packet)
         {
-            if (m_mapper != NULL && m_mapper->isOK()) {
                 int channel = packet.data[0] & MIDI_CHANNEL_MASK;
                 m_lastpgm[channel] = packet.data[1];
+            if (m_mapper != NULL && m_mapper->isOK()) {
                 int pgm = m_mapper->patch(channel, m_lastpgm[channel]);
                 if (pgm >= 0 && pgm < 128)
                     packet.data[1] = pgm;
@@ -195,6 +196,7 @@
         int m_currentOutput;
         QMap<int,QString> m_outputDevices;
         int m_lastpgm[MIDI_CHANNELS];
+        int m_lockedpgm[MIDI_CHANNELS];
         qreal m_volumeShift[MIDI_CHANNELS];
         int m_volume[MIDI_CHANNELS];
         bool m_muted[MIDI_CHANNELS];
@@ -278,6 +280,9 @@
     void inline WinMIDIOutput::outEvent(int &lastTick, bool &first, SongEvent *ev)
     {
         int i, j;
+        quint8 status;
+        quint8 chan;
+        bool reject(false);
         DWORD delta = 0;
         WinMIDIPacket packet, lpack;
         packet.dwPacket = 0;
@@ -286,6 +291,17 @@
         case SHORT_EVENT:
             packet.dwPacket = ev->getPacket();
             d->transform(packet);
+            status = packet.data[0] & MIDI_STATUS_MASK;
+            chan = packet.data[0] & MIDI_CHANNEL_MASK;
+            reject = ( ( status < MIDI_STATUS_NOTEOFF ) ||
+                       ( status >= MIDI_STATUS_SYSEX ) ||
+                       ((status < MIDI_STATUS_SYSEX) &&
+                         d->m_muted[chan]) ||
+                       ((status == MIDI_STATUS_PROGRAMCHANGE) &&
+                         d->m_locked[chan]) );
+            if (reject)
+                packet.dwPacket = 0;
+            else
             packet.data[3] = MEVT_SHORTMSG;
             break;
         case TEMPO_EVENT:
@@ -589,6 +605,10 @@
         if (channel >= 0 && channel < MIDI_CHANNELS) {
             if (d->m_locked[channel] != lock) {
                 d->m_locked[channel] = lock;
+                if (lock) {
+                    d->m_lockedpgm[channel] = d->m_lastpgm[channel];
+                    kDebug() << channel << d->m_lastpgm[channel];
+                }
                 emit lockedChanged( channel, lock );
             }
         }
@@ -638,22 +658,22 @@
         }
     }
 
-    void WinMIDIOutput::sendShortMessage(WinMIDIPacket &packet)
+    void WinMIDIOutput::sendShortMessage(WinMIDIPacket &packet, bool discardable)
     {
         MMRESULT res;
         quint8 status;
         quint8 chan;
-        bool ok;
+        bool reject(false);
         d->transform(packet);
         status = packet.data[0] & MIDI_STATUS_MASK;
         chan = packet.data[0] & MIDI_CHANNEL_MASK;
-        ok = ( status >= MIDI_STATUS_NOTEOFF ) &&
-             ( ( status == MIDI_STATUS_SYSEX ) |
-               ( status < MIDI_STATUS_SYSEX &&
-                 !d->m_muted[chan] ) );
-        if ( ok && status == MIDI_STATUS_PROGRAMCHANGE )
-            ok = !d->m_locked[chan];
-        if (ok) {
+        reject = ( ( status < MIDI_STATUS_NOTEOFF ) ||
+                   ( status >= MIDI_STATUS_SYSEX ) ||
+                   ((status < MIDI_STATUS_SYSEX) &&
+                     d->m_muted[chan] && discardable) );
+        if ( discardable && (status == MIDI_STATUS_PROGRAMCHANGE) )
+            reject |= d->m_locked[chan];
+        if (!reject) {
             res = midiOutShortMsg( (HMIDIOUT)d->m_outHandle, packet.dwPacket );
             if ( res != MMSYSERR_NOERROR )
                 kDebug() << "midiOutShortMsg() err:" << mmErrorString(res);
@@ -875,6 +895,19 @@
         d->m_currentTempo = initialTempo;
         d->m_pendingTempo = true;
     }
+
+    void WinMIDIOutput::sendInitialProgram(int chan, int program)
+    {
+        int pgm(d->m_locked[chan] ? d->m_lockedpgm[chan] : program);
+        if (pgm > -1) {
+            kDebug() << chan << pgm;
+            WinMIDIPacket packet;
+            packet.data[0] = MIDI_STATUS_PROGRAMCHANGE | (chan & MIDI_CHANNEL_MASK);
+            packet.data[1] = pgm;
+            sendShortMessage(packet, false);
 }
+    }
 
+}
+
 #include "winmidioutput.moc"
--- trunk/extragear/multimedia/kmid/win/winmidioutput.h #1158326:1158327
@@ -71,7 +71,7 @@
         virtual bool isMuted(int channel) const;
         virtual MidiMapper* midiMap();
         virtual int pitchShift();
-        void sendShortMessage(WinMIDIPacket &msg);
+        void sendShortMessage(WinMIDIPacket &msg, bool discardable = true);
 
         /* Stream IO Methods */
         bool openStream(unsigned int dev);
@@ -120,6 +120,7 @@
         void sendChannelPressure(int chan, int value);
         void sendPitchBend(int chan, int value);
         void sendSysexEvent(const QByteArray& data);
+        void sendInitialProgram(int channel, int value);
 
     Q_SIGNALS:
         void finished();


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic