bool CPVRManager::ChannelSwitch(unsigned int iChannelNumber) { CSingleLock lock(m_critSection); CPVRChannelGroupPtr playingGroup = GetPlayingGroup(m_addons->IsPlayingRadio()); if (!playingGroup) { CLog::Log(LOGERROR, "PVRManager - %s - cannot get the selected group", __FUNCTION__); return false; } CFileItemPtr channel = playingGroup->GetByChannelNumber(iChannelNumber); if (!channel || !channel->HasPVRChannelInfoTag()) { CLog::Log(LOGERROR, "PVRManager - %s - cannot find channel %d", __FUNCTION__, iChannelNumber); return false; } return PerformChannelSwitch(*channel->GetPVRChannelInfoTag(), false); }
bool CPVRActionListener::OnAction(const CAction &action) { switch (action.GetID()) { case ACTION_PVR_PLAY: case ACTION_PVR_PLAY_TV: case ACTION_PVR_PLAY_RADIO: { // see if we're already playing a PVR stream and if not or the stream type // doesn't match the demanded type, start playback of according type bool isPlayingPvr(g_PVRManager.IsPlaying() && g_application.CurrentFileItem().HasPVRChannelInfoTag()); switch (action.GetID()) { case ACTION_PVR_PLAY: if (!isPlayingPvr) g_PVRManager.StartPlayback(PlaybackTypeAny); break; case ACTION_PVR_PLAY_TV: if (!isPlayingPvr || g_application.CurrentFileItem().GetPVRChannelInfoTag()->IsRadio()) g_PVRManager.StartPlayback(PlaybackTypeTv); break; case ACTION_PVR_PLAY_RADIO: if (!isPlayingPvr || !g_application.CurrentFileItem().GetPVRChannelInfoTag()->IsRadio()) g_PVRManager.StartPlayback(PlaybackTypeRadio); break; } return true; } case REMOTE_0: case REMOTE_1: case REMOTE_2: case REMOTE_3: case REMOTE_4: case REMOTE_5: case REMOTE_6: case REMOTE_7: case REMOTE_8: case REMOTE_9: { if (g_application.IsFullScreen() && g_application.CurrentFileItem().IsLiveTV()) { if(g_PVRManager.IsPlaying()) { // pvr client addon CPVRChannelPtr playingChannel(g_PVRManager.GetCurrentChannel()); if(!playingChannel) return false; if (action.GetID() == REMOTE_0) { CPVRChannelGroupPtr group = g_PVRChannelGroups->GetPreviousPlayedGroup(); if (group) { g_PVRManager.SetPlayingGroup(group); CFileItemPtr fileItem = group->GetLastPlayedChannel(playingChannel->ChannelID()); if (fileItem && fileItem->HasPVRChannelInfoTag()) { CLog::Log(LOGDEBUG, "%s - switch to channel number %d", __FUNCTION__, fileItem->GetPVRChannelInfoTag()->ChannelNumber()); CApplicationMessenger::Get().SendAction(CAction(ACTION_CHANNEL_SWITCH, (float) fileItem->GetPVRChannelInfoTag()->ChannelNumber()), WINDOW_INVALID, false); } } } else { int autoCloseTime = CSettings::Get().GetBool("pvrplayback.confirmchannelswitch") ? 0 : g_advancedSettings.m_iPVRNumericChannelSwitchTimeout; std::string strChannel = StringUtils::Format("%i", action.GetID() - REMOTE_0); if (CGUIDialogNumeric::ShowAndGetNumber(strChannel, g_localizeStrings.Get(19000), autoCloseTime) || autoCloseTime) { int iChannelNumber = atoi(strChannel.c_str()); if (iChannelNumber > 0 && iChannelNumber != playingChannel->ChannelNumber()) { CPVRChannelGroupPtr selectedGroup = g_PVRManager.GetPlayingGroup(playingChannel->IsRadio()); CFileItemPtr channel = selectedGroup->GetByChannelNumber(iChannelNumber); if (!channel || !channel->HasPVRChannelInfoTag()) return false; CApplicationMessenger::Get().SendAction(CAction(ACTION_CHANNEL_SWITCH, (float)iChannelNumber), WINDOW_INVALID, false); } } } } } return true; } break; } return false; }
bool CGUIWindowFullScreen::OnMessage(CGUIMessage& message) { switch (message.GetMessage()) { case GUI_MSG_WINDOW_INIT: { // check whether we've come back here from a window during which time we've actually // stopped playing videos if (message.GetParam1() == WINDOW_INVALID && !g_application.IsPlayingVideo()) { // why are we here if nothing is playing??? g_windowManager.PreviousWindow(); return true; } g_infoManager.SetShowInfo(false); g_infoManager.SetShowCodec(false); m_bShowCurrentTime = false; m_bGroupSelectShow = false; g_infoManager.SetDisplayAfterSeek(0); // Make sure display after seek is off. // switch resolution g_graphicsContext.SetFullScreenVideo(true); #ifdef HAS_VIDEO_PLAYBACK // make sure renderer is uptospeed g_renderManager.Update(false); #endif // now call the base class to load our windows CGUIWindow::OnMessage(message); m_bShowViewModeInfo = false; if (CUtil::IsUsingTTFSubtitles()) { CSingleLock lock (m_fontLock); CStdString fontPath = "special://xbmc/media/Fonts/"; fontPath += g_guiSettings.GetString("subtitles.font"); // We scale based on PAL4x3 - this at least ensures all sizing is constant across resolutions. RESOLUTION_INFO pal(720, 576, 0); CGUIFont *subFont = g_fontManager.LoadTTF("__subtitle__", fontPath, color[g_guiSettings.GetInt("subtitles.color")], 0, g_guiSettings.GetInt("subtitles.height"), g_guiSettings.GetInt("subtitles.style"), false, 1.0f, 1.0f, &pal, true); CGUIFont *borderFont = g_fontManager.LoadTTF("__subtitleborder__", fontPath, 0xFF000000, 0, g_guiSettings.GetInt("subtitles.height"), g_guiSettings.GetInt("subtitles.style"), true, 1.0f, 1.0f, &pal, true); if (!subFont || !borderFont) CLog::Log(LOGERROR, "CGUIWindowFullScreen::OnMessage(WINDOW_INIT) - Unable to load subtitle font"); else m_subsLayout = new CGUITextLayout(subFont, true, 0, borderFont); } else m_subsLayout = NULL; return true; } case GUI_MSG_WINDOW_DEINIT: { CGUIWindow::OnMessage(message); CGUIDialog *pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_OSD_TELETEXT); if (pDialog) pDialog->Close(true); CGUIDialogSlider *slider = (CGUIDialogSlider *)g_windowManager.GetWindow(WINDOW_DIALOG_SLIDER); if (slider) slider->Close(true); pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_VIDEO_OSD); if (pDialog) pDialog->Close(true); pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_FULLSCREEN_INFO); if (pDialog) pDialog->Close(true); pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_OSD_CHANNELS); if (pDialog) pDialog->Close(true); pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_OSD_GUIDE); if (pDialog) pDialog->Close(true); pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_OSD_DIRECTOR); if (pDialog) pDialog->Close(true); pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_OSD_CUTTER); if (pDialog) pDialog->Close(true); FreeResources(true); CSingleLock lock (g_graphicsContext); g_graphicsContext.SetFullScreenVideo(false); lock.Leave(); #ifdef HAS_VIDEO_PLAYBACK // make sure renderer is uptospeed g_renderManager.Update(false); #endif CSingleLock lockFont(m_fontLock); if (m_subsLayout) { g_fontManager.Unload("__subtitle__"); g_fontManager.Unload("__subtitleborder__"); delete m_subsLayout; m_subsLayout = NULL; } return true; } case GUI_MSG_CLICKED: { unsigned int iControl = message.GetSenderId(); if (iControl == CONTROL_GROUP_CHOOSER && g_PVRManager.IsStarted()) { // Get the currently selected label of the Select button CGUIMessage msg(GUI_MSG_ITEM_SELECTED, GetID(), iControl); OnMessage(msg); CStdString strLabel = msg.GetLabel(); CPVRChannelPtr playingChannel; if (g_PVRManager.GetCurrentChannel(playingChannel)) { CPVRChannelGroupPtr selectedGroup = g_PVRChannelGroups->Get(playingChannel->IsRadio())->GetByName(strLabel); if (selectedGroup) { g_PVRManager.SetPlayingGroup(selectedGroup); CLog::Log(LOGDEBUG, "%s - switched to group '%s'", __FUNCTION__, selectedGroup->GroupName().c_str()); if (!selectedGroup->IsGroupMember(*playingChannel)) { CLog::Log(LOGDEBUG, "%s - channel '%s' is not a member of '%s', switching to channel 1 of the new group", __FUNCTION__, playingChannel->ChannelName().c_str(), selectedGroup->GroupName().c_str()); CFileItemPtr switchChannel = selectedGroup->GetByChannelNumber(1); if (switchChannel && switchChannel->HasPVRChannelInfoTag()) OnAction(CAction(ACTION_CHANNEL_SWITCH, (float) switchChannel->GetPVRChannelInfoTag()->ChannelNumber())); else { CLog::Log(LOGERROR, "%s - cannot find channel '1' in group %s", __FUNCTION__, selectedGroup->GroupName().c_str()); CApplicationMessenger::Get().MediaStop(false); } } } else { CLog::Log(LOGERROR, "%s - could not switch to group '%s'", __FUNCTION__, selectedGroup->GroupName().c_str()); CApplicationMessenger::Get().MediaStop(false); } } else { CLog::Log(LOGERROR, "%s - cannot find the current channel", __FUNCTION__); CApplicationMessenger::Get().MediaStop(false); } // hide the control and reset focus m_bGroupSelectShow = false; SET_CONTROL_HIDDEN(CONTROL_GROUP_CHOOSER); // SET_CONTROL_FOCUS(0, 0); return true; } break; } case GUI_MSG_SETFOCUS: case GUI_MSG_LOSTFOCUS: if (message.GetSenderId() != WINDOW_FULLSCREEN_VIDEO) return true; break; } return CGUIWindow::OnMessage(message); }
bool CGUIWindowFullScreen::OnAction(const CAction &action) { if (g_application.m_pPlayer != NULL && g_application.m_pPlayer->OnAction(action)) return true; if (m_timeCodePosition > 0 && action.GetButtonCode()) { // check whether we have a mapping in our virtual videotimeseek "window" and have a select action CKey key(action.GetButtonCode()); CAction timeSeek = CButtonTranslator::GetInstance().GetAction(WINDOW_VIDEO_TIME_SEEK, key, false); if (timeSeek.GetID() == ACTION_SELECT_ITEM) { SeekToTimeCodeStamp(SEEK_ABSOLUTE); return true; } } const unsigned int MsgTime = 300; const unsigned int DisplTime = 2000; switch (action.GetID()) { case ACTION_SHOW_OSD: ToggleOSD(); return true; case ACTION_SHOW_GUI: { // switch back to the menu OutputDebugString("Switching to GUI\n"); g_windowManager.PreviousWindow(); OutputDebugString("Now in GUI\n"); return true; } break; case ACTION_PLAYER_PLAY: case ACTION_PAUSE: if (m_timeCodePosition > 0) { SeekToTimeCodeStamp(SEEK_ABSOLUTE); return true; } break; case ACTION_STEP_BACK: if (!g_application.CurrentFileItem().HasPVRChannelInfoTag()) { if (m_timeCodePosition > 0) SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_BACKWARD); else g_application.m_pPlayer->Seek(false, false); } else SeekTV(false, false); return true; case ACTION_STEP_FORWARD: if (!g_application.CurrentFileItem().HasPVRChannelInfoTag()) { if (m_timeCodePosition > 0) SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_FORWARD); else g_application.m_pPlayer->Seek(true, false); } else SeekTV(true, false); return true; case ACTION_BIG_STEP_BACK: if (!g_application.CurrentFileItem().HasPVRChannelInfoTag()) { if (m_timeCodePosition > 0) SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_BACKWARD); else g_application.m_pPlayer->Seek(false, true); } else SeekTV(false, true); return true; case ACTION_BIG_STEP_FORWARD: if (!g_application.CurrentFileItem().HasPVRChannelInfoTag()) { if (m_timeCodePosition > 0) SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_FORWARD); else g_application.m_pPlayer->Seek(true, true); } else SeekTV(true, true); return true; case ACTION_NEXT_SCENE: if (g_application.m_pPlayer->SeekScene(true)) g_infoManager.SetDisplayAfterSeek(); return true; break; case ACTION_PREV_SCENE: if (g_application.m_pPlayer->SeekScene(false)) g_infoManager.SetDisplayAfterSeek(); return true; break; case ACTION_SHOW_OSD_TIME: m_bShowCurrentTime = !m_bShowCurrentTime; if(!m_bShowCurrentTime) g_infoManager.SetDisplayAfterSeek(0); //Force display off g_infoManager.SetShowTime(m_bShowCurrentTime); return true; break; case ACTION_SHOW_SUBTITLES: { if (g_application.m_pPlayer->GetSubtitleCount() == 0) return true; g_settings.m_currentVideoSettings.m_SubtitleOn = !g_settings.m_currentVideoSettings.m_SubtitleOn; g_application.m_pPlayer->SetSubtitleVisible(g_settings.m_currentVideoSettings.m_SubtitleOn); CStdString sub, lang; if (g_settings.m_currentVideoSettings.m_SubtitleOn) { g_application.m_pPlayer->GetSubtitleName(g_application.m_pPlayer->GetSubtitle(),sub); g_application.m_pPlayer->GetSubtitleLanguage(g_application.m_pPlayer->GetSubtitle(),lang); if (sub != lang) sub.Format("%s [%s]", sub.c_str(), lang.c_str()); } else sub = g_localizeStrings.Get(1223); CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(287), sub, DisplTime, false, MsgTime); } return true; break; case ACTION_SHOW_INFO: { CGUIDialogFullScreenInfo* pDialog = (CGUIDialogFullScreenInfo*)g_windowManager.GetWindow(WINDOW_DIALOG_FULLSCREEN_INFO); if (pDialog) { CFileItem item(g_application.CurrentFileItem()); pDialog->DoModal(); return true; } break; } case ACTION_NEXT_SUBTITLE: { if (g_application.m_pPlayer->GetSubtitleCount() == 0) return true; if(g_settings.m_currentVideoSettings.m_SubtitleStream < 0) g_settings.m_currentVideoSettings.m_SubtitleStream = g_application.m_pPlayer->GetSubtitle(); if (g_settings.m_currentVideoSettings.m_SubtitleOn) { g_settings.m_currentVideoSettings.m_SubtitleStream++; if (g_settings.m_currentVideoSettings.m_SubtitleStream >= g_application.m_pPlayer->GetSubtitleCount()) { g_settings.m_currentVideoSettings.m_SubtitleStream = 0; g_settings.m_currentVideoSettings.m_SubtitleOn = false; g_application.m_pPlayer->SetSubtitleVisible(false); } g_application.m_pPlayer->SetSubtitle(g_settings.m_currentVideoSettings.m_SubtitleStream); } else { g_settings.m_currentVideoSettings.m_SubtitleOn = true; g_application.m_pPlayer->SetSubtitleVisible(true); } CStdString sub, lang; if (g_settings.m_currentVideoSettings.m_SubtitleOn) { g_application.m_pPlayer->GetSubtitleName(g_settings.m_currentVideoSettings.m_SubtitleStream,sub); g_application.m_pPlayer->GetSubtitleLanguage(g_settings.m_currentVideoSettings.m_SubtitleStream,lang); if (sub != lang) sub.Format("%s [%s]", sub.c_str(), lang.c_str()); } else sub = g_localizeStrings.Get(1223); CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(287), sub, DisplTime, false, MsgTime); } return true; break; case ACTION_SUBTITLE_DELAY_MIN: g_settings.m_currentVideoSettings.m_SubtitleDelay -= 0.1f; if (g_settings.m_currentVideoSettings.m_SubtitleDelay < -g_advancedSettings.m_videoSubsDelayRange) g_settings.m_currentVideoSettings.m_SubtitleDelay = -g_advancedSettings.m_videoSubsDelayRange; if (g_application.m_pPlayer) g_application.m_pPlayer->SetSubTitleDelay(g_settings.m_currentVideoSettings.m_SubtitleDelay); ShowSlider(action.GetID(), 22006, g_settings.m_currentVideoSettings.m_SubtitleDelay, -g_advancedSettings.m_videoSubsDelayRange, 0.1f, g_advancedSettings.m_videoSubsDelayRange); return true; break; case ACTION_SUBTITLE_DELAY_PLUS: g_settings.m_currentVideoSettings.m_SubtitleDelay += 0.1f; if (g_settings.m_currentVideoSettings.m_SubtitleDelay > g_advancedSettings.m_videoSubsDelayRange) g_settings.m_currentVideoSettings.m_SubtitleDelay = g_advancedSettings.m_videoSubsDelayRange; if (g_application.m_pPlayer) g_application.m_pPlayer->SetSubTitleDelay(g_settings.m_currentVideoSettings.m_SubtitleDelay); ShowSlider(action.GetID(), 22006, g_settings.m_currentVideoSettings.m_SubtitleDelay, -g_advancedSettings.m_videoSubsDelayRange, 0.1f, g_advancedSettings.m_videoSubsDelayRange); return true; break; case ACTION_SUBTITLE_DELAY: ShowSlider(action.GetID(), 22006, g_settings.m_currentVideoSettings.m_SubtitleDelay, -g_advancedSettings.m_videoSubsDelayRange, 0.1f, g_advancedSettings.m_videoSubsDelayRange, true); return true; break; case ACTION_AUDIO_DELAY: ShowSlider(action.GetID(), 297, g_settings.m_currentVideoSettings.m_AudioDelay, -g_advancedSettings.m_videoAudioDelayRange, 0.025f, g_advancedSettings.m_videoAudioDelayRange, true); return true; break; case ACTION_AUDIO_DELAY_MIN: g_settings.m_currentVideoSettings.m_AudioDelay -= 0.025f; if (g_settings.m_currentVideoSettings.m_AudioDelay < -g_advancedSettings.m_videoAudioDelayRange) g_settings.m_currentVideoSettings.m_AudioDelay = -g_advancedSettings.m_videoAudioDelayRange; if (g_application.m_pPlayer) g_application.m_pPlayer->SetAVDelay(g_settings.m_currentVideoSettings.m_AudioDelay); ShowSlider(action.GetID(), 297, g_settings.m_currentVideoSettings.m_AudioDelay, -g_advancedSettings.m_videoAudioDelayRange, 0.025f, g_advancedSettings.m_videoAudioDelayRange); return true; break; case ACTION_AUDIO_DELAY_PLUS: g_settings.m_currentVideoSettings.m_AudioDelay += 0.025f; if (g_settings.m_currentVideoSettings.m_AudioDelay > g_advancedSettings.m_videoAudioDelayRange) g_settings.m_currentVideoSettings.m_AudioDelay = g_advancedSettings.m_videoAudioDelayRange; if (g_application.m_pPlayer) g_application.m_pPlayer->SetAVDelay(g_settings.m_currentVideoSettings.m_AudioDelay); ShowSlider(action.GetID(), 297, g_settings.m_currentVideoSettings.m_AudioDelay, -g_advancedSettings.m_videoAudioDelayRange, 0.025f, g_advancedSettings.m_videoAudioDelayRange); return true; break; case ACTION_AUDIO_NEXT_LANGUAGE: { if (g_application.m_pPlayer->GetAudioStreamCount() == 1) return true; if(g_settings.m_currentVideoSettings.m_AudioStream < 0) g_settings.m_currentVideoSettings.m_AudioStream = g_application.m_pPlayer->GetAudioStream(); g_settings.m_currentVideoSettings.m_AudioStream++; if (g_settings.m_currentVideoSettings.m_AudioStream >= g_application.m_pPlayer->GetAudioStreamCount()) g_settings.m_currentVideoSettings.m_AudioStream = 0; g_application.m_pPlayer->SetAudioStream(g_settings.m_currentVideoSettings.m_AudioStream); // Set the audio stream to the one selected CStdString aud; g_application.m_pPlayer->GetAudioStreamName(g_settings.m_currentVideoSettings.m_AudioStream,aud); CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(460), aud, DisplTime, false, MsgTime); return true; } break; case REMOTE_0: case REMOTE_1: case REMOTE_2: case REMOTE_3: case REMOTE_4: case REMOTE_5: case REMOTE_6: case REMOTE_7: case REMOTE_8: case REMOTE_9: { if (g_application.CurrentFileItem().IsLiveTV()) { CPVRChannelPtr channel; int iChannelNumber = -1; g_PVRManager.GetCurrentChannel(channel); if (action.GetID() == REMOTE_0) { iChannelNumber = g_PVRManager.GetPreviousChannel(); if (iChannelNumber > 0) CLog::Log(LOGDEBUG, "switch to channel number %d", iChannelNumber); else CLog::Log(LOGDEBUG, "no previous channel number found"); } else { int autoCloseTime = g_guiSettings.GetBool("pvrplayback.switchautoclose") ? 1500 : 0; CStdString strChannel; strChannel.Format("%i", action.GetID() - REMOTE_0); if (CGUIDialogNumeric::ShowAndGetNumber(strChannel, g_localizeStrings.Get(19000), autoCloseTime) || autoCloseTime) iChannelNumber = atoi(strChannel.c_str()); } if (iChannelNumber > 0 && iChannelNumber != channel->ChannelNumber()) { CPVRChannelGroupPtr selectedGroup = g_PVRManager.GetPlayingGroup(channel->IsRadio()); CFileItemPtr channel = selectedGroup->GetByChannelNumber(iChannelNumber); if (!channel || !channel->HasPVRChannelInfoTag()) return false; OnAction(CAction(ACTION_CHANNEL_SWITCH, (float)iChannelNumber)); } } else { ChangetheTimeCode(action.GetID()); } return true; } break; case ACTION_ASPECT_RATIO: { // toggle the aspect ratio mode (only if the info is onscreen) if (m_bShowViewModeInfo) { #ifdef HAS_VIDEO_PLAYBACK g_renderManager.SetViewMode(++g_settings.m_currentVideoSettings.m_ViewMode); #endif } m_bShowViewModeInfo = true; m_dwShowViewModeTimeout = XbmcThreads::SystemClockMillis(); } return true; break; case ACTION_SMALL_STEP_BACK: if (m_timeCodePosition > 0) SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_BACKWARD); else { int orgpos = (int)g_application.GetTime(); int jumpsize = g_advancedSettings.m_videoSmallStepBackSeconds; // secs int setpos = (orgpos > jumpsize) ? orgpos - jumpsize : 0; g_application.SeekTime((double)setpos); } return true; break; case ACTION_SHOW_PLAYLIST: { CFileItem item(g_application.CurrentFileItem()); if (item.HasPVRChannelInfoTag()) g_windowManager.ActivateWindow(WINDOW_DIALOG_PVR_OSD_CHANNELS); else if (item.HasVideoInfoTag()) g_windowManager.ActivateWindow(WINDOW_VIDEO_PLAYLIST); else if (item.HasMusicInfoTag()) g_windowManager.ActivateWindow(WINDOW_MUSIC_PLAYLIST); } return true; break; case ACTION_ZOOM_IN: { g_settings.m_currentVideoSettings.m_CustomZoomAmount += 0.01f; if (g_settings.m_currentVideoSettings.m_CustomZoomAmount > 2.f) g_settings.m_currentVideoSettings.m_CustomZoomAmount = 2.f; g_settings.m_currentVideoSettings.m_ViewMode = VIEW_MODE_CUSTOM; g_renderManager.SetViewMode(VIEW_MODE_CUSTOM); ShowSlider(action.GetID(), 216, g_settings.m_currentVideoSettings.m_CustomZoomAmount, 0.5f, 0.1f, 2.0f); } return true; break; case ACTION_ZOOM_OUT: { g_settings.m_currentVideoSettings.m_CustomZoomAmount -= 0.01f; if (g_settings.m_currentVideoSettings.m_CustomZoomAmount < 0.5f) g_settings.m_currentVideoSettings.m_CustomZoomAmount = 0.5f; g_settings.m_currentVideoSettings.m_ViewMode = VIEW_MODE_CUSTOM; g_renderManager.SetViewMode(VIEW_MODE_CUSTOM); ShowSlider(action.GetID(), 216, g_settings.m_currentVideoSettings.m_CustomZoomAmount, 0.5f, 0.1f, 2.0f); } return true; break; case ACTION_INCREASE_PAR: { g_settings.m_currentVideoSettings.m_CustomPixelRatio += 0.01f; if (g_settings.m_currentVideoSettings.m_CustomPixelRatio > 2.f) g_settings.m_currentVideoSettings.m_CustomZoomAmount = 2.f; g_settings.m_currentVideoSettings.m_ViewMode = VIEW_MODE_CUSTOM; g_renderManager.SetViewMode(VIEW_MODE_CUSTOM); ShowSlider(action.GetID(), 217, g_settings.m_currentVideoSettings.m_CustomPixelRatio, 0.5f, 0.1f, 2.0f); } return true; break; case ACTION_DECREASE_PAR: { g_settings.m_currentVideoSettings.m_CustomPixelRatio -= 0.01f; if (g_settings.m_currentVideoSettings.m_CustomZoomAmount < 0.5f) g_settings.m_currentVideoSettings.m_CustomPixelRatio = 0.5f; g_settings.m_currentVideoSettings.m_ViewMode = VIEW_MODE_CUSTOM; g_renderManager.SetViewMode(VIEW_MODE_CUSTOM); ShowSlider(action.GetID(), 217, g_settings.m_currentVideoSettings.m_CustomPixelRatio, 0.5f, 0.1f, 2.0f); } return true; break; case ACTION_VSHIFT_UP: { g_settings.m_currentVideoSettings.m_CustomVerticalShift -= 0.01f; if (g_settings.m_currentVideoSettings.m_CustomVerticalShift < -2.0f) g_settings.m_currentVideoSettings.m_CustomVerticalShift = -2.0f; g_settings.m_currentVideoSettings.m_ViewMode = VIEW_MODE_CUSTOM; g_renderManager.SetViewMode(VIEW_MODE_CUSTOM); ShowSlider(action.GetID(), 225, g_settings.m_currentVideoSettings.m_CustomVerticalShift, -2.0f, 0.1f, 2.0f); } return true; break; case ACTION_VSHIFT_DOWN: { g_settings.m_currentVideoSettings.m_CustomVerticalShift += 0.01f; if (g_settings.m_currentVideoSettings.m_CustomVerticalShift > 2.0f) g_settings.m_currentVideoSettings.m_CustomVerticalShift = 2.0f; g_settings.m_currentVideoSettings.m_ViewMode = VIEW_MODE_CUSTOM; g_renderManager.SetViewMode(VIEW_MODE_CUSTOM); ShowSlider(action.GetID(), 225, g_settings.m_currentVideoSettings.m_CustomVerticalShift, -2.0f, 0.1f, 2.0f); } return true; break; case ACTION_SUBTITLE_VSHIFT_UP: { RESOLUTION_INFO& res_info = g_settings.m_ResInfo[g_graphicsContext.GetVideoResolution()]; int subalign = g_guiSettings.GetInt("subtitles.align"); if ((subalign == SUBTITLE_ALIGN_BOTTOM_OUTSIDE) || (subalign == SUBTITLE_ALIGN_TOP_INSIDE)) { res_info.iSubtitles ++; if (res_info.iSubtitles >= res_info.iHeight) res_info.iSubtitles = res_info.iHeight - 1; ShowSlider(action.GetID(), 274, (float) res_info.iHeight - res_info.iSubtitles, 0.0f, 1.0f, (float) res_info.iHeight); } else { res_info.iSubtitles --; if (res_info.iSubtitles < 0) res_info.iSubtitles = 0; if (subalign == SUBTITLE_ALIGN_MANUAL) ShowSlider(action.GetID(), 274, (float) res_info.iSubtitles, 0.0f, 1.0f, (float) res_info.iHeight); else ShowSlider(action.GetID(), 274, (float) res_info.iSubtitles - res_info.iHeight, (float) -res_info.iHeight, -1.0f, 0.0f); } break; } case ACTION_SUBTITLE_VSHIFT_DOWN: { RESOLUTION_INFO& res_info = g_settings.m_ResInfo[g_graphicsContext.GetVideoResolution()]; int subalign = g_guiSettings.GetInt("subtitles.align"); if ((subalign == SUBTITLE_ALIGN_BOTTOM_OUTSIDE) || (subalign == SUBTITLE_ALIGN_TOP_INSIDE)) { res_info.iSubtitles--; if (res_info.iSubtitles < 0) res_info.iSubtitles = 0; ShowSlider(action.GetID(), 274, (float) res_info.iHeight - res_info.iSubtitles, 0.0f, 1.0f, (float) res_info.iHeight); } else { res_info.iSubtitles++; if (res_info.iSubtitles >= res_info.iHeight) res_info.iSubtitles = res_info.iHeight - 1; if (subalign == SUBTITLE_ALIGN_MANUAL) ShowSlider(action.GetID(), 274, (float) res_info.iSubtitles, 0.0f, 1.0f, (float) res_info.iHeight); else ShowSlider(action.GetID(), 274, (float) res_info.iSubtitles - res_info.iHeight, (float) -res_info.iHeight, -1.0f, 0.0f); } break; } case ACTION_SUBTITLE_ALIGN: { RESOLUTION_INFO& res_info = g_settings.m_ResInfo[g_graphicsContext.GetVideoResolution()]; int subalign = g_guiSettings.GetInt("subtitles.align"); subalign++; if (subalign > SUBTITLE_ALIGN_TOP_OUTSIDE) subalign = SUBTITLE_ALIGN_MANUAL; res_info.iSubtitles = res_info.iHeight - 1; g_guiSettings.SetInt("subtitles.align", subalign); CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(21460), g_localizeStrings.Get(21461 + subalign), TOAST_DISPLAY_TIME, false); break; } case ACTION_VOLAMP_UP: case ACTION_VOLAMP_DOWN: { float sliderMax = VOLUME_DRC_MAXIMUM / 100.0f; float sliderMin = VOLUME_DRC_MINIMUM / 100.0f; if (action.GetID() == ACTION_VOLAMP_UP) g_settings.m_currentVideoSettings.m_VolumeAmplification += 1.0f; else g_settings.m_currentVideoSettings.m_VolumeAmplification -= 1.0f; g_settings.m_currentVideoSettings.m_VolumeAmplification = std::max(std::min(g_settings.m_currentVideoSettings.m_VolumeAmplification, sliderMax), sliderMin); if (g_application.m_pPlayer) g_application.m_pPlayer->SetDynamicRangeCompression((long)(g_settings.m_currentVideoSettings.m_VolumeAmplification * 100)); ShowSlider(action.GetID(), 660, g_settings.m_currentVideoSettings.m_VolumeAmplification, sliderMin, 1.0f, sliderMax); break; } default: break; } return CGUIWindow::OnAction(action); }
bool CGUIWindowFullScreen::OnAction(const CAction &action) { if (g_application.m_pPlayer != NULL && g_application.m_pPlayer->OnAction(action)) return true; if (m_timeCodePosition > 0 && action.GetButtonCode()) { // check whether we have a mapping in our virtual videotimeseek "window" and have a select action CKey key(action.GetButtonCode()); CAction timeSeek = CButtonTranslator::GetInstance().GetAction(WINDOW_VIDEO_TIME_SEEK, key, false); if (timeSeek.GetID() == ACTION_SELECT_ITEM) { SeekToTimeCodeStamp(SEEK_ABSOLUTE); return true; } } switch (action.GetID()) { case ACTION_SHOW_OSD: ToggleOSD(); return true; case ACTION_SHOW_GUI: { // switch back to the menu OutputDebugString("Switching to GUI\n"); g_windowManager.PreviousWindow(); OutputDebugString("Now in GUI\n"); return true; } break; case ACTION_PLAYER_PLAY: case ACTION_PAUSE: if (m_timeCodePosition > 0) { SeekToTimeCodeStamp(SEEK_ABSOLUTE); return true; } break; case ACTION_STEP_BACK: if (m_timeCodePosition > 0) SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_BACKWARD); else g_application.m_pPlayer->Seek(false, false); return true; case ACTION_STEP_FORWARD: if (m_timeCodePosition > 0) SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_FORWARD); else g_application.m_pPlayer->Seek(true, false); return true; case ACTION_BIG_STEP_BACK: if (m_timeCodePosition > 0) SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_BACKWARD); else g_application.m_pPlayer->Seek(false, true); return true; case ACTION_BIG_STEP_FORWARD: if (m_timeCodePosition > 0) SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_FORWARD); else g_application.m_pPlayer->Seek(true, true); return true; case ACTION_NEXT_SCENE: if (g_application.m_pPlayer->SeekScene(true)) g_infoManager.SetDisplayAfterSeek(); return true; break; case ACTION_PREV_SCENE: if (g_application.m_pPlayer->SeekScene(false)) g_infoManager.SetDisplayAfterSeek(); return true; break; case ACTION_SHOW_OSD_TIME: m_bShowCurrentTime = !m_bShowCurrentTime; if(!m_bShowCurrentTime) g_infoManager.SetDisplayAfterSeek(0); //Force display off g_infoManager.SetShowTime(m_bShowCurrentTime); return true; break; case ACTION_SHOW_INFO: { CGUIDialogFullScreenInfo* pDialog = (CGUIDialogFullScreenInfo*)g_windowManager.GetWindow(WINDOW_DIALOG_FULLSCREEN_INFO); if (pDialog) { CFileItem item(g_application.CurrentFileItem()); pDialog->DoModal(); return true; } break; } case REMOTE_0: case REMOTE_1: case REMOTE_2: case REMOTE_3: case REMOTE_4: case REMOTE_5: case REMOTE_6: case REMOTE_7: case REMOTE_8: case REMOTE_9: { if (g_application.CurrentFileItem().IsLiveTV()) { CPVRChannelPtr channel; int iChannelNumber = -1; g_PVRManager.GetCurrentChannel(channel); if (action.GetID() == REMOTE_0) { iChannelNumber = g_PVRManager.GetPreviousChannel(); if (iChannelNumber > 0) CLog::Log(LOGDEBUG, "switch to channel number %d", iChannelNumber); else CLog::Log(LOGDEBUG, "no previous channel number found"); } else { int autoCloseTime = CSettings::Get().GetBool("pvrplayback.confirmchannelswitch") ? 0 : g_advancedSettings.m_iPVRNumericChannelSwitchTimeout; CStdString strChannel; strChannel.Format("%i", action.GetID() - REMOTE_0); if (CGUIDialogNumeric::ShowAndGetNumber(strChannel, g_localizeStrings.Get(19000), autoCloseTime) || autoCloseTime) iChannelNumber = atoi(strChannel.c_str()); } if (iChannelNumber > 0 && iChannelNumber != channel->ChannelNumber()) { CPVRChannelGroupPtr selectedGroup = g_PVRManager.GetPlayingGroup(channel->IsRadio()); CFileItemPtr channel = selectedGroup->GetByChannelNumber(iChannelNumber); if (!channel || !channel->HasPVRChannelInfoTag()) return false; OnAction(CAction(ACTION_CHANNEL_SWITCH, (float)iChannelNumber)); } } else { ChangetheTimeCode(action.GetID()); } return true; } break; case ACTION_ASPECT_RATIO: { // toggle the aspect ratio mode (only if the info is onscreen) if (m_bShowViewModeInfo) { #ifdef HAS_VIDEO_PLAYBACK g_renderManager.SetViewMode(++CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode); #endif } m_bShowViewModeInfo = true; m_dwShowViewModeTimeout = XbmcThreads::SystemClockMillis(); } return true; break; case ACTION_SMALL_STEP_BACK: if (m_timeCodePosition > 0) SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_BACKWARD); else { int orgpos = (int)g_application.GetTime(); int jumpsize = g_advancedSettings.m_videoSmallStepBackSeconds; // secs int setpos = (orgpos > jumpsize) ? orgpos - jumpsize : 0; g_application.SeekTime((double)setpos); } return true; break; case ACTION_SHOW_PLAYLIST: { CFileItem item(g_application.CurrentFileItem()); if (item.HasPVRChannelInfoTag()) g_windowManager.ActivateWindow(WINDOW_DIALOG_PVR_OSD_CHANNELS); else if (item.HasVideoInfoTag()) g_windowManager.ActivateWindow(WINDOW_VIDEO_PLAYLIST); else if (item.HasMusicInfoTag()) g_windowManager.ActivateWindow(WINDOW_MUSIC_PLAYLIST); } return true; break; case ACTION_PREVIOUS_CHANNELGROUP: { if (g_application.CurrentFileItem().HasPVRChannelInfoTag()) ChangetheTVGroup(false); return true; } case ACTION_NEXT_CHANNELGROUP: { if (g_application.CurrentFileItem().HasPVRChannelInfoTag()) ChangetheTVGroup(true); return true; } default: break; } return CGUIWindow::OnAction(action); }
bool CGUIWindowFullScreen::OnMessage(CGUIMessage& message) { switch (message.GetMessage()) { case GUI_MSG_WINDOW_INIT: { // check whether we've come back here from a window during which time we've actually // stopped playing videos if (message.GetParam1() == WINDOW_INVALID && !g_application.m_pPlayer->IsPlayingVideo()) { // why are we here if nothing is playing??? g_windowManager.PreviousWindow(); return true; } g_infoManager.SetShowInfo(false); g_infoManager.SetShowCodec(false); m_bShowCurrentTime = false; m_bGroupSelectShow = false; g_infoManager.SetDisplayAfterSeek(0); // Make sure display after seek is off. // switch resolution g_graphicsContext.SetFullScreenVideo(true); #ifdef HAS_VIDEO_PLAYBACK // make sure renderer is uptospeed g_renderManager.Update(); #endif // now call the base class to load our windows CGUIWindow::OnMessage(message); m_bShowViewModeInfo = false; return true; } case GUI_MSG_WINDOW_DEINIT: { CGUIDialog *pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_OSD_TELETEXT); if (pDialog) pDialog->Close(true); pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_SLIDER); if (pDialog) pDialog->Close(true); pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_VIDEO_OSD); if (pDialog) pDialog->Close(true); pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_FULLSCREEN_INFO); if (pDialog) pDialog->Close(true); pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_OSD_CHANNELS); if (pDialog) pDialog->Close(true); pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_OSD_GUIDE); if (pDialog) pDialog->Close(true); pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_OSD_DIRECTOR); if (pDialog) pDialog->Close(true); pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_OSD_CUTTER); if (pDialog) pDialog->Close(true); pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_SUBTITLES); if (pDialog) pDialog->Close(true); CGUIWindow::OnMessage(message); CSettings::Get().Save(); CSingleLock lock (g_graphicsContext); g_graphicsContext.SetFullScreenVideo(false); lock.Leave(); #ifdef HAS_VIDEO_PLAYBACK // make sure renderer is uptospeed g_renderManager.Update(); #endif return true; } case GUI_MSG_CLICKED: { unsigned int iControl = message.GetSenderId(); if (iControl == CONTROL_GROUP_CHOOSER && g_PVRManager.IsStarted()) { // Get the currently selected label of the Select button CGUIMessage msg(GUI_MSG_ITEM_SELECTED, GetID(), iControl); OnMessage(msg); CStdString strLabel = msg.GetLabel(); CPVRChannelPtr playingChannel; if (g_PVRManager.GetCurrentChannel(playingChannel)) { CPVRChannelGroupPtr selectedGroup = g_PVRChannelGroups->Get(playingChannel->IsRadio())->GetByName(strLabel); if (selectedGroup) { g_PVRManager.SetPlayingGroup(selectedGroup); CLog::Log(LOGDEBUG, "%s - switched to group '%s'", __FUNCTION__, selectedGroup->GroupName().c_str()); if (!selectedGroup->IsGroupMember(*playingChannel)) { CLog::Log(LOGDEBUG, "%s - channel '%s' is not a member of '%s', switching to channel 1 of the new group", __FUNCTION__, playingChannel->ChannelName().c_str(), selectedGroup->GroupName().c_str()); CFileItemPtr switchChannel = selectedGroup->GetByChannelNumber(1); if (switchChannel && switchChannel->HasPVRChannelInfoTag()) g_application.OnAction(CAction(ACTION_CHANNEL_SWITCH, (float) switchChannel->GetPVRChannelInfoTag()->ChannelNumber())); else { CLog::Log(LOGERROR, "%s - cannot find channel '1' in group %s", __FUNCTION__, selectedGroup->GroupName().c_str()); CApplicationMessenger::Get().MediaStop(false); } } } else { CLog::Log(LOGERROR, "%s - could not switch to group '%s'", __FUNCTION__, selectedGroup->GroupName().c_str()); CApplicationMessenger::Get().MediaStop(false); } } else { CLog::Log(LOGERROR, "%s - cannot find the current channel", __FUNCTION__); CApplicationMessenger::Get().MediaStop(false); } // hide the control and reset focus m_bGroupSelectShow = false; SET_CONTROL_HIDDEN(CONTROL_GROUP_CHOOSER); // SET_CONTROL_FOCUS(0, 0); return true; } break; } case GUI_MSG_SETFOCUS: case GUI_MSG_LOSTFOCUS: if (message.GetSenderId() != WINDOW_FULLSCREEN_VIDEO) return true; break; } return CGUIWindow::OnMessage(message); }
bool CPVRActionListener::OnAction(const CAction &action) { switch (action.GetID()) { case ACTION_PVR_PLAY: case ACTION_PVR_PLAY_TV: case ACTION_PVR_PLAY_RADIO: { // see if we're already playing a PVR stream and if not or the stream type // doesn't match the demanded type, start playback of according type bool isPlayingPvr(g_PVRManager.IsPlaying() && g_application.CurrentFileItem().HasPVRChannelInfoTag()); switch (action.GetID()) { case ACTION_PVR_PLAY: if (!isPlayingPvr) g_PVRManager.StartPlayback(PlaybackTypeAny); break; case ACTION_PVR_PLAY_TV: if (!isPlayingPvr || g_application.CurrentFileItem().GetPVRChannelInfoTag()->IsRadio()) g_PVRManager.StartPlayback(PlaybackTypeTv); break; case ACTION_PVR_PLAY_RADIO: if (!isPlayingPvr || !g_application.CurrentFileItem().GetPVRChannelInfoTag()->IsRadio()) g_PVRManager.StartPlayback(PlaybackTypeRadio); break; } return true; } case REMOTE_0: case REMOTE_1: case REMOTE_2: case REMOTE_3: case REMOTE_4: case REMOTE_5: case REMOTE_6: case REMOTE_7: case REMOTE_8: case REMOTE_9: { if (g_application.CurrentFileItem().IsLiveTV() && (g_windowManager.IsWindowActive(WINDOW_FULLSCREEN_VIDEO) || g_windowManager.IsWindowActive(WINDOW_VISUALISATION))) { // do not consume action if a python modal is the top most dialog // as a python modal can't return that it consumed the action. if (g_windowManager.IsPythonWindow(g_windowManager.GetTopMostModalDialogID())) return false; if(g_PVRManager.IsPlaying()) { // pvr client addon CPVRChannelPtr playingChannel(g_PVRManager.GetCurrentChannel()); if(!playingChannel) return false; if (action.GetID() == REMOTE_0) { CPVRChannelGroupPtr group = g_PVRChannelGroups->GetPreviousPlayedGroup(); if (group) { g_PVRManager.SetPlayingGroup(group); CFileItemPtr fileItem = group->GetLastPlayedChannel(playingChannel->ChannelID()); if (fileItem && fileItem->HasPVRChannelInfoTag()) { CLog::Log(LOGDEBUG, "%s - switch to channel number %d", __FUNCTION__, fileItem->GetPVRChannelInfoTag()->ChannelNumber()); CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1,static_cast<void*>( new CAction(ACTION_CHANNEL_SWITCH, static_cast<float>(fileItem->GetPVRChannelInfoTag()->ChannelNumber())))); } } } else { int autoCloseTime = CServiceBroker::GetSettings().GetBool(CSettings::SETTING_PVRPLAYBACK_CONFIRMCHANNELSWITCH) ? 0 : g_advancedSettings.m_iPVRNumericChannelSwitchTimeout; std::string strChannel = StringUtils::Format("%i", action.GetID() - REMOTE_0); if (CGUIDialogNumeric::ShowAndGetNumber(strChannel, g_localizeStrings.Get(19000), autoCloseTime) || autoCloseTime) { int iChannelNumber = atoi(strChannel.c_str()); if (iChannelNumber > 0 && iChannelNumber != playingChannel->ChannelNumber()) { CPVRChannelGroupPtr selectedGroup = g_PVRManager.GetPlayingGroup(playingChannel->IsRadio()); CFileItemPtr channel = selectedGroup->GetByChannelNumber(iChannelNumber); if (!channel || !channel->HasPVRChannelInfoTag()) return false; CApplicationMessenger::GetInstance().PostMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast<void*>( new CAction(ACTION_CHANNEL_SWITCH, static_cast<float>(iChannelNumber)))); } } } } } return true; } break; } return false; }