#include "phononplayer.h" #include "audio.h" #include #include AudioPlayer *PhononPlayerFactory::create(QObject *parent) { return new PhononPlayer(parent); } Q_EXPORT_PLUGIN2(phononplayer, PhononPlayerFactory) /* --------------------------------------------------------------- */ PhononPlayer::PhononPlayer(QObject *parent) : AudioPlayer(parent), m_working(false) { m_player = new Phonon::MediaObject(this); m_output = new Phonon::AudioOutput(Phonon::MusicCategory, this); Phonon::createPath(m_player, m_output); } bool PhononPlayer::isWorking() const { return m_working; } void PhononPlayer::setMuted(bool mute) { if (!isWorking()) return; m_output->setMuted(mute); } bool PhononPlayer::isMuted() const { return m_output->isMuted(); } void PhononPlayer::play() { if (!m_working) return; m_player->play(); } void PhononPlayer::play(QFile *sound, unsigned int length) { if (!m_working) return; setSource(sound, length); play(); } void PhononPlayer::setSource(QFile *sound, unsigned int /* length */) { if (!m_working) return; m_player->setCurrentSource(Phonon::MediaSource(sound)); } bool PhononPlayer::isPlaying() { return m_player->state() == Phonon::PlayingState; } void PhononPlayer::enqueue(QFile *sound, unsigned int /* length */) { if (!m_working) return; m_player->enqueue(Phonon::MediaSource(sound)); } void PhononPlayer::pause() { m_player->pause(); } bool PhononPlayer::isPaused() { return m_player->state() == Phonon::PausedState; } void PhononPlayer::stop() { m_player->stop(); } bool PhononPlayer::isStopped() { return m_player->state() == Phonon::StoppedState; } void PhononPlayer::clear() { m_player->clear(); } void PhononPlayer::clearQueue() { m_player->clearQueue(); } void PhononPlayer::setPrefinishMark(qint32 msecToEnd) { connect(m_player, SIGNAL(prefinishMarkReached(qint32)), this, SLOT(prefinishMarkReached_ex(qint32)), Qt::UniqueConnection); m_player->setPrefinishMark(msecToEnd); } void PhononPlayer::seek(qint64 time) { m_player->seek(time); } void PhononPlayer::setWorking(bool working) { m_working = working; } /* this is a simple hack to check if phonon can actually play sounds.. */ void PhononPlayer::test(QFile *sound, unsigned int length) { m_player->stop(); m_output->setVolume(0); m_player->setCurrentSource(Phonon::MediaSource(sound)); connect(m_player, SIGNAL(stateChanged(Phonon::State, Phonon::State)), this, SLOT(stateChanged_ex(Phonon::State, Phonon::State))); m_player->play(); QTimer timer; timer.setSingleShot(true); connect(&timer, SIGNAL(timeout()), this, SLOT(testFinished())); timer.start(length); while(timer.isActive()) { qApp->processEvents(); Sleeper::msleep(1); } clear(); } void PhononPlayer::prefinishMarkReached_ex(qint32 mark) { emit prefinishMarkReached(mark); } void PhononPlayer::finished_ex() { emit finished(); } void PhononPlayer::stateChanged_ex(Phonon::State newstate, Phonon::State oldstate) { if (newstate == Phonon::PlayingState) m_player->pause(); if (oldstate == Phonon::PlayingState && newstate == Phonon::PausedState) m_player->stop(); else if (oldstate == Phonon::PausedState && newstate == Phonon::StoppedState) { m_working = true; m_player->stop(); m_output->setVolume(1); qDebug() << "Sound is working for you!"; disconnect(m_player, SIGNAL(stateChanged(Phonon::State, Phonon::State)), this, SLOT(stateChanged_ex(Phonon::State, Phonon::State))); } } void PhononPlayer::testFinished() { if (!m_working) qWarning() << "There's no sound for you :("; disconnect(m_player, SIGNAL(stateChanged(Phonon::State, Phonon::State)), this, SLOT(stateChanged_ex(Phonon::State, Phonon::State))); } /* --------------------------------------------------------------- */ void PhononPlayer::Sleeper::sleep(unsigned long secs) { QThread::sleep(secs); } void PhononPlayer::Sleeper::msleep(unsigned long msecs) { QThread::msleep(msecs); } void PhononPlayer::Sleeper::usleep(unsigned long usecs) { QThread::usleep(usecs); }