Don't reshuffle the playlist every time the user presses next
This commit is contained in:
parent
7d1c5a3a1b
commit
70565565c7
|
@ -333,7 +333,7 @@ MainWindow::MainWindow(QNetworkAccessManager* network, Engine::Type engine, QWid
|
||||||
connect(radio_model_, SIGNAL(TaskStarted(MultiLoadingIndicator::TaskType)), multi_loading_indicator_, SLOT(TaskStarted(MultiLoadingIndicator::TaskType)));
|
connect(radio_model_, SIGNAL(TaskStarted(MultiLoadingIndicator::TaskType)), multi_loading_indicator_, SLOT(TaskStarted(MultiLoadingIndicator::TaskType)));
|
||||||
connect(radio_model_, SIGNAL(TaskFinished(MultiLoadingIndicator::TaskType)), multi_loading_indicator_, SLOT(TaskFinished(MultiLoadingIndicator::TaskType)));
|
connect(radio_model_, SIGNAL(TaskFinished(MultiLoadingIndicator::TaskType)), multi_loading_indicator_, SLOT(TaskFinished(MultiLoadingIndicator::TaskType)));
|
||||||
connect(radio_model_, SIGNAL(StreamError(QString)), SLOT(ReportError(QString)));
|
connect(radio_model_, SIGNAL(StreamError(QString)), SLOT(ReportError(QString)));
|
||||||
connect(radio_model_, SIGNAL(StreamFinished()), player_, SLOT(NextItem()));
|
connect(radio_model_, SIGNAL(StreamFinished()), player_, SLOT(RadioStreamFinished()));
|
||||||
connect(radio_model_, SIGNAL(StreamReady(QUrl,QUrl)), player_, SLOT(StreamReady(QUrl,QUrl)));
|
connect(radio_model_, SIGNAL(StreamReady(QUrl,QUrl)), player_, SLOT(StreamReady(QUrl,QUrl)));
|
||||||
connect(radio_model_, SIGNAL(StreamMetadataFound(QUrl,Song)), playlist_, SLOT(SetStreamMetadata(QUrl,Song)));
|
connect(radio_model_, SIGNAL(StreamMetadataFound(QUrl,Song)), playlist_, SLOT(SetStreamMetadata(QUrl,Song)));
|
||||||
connect(radio_model_, SIGNAL(AddItemToPlaylist(RadioItem*)), SLOT(InsertRadioItem(RadioItem*)));
|
connect(radio_model_, SIGNAL(AddItemToPlaylist(RadioItem*)), SLOT(InsertRadioItem(RadioItem*)));
|
||||||
|
@ -474,7 +474,7 @@ void MainWindow::QueueFiles(const QList<QUrl>& urls) {
|
||||||
QModelIndex playlist_index = playlist_->InsertPaths(urls);
|
QModelIndex playlist_index = playlist_->InsertPaths(urls);
|
||||||
|
|
||||||
if (playlist_index.isValid() && player_->GetState() != Engine::Playing)
|
if (playlist_index.isValid() && player_->GetState() != Engine::Playing)
|
||||||
player_->PlayAt(playlist_index.row(), Engine::First);
|
player_->PlayAt(playlist_index.row(), Engine::First, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::ReportError(const QString& message) {
|
void MainWindow::ReportError(const QString& message) {
|
||||||
|
@ -563,7 +563,7 @@ void MainWindow::PlayIndex(const QModelIndex& index) {
|
||||||
if (!index.isValid())
|
if (!index.isValid())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
player_->PlayAt(index.row(), Engine::Manual);
|
player_->PlayAt(index.row(), Engine::Manual, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::AddLibraryItemToPlaylist(const QModelIndex& index) {
|
void MainWindow::AddLibraryItemToPlaylist(const QModelIndex& index) {
|
||||||
|
@ -575,7 +575,7 @@ void MainWindow::AddLibraryItemToPlaylist(const QModelIndex& index) {
|
||||||
playlist_->InsertLibraryItems(library_->GetChildSongs(idx));
|
playlist_->InsertLibraryItems(library_->GetChildSongs(idx));
|
||||||
|
|
||||||
if (first_song.isValid() && player_->GetState() != Engine::Playing)
|
if (first_song.isValid() && player_->GetState() != Engine::Playing)
|
||||||
player_->PlayAt(first_song.row(), Engine::First);
|
player_->PlayAt(first_song.row(), Engine::First, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::VolumeWheelEvent(int delta) {
|
void MainWindow::VolumeWheelEvent(int delta) {
|
||||||
|
@ -692,7 +692,7 @@ void MainWindow::InsertRadioItem(RadioItem* item) {
|
||||||
QList<RadioItem*>() << item);
|
QList<RadioItem*>() << item);
|
||||||
|
|
||||||
if (first_song.isValid() && player_->GetState() != Engine::Playing)
|
if (first_song.isValid() && player_->GetState() != Engine::Playing)
|
||||||
player_->PlayAt(first_song.row(), Engine::Manual);
|
player_->PlayAt(first_song.row(), Engine::First, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::PlaylistRightClick(const QPoint& global_pos, const QModelIndex& index) {
|
void MainWindow::PlaylistRightClick(const QPoint& global_pos, const QModelIndex& index) {
|
||||||
|
@ -763,7 +763,7 @@ void MainWindow::PlaylistPlay() {
|
||||||
if (playlist_->current_index() == playlist_menu_index_.row()) {
|
if (playlist_->current_index() == playlist_menu_index_.row()) {
|
||||||
player_->PlayPause();
|
player_->PlayPause();
|
||||||
} else {
|
} else {
|
||||||
player_->PlayAt(playlist_menu_index_.row(), Engine::Manual);
|
player_->PlayAt(playlist_menu_index_.row(), Engine::Manual, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -980,7 +980,7 @@ void MainWindow::CommandlineOptionsReceived(const CommandlineOptions &options) {
|
||||||
player_->Previous();
|
player_->Previous();
|
||||||
break;
|
break;
|
||||||
case CommandlineOptions::Player_Next:
|
case CommandlineOptions::Player_Next:
|
||||||
player_->Next(Engine::Manual);
|
player_->Next();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CommandlineOptions::Player_None:
|
case CommandlineOptions::Player_None:
|
||||||
|
@ -1009,7 +1009,7 @@ void MainWindow::CommandlineOptionsReceived(const CommandlineOptions &options) {
|
||||||
player_->Seek(player_->PositionGet() / 1000 + options.seek_by());
|
player_->Seek(player_->PositionGet() / 1000 + options.seek_by());
|
||||||
|
|
||||||
if (options.play_track_at() != -1)
|
if (options.play_track_at() != -1)
|
||||||
player_->PlayAt(options.play_track_at(), Engine::Manual);
|
player_->PlayAt(options.play_track_at(), Engine::Manual, true);
|
||||||
|
|
||||||
if (options.show_osd())
|
if (options.show_osd())
|
||||||
player_->ShowOSD();
|
player_->ShowOSD();
|
||||||
|
|
|
@ -141,18 +141,22 @@ void Player::ReloadSettings() {
|
||||||
engine_->ReloadSettings();
|
engine_->ReloadSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::NextAuto() {
|
void Player::RadioStreamFinished() {
|
||||||
Next(Engine::Auto);
|
NextInternal(Engine::Auto);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::Next(Engine::TrackChangeType change) {
|
void Player::Next() {
|
||||||
|
NextInternal(Engine::Manual);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Player::NextInternal(Engine::TrackChangeType change) {
|
||||||
if (playlist_->current_item_options() & PlaylistItem::ContainsMultipleTracks) {
|
if (playlist_->current_item_options() & PlaylistItem::ContainsMultipleTracks) {
|
||||||
stream_change_type_ = change;
|
stream_change_type_ = change;
|
||||||
playlist_->current_item()->LoadNext();
|
playlist_->current_item()->LoadNext();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
NextItem(change);
|
NextItem(Engine::Manual);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::NextItem(Engine::TrackChangeType change) {
|
void Player::NextItem(Engine::TrackChangeType change) {
|
||||||
|
@ -164,7 +168,7 @@ void Player::NextItem(Engine::TrackChangeType change) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
PlayAt(i, change);
|
PlayAt(i, change, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::TrackEnded() {
|
void Player::TrackEnded() {
|
||||||
|
@ -173,7 +177,7 @@ void Player::TrackEnded() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Next(Engine::Auto);
|
NextInternal(Engine::Auto);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::PlayPause() {
|
void Player::PlayPause() {
|
||||||
|
@ -201,7 +205,7 @@ void Player::PlayPause() {
|
||||||
if (i == -1) i = playlist_->last_played_index();
|
if (i == -1) i = playlist_->last_played_index();
|
||||||
if (i == -1) i = 0;
|
if (i == -1) i = 0;
|
||||||
|
|
||||||
PlayAt(i, Engine::First);
|
PlayAt(i, Engine::First, true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -220,7 +224,7 @@ void Player::Previous() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
PlayAt(i, Engine::Manual);
|
PlayAt(i, Engine::Manual, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::EngineStateChanged(Engine::State state) {
|
void Player::EngineStateChanged(Engine::State state) {
|
||||||
|
@ -253,9 +257,9 @@ Engine::State Player::GetState() const {
|
||||||
return engine_->state();
|
return engine_->state();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::PlayAt(int index, Engine::TrackChangeType change) {
|
void Player::PlayAt(int index, Engine::TrackChangeType change, bool reshuffle) {
|
||||||
if (change != Engine::Auto)
|
if (reshuffle)
|
||||||
playlist_->set_current_index(-1); // to reshuffle
|
playlist_->set_current_index(-1);
|
||||||
playlist_->set_current_index(index);
|
playlist_->set_current_index(index);
|
||||||
|
|
||||||
shared_ptr<PlaylistItem> item = playlist_->item_at(index);
|
shared_ptr<PlaylistItem> item = playlist_->item_at(index);
|
||||||
|
@ -488,7 +492,7 @@ int Player::AddTrack(const QString& track, bool play_now) {
|
||||||
|
|
||||||
if (index.isValid()) {
|
if (index.isValid()) {
|
||||||
if (play_now) {
|
if (play_now) {
|
||||||
Next(Engine::First);
|
PlayAt(index.row(), Engine::First, true);
|
||||||
}
|
}
|
||||||
return 0; // Success.
|
return 0; // Success.
|
||||||
}
|
}
|
||||||
|
@ -518,7 +522,7 @@ void Player::SetRandom(bool enable) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::PlayTrack(int index) {
|
void Player::PlayTrack(int index) {
|
||||||
PlayAt(index, Engine::Manual);
|
PlayAt(index, Engine::Manual, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::PlaylistChanged() {
|
void Player::PlaylistChanged() {
|
||||||
|
@ -529,7 +533,7 @@ void Player::TrackAboutToEnd() {
|
||||||
if (engine_->is_autocrossfade_enabled()) {
|
if (engine_->is_autocrossfade_enabled()) {
|
||||||
// Crossfade is on, so just start playing the next track. The current one
|
// Crossfade is on, so just start playing the next track. The current one
|
||||||
// will fade out, and the new one will fade in
|
// will fade out, and the new one will fade in
|
||||||
NextAuto();
|
NextInternal(Engine::Auto);
|
||||||
} else {
|
} else {
|
||||||
// Crossfade is off, so start preloading the next track so we don't get a
|
// Crossfade is off, so start preloading the next track so we don't get a
|
||||||
// gap between songs.
|
// gap between songs.
|
||||||
|
|
24
src/player.h
24
src/player.h
|
@ -79,14 +79,23 @@ class Player : public QObject {
|
||||||
public slots:
|
public slots:
|
||||||
void ReloadSettings();
|
void ReloadSettings();
|
||||||
|
|
||||||
void PlayAt(int index, Engine::TrackChangeType change);
|
// Manual track change to the specified track
|
||||||
|
void PlayAt(int i, Engine::TrackChangeType change, bool reshuffle);
|
||||||
|
|
||||||
|
// If there's currently a song playing, pause it, otherwise play the track
|
||||||
|
// that was playing last, or the first one on the playlist
|
||||||
void PlayPause();
|
void PlayPause();
|
||||||
void NextItem(Engine::TrackChangeType change = Engine::Auto);
|
|
||||||
|
// Skips this track. Might load more of the current radio station.
|
||||||
|
void Next();
|
||||||
|
|
||||||
|
// Jumps to the next actual item on the playlist, with an automatic change
|
||||||
|
void RadioStreamFinished();
|
||||||
|
|
||||||
void Previous();
|
void Previous();
|
||||||
void SetVolume(int value);
|
void SetVolume(int value);
|
||||||
void Seek(int seconds);
|
void Seek(int seconds);
|
||||||
|
|
||||||
void TrackEnded();
|
|
||||||
void StreamReady(const QUrl& original_url, const QUrl& media_url);
|
void StreamReady(const QUrl& original_url, const QUrl& media_url);
|
||||||
void CurrentMetadataChanged(const Song& metadata);
|
void CurrentMetadataChanged(const Song& metadata);
|
||||||
|
|
||||||
|
@ -100,7 +109,6 @@ class Player : public QObject {
|
||||||
void Pause();
|
void Pause();
|
||||||
void Stop();
|
void Stop();
|
||||||
void Play();
|
void Play();
|
||||||
void Next(Engine::TrackChangeType change = Engine::Manual);
|
|
||||||
void Prev();
|
void Prev();
|
||||||
int PositionGet() const;
|
int PositionGet() const;
|
||||||
void PositionSet(int);
|
void PositionSet(int);
|
||||||
|
@ -144,8 +152,14 @@ class Player : public QObject {
|
||||||
private slots:
|
private slots:
|
||||||
void EngineStateChanged(Engine::State);
|
void EngineStateChanged(Engine::State);
|
||||||
void EngineMetadataReceived(const Engine::SimpleMetaBundle& bundle);
|
void EngineMetadataReceived(const Engine::SimpleMetaBundle& bundle);
|
||||||
void NextAuto();
|
|
||||||
void TrackAboutToEnd();
|
void TrackAboutToEnd();
|
||||||
|
void TrackEnded();
|
||||||
|
|
||||||
|
// Play the next item on the playlist - disregarding radio stations like
|
||||||
|
// last.fm that might have more tracks.
|
||||||
|
void NextItem(Engine::TrackChangeType change);
|
||||||
|
|
||||||
|
void NextInternal(Engine::TrackChangeType);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QVariantMap GetMetadata(const PlaylistItem& item) const;
|
QVariantMap GetMetadata(const PlaylistItem& item) const;
|
||||||
|
|
Loading…
Reference in New Issue