[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