diff --git a/src/apps/cdplayer/CDDBSupport.cpp b/src/apps/cdplayer/CDDBSupport.cpp index 37bb0b56b0..75e8908d50 100644 --- a/src/apps/cdplayer/CDDBSupport.cpp +++ b/src/apps/cdplayer/CDDBSupport.cpp @@ -78,6 +78,11 @@ CDDBQuery::CDDBQuery(const char *server, int32 port, bool log) { } +CDDBQuery::~CDDBQuery(void) +{ + kill_thread(fThread); +} + void CDDBQuery::SetToSite(const char *server, int32 port) { @@ -121,9 +126,10 @@ CDDBQuery::SetToCD(const char *path) { int32 discID = GetDiscID(&toc); - if (fDiscID == discID); + if (fDiscID == discID) return; + fDiscID = discID; fTrackCount = GetTrackCount(&toc); cdaudio_time time = GetDiscTime(&toc); @@ -221,7 +227,11 @@ CDDBQuery::GetTitles(BString *resultingTitle, vector *tracks, bigtime_t return false; if (resultingTitle) - *resultingTitle = fTitle; + { + *resultingTitle = fArtist; + resultingTitle->Append(" / "); + resultingTitle->Append(fTitle); + } if (tracks) *tracks = fTrackNames; @@ -515,6 +525,7 @@ CDDBQuery::OpenContentFile(const int32 &discID) BString tmp = GetLineFromString(trackdata); char *index; + fTrackNames.clear(); fArtist = tmp; fArtist.Truncate(fArtist.FindFirst(" - ")); @@ -567,7 +578,6 @@ CDDBQuery::QueryThread(void *owner) query->fState = kError; query->fResult = error; } - return 0; } diff --git a/src/apps/cdplayer/CDDBSupport.h b/src/apps/cdplayer/CDDBSupport.h index 1f0f7d6642..44feb8e96b 100644 --- a/src/apps/cdplayer/CDDBSupport.h +++ b/src/apps/cdplayer/CDDBSupport.h @@ -14,12 +14,18 @@ class CDDBQuery public: CDDBQuery(const char *server, int32 port = 888, bool log = false); + ~CDDBQuery(void); void SetToSite(const char *server, int32 port); void GetSites(bool (*)(const char *site, int port, const char *latitude, const char *longitude, const char *description, void *state), void *); void SetToCD(const char *devicepath); + + const char * GetArtist(void) { return fArtist.String(); } + const char * GetAlbum(void) { return fTitle.String(); } + const char * GetGenre(void) { return fCategory.String(); } + bool GetTitles(BString *title, vector *tracks, bigtime_t timeout); @@ -32,8 +38,7 @@ public: static void GetTrackTimes(const scsi_toc *, vector ×); static BString OffsetsToString(const scsi_toc *); -// TODO: make private again once finished with testing -//private: +private: void Connect(); void Disconnect(); bool IsConnected() const; diff --git a/src/apps/cdplayer/CDEngine.cpp b/src/apps/cdplayer/CDEngine.cpp index ec1b1c39ce..b678358a6a 100644 --- a/src/apps/cdplayer/CDEngine.cpp +++ b/src/apps/cdplayer/CDEngine.cpp @@ -17,7 +17,7 @@ #include "PlayList.h" static PlayList sPlayList; -static CDAudioDevice sCDDevice; +CDAudioDevice gCDDevice; const bigtime_t kPulseRate = 500000; @@ -57,7 +57,7 @@ PlayState::PlayState(CDEngine *engine) bool PlayState::UpdateState(void) { - CDState state = sCDDevice.GetState(); + CDState state = gCDDevice.GetState(); if(state == kStopped) { if(fEngine->GetState() == kPlaying) @@ -67,14 +67,14 @@ PlayState::UpdateState(void) int16 next = sPlayList.GetNextTrack(); if(next > 0) { - sCDDevice.Play(next); + gCDDevice.Play(next); return CurrentState(kPlaying); } } else { - sPlayList.SetTrackCount(sCDDevice.CountTracks()); - sPlayList.SetStartingTrack(sCDDevice.GetTrack()); + sPlayList.SetTrackCount(gCDDevice.CountTracks()); + sPlayList.SetStartingTrack(gCDDevice.GetTrack()); return CurrentState(kPlaying); } } @@ -85,8 +85,8 @@ PlayState::UpdateState(void) // or this app is started while the drive is playing. We should // reset the to start at the current track and finish at the // last one and send a notification. - sPlayList.SetTrackCount(sCDDevice.CountTracks()); - sPlayList.SetStartingTrack(sCDDevice.GetTrack()); + sPlayList.SetTrackCount(gCDDevice.CountTracks()); + sPlayList.SetStartingTrack(gCDDevice.GetTrack()); return CurrentState(kPlaying); } @@ -130,9 +130,9 @@ TrackState::UpdateState() int16 cdTrack, count; - if(sCDDevice.GetState() == kPlaying) + if(gCDDevice.GetState() == kPlaying) { - cdTrack = sCDDevice.GetTrack(); + cdTrack = gCDDevice.GetTrack(); if(cdTrack != sPlayList.GetCurrentTrack()) sPlayList.SetCurrentTrack(cdTrack); return CurrentState(cdTrack, trackCount); @@ -140,14 +140,14 @@ TrackState::UpdateState() // If we're not playing, just monitor the current track in the playlist cdTrack = sPlayList.GetCurrentTrack(); - count = sCDDevice.CountTracks(); + count = gCDDevice.CountTracks(); return CurrentState(cdTrack,count); } int32 TrackState::GetNumTracks() const { - return sCDDevice.CountTracks(); + return gCDDevice.CountTracks(); } bool @@ -172,14 +172,14 @@ TimeState::UpdateState() cdaudio_time track; cdaudio_time disc; - if(sCDDevice.GetTime(track,disc)) + if(gCDDevice.GetTime(track,disc)) { cdaudio_time ttrack; cdaudio_time tdisc; - int16 ctrack = sCDDevice.GetTrack(); + int16 ctrack = gCDDevice.GetTrack(); - sCDDevice.GetTimeForDisc(tdisc); - sCDDevice.GetTimeForTrack(ctrack,ttrack); + gCDDevice.GetTimeForDisc(tdisc); + gCDDevice.GetTimeForTrack(ctrack,ttrack); return CurrentState(track,ttrack,disc,tdisc); } @@ -240,8 +240,7 @@ TimeState::GetTotalTrackTime(int32 &minutes, int32 &seconds) const CDContentWatcher::CDContentWatcher(void) : cddbQuery("us.freedb.org", 888, true), - discID(-1), - fReady(false) + discID(-1) { } @@ -264,20 +263,7 @@ CDContentWatcher::UpdateState() { int32 newDiscID = -1; - // Check the table of contents to see if the new one is different - // from the old one whenever there is a CD in the drive - if (engine->PlayStateWatcher()->GetState() != kNoCD) - { - newDiscID = sCDDevice.GetDiscID(); - - if (discID == newDiscID) - return false; - - // We have changed CDs, so we are not ready until the CDDB lookup finishes - cddbQuery.SetToCD(sCDDevice.GetDrivePath()); - fReady=false; - } - else + if (engine->PlayStateWatcher()->GetState() == kNoCD) { if(discID != -1) { @@ -288,17 +274,24 @@ CDContentWatcher::UpdateState() return false; } - // If the CD has changed and the CDDB query is ready, we set to true so that - // when UpdateState returns, a notification is sent - bool result = ( (fReady != cddbQuery.Ready()) && (newDiscID != discID) ); + // Check the table of contents to see if the new one is different + // from the old one whenever there is a CD in the drive + newDiscID = gCDDevice.GetDiscID(); - if(result) + if (discID == newDiscID) + return false; + + // We have changed CDs, so we are not ready until the CDDB lookup finishes + cddbQuery.SetToCD(gCDDevice.GetDrivePath()); + + // Notify when the query is ready + if(cddbQuery.Ready()) { - fReady = true; discID = newDiscID; + return true; } - - return result; + + return false; } VolumeState::VolumeState(void) @@ -309,7 +302,7 @@ VolumeState::VolumeState(void) bool VolumeState::UpdateState(void) { - uint8 volume = sCDDevice.GetVolume(); + uint8 volume = gCDDevice.GetVolume(); if(fVolume == volume) return false; @@ -328,7 +321,7 @@ CDEngine::CDEngine(void) playState(this), fEngineState(kStopped) { - sPlayList.SetTrackCount(sCDDevice.CountTracks()); + sPlayList.SetTrackCount(gCDDevice.CountTracks()); } CDEngine::~CDEngine() @@ -349,8 +342,8 @@ CDEngine::AttachedToLooper(BLooper *looper) void CDEngine::Pause() { - sCDDevice.Pause(); - fEngineState = sCDDevice.GetState(); + gCDDevice.Pause(); + fEngineState = gCDDevice.GetState(); } void @@ -358,8 +351,8 @@ CDEngine::Play() { if(fEngineState == kPaused) { - sCDDevice.Resume(); - fEngineState = sCDDevice.GetState(); + gCDDevice.Resume(); + fEngineState = gCDDevice.GetState(); } else if(fEngineState == kPlaying) @@ -368,8 +361,8 @@ CDEngine::Play() } else { - sCDDevice.Play(sPlayList.GetCurrentTrack()); - fEngineState = sCDDevice.GetState(); + gCDDevice.Play(sPlayList.GetCurrentTrack()); + fEngineState = gCDDevice.GetState(); } } @@ -377,14 +370,14 @@ void CDEngine::Stop() { fEngineState = kStopped; - sCDDevice.Stop(); + gCDDevice.Stop(); } void CDEngine::Eject() { - sCDDevice.Eject(); - fEngineState = sCDDevice.GetState(); + gCDDevice.Eject(); + fEngineState = gCDDevice.GetState(); } void @@ -403,14 +396,14 @@ CDEngine::SkipOneForward() return; } - CDState state = sCDDevice.GetState(); + CDState state = gCDDevice.GetState(); if(state == kPlaying) - sCDDevice.Play(track); + gCDDevice.Play(track); if(state == kPaused) { - sCDDevice.Play(track); - sCDDevice.Pause(); + gCDDevice.Play(track); + gCDDevice.Pause(); } trackState.UpdateNow(); } @@ -430,15 +423,15 @@ CDEngine::SkipOneBackward() return; } - CDState state = sCDDevice.GetState(); + CDState state = gCDDevice.GetState(); if(state == kPlaying) - sCDDevice.Play(track); + gCDDevice.Play(track); if(state == kPaused) { - sCDDevice.Play(track); - sCDDevice.Pause(); + gCDDevice.Play(track); + gCDDevice.Pause(); } trackState.UpdateNow(); } @@ -446,19 +439,19 @@ CDEngine::SkipOneBackward() void CDEngine::StartSkippingBackward() { - sCDDevice.StartRewind(); + gCDDevice.StartRewind(); } void CDEngine::StartSkippingForward() { - sCDDevice.StartFastFwd(); + gCDDevice.StartFastFwd(); } void CDEngine::StopSkipping() { - sCDDevice.StopFastFwd(); + gCDDevice.StopFastFwd(); } void @@ -466,14 +459,14 @@ CDEngine::SelectTrack(int32 trackNumber) { sPlayList.SetCurrentTrack(trackNumber); if(playState.GetState() == kPlaying) - sCDDevice.Play(trackNumber); + gCDDevice.Play(trackNumber); trackState.UpdateNow(); } void CDEngine::SetVolume(uint8 value) { - sCDDevice.SetVolume(value); + gCDDevice.SetVolume(value); } void @@ -485,12 +478,12 @@ CDEngine::ToggleShuffle(void) int16 track = sPlayList.GetCurrentTrack(); sPlayList.SetShuffle(false); sPlayList.SetStartingTrack(track); - sPlayList.SetTrackCount(sCDDevice.CountTracks()); + sPlayList.SetTrackCount(gCDDevice.CountTracks()); } else { // Not shuffled, so we will play the entire CD and randomly pick - sPlayList.SetTrackCount(sCDDevice.CountTracks()); + sPlayList.SetTrackCount(gCDDevice.CountTracks()); sPlayList.SetShuffle(true); } } diff --git a/src/apps/cdplayer/CDEngine.h b/src/apps/cdplayer/CDEngine.h index 7f10f35d43..82871e0a79 100644 --- a/src/apps/cdplayer/CDEngine.h +++ b/src/apps/cdplayer/CDEngine.h @@ -115,7 +115,6 @@ private: CDDBQuery cddbQuery; int32 discID; - bool fReady; }; // this watcher sends notices to observers that are interested @@ -225,5 +224,6 @@ public: } }; +extern CDAudioDevice gCDDevice; #endif \ No newline at end of file diff --git a/src/apps/cdplayer/CDPlayer.cpp b/src/apps/cdplayer/CDPlayer.cpp index ce029e53c6..de194f7dbd 100644 --- a/src/apps/cdplayer/CDPlayer.cpp +++ b/src/apps/cdplayer/CDPlayer.cpp @@ -357,6 +357,7 @@ CDPlayer::NoticeChange(Notifier *notifier) if(ps) { + AdjustButtonStates(); HandlePlayState(); } else @@ -393,34 +394,29 @@ CDPlayer::HandlePlayState(void) { case kNoCD: { - AdjustButtonStates(); fCurrentTrack->SetHighColor(fStopColor); fCurrentTrack->Invalidate(); break; } case kStopped: { - AdjustButtonStates(); fCurrentTrack->SetHighColor(fStopColor); fCurrentTrack->Invalidate(); break; } case kPaused: { - AdjustButtonStates(); fCurrentTrack->SetHighColor(fPlayColor); break; } case kPlaying: { - AdjustButtonStates(); fCurrentTrack->SetHighColor(fPlayColor); fCurrentTrack->Invalidate(); break; } case kSkipping: { - AdjustButtonStates(); fCurrentTrack->SetHighColor(fStopColor); break; } @@ -434,58 +430,33 @@ CDPlayer::HandlePlayState(void) void CDPlayer::AdjustButtonStates(void) { - CDState state = engine->GetState(); + CDState state = gCDDevice.GetState(); - switch(state) + if(state==kNoCD) { - case kNoCD: - { - // Everything needs to be disabled when there is no CD - fStop->SetEnabled(false); - fPlay->SetEnabled(false); - fNextTrack->SetEnabled(false); - fPrevTrack->SetEnabled(false); - - fSave->SetEnabled(false); - break; - } - case kStopped: - { - fStop->SetEnabled(true); - fPlay->SetEnabled(true); - fNextTrack->SetEnabled(true); - fPrevTrack->SetEnabled(true); - - // TODO: Enable when Save is implemented -// fSave->SetEnabled(true); - - fPlay->SetState(0); - break; - } - case kPaused: - { - fPlay->SetState(0); - break; - } - case kPlaying: - { - fStop->SetEnabled(true); - fPlay->SetEnabled(true); - fNextTrack->SetEnabled(true); - fPrevTrack->SetEnabled(true); - - // TODO: Enable when Save is implemented -// fSave->SetEnabled(true); - - fPlay->SetState(1); - break; - } - case kSkipping: - default: - { - break; - } + // Everything needs to be disabled when there is no CD + fStop->SetEnabled(false); + fPlay->SetEnabled(false); + fNextTrack->SetEnabled(false); + fPrevTrack->SetEnabled(false); + + fSave->SetEnabled(false); } + else + { + fStop->SetEnabled(true); + fPlay->SetEnabled(true); + fNextTrack->SetEnabled(true); + fPrevTrack->SetEnabled(true); + + // TODO: Enable when Save is implemented +// fSave->SetEnabled(true); + } + + if(state==kPlaying) + fPlay->SetState(1); + else + fPlay->SetState(0); } void @@ -628,7 +599,7 @@ public: CDPlayerWindow::CDPlayerWindow(void) : BWindow(BRect (100, 100, 610, 200), "CD Player", B_TITLED_WINDOW, B_NOT_V_RESIZABLE | - B_NOT_ZOOMABLE | B_ASYNCHRONOUS_CONTROLS) + B_NOT_ZOOMABLE) { float wmin,wmax,hmin,hmax;