diff --git a/src/apps/cdplayer/CDAudioDevice.cpp b/src/apps/cdplayer/CDAudioDevice.cpp index bd91b6a513..eaf5e6d072 100644 --- a/src/apps/cdplayer/CDAudioDevice.cpp +++ b/src/apps/cdplayer/CDAudioDevice.cpp @@ -442,8 +442,8 @@ CDAudioDevice::GetTimeForDisc(cdaudio_time &disc) int16 trackcount = toc.toc_data[3] - toc.toc_data[2] + 1; TrackDescriptor *desc = (TrackDescriptor*)&(toc.toc_data[4]); - disc.minutes = desc[trackcount-1].min; - disc.seconds = desc[trackcount-1].sec; + disc.minutes = desc[trackcount].min; + disc.seconds = desc[trackcount].sec; return true; } diff --git a/src/apps/cdplayer/CDDBSupport.cpp b/src/apps/cdplayer/CDDBSupport.cpp index dc643c6766..07854bc5e2 100644 --- a/src/apps/cdplayer/CDDBSupport.cpp +++ b/src/apps/cdplayer/CDDBSupport.cpp @@ -565,50 +565,3 @@ CDDBQuery::FindOrCreateContentFileForDisk(BFile *file, entry_ref *fileRef, int32 } return false; } - -/* - -#include "CDEngine.h" - -bool -PrintSite(const char *site, int port, const char *latitude, - const char *longitude, const char *description, void *) -{ - printf("server:%s port:%d latitude:%s longitude:%s description: %s\n", - site, port, latitude, longitude, description); - return false; -} - -int -main() -{ - CDDBQuery query("us.freedb.org", 888, true); - - int32 device = CDEngine::FindCDPlayerDevice(); - if (!device) - { - printf("no device %s\n", strerror(device)); - return 0; - } - - scsi_toc toc; - - ioctl(device, B_SCSI_GET_TOC, &toc); - int32 discID = query.GetDiscID(&toc); - - query.SetToCD(&toc); - - BString title; - vector trackTitles; - query.GetTitles(&title, &trackTitles, 10000000); - - printf("CD Title: %s, ID: %lx\n", title.String(), discID); - int32 index = 0; - for (vector::iterator iterator = trackTitles.begin(); - iterator != trackTitles.end(); index++, iterator++) - printf("%ld: %s\n", index, (*iterator).String()); - - return 0; -} - -*/ diff --git a/src/apps/cdplayer/CDEngine.cpp b/src/apps/cdplayer/CDEngine.cpp index d7812b0f82..9ca3def651 100644 --- a/src/apps/cdplayer/CDEngine.cpp +++ b/src/apps/cdplayer/CDEngine.cpp @@ -36,14 +36,15 @@ void PeriodicWatcher::DoPulse() { // control the period here - if (UpdateState()) + if(UpdateState()) Notify(); } void PeriodicWatcher::UpdateNow() { - UpdateState(); + if(UpdateState()) + Notify(); } @@ -69,6 +70,7 @@ PlayState::UpdateState(void) } } + /* if(state == kPlaying && fEngine->GetState() == kStopped) { // This happens when the CD drive is started by R5's player @@ -118,11 +120,18 @@ TrackState::UpdateState() // As a result, we want to make sure this hasn't happened. If it has, then we // need to update the playlist's position. - int16 cdTrack = sCDDevice.GetTrack(); - - if(cdTrack != sPlayList.GetCurrentTrack()) - sPlayList.SetCurrentTrack(cdTrack); + int16 cdTrack; + if(sCDDevice.GetState() == kPlaying) + { + cdTrack = sCDDevice.GetTrack(); + if(cdTrack != sPlayList.GetCurrentTrack()) + sPlayList.SetCurrentTrack(cdTrack); + return CurrentState(cdTrack); + } + + // If we're not playing, just monitor the current track in the playlist + cdTrack = sPlayList.GetCurrentTrack(); return CurrentState(cdTrack); } @@ -170,8 +179,7 @@ TimeState::UpdateState() track.seconds = -1; disc.minutes = -1; disc.seconds = -1; - CurrentState(disc,disc,track,track); - return false; + return CurrentState(disc,disc,track,track); } } @@ -373,31 +381,56 @@ void CDEngine::SkipOneForward() { int16 track = sPlayList.GetNextTrack(); + if(track <= 0) - return; + { + // force a "wrap around" when possible. This makes it + // possible for the user to be able to, for example, jump + // back to the first track from the last one with 1 button push + track = sPlayList.GetFirstTrack(); + + if(track <= 0) + return; + } CDState state = sCDDevice.GetState(); if(state == kPlaying) sCDDevice.Play(track); -// if(state == kPaused) -// sCDDevice.Pause(); + if(state == kPaused) + { + sCDDevice.Play(track); + sCDDevice.Pause(); + } + trackState.UpdateNow(); } void CDEngine::SkipOneBackward() { int16 track = sPlayList.GetPreviousTrack(); + if(track <= 0) - return; + { + // force a "wrap around" when possible. This way the user + // can search backwards to get to a later track + track = sPlayList.GetLastTrack(); + + if(track <= 0) + return; + } CDState state = sCDDevice.GetState(); if(state == kPlaying) sCDDevice.Play(track); -// if(state == kPaused) -// sCDDevice.Pause(); + if(state == kPaused) + { + sCDDevice.Play(track); + sCDDevice.Pause(); + } + trackState.UpdateNow(); } void diff --git a/src/apps/cdplayer/CDEngine.h b/src/apps/cdplayer/CDEngine.h index 9de0f3711d..b8d8641049 100644 --- a/src/apps/cdplayer/CDEngine.h +++ b/src/apps/cdplayer/CDEngine.h @@ -40,7 +40,6 @@ public: protected: virtual bool UpdateState() = 0; - CDEngine *engine; }; @@ -70,7 +69,7 @@ public: int32 GetTrack() const; int32 GetNumTracks() const; - + private: bool UpdateState(); bool CurrentState(int32); @@ -126,10 +125,10 @@ class VolumeState : public PeriodicWatcher public: VolumeState(void); - bool UpdateState(); int32 GetVolume() const; private: + bool UpdateState(); int32 fVolume; }; diff --git a/src/apps/cdplayer/CDPlayer.cpp b/src/apps/cdplayer/CDPlayer.cpp index c3b0c35c16..209be4232e 100644 --- a/src/apps/cdplayer/CDPlayer.cpp +++ b/src/apps/cdplayer/CDPlayer.cpp @@ -175,6 +175,7 @@ void CDPlayer::BuildGUI(void) fRewind->MoveTo(fNextTrack->Frame().right + 10, Bounds().bottom - 5 - fRewind->Frame().Height()); fRewind->SetDisabled(BTranslationUtils::GetBitmap(B_PNG_FORMAT,"rew_disabled")); AddChild(fRewind); + fRewind->SetEnabled(false); fFastFwd = new DrawButton( BRect(0,0,1,1), "FastFwd", BTranslationUtils::GetBitmap(B_PNG_FORMAT,"ffwd_up"), BTranslationUtils::GetBitmap(B_PNG_FORMAT,"ffwd_down"), new BMessage(M_NEXT_TRACK), @@ -183,6 +184,7 @@ void CDPlayer::BuildGUI(void) fFastFwd->MoveTo(fRewind->Frame().right + 2, Bounds().bottom - 5 - fFastFwd->Frame().Height()); fFastFwd->SetDisabled(BTranslationUtils::GetBitmap(B_PNG_FORMAT,"ffwd_disabled")); AddChild(fFastFwd); + fFastFwd->SetEnabled(false); fEject = new DrawButton( BRect(0,0,1,1), "Eject", BTranslationUtils::GetBitmap(B_PNG_FORMAT,"eject_up"), BTranslationUtils::GetBitmap(B_PNG_FORMAT,"eject_down"), new BMessage(M_EJECT), @@ -364,87 +366,34 @@ CDPlayer::HandlePlayState(void) { case kNoCD: { - if(fStop->IsEnabled()) - { - fStop->SetEnabled(false); - fPlay->SetEnabled(false); - fNextTrack->SetEnabled(false); - fPrevTrack->SetEnabled(false); - fFastFwd->SetEnabled(false); - fRewind->SetEnabled(false); - fSave->SetEnabled(false); - } + AdjustButtonStates(); fCurrentTrack->SetHighColor(fStopColor); + fCurrentTrack->Invalidate(); break; } case kStopped: { - if(!fStop->IsEnabled()) - { - fStop->SetEnabled(true); - fPlay->SetEnabled(true); - fNextTrack->SetEnabled(true); - fPrevTrack->SetEnabled(true); - fFastFwd->SetEnabled(true); - fRewind->SetEnabled(true); - - // TODO: Enable when Save is implemented -// fSave->SetEnabled(true); - } + AdjustButtonStates(); fCurrentTrack->SetHighColor(fStopColor); + fCurrentTrack->Invalidate(); break; } case kPaused: { - // TODO: Set play button to Pause - if(!fStop->IsEnabled()) - { - fStop->SetEnabled(true); - fPlay->SetEnabled(true); - fNextTrack->SetEnabled(true); - fPrevTrack->SetEnabled(true); - fFastFwd->SetEnabled(true); - fRewind->SetEnabled(true); - - // TODO: Enable when Save is implemented -// fSave->SetEnabled(true); - } + AdjustButtonStates(); fCurrentTrack->SetHighColor(fPlayColor); break; } case kPlaying: { - if(!fStop->IsEnabled()) - { - fStop->SetEnabled(true); - fPlay->SetEnabled(true); - fNextTrack->SetEnabled(true); - fPrevTrack->SetEnabled(true); - fFastFwd->SetEnabled(true); - fRewind->SetEnabled(true); - - // TODO: Enable when Save is implemented -// fSave->SetEnabled(true); - } - fPlay->SetState(1); + AdjustButtonStates(); fCurrentTrack->SetHighColor(fPlayColor); fCurrentTrack->Invalidate(); break; } case kSkipping: { - if(!fStop->IsEnabled()) - { - fStop->SetEnabled(true); - fPlay->SetEnabled(true); - fNextTrack->SetEnabled(true); - fPrevTrack->SetEnabled(true); - fFastFwd->SetEnabled(true); - fRewind->SetEnabled(true); - - // TODO: Enable when Save is implemented -// fSave->SetEnabled(true); - } + AdjustButtonStates(); fCurrentTrack->SetHighColor(fStopColor); break; } @@ -455,6 +404,73 @@ CDPlayer::HandlePlayState(void) } } +void +CDPlayer::AdjustButtonStates(void) +{ + CDState state = engine->GetState(); + + switch(state) + { + case kNoCD: + { + // Everything needs to be disabled when there is no CD + fStop->SetEnabled(false); + fPlay->SetEnabled(false); + fNextTrack->SetEnabled(false); + fPrevTrack->SetEnabled(false); + fFastFwd->SetEnabled(false); + fRewind->SetEnabled(false); + fSave->SetEnabled(false); + break; + } + case kStopped: + { + fStop->SetEnabled(true); + fPlay->SetEnabled(true); + fNextTrack->SetEnabled(true); + fPrevTrack->SetEnabled(true); + + fFastFwd->SetEnabled(false); + fRewind->SetEnabled(false); + + // TODO: Enable when Save is implemented +// fSave->SetEnabled(true); + + fPlay->SetState(0); + break; + } + case kPaused: + { + // We can only pause when everything is enabled, so this is all we should do. + fFastFwd->SetEnabled(false); + fRewind->SetEnabled(false); + fPlay->SetState(0); + break; + } + case kPlaying: + { + fStop->SetEnabled(true); + fPlay->SetEnabled(true); + fNextTrack->SetEnabled(true); + fPrevTrack->SetEnabled(true); + + fFastFwd->SetEnabled(true); + fRewind->SetEnabled(true); + + // TODO: Enable when Save is implemented +// fSave->SetEnabled(true); + + fPlay->SetState(1); + break; + } + case kSkipping: + default: + { + break; + } + } +} + void CDPlayer::UpdateCDInfo(void) { diff --git a/src/apps/cdplayer/CDPlayer.h b/src/apps/cdplayer/CDPlayer.h index 60cc2f6b40..4bd67ae1d3 100644 --- a/src/apps/cdplayer/CDPlayer.h +++ b/src/apps/cdplayer/CDPlayer.h @@ -48,6 +48,7 @@ private: void HandlePlayState(void); void UpdateCDInfo(void); void UpdateTimeInfo(void); + void AdjustButtonStates(void); CDEngine *engine; diff --git a/src/apps/cdplayer/CDPlayer.rdef b/src/apps/cdplayer/CDPlayer.rdef index dac5556f25..3f5648da63 100644 --- a/src/apps/cdplayer/CDPlayer.rdef +++ b/src/apps/cdplayer/CDPlayer.rdef @@ -351,120 +351,85 @@ resource(24, "save_disabled") #'PNG ' array { }; resource(25, "repeat_up") #'PNG ' array { - $"89504E470D0A1A0A0000000D49484452000000230000001308030000015A7A74" - $"5000000012504C5445FFFFFF000000E6E6E6DCDCDC6C6C6C008300BB001C5100" - $"0000096F464673000000000000000000DA2AB6CE000000097048597300000FA0" - $"00000FA001A06A8C770000007E49444154789CAD8F510EC0200843ADD5FB5F79" - $"90AA1B62B264593FB6525E104A9148D0BFE4ACCDA9244CAB6D662026A80976A8" - $"E9FDA39B16F31723448A21C2D49885A49255C930AC59A24334A8C31204889F93" - $"6DC5B6BDEEC961E77A96E1320DE98CE7D3E8DDCE1283CC605562B6AD9F10FF66" - $"4ED01DE5BBB29C696FC205B240065004A187160000000049454E44AE426082" + $"89504E470D0A1A0A0000000D49484452000000230000001308060000001AA3B4" + $"F4000000A049444154789CED96CD0DC3200C461F15A3782486F104886118893B" + $"1BE44A0F154A0FADF86922A2A8EF6CACC767846C4A29850B608CC102E49C978A" + $"78EF015E3200DBB62D93A93C560BBC735F191121C6387DFEF06454755AC8B64B" + $"7644A45B48550921E09CEBEE7FEA9B51D5EE0BC0C9322104524ADDF543636A35" + $"AE298C8EA7727832B32230984C8B91917CE2BE9FDEAFFC65BE6161DF27566380" + $"4B6C7A004F04A22A52A51390770000000049454E44AE426082" }; resource(26, "repeat_down") #'PNG ' array { - $"89504E470D0A1A0A0000000D49484452000000230000001308030000015A7A74" - $"5000000012504C5445000000FFFFFF6C6C6CE6E6E6BEBEBE0083004C8424AC00" - $"0000096F464673000000000000000000DA2AB6CE000000097048597300000FA0" - $"00000FA001A06A8C770000007C49444154789CAD90510EC0200843CBACF7BFF2" - $"40D40D313159D60F85478320E022413BF5EEB991963632CB4631245E04AB7851" - $"B58F4688714584E86240F3B9DE4B92907591A15951E28B78A30A2508267E26CB" - $"886579DDC866E6EBA022698DF041B5EA5AEE41F66066EE59A67E9BF8B767677A" - $"50DE2BCB3CE524B9012C9D0763558616CC0000000049454E44AE426082" + $"89504E470D0A1A0A0000000D49484452000000230000001308060000001AA3B4" + $"F4000000A449444154789CED96410D03211045DF3698C0080290800E041014A0" + $"0A012B041BD34343DA4BCB4269D86CFAAE0393C71F42D800E10488080AC07BBF" + $"5424C608F0900170CE2D93A9DC560BBC725D196B2DFBBE0FEF9F9E4C08615848" + $"B5973CB1D61E16024829618C39DCFFA777268470F800D0994C2FBDC974C9E49C" + $"3FD66B0ABD1295E9631A1581C9636A25D7E2BA8FDEB7FC65DEB101524A59ED81" + $"D61A25728A8F1E0077F2B428384A1FEECA0000000049454E44AE426082" }; resource(27, "repeat_up_on") #'PNG ' array { - $"89504E470D0A1A0A0000000D49484452000000230000001308030000015A7A74" - $"5000000012504C5445FFFFFF000000E6E6E66C6C6CDCDCDC00FF00911226CA00" - $"0000096F464673000000000000000000DA2AB6CE000000097048597300000FA0" - $"00000FA001A06A8C770000007B49444154789CAD8FDB0EC0200843AD96FFFFE5" - $"6110276262B2AC0F0AE5844B292612EC2FE9B9469612AA59D660202A58111458" - $"B1D78F9187F02F5A88148305D7E885A49255C9D0ACA963875823813A08103F3B" - $"DB8A6D9BDE9DC3CEF5A28674C63A1A227A9631C80C6666CCB6F50AF16FE604BD" - $"56BE2BAB33ED263C9CF907A6D61A86EF0000000049454E44AE426082" + $"89504E470D0A1A0A0000000D49484452000000230000001308060000001AA3B4" + $"F4000000E849444154789CCD96410E832010451F8D47992371983981E1301C69" + $"F6DEC0AD5D588C6DD102B6D59FB011828F99FF096E9AA6890BC8394707300CC3" + $"A9207DDF03CC3000E3389E0693D47D5EB2AD1823AAFAF6DDCC9AF6BBB5428848" + $"160440448831FE1E26578D10C23292541511A9DABBBA4D6B901002DEFBA779EF" + $"FD13B08814B7ADAA32EBD2E740D640EB2A95AA0A269D760F240754DAAE2603E7" + $"54EB8F9C9A6054359B9657A0ADB46DA9CAC066B6FC702FD6C9B0697DA981ABD3" + $"D40254AAA63699D96E5AFE7A03C39C16335BC651904330391D01812FC21C0581" + $"8781D37BE26C39E0122F3D803B2D1971A06BDE4E510000000049454E44AE4260" + $"82" }; resource(28, "repeat_down_on") #'PNG ' array { - $"89504E470D0A1A0A0000000D49484452000000230000001308030000015A7A74" - $"5000000012504C5445000000FFFFFF6C6C6CE6E6E6BEBEBE00FF00CF0E125600" - $"0000096F464673000000000000000000DA2AB6CE000000097048597300000FA0" - $"00000FA001A06A8C770000007C49444154789CAD90510EC0200843CBACF7BFF2" - $"40D40D313159D60F85478320E022413BF5EEB991963632CB4631245E04AB7851" - $"B58F4688714584E86240F3B9DE4B92907591A15951E28B78A30A2508267E26CB" - $"886579DDC866E6EBA022698DF041B5EA5AEE41F66066EE59A67E9BF8B767677A" - $"50DE2BCB3CE524B9012C9D0763558616CC0000000049454E44AE426082" -}; - -resource(29, "repeat_disabled") #'PNG ' array { - $"89504E470D0A1A0A0000000D494844520000002300000013080000000148CFDB" - $"BE000000096F464673000000000000000000DA2AB6CE00000009704859730000" - $"0FA000000FA001A06A8C77000000B749444154789C8D90BD15C3200C843FF254" - $"658E8CA13A63A574ED22D3B8D618A18D37704B0AC008E2FCA841EF743A4E1712" - $"8010310D290221011281134048D100AD634C330520483400BD111E05BB9CA8D5" - $"BAB20BA6E57134C0401D5FF781E4E1080FB51B6A7BEBD6E9EB2C59482D0B2D10" - $"9E4BAF38779E86133E2392459D45F9E2B5795E8F071B9C0198EE02FD194E76B3" - $"85ABE6846AAC1D57B31DA5A4E828B5D54AE2E8AEF7FA97D3F218FC789D83843C" - $"244C3FFF7A014CCF345764741A860000000049454E44AE426082" + $"89504E470D0A1A0A0000000D49484452000000230000001308060000001AA3B4" + $"F4000000FF49444154789CCD96E16DC4200C46DF5559820D328107F008998301" + $"5026602A066090AC417FB4AE92964B8144BAFBA4281120787CB6210FA0F0062A" + $"A5300178EF5F0AB2AE2BC0170CC0B22C2F83314DFF0F79AE9C3321843FED29A5" + $"A1F93E462154B50A02A0AAE49CBBE7ED76A6E6468CF1E7DBFAECDDE35237CC1E" + $"24C688881CFA534A0760556D06EA0AD3DEFA1A8849440E6EB5AA0BC6767B0652" + $"0352D5FB61CED4BAE09986604208D56AF90DF4ACDA6E81D927A201D95303B2F1" + $"AD09FC008AF7BEEB046E09494F49CFF38C736E2C4C29A5D36A193D8187AF0311" + $"392C6A6E8D82C08DD504D740E04698AB20F09DC0DBB65DA7B928E71C53296FF1" + $"A307C02781096F058F7CB3C80000000049454E44AE426082" }; resource(30, "shuffle_up") #'PNG ' array { - $"89504E470D0A1A0A0000000D49484452000000230000001308030000015A7A74" - $"5000000012504C5445FFFFFF000000E6E6E66C6C6CDCDCDC0083001298103000" - $"0000096F464673000000000000000000DA2AB6CE000000097048597300000FA0" - $"00000FA001A06A8C770000008E49444154789C85925B16802008449DC4FD6F39" - $"E46581E57C100EF720786A4D452C8F715E26113803C05F4758B0228DC8088D21" - $"E19E5EA4DEAD5842CDEE8012D22559DABFA8555DE9BE9E9C81EC5061D4818C02" - $"1B881D9845E1F86131A5CF66E6EBA08EBCC67BA73178AD7F46063B3132E064E0" - $"3BC9EBFBABEB91EC2EAD58D9330DD830FE2B44D8311F77F5937003992A073AE8" - $"E0FDC50000000049454E44AE426082" + $"89504E470D0A1A0A0000000D49484452000000230000001308060000001AA3B4" + $"F40000007D49444154789CDD96B90DC0200C00CF11A3302B53D2B3012D292224" + $"37F9142343AE85E2EC6B2CADB5C604880801A094E22A9252023864006AAD6E32" + $"9DCD5B4013EEBF408CF1F42DE76C26B3DE662CA7BFE2918C6664B2F532694626" + $"7B2DA3B14EB676268D75B24F321A8B64FFC9A4B14836DF66FA3DE18D00535C7A" + $"003B6C0624445116DF550000000049454E44AE426082" }; resource(31, "shuffle_down") #'PNG ' array { - $"89504E470D0A1A0A0000000D49484452000000230000001308030000015A7A74" - $"5000000012504C5445000000FFFFFF6C6C6CE6E6E6BEBEBE0083004C8424AC00" - $"0000096F464673000000000000000000DA2AB6CE000000097048597300000FA0" - $"00000FA001A06A8C770000008749444154789C85925B168020084487C4FD6F39" - $"792847B09C0F8E0CD7800A30F1D08C2B0F5312F3B19021F222F775621248B9DD" - $"DB846A298518430FD9528A8A50F5A47E2D391DD9E1C29803D8C63A86DC825BBC" - $"9C9904539E7398F9B9A8515E63DFA9F7B1D63FA383DD181D509878D9B00FCE91" - $"B2F7B28A97E7C9020E8CFF0A114ECC47AF7613BD278906D3979AD3BB00000000" - $"49454E44AE426082" + $"89504E470D0A1A0A0000000D49484452000000230000001308060000001AA3B4" + $"F40000008649444154789CDD96B90DC0200C008F8825588711988309188E7158" + $"C329A2486EF2298E805C6B1787AFC101C20088081E20E7DC55A49402B0C900A4" + $"94BAC9EC2CBD0534FE7A05628C87B35AAB99CC7C97B17CFD19B764345F269B2F" + $"93E6CB648F6534D6C9E6CEA4B14EF64A466391EC3F993416C986BA8C03A4B5D6" + $"DB8310025E64888F1E002BA1FC23C06E93FD8D0000000049454E44AE426082" }; resource(32, "shuffle_up_on") #'PNG ' array { - $"89504E470D0A1A0A0000000D49484452000000230000001308030000015A7A74" - $"5000000012504C5445FFFFFF000000E6E6E66C6C6CDCDCDC00FF00911226CA00" - $"0000096F464673000000000000000000DA2AB6CE000000097048597300000FA0" - $"00000FA001A06A8C770000008E49444154789C85925B16802008449DC4FD6F39" - $"E46581E57C100EF720786A4D452C8F715E26113803C05F4758B0228DC8088D21" - $"E19E5EA4DEAD5842CDEE8012D22559DABFA8555DE9BE9E9C81EC5061D4818C02" - $"1B881D9845E1F86131A5CF66E6EBA08EBCC67BA73178AD7F46063B3132E064E0" - $"3BC9EBFBABEB91EC2EAD58D9330DD830FE2B44D8311F77F5937003992A073AE8" - $"E0FDC50000000049454E44AE426082" + $"89504E470D0A1A0A0000000D49484452000000230000001308060000001AA3B4" + $"F40000007D49444154789CDD96B10DC0200C04CF11A3302B53D2B301AD534428" + $"3421141070AE85E2FC2F904555950D10111C404A69A9480801E09201C8392F93" + $"291CAB056ADCFB15F0DE3F9EC51887C9D84B66E4F42DBA646A665666AFA69A99" + $"953565BE7A45053B35F54C3F323D3BC9F4F0DB1F782B1907F73EB11A01B6D8F4" + $"004E58642442B55F4BCA0000000049454E44AE426082" }; resource(33, "shuffle_down_on") #'PNG ' array { - $"89504E470D0A1A0A0000000D49484452000000230000001308030000015A7A74" - $"5000000012504C5445000000FFFFFF6C6C6CE6E6E6BEBEBE00FF00CF0E125600" - $"0000096F464673000000000000000000DA2AB6CE000000097048597300000FA0" - $"00000FA001A06A8C770000008749444154789C85925B168020084487C4FD6F39" - $"792847B09C0F8E0CD7800A30F1D08C2B0F5312F3B19021F222F775621248B9DD" - $"DB846A298518430FD9528A8A50F5A47E2D391DD9E1C29803D8C63A86DC825BBC" - $"9C9904539E7398F9B9A8515E63DFA9F7B1D63FA383DD181D509878D9B00FCE91" - $"B2F7B28A97E7C9020E8CFF0A114ECC47AF7613BD278906D3979AD3BB00000000" - $"49454E44AE426082" -}; - -resource(34, "shuffle_disabled") #'PNG ' array { - $"89504E470D0A1A0A0000000D494844520000002300000013080000000148CFDB" - $"BE000000096F464673000000000000000000DA2AB6CE00000009704859730000" - $"0FA000000FA001A06A8C77000000C449444154789C7D91B115C2301043BFFD3C" - $"0A63A8661B56A0A4A66001D648AD31480B1BA43585ED042721AA2C9DDE597717" - $"324062042200210369E6218F0058213F4156B50084548A5C09AFAA9DA2B131FC" - $"68AD4B83758AF410440CD8002E8FB431ED610E34237DA6FEBFFBAAD300E13DF5" - $"DA7D9D091218614018998885D112262217E29667D3792FF3677F9819B74782E9" - $"6FD903676D36D4A3A63CF4D43922D86DFF06B743148A8B07C958AA2AA2D13A7D" - $"BF43999EEF781065CBB29703877C394C0D3CBE855E4A1104D8C6E70000000049" - $"454E44AE426082" + $"89504E470D0A1A0A0000000D49484452000000230000001308060000001AA3B4" + $"F40000008649444154789CDD96D10DC01014004F6309EB18C11C26309C71ACF1" + $"FAD148A4495513AA7ABF7C1C475080F00144040DE0BD9F2A1242003864009C73" + $"D36432DB6C81127D3F05ACB5976331C66E32EBED4CCFD5D768922919996CBD4C" + $"2523935565DEBA45997532BD758B328FCFCC999E29D7C9D4C26F9F0305484A69" + $"B607C618B4C8273E7A00EC731B23C09F9ED4020000000049454E44AE426082" }; resource(35, "pause_up") #'PNG ' array { diff --git a/src/apps/cdplayer/PlayList.cpp b/src/apps/cdplayer/PlayList.cpp index cf933e15e3..9930bbf08a 100644 --- a/src/apps/cdplayer/PlayList.cpp +++ b/src/apps/cdplayer/PlayList.cpp @@ -83,6 +83,8 @@ PlayList::SetShuffle(const bool &random) else Unrandomize(); + fRandom = random; + fLocker.Unlock(); } @@ -185,6 +187,41 @@ PlayList::GetPreviousTrack(void) return value; } +int16 +PlayList::GetLastTrack(void) +{ + fLocker.Lock(); + + if(fTrackCount < 1) + { + fLocker.Unlock(); + return -1; + } + + fTrackIndex = fTrackCount - 1; + int16 value = fTrackList[fTrackIndex]; + fLocker.Unlock(); + return value; +} + +int16 +PlayList::GetFirstTrack(void) +{ + fLocker.Lock(); + + if(fTrackCount < 1) + { + fLocker.Unlock(); + return -1; + } + + fTrackIndex = 0; + int16 value = fTrackList[fTrackIndex]; + + fLocker.Unlock(); + return value; +} + void PlayList::Randomize(void) { diff --git a/src/apps/cdplayer/PlayList.h b/src/apps/cdplayer/PlayList.h index 9efe4516e0..fbf3a67b50 100644 --- a/src/apps/cdplayer/PlayList.h +++ b/src/apps/cdplayer/PlayList.h @@ -29,6 +29,9 @@ public: int16 GetNextTrack(void); int16 GetPreviousTrack(void); + int16 GetFirstTrack(void); + int16 GetLastTrack(void); + private: void Randomize(void); void Unrandomize(void);