diff --git a/src/helpers.cpp b/src/helpers.cpp index 1e3d7d8c..35824e74 100644 --- a/src/helpers.cpp +++ b/src/helpers.cpp @@ -136,8 +136,8 @@ bool ParseArgv(vector &v) else if (*it == "volume") { it++; - Mpd->GetStatus(); - if (Mpd->CheckForErrors()) + Mpd->UpdateStatus(); + if (!Mpd->GetErrorMessage().empty()) { cout << "Error: " << Mpd->GetErrorMessage() << endl; return 1; @@ -151,7 +151,7 @@ bool ParseArgv(vector &v) cout << "ncmpcpp: invalid option " << *it << endl; return 1; } - if (Mpd->CheckForErrors()) + if (!Mpd->GetErrorMessage().empty()) { cout << "Error: " << Mpd->GetErrorMessage() << endl; return 1; diff --git a/src/mpdpp.cpp b/src/mpdpp.cpp index dc384f05..69d1b552 100644 --- a/src/mpdpp.cpp +++ b/src/mpdpp.cpp @@ -119,20 +119,15 @@ void MPDConnection::SetErrorHandler(ErrorHandler handler, void *data) itsErrorHandlerUserdata = data; } -void MPDConnection::GetStatus() +void MPDConnection::UpdateStatus() { + CheckForErrors(); + if (itsOldStatus) mpd_freeStatus(itsOldStatus); itsOldStatus = itsCurrentStatus; mpd_sendStatusCommand(itsConnection); itsCurrentStatus = mpd_getStatus(itsConnection); -} - -void MPDConnection::UpdateStatus() -{ - CheckForErrors(); - - GetStatus(); if (!itsMaxPlaylistLength) itsMaxPlaylistLength = GetPlaylistLength(); @@ -140,42 +135,44 @@ void MPDConnection::UpdateStatus() if (CheckForErrors()) return; - MPDStatusChanges changes; - if (itsOldStats) mpd_freeStats(itsOldStats); itsOldStats = itsCurrentStats; mpd_sendStatsCommand(itsConnection); itsCurrentStats = mpd_getStats(itsConnection); - if (itsOldStatus == NULL) + if (itsCurrentStatus && itsUpdater) { - changes.Playlist = 1; - changes.SongID = 1; - changes.Database = 1; - changes.DBUpdating = 1; - changes.Volume = 1; - changes.ElapsedTime = 1; - changes.Crossfade = 1; - changes.Random = 1; - changes.Repeat = 1; - changes.PlayerState = 1; - } - else - { - changes.Playlist = itsOldStatus->playlist != itsCurrentStatus->playlist; - changes.SongID = itsOldStatus->songid != itsCurrentStatus->songid; - changes.Database = itsOldStats->dbUpdateTime != itsCurrentStats->dbUpdateTime; - changes.DBUpdating = itsOldStatus->updatingDb != itsCurrentStatus->updatingDb; - changes.Volume = itsOldStatus->volume != itsCurrentStatus->volume; - changes.ElapsedTime = itsOldStatus->elapsedTime != itsCurrentStatus->elapsedTime; - changes.Crossfade = itsOldStatus->crossfade != itsCurrentStatus->crossfade; - changes.Random = itsOldStatus->random != itsCurrentStatus->random; - changes.Repeat = itsOldStatus->repeat != itsCurrentStatus->repeat; - changes.PlayerState = itsOldStatus->state != itsCurrentStatus->state; - } - if (itsUpdater) + MPDStatusChanges changes; + + if (itsOldStatus == NULL) + { + changes.Playlist = 1; + changes.SongID = 1; + changes.Database = 1; + changes.DBUpdating = 1; + changes.Volume = 1; + changes.ElapsedTime = 1; + changes.Crossfade = 1; + changes.Random = 1; + changes.Repeat = 1; + changes.PlayerState = 1; + } + else + { + changes.Playlist = itsOldStatus->playlist != itsCurrentStatus->playlist; + changes.SongID = itsOldStatus->songid != itsCurrentStatus->songid; + changes.Database = itsOldStats->dbUpdateTime != itsCurrentStats->dbUpdateTime; + changes.DBUpdating = itsOldStatus->updatingDb != itsCurrentStatus->updatingDb; + changes.Volume = itsOldStatus->volume != itsCurrentStatus->volume; + changes.ElapsedTime = itsOldStatus->elapsedTime != itsCurrentStatus->elapsedTime; + changes.Crossfade = itsOldStatus->crossfade != itsCurrentStatus->crossfade; + changes.Random = itsOldStatus->random != itsCurrentStatus->random; + changes.Repeat = itsOldStatus->repeat != itsCurrentStatus->repeat; + changes.PlayerState = itsOldStatus->state != itsCurrentStatus->state; + } itsUpdater(this, changes, itsErrorHandlerUserdata); + } } void MPDConnection::UpdateDirectory(const string &path) const diff --git a/src/mpdpp.h b/src/mpdpp.h index fe9ed657..58412175 100644 --- a/src/mpdpp.h +++ b/src/mpdpp.h @@ -90,7 +90,6 @@ class MPDConnection void SetStatusUpdater(StatusUpdater, void *); void SetErrorHandler(ErrorHandler, void *); - void GetStatus(); void UpdateStatus(); void UpdateDirectory(const string &) const; @@ -122,7 +121,7 @@ class MPDConnection int GetPlaylistLength() const { return isConnected && itsCurrentStatus ? itsCurrentStatus->playlistLength : 0; } void GetPlaylistChanges(long long, SongList &) const; - string GetErrorMessage() const { return itsErrorMessage; } + const string & GetErrorMessage() const { return itsErrorMessage; } int GetErrorCode() const { return itsErrorCode; } Song GetCurrentSong() const; @@ -171,10 +170,9 @@ class MPDConnection void GetSongs(const string &, SongList &) const; void GetDirectories(const string &, TagList &) const; - int CheckForErrors(); - private: void ClearQueue(); + int CheckForErrors(); mpd_Connection *itsConnection; bool isConnected; diff --git a/src/status_checker.cpp b/src/status_checker.cpp index 7c05b998..58732deb 100644 --- a/src/status_checker.cpp +++ b/src/status_checker.cpp @@ -319,15 +319,16 @@ void NcmpcppStatusChanged(MPDConnection *Mpd, MPDStatusChanges changed, void *) playing_song_scroll_begin = 0; if (Mpd->GetState() == psPlay) + { + WindowTitle(DisplaySong(Mpd->GetCurrentSong(), &Config.song_window_title_format)); changed.ElapsedTime = 1; + } } if (changed.ElapsedTime) { - Song s = Mpd->GetCurrentSong(); + const Song &s = Mpd->GetCurrentSong(); if (!player_state.empty() && !s.Empty()) { - WindowTitle(DisplaySong(s, &Config.song_window_title_format)); - int elapsed = Mpd->GetElapsedTime(); // 'repeat one' mode check - be sure that we deal with item with known length @@ -391,14 +392,14 @@ void NcmpcppStatusChanged(MPDConnection *Mpd, MPDStatusChanges changed, void *) if (changed.Repeat) { mpd_repeat = (Mpd->GetRepeat() ? "r" : ""); - ShowMessage("Repeat is " + (string)(mpd_repeat.empty() ? "off" : "on")); + ShowMessage("Repeat is " + string(mpd_repeat.empty() ? "off" : "on")); header_update_status = 1; } if (changed.Random) { mpd_random = Mpd->GetRandom() ? "z" : ""; - ShowMessage("Random is " + (string)(mpd_random.empty() ? "off" : "on")); + ShowMessage("Random is " + string(mpd_random.empty() ? "off" : "on")); header_update_status = 1; } if (changed.Crossfade)