[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