#include <phonon/EffectParameter>
#include "../config.h"
#include <QTime>
+#include <QTimer>
using namespace SomePlayer::Playback;
using namespace SomePlayer::DataObjects;
int Randomizer::next() {
int res = 0;
- if (_current == _rand.count()) {
+ if (_rand.count() == 0) {
_shuffle();
- _current = 0;
res = next();
} else {
- res = _rand.at(_current);
+ res = _rand.takeFirst();
}
- ++_current;
return res;
}
void Randomizer::setPlaylist(QList<int> pl) {
_playlist = pl;
- _current = 0;
_shuffle();
+ _last = -1;
}
void Randomizer::_shuffle() {
_rand[i] = _rand[j];
_rand[j] = tmp;
}
+ if (cnt > 1 && _last == _rand[0]) {
+ _rand.removeAt(0);
+ _rand.insert(qrand() % (cnt-1) + 1, _last);
+ }
+ if (!_rand.isEmpty())
+ _last = _rand.last();
+ else _last = -1;
+}
+
+void Randomizer::removeId(int id) {
+ _rand.removeOne(id);
}
Player::Player(QObject *parent) :
_equalizer_enabled = false;
connect(_player, SIGNAL(stateChanged(Phonon::State,Phonon::State)), this, SLOT(_stateChanged(Phonon::State,Phonon::State)));
connect(_player, SIGNAL(tick(qint64)), this, SLOT(_tick(qint64)));
+ connect(_player, SIGNAL(finished()), this, SLOT(next()));
_path = Phonon::createPath(_player, _output);
QList<Phonon::EffectDescription> effects = Phonon::BackendCapabilities::availableAudioEffects();
foreach (Phonon::EffectDescription desc, effects) {
if (desc.name() == "equalizer-10bands") {
_equalizer = new Phonon::Effect(desc, this);
Config config;
- if (config.getValue("equalizer/equalizer").toString() == "enabled") {
+ if (config.equalizerEnabled()) {
for (int i = 0; i < 10; i++) {
- QVariant var = config.getValue(QString("equalizer/band%1").arg(i));
+ QVariant var = config.getEqualizerValue(QString("band%1").arg(i));
setEqualizerValue(i, var.toDouble());
}
enableEqualizer();
- } else if (config.getValue("equalizer/equalizer") == "") {
- for (int i = 0; i < 10; i++) {
- config.setValue(QString("equalizer/band%1").arg(i), 0);
- }
}
}
}
int seed = QTime::currentTime().msec();
qsrand(seed);
_random = _config.getValue("playback/random").toBool();
- _repeat = _config.getValue("playback/repeat").toBool();
+ _repeat = (RepeatRule) _config.getValue("playback/repeat").toInt();
_current = -1;
}
void Player::setTrackId(int id) {
+ if (_random) {
+ _randomizer.removeId(id);
+ }
_current = id;
if (!_history.isEmpty() && _history.top() != _current || _history.isEmpty()) {
_history.push(_current);
stop(); // empty playlist
return;
}
+ if (_repeat == REPEAT_ONE) {
+ _set_source();
+ play();
+ return;
+ }
_history.push(_current % count);
if (!_queue.isEmpty()) {
_current = _queue.dequeue();
_current = _current + 1;
}
}
- if (_random && _history.count() >= count && !_repeat ||
- !_repeat && _current >= count) {
+ if (_random && _history.count() >= count && _repeat == REPEAT_NO||
+ _repeat == REPEAT_NO && _current >= count) {
_history.clear();
stop();
} else {
void Player::_stateChanged(Phonon::State newState, Phonon::State /*oldState*/) {
switch (newState) {
case Phonon::PlayingState:
- if (_state == PLAYER_LOADING) {
- _state = PLAYER_PLAYING;
- emit stateChanged(_state);
- }
- break;
- case Phonon::StoppedState:
- break;
- case Phonon::LoadingState:
- break;
- case Phonon::PausedState:
- if (_state == PLAYER_PLAYING) {
- next();
- } else if (_state == PLAYER_ERROR) {
- play();
- }
- break;
- case Phonon::BufferingState:
+ _state = PLAYER_PLAYING;
+ emit stateChanged(_state);
break;
case Phonon::ErrorState:
play(); // force
-// _state = PLAYER_ERROR;
+ break;
+ default:
break;
}
}
void Player::seek(int s) {
_player->seek(s*1000);
+ if (s >= _track.metadata().length()) {
+ next();
+ }
}
void Player::play() {
}
void Player::toggleRepeat() {
- _repeat = !_repeat;
+ if (_repeat == REPEAT_NO) {
+ _repeat = REPEAT_ALL;
+ } else if (_repeat == REPEAT_ALL) {
+ _repeat = REPEAT_ONE;
+ } else if (_repeat == REPEAT_ONE) {
+ _repeat = REPEAT_NO;
+ }
_config.setValue("playback/repeat", _repeat);
}
-void Player::setVolume(int v) {
- _output->setVolume(v*0.01);
-}
-
void Player::equalizerValue(int band, double *val) {
if (_equalizer == NULL) {
*val = 0;
_equalizer_enabled = true;
_path.insertEffect(_equalizer);
Config config;
- config.setValue("equalizer/equalizer", "enabled");
+ config.setEqualizerEnabled(true);
}
void Player::disableEqualizer() {
_equalizer_enabled = false;
_path.removeEffect(_equalizer);
Config config;
- config.setValue("equalizer/equalizer", "disabled");
+ config.setEqualizerEnabled(false);
}
void Player::setEqualizerValue(int band, double value) {
QList<Phonon::EffectParameter> plist = _equalizer->parameters();
_equalizer->setParameterValue(plist[band], QVariant::fromValue(value));
Config config;
- config.setValue(QString("equalizer/band%1").arg(band), value);
+ config.setEqualizerValue(QString("band%1").arg(band), value);
}
QString Player::artist() {
return "";
return _playlist.tracks().at(_current).metadata().title();
}
+
+Track Player::current() {
+ if (_current >= 0 && _current < _playlist.tracks().count()) {
+ return _playlist.tracks().at(_current);
+ } else {
+ return Track();
+ }
+}
+
+void Player::pause() {
+ if (_state == PLAYER_PLAYING) {
+ _player->pause();
+ _state = PLAYER_PAUSED;
+ emit stateChanged(_state);
+ }
+}
+
+void Player::playIfPaused() {
+ if (_state == PLAYER_PAUSED) {
+ play();
+ }
+}