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

List:       kde-commits
Subject:    playground/multimedia/kmid2
From:       Pedro Lopez-Cabanillas <pedro.lopez.cabanillas () gmail ! com>
Date:       2009-10-31 10:54:00
Message-ID: 1256986440.899822.11176.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 1042970 by pedrol:

More karaoke metadata types
Minor fixes

 M  +8 -9      alsa/alsamidiobject.cpp  
 M  +32 -25    alsa/song.cpp  
 M  +8 -9      alsa/song.h  
 M  +8 -2      src/kmid2.cpp  
 M  +8 -8      src/midiobject.h  


--- trunk/playground/multimedia/kmid2/alsa/alsamidiobject.cpp #1042969:1042970
@@ -140,13 +140,10 @@
         d->m_port->subscribeFromAnnounce();
         d->m_player = new Player(d->m_client, d->m_portId);
         connect(d->m_player, SIGNAL(finished()), SLOT(songFinished()));
-        //connect(d->m_client, SIGNAL(eventReceived(SequencerEvent*)),
-        //                     SLOT(sequencerEvent(SequencerEvent*)));
         d->m_client->setHandler(this);
         d->m_client->startSequencerInput();
     }
 
-    //void ALSAMIDIObject::sequencerEvent(SequencerEvent *ev)
     void ALSAMIDIObject::handleSequencerEvent(SequencerEvent* ev)
     {
         if (SequencerEvent::isConnectionChange(ev))
@@ -164,8 +161,8 @@
                             s = QString::fromAscii(ve->getData(), ve->getLength());
                         else
                             s = d->m_decoder->toUnicode(ve->getData(), ve->getLength());
-                        s.replace(QRegExp("[/\\\\]+"), ""); //QString(QChar::LineSeparator));
-                        s.replace(QRegExp("[\r\n]+"), ""); //QString(QChar::LineSeparator));
+                        s.replace(QRegExp("[/\\\\]+"), "");
+                        s.replace(QRegExp("[\r\n]+"), "");
                         emit midiTextEvent(Song::Lyric, s);
                     }
                     break;
@@ -236,6 +233,8 @@
             return d->m_song.getText(Song::KarLanguage);
         else if (key == "KAR_TITLES")
             return d->m_song.getText(Song::KarTitles);
+        else if (key == "KAR_WARNINGS")
+            return d->m_song.getText(Song::KarWarnings);
         return QStringList();
     }
 
@@ -453,9 +452,10 @@
         if ( (type >= Song::FIRST_TYPE) && (type <= Song::Cue) ) {
             qint64 tick = d->m_engine->getCurrentTime();
             d->m_song.addMetaData(static_cast<Song::TextType>(type), data, tick);
-            if ( type == Song::Lyric || type == Song::Text ) {
-                if (data.length() > 1 && data[0] == '@')
-                    return;
+            if ( (type == Song::Lyric || type == Song::Text) &&
+                 (data.length() > 0) &&
+                 (data[0] != '@') &&
+                 (data[0] != '%') ) {
                 VariableEvent *ev = new VariableEvent(data);
                 ev->setSequencerType(SND_SEQ_EVENT_USR_VAR0);
                 appendEvent(ev);
@@ -525,7 +525,6 @@
         updateState( StoppedState );
         d->m_player->resetPosition();
         emit finished();
-        emit tick(0);
     }
 
     void ALSAMIDIObject::updateState(State newState)
--- trunk/playground/multimedia/kmid2/alsa/song.cpp #1042969:1042970
@@ -44,8 +44,6 @@
             delete takeFirst();
         m_fileName.clear();
         m_text.clear();
-        m_lyrics.clear();
-        m_textEvents.clear();
         m_format = 0;
         m_ntrks = 0;
         m_division = 0;
@@ -67,6 +65,8 @@
     {
         if ( (type >= FIRST_TYPE) && (type <= Cue) ) {
             TextType t = type;
+            if ((text.length() > 0) && (text[0] == '%'))
+                return; // ignored
             if ((text.length() > 1) && (text[0] == '@')) {
                 switch(text[1]) {
                 case 'K':
@@ -84,32 +84,40 @@
                 case 'T':
                     t = KarTitles;
                     break;
+                case 'W':
+                    t = KarWarnings;
+                    break;
                 }
             }
-            m_text[t].append(text);
-            if (t == Text)
-                m_textEvents[tick].append(text);
-            else if (t == Lyric)
-                m_lyrics[tick].append(text);
+            m_text[t][tick].append(text);
         }
     }
 
     void Song::appendStringToList(QStringList &list, QString &s)
     {
-        s.replace(QRegExp("^@[IKLTV]"), QString(QChar::LineSeparator));
+        s.replace(QRegExp("@[IKLTVW]"), QString(QChar::LineSeparator));
         s.replace(QRegExp("[/\\\\]+"), QString(QChar::LineSeparator));
         s.replace(QRegExp("[\r\n]+"), QString(QChar::LineSeparator));
         list.append(s);
     }
 
+    void Song::chkDecoder()
+    {
+        if (m_codec != NULL && m_decoder == NULL)
+            m_decoder = m_codec->makeDecoder();
+    }
+
     QStringList Song::getText(TextType type)
     {
         QString s;
         QStringList list;
         if ( (type >= FIRST_TYPE) && (type <= LAST_TYPE) ) {
-            if (m_codec != NULL && m_decoder == NULL) m_decoder = m_codec->makeDecoder();
+            chkDecoder();
             foreach(const QByteArray &a, m_text[type]) {
-                s = (m_decoder == NULL ? QString::fromAscii(a) : m_decoder->toUnicode(a));
+                if (m_decoder == NULL )
+                    s = QString::fromAscii(a);
+                else
+                    s = m_decoder->toUnicode(a);
                 appendStringToList(list, s);
             }
         }
@@ -121,24 +129,23 @@
         QString s;
         QStringList list;
         TimeStampedData::const_iterator it, end;
-        if (m_codec != NULL && m_decoder == NULL)
-            m_decoder = m_codec->makeDecoder();
-        if (m_lyrics.empty()) {
-            it = m_textEvents.constBegin();
-            if (m_textEvents.empty())
-                end = m_textEvents.constEnd();
+        chkDecoder();
+        if (m_text[Lyric].empty()) {
+            it = m_text[Text].constBegin();
+            if (m_text[Text].empty())
+                end = m_text[Text].constEnd();
             else
-                end = m_textEvents.upperBound(time);
+                end = m_text[Text].upperBound(time);
         } else {
-            it = m_lyrics.constBegin();
-            end = m_lyrics.upperBound(time);
+            it = m_text[Lyric].constBegin();
+            end = m_text[Lyric].upperBound(time);
         }
-        while( it != end ) {
-            foreach(const QByteArray &a, it.value()) {
-                s = (m_decoder == NULL ? QString::fromAscii(a) : m_decoder->toUnicode(a));
-                appendStringToList(list, s);
-            }
-            ++it;
+        for (; it != end; ++it ) {
+            if (m_decoder == NULL)
+                s = QString::fromAscii(it.value());
+            else
+                s = m_decoder->toUnicode(it.value());
+            appendStringToList(list, s);
         }
         return list;
     }
--- trunk/playground/multimedia/kmid2/alsa/song.h #1042969:1042970
@@ -36,19 +36,20 @@
     public:
 
         /**
-         * For Karaoke files, there is additional metadata
+         * For Karaoke files, there may be additional metadata
          * FileType: @KMIDI KARAOKE FILE
          * Version: @V0100
          * Information: @I<text>
          * Language: @L<lang>
-         * Title: @T<title>
+         * Title: @T<title, author, ...>
+         * Warning?: @W<bla bla bla>
          */
         enum TextType {
             Text = 1, Copyright = 2, TrackName = 3,
             InstrumentName = 4, Lyric = 5, Marker = 6, Cue = 7,
             KarFileType = 8, KarVersion = 9, KarInformation = 10,
-            KarLanguage = 11, KarTitles = 12,
-            FIRST_TYPE = Text, LAST_TYPE = KarTitles
+            KarLanguage = 11, KarTitles = 12, KarWarnings = 13,
+            FIRST_TYPE = Text, LAST_TYPE = KarWarnings
         };
 
         Song() : QList<SequencerEvent*>(),
@@ -77,11 +78,11 @@
 
     private:
         void appendStringToList(QStringList &list, QString &s);
-
+        void chkDecoder();
         /**
          * Time-stamped data, like lyrics and similar meta data
          */
-        typedef QMap<qint64, QList<QByteArray> > TimeStampedData;
+        typedef QMap<qint64, QByteArray> TimeStampedData;
 
         int m_format;
         int m_ntrks;
@@ -89,9 +90,7 @@
         QTextCodec *m_codec;
         QTextDecoder *m_decoder;
         QString m_fileName;
-        QMap<TextType, QList<QByteArray> > m_text;
-        TimeStampedData m_lyrics;
-        TimeStampedData m_textEvents;
+        QMap<TextType, TimeStampedData> m_text;
     };
     
     typedef QListIterator<SequencerEvent*> SongIterator;
--- trunk/playground/multimedia/kmid2/src/kmid2.cpp #1042969:1042970
@@ -41,6 +41,7 @@
 #include <KMessageBox>
 #include <KCharsets>
 #include <KGlobalSettings>
+#include <KDebug>
 
 using namespace KMid;
 
@@ -76,6 +77,7 @@
         connect(m_midiobj, SIGNAL(midiTextEvent(const int, const QString &)),
                 SLOT(slotMidiTextEvent(const int, const QString&)));
         connect(m_midiobj, SIGNAL(tick(qint64)), SLOT(slotTick(qint64)));
+        connect(m_midiobj, SIGNAL(finished()), SLOT(finished()));
         finished();
     }
 }
@@ -183,7 +185,6 @@
         m_view->labelDuration->setText(m_midiobj->readableTotalTime());
         finished();
         updateTempoLabel();
-        displayLyrics();
         m_seeking = false;
     }
 }
@@ -281,7 +282,7 @@
     m_midiobj->seek(0);
     m_view->labelPosition->setNum(0);
     m_view->timeSlider->setSliderPosition(0);
-    updateState("stopped_state", i18n("stopped"));
+    displayLyrics();
 }
 
 void KMid2::slotSelectEncoding(int i)
@@ -429,7 +430,12 @@
         s = m_midiobj->metaData("KAR_TITLES").join("<br>");
         if (!s.isEmpty())
             infostr += i18n("Karaoke title: <b>%1</b><br>", s);
+
+        s = m_midiobj->metaData("KAR_WARNINGS").join("<br>");
+        if (!s.isEmpty())
+            infostr += i18n("Karaoke warnings: <b>%1</b><br>", s);
     }
+    infostr.replace(QChar::LineSeparator, "<br>");
     KMessageBox::information(this, infostr, i18n("Sequence Information"));
 }
 
--- trunk/playground/multimedia/kmid2/src/midiobject.h #1042969:1042970
@@ -127,17 +127,17 @@
          *
          * Backends may also return other Karaoke types as well:
          * KAR_FILETYPE, KAR_VERSION, KAR_INFORMATION,
-         * KAR_LANGUAGE, KAR_TITLES.
+         * KAR_LANGUAGE, KAR_TITLES, KAR_WARNINGS.
          *
          * A typical usage looks like this:
          * \code
-         * setMetaText       (media->metaData("SMF_TEXT"))
-         * setMetaCopyright  (media->metaData("SMF_COPYRIGHT"));
-         * setMetaTrackNames (media->metaData("SMF_TRACKNAMES"));
-         * setMetaInstruments(media->metaData("SMF_INSTRUMENTNAMES"));
-         * setMetaLyrics     (media->metaData("SMF_LYRICS"));
-         * setMetaMarkers    (media->metaData("SMF_MARKERS"));
-         * setMetaCues       (media->metaData("SMF_CUES"));
+         * setText       (media->metaData("SMF_TEXT"))
+         * setCopyright  (media->metaData("SMF_COPYRIGHT"));
+         * setTrackNames (media->metaData("SMF_TRACKNAMES"));
+         * setInstruments(media->metaData("SMF_INSTRUMENTNAMES"));
+         * setLyrics     (media->metaData("SMF_LYRICS"));
+         * setMarkers    (media->metaData("SMF_MARKERS"));
+         * setCues       (media->metaData("SMF_CUES"));
          * \endcode
          */
         virtual QStringList metaData(const QString &key) const = 0;
[prev in list] [next in list] [prev in thread] [next in thread] 

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