Ejemplo n.º 1
0
/** \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);
}
Ejemplo n.º 2
0
/** \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);
}
Ejemplo n.º 3
0
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);
}
Ejemplo n.º 4
0
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);
		}
	}

}