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 }