#include "mafwwrapper.h" MafwWrapper::MafwWrapper(QObject *parent) : QObject(parent), m_rnd(0), m_positionTimer(new QTimer(this)), m_currentPosition(0), m_totalLength(0), m_currentIndex(0), m_playlistCount(0), m_shouldShowPauseButton(false), m_songTitle(tr("Unknown song")), m_artistName(tr("Unknown artist")), m_albumName(tr("Unknown album")), m_iconUrl(PLAY_ICON_URL), m_durationText("0:00/0:00") { MafwRegistry* registry = MafwRegistry::instance(); QList renderers = registry->renderers(); connect(registry, SIGNAL(rendererAdded(MafwRenderer*)), this, SLOT(rendererAdded(MafwRenderer*))); connect(registry, SIGNAL(rendererRemoved(const MafwRenderer*)), this, SLOT(rendererRemoved(const MafwRenderer*))); MafwShared *sessionBusTracker = MafwShared::instance(); sessionBusTracker->initTracking(registry); m_positionTimer->setInterval(1000); connect(m_positionTimer, SIGNAL(timeout()), this, SLOT(onPositionTimerTimedOut())); foreach (MafwRenderer *renderer, renderers) { if (renderer->name() == MAFW_AUDIO_RENDERER || renderer->uuid() == MAFW_AUDIO_RENDERER) { rendererAdded(renderer); break; } } } void MafwWrapper::rendererAdded(MafwRenderer *rnd) { if (rnd->uuid() != MAFW_AUDIO_RENDERER) return; m_rnd = rnd; connect(rnd, SIGNAL(stateChanged(MafwRenderer::State)), this, SLOT(onStateChanged(MafwRenderer::State))); connect(rnd, SIGNAL(metadataChanged(QString,QList)), this, SLOT(onMetadataChanged(QString,QList))); } void MafwWrapper::rendererRemoved(MafwRenderer *rnd) { } void MafwWrapper::onStateChanged(MafwRenderer::State state) { bool shouldShowPauseButton = false; m_currentState = state; switch (state) { case MafwRenderer::Playing: shouldShowPauseButton = true; m_positionTimer->start(); break; case MafwRenderer::Paused: shouldShowPauseButton = false; m_positionTimer->stop(); break; case MafwRenderer::Transitioning: shouldShowPauseButton = false; m_positionTimer->stop(); break; case MafwRenderer::Stopped: shouldShowPauseButton = false; m_positionTimer->stop(); break; case MafwRenderer::Invalid: shouldShowPauseButton = false; m_positionTimer->stop(); break; } setShouldShowPauseButton(shouldShowPauseButton); } void MafwWrapper::onMetadataChanged(QString metadata, QList values) { if (metadata == MAFW_METADATA_KEY_TITLE) setSongTitle(values.first().toString()); else if (metadata == MAFW_METADATA_KEY_ALBUM) setAlbumName(values.first().toString()); else if (metadata == MAFW_METADATA_KEY_ARTIST) setArtistName(values.first().toString()); else if (metadata == MAFW_METADATA_KEY_DURATION) setTotalLength(values.first().toInt()); else if (metadata == MAFW_METADATA_KEY_RENDERER_ART_URI) setAlbumArtUri(values.first().toString()); } void MafwWrapper::onPositionTimerTimedOut() { if (m_rnd) m_rnd->getPosition(this, SLOT(onGotPosition(uint))); } QString MafwWrapper::time_mmss(int seconds) { if (seconds < 0) { seconds = -seconds; return QString("-%1:%2").arg(seconds/60, 2, 10, QChar('0')).arg(seconds%60, 2, 10, QChar('0')); } else { return QString("%1:%2").arg(seconds/60, 2, 10, QChar('0')).arg(seconds%60, 2, 10, QChar('0')); } } void MafwWrapper::onGotPosition(uint pos) { setCurrentPosition(pos); setDurationText(time_mmss(pos) + "/" + time_mmss(m_totalLength)); } void MafwWrapper::playPause() { if (!m_rnd) return; if (m_currentState == MafwRenderer::Playing) m_rnd->pause(); else if (m_currentState == MafwRenderer::Paused) m_rnd->resume(); else if (m_currentState == MafwRenderer::Stopped) m_rnd->play(); } void MafwWrapper::seek(int pos) { if (!m_rnd) return; m_rnd->setPosition(pos); }