/** \fn LiveTVChain::SwitchToNext(bool) * \brief Sets the recording to switch to. * \param up Set to true to switch to the next recording, * false to switch to the previous recording. */ void LiveTVChain::SwitchToNext(bool up) { //VERBOSE(VB_PLAYBACK, LOC + "SwitchToNext("<<(up?"up":"down")<<")"); if (up && HasNext()) SwitchTo(m_curpos + 1); else if (!up && HasPrev()) SwitchTo(m_curpos - 1); }
/** \fn LiveTVChain::SwitchToNext(bool) * \brief Sets the recording to switch to. * \param up Set to true to switch to the next recording, * false to switch to the previous recording. */ void LiveTVChain::SwitchToNext(bool up) { #if 0 LOG(VB_PLAYBACK, LOG_DEBUG, LOC + "SwitchToNext("<<(up?"up":"down")<<")"); #endif if (up && HasNext()) SwitchTo(m_curpos + 1); else if (!up && HasPrev()) SwitchTo(m_curpos - 1); }
void SjMainFrame::UpdateDisplay() { SjSkinValue value; long totalMs, elapsedMs; // get the number of visible lines long visLineCount = GetLinesCount(), visLine; wxASSERT(visLineCount>=0); // get the player SjPlayer* recentPlayer = &g_mainFrame->m_player; // get the number of tracks in the queue long queueTrackCount = recentPlayer->m_queue.GetCount(), queuePlayingPos = recentPlayer->m_queue.GetCurrPos(), queuePos; wxASSERT(queueTrackCount>=0); // current stuff SjPlaylistEntry& urlInfo1 = recentPlayer->m_queue.GetInfo(-1); wxString currTrackName = urlInfo1.GetTrackName(); wxString currArtistName = urlInfo1.GetLeadArtistName(); unsigned long currTimestamp = SjTools::GetMsTicks(); // update cover { if( !m_display.m_showStartupDisplay && queuePlayingPos != -1 ) { value.string = m_columnMixer.GetTrackCoverUrl(recentPlayer->m_queue.GetUrlByPos(-1)); value.value = SJ_VFLAG_STRING_IS_IMAGE_URL; SetSkinTargetValue(IDT_DISPLAY_COVER, value); } else { SetSkinTargetValue(IDT_DISPLAY_COVER, value); } } // update seeker { totalMs = recentPlayer->GetTotalTime(); value.string.Empty(); if( !m_display.m_showStartupDisplay && !recentPlayer->IsStopped() && totalMs > 0 ) { elapsedMs = recentPlayer->GetElapsedTime(); value.vmax = totalMs/SJ_SEEK_RESOLUTION; if( value.vmax==0 ) value.vmax = 1; value.value = elapsedMs/SJ_SEEK_RESOLUTION; SetSkinTargetValue(IDT_SEEK, value); } else { value.value = 0; SetSkinTargetValue(IDT_SEEK, value); } } // update main window title and the "currTrack" target if( !m_display.m_showStartupDisplay && !IsStopped() ) { wxString title, titleArtistName(currArtistName), titleTrackName(currTrackName); if( recentPlayer != &m_player ) { SjPlaylistEntry& urlInfo4 = m_player.m_queue.GetInfo(-1); titleTrackName = urlInfo4.GetTrackName(); titleArtistName = urlInfo4.GetLeadArtistName(); } // set windows title title = CombineArtistNTitle(titleArtistName, titleTrackName, wxT(" - ")); title.Append(wxT(" - ")); title.Append(SJ_PROGRAM_NAME); SetTitle(title); } else { // set windows title SetTitle(SJ_PROGRAM_NAME); } // update display lines... bool displayMsgInCurrNextTrack = false; if( (m_display.m_msgCancelAtTimestamp && !m_display.m_msg1.IsEmpty()) ) { // ...display message wxString msg1(m_display.m_msg1), msg2(m_display.m_msg2); if( HasSkinTarget(IDT_DISPLAY_LINE_FIRST) ) { m_display.m_backupedCurrLine = -1; value.value = SJ_VFLAG_CENTER; value.value |= queueTrackCount? SJ_VFLAG_IGNORECENTEROFFSET : 0; for( visLine = 0; visLine < visLineCount; visLine++ ) { if( visLine==visLineCount/2 ) { value.string = msg1; } else if( visLine==(visLineCount/2)+1 ) { value.string = msg2; } else { value.string.Empty(); } SetSkinTargetValue(IDT_DISPLAY_LINE_FIRST+visLine, value); } } else if( HasSkinTarget(IDT_CURR_TRACK) ) { displayMsgInCurrNextTrack = true; value.value = 0; if( HasSkinTarget(IDT_NEXT_TRACK) ) { value.string = msg1; SetSkinTargetValue(IDT_CURR_TRACK, value); value.string = msg2; SetSkinTargetValue(IDT_NEXT_TRACK, value); } else { value.string = msg1; if( !msg2.IsEmpty() ) value.string += wxT(" ") + msg2; SetSkinTargetValue(IDT_CURR_TRACK, value); } } } else if( m_display.m_showStartupDisplay || queueTrackCount == 0 ) { // ...nothing in queue, display logo m_display.m_firstLineQueuePos = -1; value.thumbSize = 1; value.vmin = 0; value.vmax = 1; value.value = 0; SetSkinTargetValue(IDT_DISPLAY_V_SCROLL, value); value.value = SJ_VFLAG_CENTER; for( visLine = 0; visLine < visLineCount; visLine++ ) { if( visLine==visLineCount/2 ) { value.string = SJ_PROGRAM_NAME wxT(" ") SJ_VERSION_STR; } else { value.string.Empty(); } SetSkinTargetValue(IDT_DISPLAY_LINE_FIRST+visLine, value); } } else { // ...sth. in queue, display queue... m_display.m_backupedCurrLine = -1; m_display.m_backupedCurrBold = FALSE; queuePos = m_display.m_scrollPos==-1? queuePlayingPos : m_display.m_scrollPos; if( queuePos < 0 ) queuePos = 0; if( queueTrackCount > visLineCount && queuePos > queueTrackCount-visLineCount ) queuePos = queueTrackCount-visLineCount; if( queueTrackCount <= visLineCount ) queuePos = 0; if( m_display.m_scrollPos != -1 ) m_display.m_scrollPos = queuePos; // correct the value value.thumbSize = visLineCount; value.vmin = 0; value.vmax = queueTrackCount; value.value = queuePos; SetSkinTargetValue(IDT_DISPLAY_V_SCROLL, value); value.thumbSize = 0; m_display.m_firstLineQueuePos = queuePos; for( visLine = 0; visLine < visLineCount; visLine++, queuePos++ ) { value.vmax = 0; value.vmin = 0; if( queuePos >= 0 && queuePos < queueTrackCount ) { // ...name SjPlaylistEntry& urlInfo2 = recentPlayer->m_queue.GetInfo(queuePos); value.string = CombineArtistNTitle(urlInfo2.GetLeadArtistName(), urlInfo2.GetTrackName()); if( m_skinFlags&SJ_SKIN_SHOW_DISPLAY_AUTOPLAY ) { if( recentPlayer->m_queue.GetFlags(queuePos)&SJ_PLAYLISTENTRY_AUTOPLAY ) { value.string.Prepend(_("AutoPlay")+wxString(wxT(": "))); } } if( m_skinFlags&SJ_SKIN_SHOW_DISPLAY_TRACKNR ) { value.string.Prepend(wxString::Format(wxT("%i. "), (int)queuePos+1)); } // ...time / right icon value.value = 0; if( IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { value.value |= (SJ_VFLAG_MOVABLE); } if( IsOpAvailable(SJ_OP_UNQUEUE) ) { value.value |= (SJ_VFLAG_ICONR_DELETE); } if( queuePos == queuePlayingPos && !recentPlayer->IsStopped() ) { value.value |= SJ_VFLAG_VMIN_IS_TIME; if( IsOpAvailable(SJ_OP_TOGGLE_TIME_MODE) ) value.value |= SJ_VFLAG_TIME_CLICKABLE; long totalTime = recentPlayer->GetTotalTime(); if( m_showRemainingTime && totalTime > 0 ) { value.value |= SJ_VFLAG_VMIN_MINUS; value.vmin = recentPlayer->GetRemainingTime(); if( value.vmin <= 0 ) { value.vmin = urlInfo2.GetPlaytimeMs(); } } else { value.vmin = recentPlayer->GetElapsedTime(); } if( m_skinFlags&SJ_SKIN_SHOW_DISPLAY_TOTAL_TIME ) { value.vmax = totalTime; value.value |= value.vmax>0? SJ_VFLAG_VMAX_IS_TIME : 0; } } else { value.vmin = urlInfo2.GetPlaytimeMs(); value.value |= value.vmin>0? SJ_VFLAG_VMIN_IS_TIME : 0; } // marked (or just added?) if( m_display.m_selectedIds.Lookup(urlInfo2.GetId()) ) { value.value |= SJ_VFLAG_BOLD; if( queuePos == queuePlayingPos ) { m_display.m_backupedCurrBold = TRUE; } } // ...left icon if( queuePos == queuePlayingPos ) { if( recentPlayer->IsStopped() ) { value.value |= SJ_VFLAG_ICONL_STOP; } else if( recentPlayer->IsPaused() ) { value.value |= SJ_VFLAG_ICONL_PAUSE; } else { value.value |= SJ_VFLAG_ICONL_PLAY; } m_display.m_backupedCurrTitle = value.string; m_display.m_backupedCurrLine = visLine; } else { long entryFlags = recentPlayer->m_queue.GetFlags(queuePos); if( entryFlags & SJ_PLAYLISTENTRY_MOVED_DOWN ) { if( !recentPlayer->m_queue.IsBoring(queuePos, currTimestamp) ) { entryFlags &= ~SJ_PLAYLISTENTRY_MOVED_DOWN; recentPlayer->m_queue.SetFlags(queuePos, entryFlags); } } if( entryFlags&SJ_PLAYLISTENTRY_ERRONEOUS ) { value.value |= SJ_VFLAG_ICONL_ERRONEOUS; } else if( recentPlayer->m_queue.WasPlayed(queuePos) ) { value.value |= SJ_VFLAG_ICONL_PLAYED; } else if( entryFlags&SJ_PLAYLISTENTRY_MOVED_DOWN ) { value.value |= SJ_VFLAG_ICONL_MOVED_DOWN; } else { value.value |= SJ_VFLAG_ICONL_EMPTY; } } } else { // ...empty line value.value = SJ_VFLAG_ICONL_EMPTY; value.string.Empty(); } SetSkinTargetValue(IDT_DISPLAY_LINE_FIRST+visLine, value); } } // set "currTrack", "nextTrack" and "currTime" targets if( !displayMsgInCurrNextTrack ) { if( HasSkinTarget(IDT_CURR_TRACK) ) { value.value = 0; value.string = SJ_PROGRAM_NAME; if( !IsStopped() && queuePlayingPos < queueTrackCount ) { SjPlaylistEntry& urlInfo4 = m_player.m_queue.GetInfo(queuePlayingPos); value.string = CombineArtistNTitle(urlInfo4.GetLeadArtistName(), urlInfo4.GetTrackName()); } SetSkinTargetValue(IDT_CURR_TRACK, value); } if( HasSkinTarget(IDT_NEXT_TRACK) ) { value.value = 0; value.string.Empty(); if( !IsStopped() ) { if( GetShuffle() ) { if( HasNextRegardAP() ) { value.string = _("Shuffle"); } } else { if( queuePlayingPos+1 < queueTrackCount ) { SjPlaylistEntry& urlInfo4 = m_player.m_queue.GetInfo(queuePlayingPos+1); value.string = CombineArtistNTitle(urlInfo4.GetLeadArtistName(), urlInfo4.GetTrackName()); } } } SetSkinTargetValue(IDT_NEXT_TRACK, value); } } if( HasSkinTarget(IDT_CURR_TIME) ) { UpdateCurrTime(); } // playing states value.vmin = 0; value.vmax = 255; value.thumbSize = 0; value.value = m_player.GetMainVol(); SetSkinTargetValue(IDT_MAIN_VOL_SLIDER, value); value.vmax = 0; value.value = m_player.GetMainVolMute()? 1 : 0; SetSkinTargetValue(IDT_MAIN_VOL_MUTE, value); value.value = m_player.IsPlaying()? 1 : 0; SetSkinTargetValue(IDT_PLAY, value); value.value = m_player.IsPaused()? 1 : 0; SetSkinTargetValue(IDT_PAUSE, value); value.value = m_player.IsStopped()? 1 : 0; SetSkinTargetValue(IDT_STOP, value); value.value = HasPrev()? 0 : 2; SetSkinTargetValue(IDT_PREV, value); value.value = HasNextRegardAP()? 0 : 2; SetSkinTargetValue(IDT_NEXT, value); SetSkinTargetValue(IDT_FADE_TO_NEXT, value); value.value = m_player.StopAfterThisTrack()? 1 : (/*m_player.IsStopped()? 2 :*/ 0); SetSkinTargetValue(IDT_STOP_AFTER_THIS_TRACK, value); value.value = m_player.StopAfterEachTrack()? 1 : (/*m_player.IsStopped()? 2 :*/ 0); SetSkinTargetValue(IDT_STOP_AFTER_EACH_TRACK, value); value.value = m_player.m_queue.GetShuffle()? 1 : 0; SetSkinTargetValue(IDT_SHUFFLE, value); value.value = m_player.m_queue.GetRepeat(); /*0=off, 1=single, 2=all*/ SetSkinTargetValue(IDT_REPEAT, value); value.value = queueTrackCount? 0/*enabled*/ : 2/*disabled*/; SetSkinTargetValue(IDT_APPEND_FILES, value); SetSkinTargetValue(IDT_SAVE_PLAYLIST, value); SetSkinTargetValue(IDT_UNQUEUE_ALL, value); SetSkinTargetValue(IDT_MORE_FROM_CURR_ALBUM, value); SetSkinTargetValue(IDT_MORE_FROM_CURR_ARTIST, value); }
void SjMainFrame::CreatePlaybackMenu(SjMenu* playbackMenu, bool createMainMenu) { bool anythingInQueue = GetQueueCount()>0; playbackMenu->Append(IDT_MORE_FROM_CURR_ALBUM); playbackMenu->Enable(IDT_MORE_FROM_CURR_ALBUM, anythingInQueue); playbackMenu->Append(IDT_MORE_FROM_CURR_ARTIST); playbackMenu->Enable(IDT_MORE_FROM_CURR_ARTIST, anythingInQueue); playbackMenu->AppendSeparator(); if( createMainMenu || IsOpAvailable(SJ_OP_PLAYPAUSE) ) { playbackMenu->AppendRadioItem(IDT_PLAY); playbackMenu->Check(IDT_PLAY, m_player.IsPlaying()); playbackMenu->AppendRadioItem(IDT_PAUSE); playbackMenu->Check(IDT_PAUSE, m_player.IsPaused()); playbackMenu->AppendRadioItem(IDT_STOP); playbackMenu->Check(IDT_STOP, m_player.IsStopped()); playbackMenu->AppendCheckItem(IDT_STOP_AFTER_THIS_TRACK); playbackMenu->Check(IDT_STOP_AFTER_THIS_TRACK, m_player.StopAfterThisTrack()); playbackMenu->AppendCheckItem(IDT_STOP_AFTER_EACH_TRACK); playbackMenu->Check(IDT_STOP_AFTER_EACH_TRACK, m_player.StopAfterEachTrack()); } if( createMainMenu || IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { if( !IsOpAvailable(SJ_OP_PLAYPAUSE) ) playbackMenu->AppendSeparator(); playbackMenu->Append(IDT_PREV); playbackMenu->Enable(IDT_PREV, HasPrev()); bool hasNext = HasNextRegardAP(); playbackMenu->Append(IDT_NEXT, GetNextMenuTitle()); playbackMenu->Enable(IDT_NEXT, hasNext); playbackMenu->Append(IDT_FADE_TO_NEXT); playbackMenu->Enable(IDT_FADE_TO_NEXT, hasNext); } if( createMainMenu || IsOpAvailable(SJ_OP_MAIN_VOL) ) { SjMenu* volMenu = new SjMenu(playbackMenu->ShowShortcuts()); volMenu->Append(IDT_MAIN_VOL_UP); volMenu->Append(IDT_MAIN_VOL_DOWN); volMenu->AppendCheckItem(IDT_MAIN_VOL_MUTE); volMenu->Check(IDT_MAIN_VOL_MUTE, m_player.GetMainVolMute()); playbackMenu->Append(0, _("Volume"), volMenu); } if( createMainMenu || IsOpAvailable(SJ_OP_EDIT_QUEUE) || IsOpAvailable(SJ_OP_REPEAT) || IsOpAvailable(SJ_OP_PLAYPAUSE) ) { playbackMenu->AppendSeparator(); if( createMainMenu || IsOpAvailable(SJ_OP_REPEAT) ) { wxString repeatText; // default by SjAccelModule if( m_player.m_queue.GetRepeat()==1 ) repeatText = _("Repeat one"); if( m_player.m_queue.GetRepeat()==2 ) repeatText = _("Repeat all"); playbackMenu->AppendCheckItem(IDT_REPEAT, repeatText); playbackMenu->Check(IDT_REPEAT, m_player.m_queue.GetRepeat()!=0); } if( createMainMenu || IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { playbackMenu->AppendCheckItem(IDT_SHUFFLE); playbackMenu->Check(IDT_SHUFFLE, m_player.m_queue.GetShuffle()); } if( createMainMenu || IsOpAvailable(SJ_OP_EDIT_QUEUE) || IsOpAvailable(SJ_OP_PLAYPAUSE) ) { SjMenu* queueMenu = new SjMenu(playbackMenu->ShowShortcuts()); if( IsOpAvailable(SJ_OP_PLAYPAUSE) ) { queueMenu->AppendCheckItem(IDO_START_PB_ON_ENQUEUE, _("Start playback on first enqueue")); queueMenu->Check(IDO_START_PB_ON_ENQUEUE, (g_accelModule->m_flags&SJ_ACCEL_START_PLAYBACK_ON_ENQUEUE)!=0); } if( IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { queueMenu->AppendCheckItem(IDT_PLAY_NOW_ON_DBL_CLICK); queueMenu->Check(IDT_PLAY_NOW_ON_DBL_CLICK, (g_accelModule->m_flags&SJ_ACCEL_PLAY_NOW_ON_DBL_CLICK)!=0); } playbackMenu->Append(0, _("Queue"), queueMenu); } } }