File indexing completed on 2024-05-05 04:48:36

0001 /***************************************************************************************
0002  * Copyright (c) 2013 Matěj Laitl <matej@laitl.cz>                                      *
0003  *                                                                                      *
0004  * This program is free software; you can redistribute it and/or modify it under        *
0005  * the terms of the GNU General Public License as published by the Free Software        *
0006  * Foundation; either version 2 of the License, or (at your option) any later           *
0007  * version.                                                                             *
0008  *                                                                                      *
0009  * This program is distributed in the hope that it will be useful, but WITHOUT ANY      *
0010  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A      *
0011  * PARTICULAR PURPOSE. See the GNU General Public License for more details.             *
0012  *                                                                                      *
0013  * You should have received a copy of the GNU General Public License along with         *
0014  * this program.  If not, see <http://www.gnu.org/licenses/>.                           *
0015  ****************************************************************************************/
0016 
0017 #include "DelayedDoers.h"
0018 
0019 #include "core/support/Debug.h"
0020 
0021 #include <phonon/MediaController>
0022 #include <phonon/MediaObject>
0023 
0024 DelayedDoer::DelayedDoer( Phonon::MediaObject *mediaObject,
0025                           const QSet<Phonon::State> &applicableStates )
0026     : m_mediaObject( mediaObject )
0027     , m_applicableStates( applicableStates )
0028 {
0029     Q_ASSERT( mediaObject );
0030     connect( mediaObject, &Phonon::MediaObject::stateChanged,
0031              this, &DelayedDoer::slotStateChanged );
0032     connect( mediaObject, &Phonon::MediaObject::destroyed,
0033              this, &DelayedDoer::deleteLater );
0034 }
0035 
0036 void
0037 DelayedDoer::slotStateChanged( Phonon::State newState )
0038 {
0039     if( m_applicableStates.contains( newState ) )
0040     {
0041         // don't let be called twice, deleteLater() may fire really LATER
0042         disconnect( m_mediaObject, nullptr, this, nullptr );
0043         performAction();
0044         deleteLater();
0045     }
0046     else
0047         debug() << __PRETTY_FUNCTION__ << "newState" << newState << "not applicable, waiting...";
0048 }
0049 
0050 DelayedSeeker::DelayedSeeker( Phonon::MediaObject *mediaObject, qint64 seekTo, bool startPaused )
0051     : DelayedDoer( mediaObject, QSet<Phonon::State>() << Phonon::PlayingState
0052                                                       << Phonon::BufferingState
0053                                                       << Phonon::PausedState )
0054     , m_seekTo( seekTo )
0055     , m_startPaused( startPaused )
0056 {
0057 }
0058 
0059 void
0060 DelayedSeeker::performAction()
0061 {
0062     m_mediaObject->seek( m_seekTo );
0063     Q_EMIT trackPositionChanged( m_seekTo, /* userSeek */ true );
0064 
0065     if( !m_startPaused )
0066         m_mediaObject->play();
0067 }
0068 
0069 DelayedTrackChanger::DelayedTrackChanger( Phonon::MediaObject *mediaObject,
0070                                           Phonon::MediaController *mediaController,
0071                                           int trackNumber, qint64 seekTo, bool startPaused )
0072     : DelayedSeeker( mediaObject, seekTo, startPaused )
0073     , m_mediaController( mediaController )
0074     , m_trackNumber( trackNumber )
0075 {
0076     Q_ASSERT( mediaController );
0077     connect( mediaController, &QObject::destroyed, this, &QObject::deleteLater );
0078     Q_ASSERT( trackNumber > 0 );
0079 }
0080 
0081 void
0082 DelayedTrackChanger::performAction()
0083 {
0084     m_mediaController->setCurrentTitle( m_trackNumber );
0085     if( m_seekTo )
0086     {
0087         m_mediaObject->seek( m_seekTo );
0088         Q_EMIT trackPositionChanged( m_seekTo, /* userSeek */ true );
0089     }
0090 
0091     if( !m_startPaused )
0092         m_mediaObject->play();
0093 }