diff options
Diffstat (limited to 'src/interfaces/legacy/Player.cpp')
-rw-r--r-- | src/interfaces/legacy/Player.cpp | 502 |
1 files changed, 502 insertions, 0 deletions
diff --git a/src/interfaces/legacy/Player.cpp b/src/interfaces/legacy/Player.cpp new file mode 100644 index 0000000000..274f218c6a --- /dev/null +++ b/src/interfaces/legacy/Player.cpp @@ -0,0 +1,502 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * <http://www.gnu.org/licenses/>. + * + */ + +#include "Player.h" +#include "ListItem.h" +#include "PlayList.h" +#include "PlayListPlayer.h" +#include "settings/MediaSettings.h" +#include "Application.h" +#include "ApplicationMessenger.h" +#include "GUIInfoManager.h" +#include "AddonUtils.h" +#include "utils/log.h" +#include "cores/IPlayer.h" +#include "settings/MediaSettings.h" + +namespace XBMCAddon +{ + namespace xbmc + { + PlayParameter Player::defaultPlayParameter; + + Player::Player(int _playerCore) + { + iPlayList = PLAYLIST_MUSIC; + + if (_playerCore == EPC_DVDPLAYER || + _playerCore == EPC_MPLAYER || + _playerCore == EPC_PAPLAYER) + playerCore = (EPLAYERCORES)_playerCore; + else + playerCore = EPC_NONE; + + // now that we're done, register hook me into the system + if (languageHook) + { + DelayedCallGuard dc(languageHook); + languageHook->RegisterPlayerCallback(this); + } + } + + Player::~Player() + { + deallocating(); + + // we're shutting down so unregister me. + if (languageHook) + { + DelayedCallGuard dc(languageHook); + languageHook->UnregisterPlayerCallback(this); + } + } + + void Player::play(const Alternative<String, const PlayList* > & item, + const XBMCAddon::xbmcgui::ListItem* listitem, bool windowed, int startpos) + { + XBMC_TRACE; + + if (&item == &defaultPlayParameter) + playCurrent(windowed); + else if (item.which() == XBMCAddon::first) + playStream(item.former(), listitem, windowed); + else // item is a PlayListItem + playPlaylist(item.later(),windowed,startpos); + } + + void Player::playStream(const String& item, const xbmcgui::ListItem* plistitem, bool windowed) + { + XBMC_TRACE; + DelayedCallGuard dc(languageHook); + if (!item.empty()) + { + // set fullscreen or windowed + CMediaSettings::Get().SetVideoStartWindowed(windowed); + + // force a playercore before playing + g_application.m_eForcedNextPlayer = playerCore; + + const AddonClass::Ref<xbmcgui::ListItem> listitem(plistitem); + + if (listitem.isSet()) + { + // set m_strPath to the passed url + listitem->item->SetPath(item.c_str()); + CApplicationMessenger::Get().PlayFile((const CFileItem)(*(listitem->item)), false); + } + else + { + CFileItem nextitem(item, false); + CApplicationMessenger::Get().MediaPlay(nextitem.GetPath()); + } + } + else + playCurrent(windowed); + } + + void Player::playCurrent(bool windowed) + { + XBMC_TRACE; + DelayedCallGuard dc(languageHook); + // set fullscreen or windowed + CMediaSettings::Get().SetVideoStartWindowed(windowed); + + // force a playercore before playing + g_application.m_eForcedNextPlayer = playerCore; + + // play current file in playlist + if (g_playlistPlayer.GetCurrentPlaylist() != iPlayList) + g_playlistPlayer.SetCurrentPlaylist(iPlayList); + CApplicationMessenger::Get().PlayListPlayerPlay(g_playlistPlayer.GetCurrentSong()); + } + + void Player::playPlaylist(const PlayList* playlist, bool windowed, int startpos) + { + XBMC_TRACE; + DelayedCallGuard dc(languageHook); + if (playlist != NULL) + { + // set fullscreen or windowed + CMediaSettings::Get().SetVideoStartWindowed(windowed); + + // force a playercore before playing + g_application.m_eForcedNextPlayer = playerCore; + + // play a python playlist (a playlist from playlistplayer.cpp) + iPlayList = playlist->getPlayListId(); + g_playlistPlayer.SetCurrentPlaylist(iPlayList); + if (startpos > -1) + g_playlistPlayer.SetCurrentSong(startpos); + CApplicationMessenger::Get().PlayListPlayerPlay(startpos); + } + else + playCurrent(windowed); + } + + void Player::stop() + { + XBMC_TRACE; + CApplicationMessenger::Get().MediaStop(); + } + + void Player::pause() + { + XBMC_TRACE; + CApplicationMessenger::Get().MediaPause(); + } + + void Player::playnext() + { + XBMC_TRACE; + DelayedCallGuard dc(languageHook); + // force a playercore before playing + g_application.m_eForcedNextPlayer = playerCore; + + CApplicationMessenger::Get().PlayListPlayerNext(); + } + + void Player::playprevious() + { + XBMC_TRACE; + DelayedCallGuard dc(languageHook); + // force a playercore before playing + g_application.m_eForcedNextPlayer = playerCore; + + CApplicationMessenger::Get().PlayListPlayerPrevious(); + } + + void Player::playselected(int selected) + { + XBMC_TRACE; + DelayedCallGuard dc(languageHook); + // force a playercore before playing + g_application.m_eForcedNextPlayer = playerCore; + + if (g_playlistPlayer.GetCurrentPlaylist() != iPlayList) + { + g_playlistPlayer.SetCurrentPlaylist(iPlayList); + } + g_playlistPlayer.SetCurrentSong(selected); + + CApplicationMessenger::Get().PlayListPlayerPlay(selected); + //g_playlistPlayer.Play(selected); + //CLog::Log(LOGNOTICE, "Current Song After Play: %i", g_playlistPlayer.GetCurrentSong()); + } + + void Player::OnPlayBackStarted() + { + XBMC_TRACE; + invokeCallback(new CallbackFunction<Player>(this,&Player::onPlayBackStarted)); + } + + void Player::OnPlayBackEnded() + { + XBMC_TRACE; + invokeCallback(new CallbackFunction<Player>(this,&Player::onPlayBackEnded)); + } + + void Player::OnPlayBackStopped() + { + XBMC_TRACE; + invokeCallback(new CallbackFunction<Player>(this,&Player::onPlayBackStopped)); + } + + void Player::OnPlayBackPaused() + { + XBMC_TRACE; + invokeCallback(new CallbackFunction<Player>(this,&Player::onPlayBackPaused)); + } + + void Player::OnPlayBackResumed() + { + XBMC_TRACE; + invokeCallback(new CallbackFunction<Player>(this,&Player::onPlayBackResumed)); + } + + void Player::OnQueueNextItem() + { + XBMC_TRACE; + invokeCallback(new CallbackFunction<Player>(this,&Player::onQueueNextItem)); + } + + void Player::OnPlayBackSpeedChanged(int speed) + { + XBMC_TRACE; + invokeCallback(new CallbackFunction<Player,int>(this,&Player::onPlayBackSpeedChanged,speed)); + } + + void Player::OnPlayBackSeek(int time, int seekOffset) + { + XBMC_TRACE; + invokeCallback(new CallbackFunction<Player,int,int>(this,&Player::onPlayBackSeek,time,seekOffset)); + } + + void Player::OnPlayBackSeekChapter(int chapter) + { + XBMC_TRACE; + invokeCallback(new CallbackFunction<Player,int>(this,&Player::onPlayBackSeekChapter,chapter)); + } + + void Player::onPlayBackStarted() + { + XBMC_TRACE; + } + + void Player::onPlayBackEnded() + { + XBMC_TRACE; + } + + void Player::onPlayBackStopped() + { + XBMC_TRACE; + } + + void Player::onPlayBackPaused() + { + XBMC_TRACE; + } + + void Player::onPlayBackResumed() + { + XBMC_TRACE; + } + + void Player::onQueueNextItem() + { + XBMC_TRACE; + } + + void Player::onPlayBackSpeedChanged(int speed) + { + XBMC_TRACE; + } + + void Player::onPlayBackSeek(int time, int seekOffset) + { + XBMC_TRACE; + } + + void Player::onPlayBackSeekChapter(int chapter) + { + XBMC_TRACE; + } + + bool Player::isPlaying() + { + XBMC_TRACE; + return g_application.m_pPlayer->IsPlaying(); + } + + bool Player::isPlayingAudio() + { + XBMC_TRACE; + return g_application.m_pPlayer->IsPlayingAudio(); + } + + bool Player::isPlayingVideo() + { + XBMC_TRACE; + return g_application.m_pPlayer->IsPlayingVideo(); + } + + String Player::getPlayingFile() throw (PlayerException) + { + XBMC_TRACE; + if (!g_application.m_pPlayer->IsPlaying()) + throw PlayerException("XBMC is not playing any file"); + + return g_application.CurrentFile(); + } + + InfoTagVideo* Player::getVideoInfoTag() throw (PlayerException) + { + XBMC_TRACE; + if (!g_application.m_pPlayer->IsPlayingVideo()) + throw PlayerException("XBMC is not playing any videofile"); + + const CVideoInfoTag* movie = g_infoManager.GetCurrentMovieTag(); + if (movie) + return new InfoTagVideo(*movie); + + return new InfoTagVideo(); + } + + InfoTagMusic* Player::getMusicInfoTag() throw (PlayerException) + { + XBMC_TRACE; + if (g_application.m_pPlayer->IsPlayingVideo() || !g_application.m_pPlayer->IsPlayingAudio()) + throw PlayerException("XBMC is not playing any music file"); + + const MUSIC_INFO::CMusicInfoTag* tag = g_infoManager.GetCurrentSongTag(); + if (tag) + return new InfoTagMusic(*tag); + + return new InfoTagMusic(); + } + + double Player::getTotalTime() throw (PlayerException) + { + XBMC_TRACE; + if (!g_application.m_pPlayer->IsPlaying()) + throw PlayerException("XBMC is not playing any media file"); + + return g_application.GetTotalTime(); + } + + double Player::getTime() throw (PlayerException) + { + XBMC_TRACE; + if (!g_application.m_pPlayer->IsPlaying()) + throw PlayerException("XBMC is not playing any media file"); + + return g_application.GetTime(); + } + + void Player::seekTime(double pTime) throw (PlayerException) + { + XBMC_TRACE; + if (!g_application.m_pPlayer->IsPlaying()) + throw PlayerException("XBMC is not playing any media file"); + + g_application.SeekTime( pTime ); + } + + void Player::setSubtitles(const char* cLine) + { + XBMC_TRACE; + if (g_application.m_pPlayer->HasPlayer()) + { + int nStream = g_application.m_pPlayer->AddSubtitle(cLine); + if(nStream >= 0) + { + g_application.m_pPlayer->SetSubtitle(nStream); + g_application.m_pPlayer->SetSubtitleVisible(true); + CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleDelay = 0.0f; + g_application.m_pPlayer->SetSubTitleDelay(CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleDelay); + } + } + } + + void Player::showSubtitles(bool bVisible) + { + XBMC_TRACE; + if (g_application.m_pPlayer->HasPlayer()) + { + g_application.m_pPlayer->SetSubtitleVisible(bVisible != 0); + } + } + + String Player::getSubtitles() + { + XBMC_TRACE; + if (g_application.m_pPlayer->HasPlayer()) + { + SPlayerSubtitleStreamInfo info; + g_application.m_pPlayer->GetSubtitleStreamInfo(g_application.m_pPlayer->GetSubtitle(), info); + + if (info.language.length() > 0) + return info.language; + else + return info.name; + } + + return NULL; + } + + void Player::disableSubtitles() + { + XBMC_TRACE; + CLog::Log(LOGWARNING,"'xbmc.Player().disableSubtitles()' is deprecated and will be removed in future releases, please use 'xbmc.Player().showSubtitles(false)' instead"); + if (g_application.m_pPlayer->HasPlayer()) + { + g_application.m_pPlayer->SetSubtitleVisible(false); + } + } + + std::vector<String>* Player::getAvailableSubtitleStreams() + { + if (g_application.m_pPlayer->HasPlayer()) + { + int subtitleCount = g_application.m_pPlayer->GetSubtitleCount(); + std::vector<String>* ret = new std::vector<String>(subtitleCount); + for (int iStream=0; iStream < subtitleCount; iStream++) + { + SPlayerSubtitleStreamInfo info; + g_application.m_pPlayer->GetSubtitleStreamInfo(iStream, info); + + if (info.language.length() > 0) + (*ret)[iStream] = info.language; + else + (*ret)[iStream] = info.name; + } + return ret; + } + + return NULL; + } + + void Player::setSubtitleStream(int iStream) + { + if (g_application.m_pPlayer->HasPlayer()) + { + int streamCount = g_application.m_pPlayer->GetSubtitleCount(); + if(iStream < streamCount) + { + g_application.m_pPlayer->SetSubtitle(iStream); + g_application.m_pPlayer->SetSubtitleVisible(true); + } + } + } + + std::vector<String>* Player::getAvailableAudioStreams() + { + if (g_application.m_pPlayer->HasPlayer()) + { + int streamCount = g_application.m_pPlayer->GetAudioStreamCount(); + std::vector<String>* ret = new std::vector<String>(streamCount); + for (int iStream=0; iStream < streamCount; iStream++) + { + SPlayerAudioStreamInfo info; + g_application.m_pPlayer->GetAudioStreamInfo(iStream, info); + + if (info.language.length() > 0) + (*ret)[iStream] = info.language; + else + (*ret)[iStream] = info.name; + } + return ret; + } + + return NULL; + } + + void Player::setAudioStream(int iStream) + { + if (g_application.m_pPlayer->HasPlayer()) + { + int streamCount = g_application.m_pPlayer->GetAudioStreamCount(); + if(iStream < streamCount) + g_application.m_pPlayer->SetAudioStream(iStream); + } + } + } +} + |