You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

145 lines
4.8 KiB

* Copyright (C) 2004 Frederik Holljen <> *
* (C) 2004,5 Max Howell <> *
* (C) 2004,5 Mark Kretschmann *
* *
* 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. *
* *
#include "enginebase.h"
#include "engineobserver.h"
#include "metabundle.h"
#include <tqmap.h>
#include <tqobject.h>
#include <tqvaluelist.h>
class TQTimer;
namespace KIO { class Job; }
* This class captures Amarok specific behaviour for some common features.
* Accessing the engine directly is perfectly legal but on your own risk.
* TODO: Hide proxy stuff!
class EngineController : public TQObject, public EngineSubject
typedef TQMap<TQString, bool> ExtensionCache;
// plugins have their own static space, so calling instance
// from a plugin won't do any good. you'll only get a new
// instance with a voidEngine
static EngineController* instance();
static EngineBase* engine() { return instance()->m_engine; }
static bool canDecode( const KURL& );
static ExtensionCache& extensionCache() { return s_extensionCache; }
static TQString engineProperty( const TQString& key ) { return engine()->pluginProperty( key ); }
static bool hasEngineProperty( const TQString& key ) { return engine()->hasPluginProperty( key ); }
uint trackPosition() const;
EngineBase* loadEngine();
void unplayableNotification();
uint trackLength() const { return m_bundle.length() * 1000; }
const MetaBundle &bundle() const;
KURL previousURL() const { return m_previousUrl; }
KURL playingURL() const { return bundle().url(); }
void restoreSession();
void endSession();
void updateBundleRating( const int rating ) { m_bundle.setRating(rating); } //Can't update metabundle rating from bundle(), d'oh
//xx000, xx100, xx200, so at most will be 200ms delay before time displays are updated
static const int MAIN_TIMER = 300;
/*enum Filetype { MP3 };*/ //assuming MP3 for time being
LIBAMAROK_EXPORT static bool installDistroCodec(const TQString& engine /*Filetype type*/);
public slots:
void previous();
// forceNext make we go to next track even if Repeat Track is on
//NOTE If the track ended normally, call next(false) !
void next( const bool forceNext = true );
void trackFinished() { next(false); };
void play();
void play( const MetaBundle&, uint offset = 0 );
void pause();
void stop();
void playPause(); //pauses if playing, plays if paused or stopped
void seek( int ms );
void seekRelative( int ms );
void seekForward( int ms = 10000 );
void seekBackward( int ms = 10000 );
int increaseVolume( int ticks = 100/25 );
int decreaseVolume( int ticks = 100/25 );
int setVolume( int percent );
void mute();
void playlistChanged() { m_engine->playlistChanged(); }
void slotStreamMetaData( const MetaBundle &bundle );
void currentTrackMetaDataChanged( const MetaBundle& bundle );
void orderPrevious();
void orderCurrent();
void orderNext( const bool );
void statusText( const TQString& );
private slots:
void slotEngineMetaData( const Engine::SimpleMetaBundle& );
void slotMainTimer();
void slotTrackEnded();
void slotStateChanged( Engine::State );
// undefined
EngineController( const EngineController& );
EngineController &operator=( const EngineController& );
static ExtensionCache s_extensionCache;
EngineBase* loadEngine( const TQString &engineName );
EngineBase* m_engine;
EngineBase* m_voidEngine;
MetaBundle m_bundle;
KURL m_previousUrl;
BundleList m_lastMetadata;
long m_delayTime;
int m_muteVolume;
bool m_xFadeThisTrack;
bool m_isTiming;
TQTimer* m_timer;
uint m_playFailureCount;
// try to correct start time for tracks from streams
bool m_lastFm;
uint m_positionOffset, m_lastPositionOffset;