/*************************************************************************** * Copyright (C) 2008 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "decoder_phonon.h" VideoWindow::VideoWindow(DecoderPhonon *decoder, QWidget *parent) : Phonon::VideoWidget(parent) { m_decoder = decoder; //create menu m_menu = new QMenu (this); //actions m_fullScreenAction = new QAction(tr("Full Screen"), this); m_fullScreenAction->setShortcut(tr("Alt+Return")); m_fullScreenAction->setCheckable(TRUE); m_fullScreenAction->setChecked(FALSE); m_fullScreenAction->setShortcutContext(Qt::WindowShortcut); connect(m_fullScreenAction, SIGNAL(triggered(bool)), SLOT(changeScreen(bool))); m_menu->addAction(m_fullScreenAction); addAction(m_fullScreenAction); setMouseTracking (FALSE); } void VideoWindow::mouseDoubleClickEvent(QMouseEvent *e) { changeScreen(!isFullScreen()); Phonon::VideoWidget::mouseDoubleClickEvent(e); } void VideoWindow::closeEvent (QCloseEvent *event) { if (event->spontaneous()) m_decoder->stop(); Phonon::VideoWidget::closeEvent(event); } void VideoWindow::mousePressEvent(QMouseEvent *event) { switch ((int) event->button ()) { case Qt::LeftButton: m_pos = event->pos(); break; case Qt::RightButton: m_menu->exec(event->globalPos()); break; } Phonon::VideoWidget::mousePressEvent(event); } void VideoWindow::mouseReleaseEvent(QMouseEvent *event) { Phonon::VideoWidget::mouseReleaseEvent(event); } void VideoWindow::mouseMoveEvent(QMouseEvent *event) { QPoint npos = (event->globalPos() - m_pos + (frameGeometry ().topLeft() - geometry().topLeft())); move(npos); Phonon::VideoWidget::mouseMoveEvent(event); } void VideoWindow::changeScreen(bool fullScreen) { m_fullScreenAction->setChecked(fullScreen); setFullScreen(fullScreen); if (!fullScreen) resize(sizeHint()); } DecoderPhonon::DecoderPhonon(QObject *parent, DecoderFactory *d, const QString &url) : Decoder(parent, d) { m_mediaObject = 0; m_audioOutput = 0; m_videoWidget = 0; m_url = url; } DecoderPhonon::~DecoderPhonon() { qDebug("DecoderPhonon::~DecoderPhonon"); m_videoWidget->hide(); delete m_videoWidget; } bool DecoderPhonon::initialize() { m_videoWidget = new VideoWindow(this);//Phonon::VideoWidget(); m_videoWidget->setAspectRatio(Phonon::VideoWidget::AspectRatioAuto); m_videoWidget->resize(300,200); m_videoWidget->setWindowTitle("Phonon Plugin"); m_mediaObject = new Phonon::MediaObject(this); m_audioOutput = new Phonon::AudioOutput(this); m_audioOutputPath = Phonon::createPath(m_mediaObject, m_audioOutput); Phonon::createPath(m_mediaObject, m_videoWidget); connect(m_mediaObject, SIGNAL(stateChanged(Phonon::State, Phonon::State)), SLOT(updateState(Phonon::State, Phonon::State))); connect(m_mediaObject, SIGNAL(tick (qint64)), SLOT(updateTime(qint64))); connect(m_mediaObject, SIGNAL(finished ()), SLOT(finish ())); m_mediaObject->setTickInterval(1000); m_mediaObject->clearQueue(); m_mediaObject->enqueue(Phonon::MediaSource(m_url)); m_stop = FALSE; return TRUE; } qint64 DecoderPhonon::lengthInSeconds() { return m_mediaObject->totalTime () / 1000; } void DecoderPhonon::seek(qint64 pos) { m_mediaObject->seek(pos * 1000); } void DecoderPhonon::stop() { m_mediaObject->stop(); m_videoWidget->close(); while (m_mediaObject->state() == Phonon::PlayingState) { qApp->processEvents(); usleep(100); } StateHandler::instance()->dispatch(Qmmp::Stopped); } void DecoderPhonon::pause() { if (m_mediaObject->state() == Phonon::PausedState) m_mediaObject->play(); else if (m_mediaObject->state() == Phonon::PlayingState) m_mediaObject->pause(); } void DecoderPhonon::setEQ(double bands[10], double preamp) { } void DecoderPhonon::setEQEnabled(bool on) { } void DecoderPhonon::run() { if (!m_stop) m_mediaObject->play(); else { //m_mediaObject.stop(); while (m_mediaObject->state() == Phonon::PlayingState) { qApp->processEvents(); usleep(500); } } } void DecoderPhonon::updateState(Phonon::State newstate, Phonon::State) { switch ((int) newstate) { case Phonon::PlayingState: StateHandler::instance()->dispatch(Qmmp::Playing); m_videoWidget->resize(m_videoWidget->sizeHint()); m_videoWidget->show(); break; case Phonon::PausedState: StateHandler::instance()->dispatch(Qmmp::Paused); break; case Phonon::StoppedState: //StateHandler::instance()->dispatch(Qmmp::Stopped); //m_videoWidget->close(); qApp->processEvents(); break; } } void DecoderPhonon::updateTime(qint64 time) { StateHandler::instance()->dispatch(time / 1000, m_mediaObject->totalTime () / 1000, 0, 0, 0, 0); }