summaryrefslogtreecommitdiffstats
path: root/xbmc/application/ApplicationPlayer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/application/ApplicationPlayer.cpp')
-rw-r--r--xbmc/application/ApplicationPlayer.cpp1061
1 files changed, 1061 insertions, 0 deletions
diff --git a/xbmc/application/ApplicationPlayer.cpp b/xbmc/application/ApplicationPlayer.cpp
new file mode 100644
index 0000000..ef571a6
--- /dev/null
+++ b/xbmc/application/ApplicationPlayer.cpp
@@ -0,0 +1,1061 @@
+/*
+ * Copyright (C) 2005-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#include "ApplicationPlayer.h"
+
+#include "ServiceBroker.h"
+#include "cores/DataCacheCore.h"
+#include "cores/IPlayer.h"
+#include "cores/VideoPlayer/VideoPlayer.h"
+#include "cores/playercorefactory/PlayerCoreFactory.h"
+#include "guilib/GUIComponent.h"
+#include "guilib/GUIWindowManager.h"
+#include "settings/AdvancedSettings.h"
+#include "settings/SettingsComponent.h"
+
+#include <mutex>
+
+using namespace std::chrono_literals;
+
+std::shared_ptr<const IPlayer> CApplicationPlayer::GetInternal() const
+{
+ std::unique_lock<CCriticalSection> lock(m_playerLock);
+ return m_pPlayer;
+}
+
+std::shared_ptr<IPlayer> CApplicationPlayer::GetInternal()
+{
+ std::unique_lock<CCriticalSection> lock(m_playerLock);
+ return m_pPlayer;
+}
+
+void CApplicationPlayer::ClosePlayer()
+{
+ m_nextItem.pItem.reset();
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ {
+ CloseFile();
+ ResetPlayer();
+ }
+}
+
+void CApplicationPlayer::ResetPlayer()
+{
+ // we need to do this directly on the member
+ std::unique_lock<CCriticalSection> lock(m_playerLock);
+ m_pPlayer.reset();
+}
+
+void CApplicationPlayer::CloseFile(bool reopen)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ {
+ player->CloseFile(reopen);
+ }
+}
+
+void CApplicationPlayer::CreatePlayer(const CPlayerCoreFactory &factory, const std::string &player, IPlayerCallback& callback)
+{
+ std::unique_lock<CCriticalSection> lock(m_playerLock);
+ if (!m_pPlayer)
+ {
+ CDataCacheCore::GetInstance().Reset();
+ m_pPlayer = factory.CreatePlayer(player, callback);
+ }
+}
+
+std::string CApplicationPlayer::GetCurrentPlayer() const
+{
+ std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ {
+ return player->m_name;
+ }
+ return "";
+}
+
+bool CApplicationPlayer::OpenFile(const CFileItem& item, const CPlayerOptions& options,
+ const CPlayerCoreFactory &factory,
+ const std::string &playerName, IPlayerCallback& callback)
+{
+ // get player type
+ std::string newPlayer;
+ if (!playerName.empty())
+ newPlayer = playerName;
+ else
+ newPlayer = factory.GetDefaultPlayer(item);
+
+ // check if we need to close current player
+ // VideoPlayer can open a new file while playing
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player && player->IsPlaying())
+ {
+ bool needToClose = false;
+
+ if (item.IsDiscImage() || item.IsDVDFile())
+ needToClose = true;
+
+ if (player->m_name != newPlayer)
+ needToClose = true;
+
+ if (player->m_type != "video")
+ needToClose = true;
+
+ if (needToClose)
+ {
+ m_nextItem.pItem = std::make_shared<CFileItem>(item);
+ m_nextItem.options = options;
+ m_nextItem.playerName = newPlayer;
+ m_nextItem.callback = &callback;
+
+ CloseFile();
+ if (player->m_name != newPlayer)
+ {
+ std::unique_lock<CCriticalSection> lock(m_playerLock);
+ m_pPlayer.reset();
+ }
+ return true;
+ }
+ }
+ else if (player && player->m_name != newPlayer)
+ {
+ CloseFile();
+ {
+ std::unique_lock<CCriticalSection> lock(m_playerLock);
+ m_pPlayer.reset();
+ player.reset();
+ }
+ }
+
+ if (!player)
+ {
+ CreatePlayer(factory, newPlayer, callback);
+ player = GetInternal();
+ if (!player)
+ return false;
+ }
+
+ bool ret = player->OpenFile(item, options);
+
+ m_nextItem.pItem.reset();
+
+ // reset caching timers
+ m_audioStreamUpdate.SetExpired();
+ m_videoStreamUpdate.SetExpired();
+ m_subtitleStreamUpdate.SetExpired();
+
+ return ret;
+}
+
+void CApplicationPlayer::OpenNext(const CPlayerCoreFactory &factory)
+{
+ if (m_nextItem.pItem)
+ {
+ OpenFile(*m_nextItem.pItem, m_nextItem.options,
+ factory,
+ m_nextItem.playerName, *m_nextItem.callback);
+ m_nextItem.pItem.reset();
+ }
+}
+
+bool CApplicationPlayer::HasPlayer() const
+{
+ std::shared_ptr<const IPlayer> player = GetInternal();
+ return player != nullptr;
+}
+
+int CApplicationPlayer::GetChapter() const
+{
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ return player->GetChapter();
+ else
+ return -1;
+}
+
+int CApplicationPlayer::GetChapterCount() const
+{
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ return player->GetChapterCount();
+ else
+ return 0;
+}
+
+void CApplicationPlayer::GetChapterName(std::string& strChapterName, int chapterIdx) const
+{
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ player->GetChapterName(strChapterName, chapterIdx);
+}
+
+int64_t CApplicationPlayer::GetChapterPos(int chapterIdx) const
+{
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ return player->GetChapterPos(chapterIdx);
+
+ return -1;
+}
+
+bool CApplicationPlayer::HasAudio() const
+{
+ std::shared_ptr<const IPlayer> player = GetInternal();
+ return (player && player->HasAudio());
+}
+
+bool CApplicationPlayer::HasVideo() const
+{
+ std::shared_ptr<const IPlayer> player = GetInternal();
+ return (player && player->HasVideo());
+}
+
+bool CApplicationPlayer::HasGame() const
+{
+ std::shared_ptr<const IPlayer> player = GetInternal();
+ return (player && player->HasGame());
+}
+
+PLAYLIST::Id CApplicationPlayer::GetPreferredPlaylist() const
+{
+ if (IsPlayingVideo())
+ return PLAYLIST::TYPE_VIDEO;
+
+ if (IsPlayingAudio())
+ return PLAYLIST::TYPE_MUSIC;
+
+ return PLAYLIST::TYPE_NONE;
+}
+
+bool CApplicationPlayer::HasRDS() const
+{
+ std::shared_ptr<const IPlayer> player = GetInternal();
+ return (player && player->HasRDS());
+}
+
+bool CApplicationPlayer::IsPaused() const
+{
+ return (GetPlaySpeed() == 0);
+}
+
+bool CApplicationPlayer::IsPlaying() const
+{
+ std::shared_ptr<const IPlayer> player = GetInternal();
+ return (player && player->IsPlaying());
+}
+
+bool CApplicationPlayer::IsPausedPlayback() const
+{
+ return (IsPlaying() && (GetPlaySpeed() == 0));
+}
+
+bool CApplicationPlayer::IsPlayingAudio() const
+{
+ return (IsPlaying() && !HasVideo() && HasAudio());
+}
+
+bool CApplicationPlayer::IsPlayingVideo() const
+{
+ return (IsPlaying() && HasVideo());
+}
+
+bool CApplicationPlayer::IsPlayingGame() const
+{
+ return (IsPlaying() && HasGame());
+}
+
+bool CApplicationPlayer::IsPlayingRDS() const
+{
+ return (IsPlaying() && HasRDS());
+}
+
+void CApplicationPlayer::Pause()
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ {
+ player->Pause();
+ }
+}
+
+void CApplicationPlayer::SetMute(bool bOnOff)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ player->SetMute(bOnOff);
+}
+
+void CApplicationPlayer::SetVolume(float volume)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ player->SetVolume(volume);
+}
+
+void CApplicationPlayer::Seek(bool bPlus, bool bLargeStep, bool bChapterOverride)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ player->Seek(bPlus, bLargeStep, bChapterOverride);
+}
+
+void CApplicationPlayer::SeekPercentage(float fPercent)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ player->SeekPercentage(fPercent);
+}
+
+bool CApplicationPlayer::IsPassthrough() const
+{
+ std::shared_ptr<const IPlayer> player = GetInternal();
+ return (player && player->IsPassthrough());
+}
+
+bool CApplicationPlayer::CanSeek() const
+{
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ return (player && player->CanSeek());
+}
+
+bool CApplicationPlayer::SeekScene(bool bPlus)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ return (player && player->SeekScene(bPlus));
+}
+
+void CApplicationPlayer::SeekTime(int64_t iTime)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ player->SeekTime(iTime);
+}
+
+void CApplicationPlayer::SeekTimeRelative(int64_t iTime)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ {
+ // use relative seeking if implemented by player
+ if (!player->SeekTimeRelative(iTime))
+ {
+ int64_t abstime = GetTime() + iTime;
+ player->SeekTime(abstime);
+ }
+ }
+}
+
+int64_t CApplicationPlayer::GetTime() const
+{
+ std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ return CDataCacheCore::GetInstance().GetPlayTime();
+ else
+ return 0;
+}
+
+int64_t CApplicationPlayer::GetMinTime() const
+{
+ std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ return CDataCacheCore::GetInstance().GetMinTime();
+ else
+ return 0;
+}
+
+int64_t CApplicationPlayer::GetMaxTime() const
+{
+ std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ return CDataCacheCore::GetInstance().GetMaxTime();
+ else
+ return 0;
+}
+
+time_t CApplicationPlayer::GetStartTime() const
+{
+ std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ return CDataCacheCore::GetInstance().GetStartTime();
+ else
+ return 0;
+}
+
+int64_t CApplicationPlayer::GetTotalTime() const
+{
+ std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ {
+ int64_t total = CDataCacheCore::GetInstance().GetMaxTime() - CDataCacheCore::GetInstance().GetMinTime();
+ return total;
+ }
+ else
+ return 0;
+}
+
+bool CApplicationPlayer::IsCaching() const
+{
+ std::shared_ptr<const IPlayer> player = GetInternal();
+ return (player && player->IsCaching());
+}
+
+bool CApplicationPlayer::IsInMenu() const
+{
+ std::shared_ptr<const IPlayer> player = GetInternal();
+ return (player && player->IsInMenu());
+}
+
+MenuType CApplicationPlayer::GetSupportedMenuType() const
+{
+ std::shared_ptr<const IPlayer> player = GetInternal();
+ if (!player)
+ {
+ return MenuType::NONE;
+ }
+ return player->GetSupportedMenuType();
+}
+
+int CApplicationPlayer::GetCacheLevel() const
+{
+ std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ return player->GetCacheLevel();
+ else
+ return 0;
+}
+
+int CApplicationPlayer::GetSubtitleCount() const
+{
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ return player->GetSubtitleCount();
+ else
+ return 0;
+}
+
+int CApplicationPlayer::GetAudioStream()
+{
+ if (!m_audioStreamUpdate.IsTimePast())
+ return m_iAudioStream;
+
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ {
+ m_iAudioStream = player->GetAudioStream();
+ m_audioStreamUpdate.Set(1000ms);
+ return m_iAudioStream;
+ }
+ else
+ return 0;
+}
+
+int CApplicationPlayer::GetSubtitle()
+{
+ if (!m_subtitleStreamUpdate.IsTimePast())
+ return m_iSubtitleStream;
+
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ {
+ m_iSubtitleStream = player->GetSubtitle();
+ m_subtitleStreamUpdate.Set(1000ms);
+ return m_iSubtitleStream;
+ }
+ else
+ return 0;
+}
+
+bool CApplicationPlayer::GetSubtitleVisible() const
+{
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ return player && player->GetSubtitleVisible();
+}
+
+bool CApplicationPlayer::CanPause() const
+{
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ return (player && player->CanPause());
+}
+
+bool CApplicationPlayer::HasTeletextCache() const
+{
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ return player->HasTeletextCache();
+ else
+ return false;
+}
+
+std::shared_ptr<TextCacheStruct_t> CApplicationPlayer::GetTeletextCache()
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ return player->GetTeletextCache();
+ else
+ return {};
+}
+
+float CApplicationPlayer::GetPercentage() const
+{
+ std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ {
+ float fPercent = CDataCacheCore::GetInstance().GetPlayPercentage();
+ return std::max(0.0f, std::min(fPercent, 100.0f));
+ }
+ else
+ return 0.0;
+}
+
+float CApplicationPlayer::GetCachePercentage() const
+{
+ std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ return player->GetCachePercentage();
+ else
+ return 0.0;
+}
+
+void CApplicationPlayer::SetSpeed(float speed)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ player->SetSpeed(speed);
+}
+
+void CApplicationPlayer::SetTempo(float tempo)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ player->SetTempo(tempo);
+}
+
+void CApplicationPlayer::FrameAdvance(int frames)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ player->FrameAdvance(frames);
+}
+
+void CApplicationPlayer::DoAudioWork()
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ player->DoAudioWork();
+}
+
+std::string CApplicationPlayer::GetPlayerState()
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ return player->GetPlayerState();
+ else
+ return "";
+}
+
+bool CApplicationPlayer::QueueNextFile(const CFileItem &file)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ return (player && player->QueueNextFile(file));
+}
+
+bool CApplicationPlayer::SetPlayerState(const std::string& state)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ return (player && player->SetPlayerState(state));
+}
+
+void CApplicationPlayer::OnNothingToQueueNotify()
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ player->OnNothingToQueueNotify();
+}
+
+void CApplicationPlayer::GetVideoStreamInfo(int streamId, VideoStreamInfo& info) const
+{
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ player->GetVideoStreamInfo(streamId, info);
+}
+
+void CApplicationPlayer::GetAudioStreamInfo(int index, AudioStreamInfo& info) const
+{
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ player->GetAudioStreamInfo(index, info);
+}
+
+int CApplicationPlayer::GetPrograms(std::vector<ProgramInfo> &programs)
+{
+ int ret = 0;
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ ret = player->GetPrograms(programs);
+ return ret;
+}
+
+void CApplicationPlayer::SetProgram(int progId)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ player->SetProgram(progId);
+}
+
+int CApplicationPlayer::GetProgramsCount() const
+{
+ int ret = 0;
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ ret = player->GetProgramsCount();
+ return ret;
+}
+
+bool CApplicationPlayer::OnAction(const CAction &action)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ return (player && player->OnAction(action));
+}
+
+int CApplicationPlayer::GetAudioStreamCount() const
+{
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ return player->GetAudioStreamCount();
+ else
+ return 0;
+}
+
+int CApplicationPlayer::GetVideoStream()
+{
+ if (!m_videoStreamUpdate.IsTimePast())
+ return m_iVideoStream;
+
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ {
+ m_iVideoStream = player->GetVideoStream();
+ m_videoStreamUpdate.Set(1000ms);
+ return m_iVideoStream;
+ }
+ else
+ return 0;
+}
+
+int CApplicationPlayer::GetVideoStreamCount() const
+{
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ return player->GetVideoStreamCount();
+ else
+ return 0;
+}
+
+void CApplicationPlayer::SetAudioStream(int iStream)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ {
+ player->SetAudioStream(iStream);
+ m_iAudioStream = iStream;
+ m_audioStreamUpdate.Set(1000ms);
+ }
+}
+
+void CApplicationPlayer::GetSubtitleStreamInfo(int index, SubtitleStreamInfo& info) const
+{
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ player->GetSubtitleStreamInfo(index, info);
+}
+
+void CApplicationPlayer::SetSubtitle(int iStream)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ {
+ player->SetSubtitle(iStream);
+ m_iSubtitleStream = iStream;
+ m_subtitleStreamUpdate.Set(1000ms);
+ }
+}
+
+void CApplicationPlayer::SetSubtitleVisible(bool bVisible)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ {
+ player->SetSubtitleVisible(bVisible);
+ }
+}
+
+void CApplicationPlayer::SetSubtitleVerticalPosition(int value, bool save)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ {
+ player->SetSubtitleVerticalPosition(value, save);
+ }
+}
+
+void CApplicationPlayer::SetTime(int64_t time)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ return player->SetTime(time);
+}
+
+void CApplicationPlayer::SetTotalTime(int64_t time)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ player->SetTotalTime(time);
+}
+
+void CApplicationPlayer::SetVideoStream(int iStream)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ {
+ player->SetVideoStream(iStream);
+ m_iVideoStream = iStream;
+ m_videoStreamUpdate.Set(1000ms);
+ }
+}
+
+void CApplicationPlayer::AddSubtitle(const std::string& strSubPath)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ player->AddSubtitle(strSubPath);
+}
+
+void CApplicationPlayer::SetSubTitleDelay(float fValue)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ player->SetSubTitleDelay(fValue);
+}
+
+void CApplicationPlayer::SetAVDelay(float fValue)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ player->SetAVDelay(fValue);
+}
+
+void CApplicationPlayer::SetDynamicRangeCompression(long drc)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ player->SetDynamicRangeCompression(drc);
+}
+
+void CApplicationPlayer::LoadPage(int p, int sp, unsigned char* buffer)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ player->LoadPage(p, sp, buffer);
+}
+
+void CApplicationPlayer::GetAudioCapabilities(std::vector<int>& audioCaps) const
+{
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ player->GetAudioCapabilities(audioCaps);
+}
+
+void CApplicationPlayer::GetSubtitleCapabilities(std::vector<int>& subCaps) const
+{
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ player->GetSubtitleCapabilities(subCaps);
+}
+
+int CApplicationPlayer::SeekChapter(int iChapter)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ return player->SeekChapter(iChapter);
+ else
+ return 0;
+}
+
+void CApplicationPlayer::SetPlaySpeed(float speed)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (!player)
+ return;
+
+ if (!IsPlayingAudio() && !IsPlayingVideo())
+ return ;
+
+ SetSpeed(speed);
+}
+
+float CApplicationPlayer::GetPlaySpeed() const
+{
+ std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ {
+ return CDataCacheCore::GetInstance().GetSpeed();
+ }
+ else
+ return 0;
+}
+
+float CApplicationPlayer::GetPlayTempo() const
+{
+ std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ {
+ return CDataCacheCore::GetInstance().GetTempo();
+ }
+ else
+ return 0;
+}
+
+bool CApplicationPlayer::SupportsTempo() const
+{
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ return player->SupportsTempo();
+ else
+ return false;
+}
+
+void CApplicationPlayer::FrameMove()
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ {
+ if (CDataCacheCore::GetInstance().IsPlayerStateChanged())
+ // CApplicationMessenger would be overhead because we are already in gui thread
+ CServiceBroker::GetGUI()->GetWindowManager().SendMessage(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_STATE_CHANGED);
+ }
+}
+
+void CApplicationPlayer::Render(bool clear, uint32_t alpha, bool gui)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ player->Render(clear, alpha, gui);
+}
+
+void CApplicationPlayer::FlushRenderer()
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ player->FlushRenderer();
+}
+
+void CApplicationPlayer::SetRenderViewMode(int mode, float zoom, float par, float shift, bool stretch)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ player->SetRenderViewMode(mode, zoom, par, shift, stretch);
+}
+
+float CApplicationPlayer::GetRenderAspectRatio() const
+{
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ return player->GetRenderAspectRatio();
+ else
+ return 1.0;
+}
+
+void CApplicationPlayer::TriggerUpdateResolution()
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ player->TriggerUpdateResolution();
+}
+
+bool CApplicationPlayer::IsRenderingVideo() const
+{
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ return player->IsRenderingVideo();
+ else
+ return false;
+}
+
+bool CApplicationPlayer::IsRenderingGuiLayer() const
+{
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ return CServiceBroker::GetDataCacheCore().GetGuiRender();
+ else
+ return false;
+}
+
+bool CApplicationPlayer::IsRenderingVideoLayer() const
+{
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ return CServiceBroker::GetDataCacheCore().GetVideoRender();
+ else
+ return false;
+}
+
+bool CApplicationPlayer::Supports(EINTERLACEMETHOD method) const
+{
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ return player->Supports(method);
+ else
+ return false;
+}
+
+EINTERLACEMETHOD CApplicationPlayer::GetDeinterlacingMethodDefault() const
+{
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ return player->GetDeinterlacingMethodDefault();
+ else
+ return EINTERLACEMETHOD::VS_INTERLACEMETHOD_NONE;
+}
+
+bool CApplicationPlayer::Supports(ESCALINGMETHOD method) const
+{
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ return player->Supports(method);
+ else
+ return false;
+}
+
+bool CApplicationPlayer::Supports(ERENDERFEATURE feature) const
+{
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ return player->Supports(feature);
+ else
+ return false;
+}
+
+unsigned int CApplicationPlayer::RenderCaptureAlloc()
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ return player->RenderCaptureAlloc();
+ else
+ return 0;
+}
+
+void CApplicationPlayer::RenderCapture(unsigned int captureId, unsigned int width, unsigned int height, int flags)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ player->RenderCapture(captureId, width, height, flags);
+}
+
+void CApplicationPlayer::RenderCaptureRelease(unsigned int captureId)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ player->RenderCaptureRelease(captureId);
+}
+
+bool CApplicationPlayer::RenderCaptureGetPixels(unsigned int captureId, unsigned int millis, uint8_t *buffer, unsigned int size)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ return player->RenderCaptureGetPixels(captureId, millis, buffer, size);
+ else
+ return false;
+}
+
+bool CApplicationPlayer::IsExternalPlaying() const
+{
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ {
+ if (player->IsPlaying() && player->m_type == "external")
+ return true;
+ }
+ return false;
+}
+
+bool CApplicationPlayer::IsRemotePlaying() const
+{
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ {
+ if (player->IsPlaying() && player->m_type == "remote")
+ return true;
+ }
+ return false;
+}
+
+CVideoSettings CApplicationPlayer::GetVideoSettings() const
+{
+ std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ {
+ return player->GetVideoSettings();
+ }
+ return CVideoSettings();
+}
+
+void CApplicationPlayer::SetVideoSettings(CVideoSettings& settings)
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ if (player)
+ {
+ return player->SetVideoSettings(settings);
+ }
+}
+
+CSeekHandler& CApplicationPlayer::GetSeekHandler()
+{
+ return m_seekHandler;
+}
+
+const CSeekHandler& CApplicationPlayer::GetSeekHandler() const
+{
+ return m_seekHandler;
+}
+
+void CApplicationPlayer::SetUpdateStreamDetails()
+{
+ std::shared_ptr<IPlayer> player = GetInternal();
+ CVideoPlayer* vp = dynamic_cast<CVideoPlayer*>(player.get());
+ if (vp)
+ vp->SetUpdateStreamDetails();
+}
+
+bool CApplicationPlayer::HasGameAgent() const
+{
+ const std::shared_ptr<const IPlayer> player = GetInternal();
+ if (player)
+ return player->HasGameAgent();
+
+ return false;
+}
+
+int CApplicationPlayer::GetSubtitleDelay() const
+{
+ // converts subtitle delay to a percentage
+ const auto& advSettings = CServiceBroker::GetSettingsComponent()->GetAdvancedSettings();
+ const auto delay = this->GetVideoSettings().m_SubtitleDelay;
+ const auto range = advSettings->m_videoSubsDelayRange;
+ return static_cast<int>(0.5f + (delay + range) / (2.f * range) * 100.0f);
+}
+
+int CApplicationPlayer::GetAudioDelay() const
+{
+ // converts audio delay to a percentage
+ const auto& advSettings = CServiceBroker::GetSettingsComponent()->GetAdvancedSettings();
+ const auto delay = this->GetVideoSettings().m_AudioDelay;
+ const auto range = advSettings->m_videoAudioDelayRange;
+ return static_cast<int>(0.5f + (delay + range) / (2.f * range) * 100.0f);
+}