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
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<BString> *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;
}
+7 -2
View File
@@ -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<BString> *tracks,
bigtime_t timeout);
@@ -32,8 +38,7 @@ public:
static void GetTrackTimes(const scsi_toc *, vector<cdaudio_time> &times);
static BString OffsetsToString(const scsi_toc *);
// TODO: make private again once finished with testing
//private:
private:
void Connect();
void Disconnect();
bool IsConnected() const;
+57 -64
View File
@@ -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);
}
}
+1 -1
View File
@@ -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
+26 -55
View File
@@ -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;