[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: extragear/multimedia/kmid/mac
From: Pedro Lopez-Cabanillas <pedro.lopez.cabanillas () gmail ! com>
Date: 2010-10-30 10:56:05
Message-ID: 20101030105605.67757AC89A () svn ! kde ! org
[Download RAW message or body]
SVN commit 1191276 by pedrol:
MacOSX backend. Fix for bug#255605: highlighted lyrics syllable randomly jumps when \
playing some songs having both Text and Lyric events. This bug hits all KMid \
backends.
M +40 -6 macmidiobject.cpp
M +1 -0 macmidiobject.h
--- trunk/extragear/multimedia/kmid/mac/macmidiobject.cpp #1191275:1191276
@@ -99,7 +99,8 @@
m_songEmpty(true),
m_tickInterval(0),
m_numtracks(0),
- m_barCount(0)
+ m_barCount(0),
+ m_lyricTextType(Text)
{ }
virtual ~MacMIDIObjectPrivate()
@@ -144,6 +145,7 @@
qint32 m_tickInterval;
int m_numtracks;
int m_barCount;
+ TextType m_lyricTextType;
QMap<TextType, TimeStampedData> m_text;
QMap<MusicTimeStamp, QByteArray> m_textUserEvents;
QMap<MusicTimeStamp, qreal> m_tempoUserEvents;
@@ -700,14 +702,12 @@
metap->dataLength );
qint64 tick = timeStamp * d->m_division;
addMetaData((TextType)metap->metaEventType, data, tick);
- if ( ( metap->metaEventType == Lyric ||
- metap->metaEventType == Text ) &&
+ if ( (metap->metaEventType == d->m_lyricTextType) &&
(data.length() > 0) &&
(data[0] != '@') && (data[0] != '%') ) {
data.truncate(32);
d->m_textUserEvents[timeStamp] += data;
}
-
if ( (metap->metaEventType == TrackName ||
metap->metaEventType == InstrumentName ) &&
trackLabel.isEmpty() )
@@ -758,6 +758,40 @@
}
}
+ void MacMIDIObject::analyzeLyrics()
+ {
+ OSStatus result = noErr;
+ d->m_lyricTextType = Text;
+ for (int i = 0; i < d->m_numtracks; ++i) {
+ Boolean hasCurrentEvent;
+ MusicTrack track;
+ MusicEventIterator iter;
+ MusicSequenceGetIndTrack(d->m_sequence, i, &track);
+ NewMusicEventIterator(track, &iter);
+ MusicEventIteratorHasCurrentEvent (iter, &hasCurrentEvent);
+ while (hasCurrentEvent) {
+ MusicTimeStamp timeStamp;
+ MusicEventType eventType;
+ const void *dataPtr;
+ UInt32 dataLen;
+ MusicEventIteratorGetEventInfo ( iter, &timeStamp, &eventType,
+ &dataPtr, &dataLen );
+ if (eventType == kMusicEventType_Meta) {
+ MIDIMetaEvent *metap = (MIDIMetaEvent*) dataPtr;
+ if (metap->metaEventType == Lyric) {
+ d->m_lyricTextType = Lyric;
+ break;
+ }
+ }
+ MusicEventIteratorNextEvent (iter);
+ MusicEventIteratorHasCurrentEvent (iter, &hasCurrentEvent);
+ }
+ DisposeMusicEventIterator (iter);
+ if (d->m_lyricTextType == Lyric)
+ return;
+ }
+ }
+
void MacMIDIObject::analyzeSequence()
{
OSStatus result = noErr;
@@ -778,11 +812,11 @@
d->m_channelLabel[i].clear();
d->m_channelPatches[i] = -1;
}
-
result = MusicSequenceGetTrackCount (d->m_sequence, &ntracks);
if (result != noErr)
kDebug() << "MusicSequenceGetTrackCount() err:" << result;
- d->m_numtracks = result;
+ d->m_numtracks = ntracks;
+ analyzeLyrics();
analyzeTrack(-1); // tempoTrack
for (UInt32 i = 0; i < ntracks; ++i)
analyzeTrack(i);
--- trunk/extragear/multimedia/kmid/mac/macmidiobject.h #1191275:1191276
@@ -89,6 +89,7 @@
void sendEvents(const MIDIPacketList *pktlist);
void updateState(State newState);
void analyzeTrack(int trackno);
+ void analyzeLyrics();
void analyzeSequence();
void clearSequence();
void addMetaData(TextType type, const QByteArray& text,
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic