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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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> ×);
|
||||
static BString OffsetsToString(const scsi_toc *);
|
||||
|
||||
// TODO: make private again once finished with testing
|
||||
//private:
|
||||
private:
|
||||
void Connect();
|
||||
void Disconnect();
|
||||
bool IsConnected() const;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user