From kde-commits Sat Oct 30 10:56:05 2010 From: Pedro Lopez-Cabanillas Date: Sat, 30 Oct 2010 10:56:05 +0000 To: kde-commits Subject: extragear/multimedia/kmid/mac Message-Id: <20101030105605.67757AC89A () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=128843709718593 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 m_text; QMap m_textUserEvents; QMap 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,