Fixed lookups when CDs are changed

Artist is again displayed alongside the CD title
Fixed button state updates when CDs are changed


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