[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