diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 18:07:22 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 18:07:22 +0000 |
commit | c04dcc2e7d834218ef2d4194331e383402495ae1 (patch) | |
tree | 7333e38d10d75386e60f336b80c2443c1166031d /xbmc/interfaces/legacy/Player.h | |
parent | Initial commit. (diff) | |
download | kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.tar.xz kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.zip |
Adding upstream version 2:20.4+dfsg.upstream/2%20.4+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'xbmc/interfaces/legacy/Player.h')
-rw-r--r-- | xbmc/interfaces/legacy/Player.h | 824 |
1 files changed, 824 insertions, 0 deletions
diff --git a/xbmc/interfaces/legacy/Player.h b/xbmc/interfaces/legacy/Player.h new file mode 100644 index 0000000..b700597 --- /dev/null +++ b/xbmc/interfaces/legacy/Player.h @@ -0,0 +1,824 @@ +/* + * 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. + */ + +#pragma once + +#include "AddonCallback.h" +#include "AddonString.h" +#include "Alternative.h" +#include "Exception.h" +#include "InfoTagGame.h" +#include "InfoTagMusic.h" +#include "InfoTagRadioRDS.h" +#include "InfoTagVideo.h" +#include "ListItem.h" +#include "PlayList.h" +#include "cores/IPlayerCallback.h" +#include "swighelper.h" + +#include <vector> + +namespace XBMCAddon +{ + namespace xbmc + { + XBMCCOMMONS_STANDARD_EXCEPTION(PlayerException); + + typedef Alternative<String, const PlayList* > PlayParameter; + + // This class is a merge of what was previously in xbmcmodule/player.h + // and xbmcmodule/PythonPlayer.h without the python references. The + // queuing and handling of asynchronous callbacks is done internal to + // this class. + + // + /// \defgroup python_Player Player + /// \ingroup python_xbmc + /// @{ + /// @brief **Kodi's player.** + /// + /// \python_class{ xbmc.Player() } + /// + /// To become and create the class to play something. + /// + /// + /// + ///-------------------------------------------------------------------------- + /// + /// **Example:** + /// ~~~~~~~~~~~~~{.py} + /// ... + /// xbmc.Player().play(url, listitem, windowed) + /// ... + /// ~~~~~~~~~~~~~ + // + class Player : public AddonCallback, public IPlayerCallback + { + private: + int iPlayList; + + void playStream(const String& item = emptyString, const XBMCAddon::xbmcgui::ListItem* listitem = NULL, bool windowed = false); + void playPlaylist(const PlayList* playlist = NULL, + bool windowed = false, int startpos=-1); + void playCurrent(bool windowed = false); + + public: +#if !defined SWIG && !defined DOXYGEN_SHOULD_SKIP_THIS + static PlayParameter defaultPlayParameter; +#endif + +#ifndef DOXYGEN_SHOULD_SKIP_THIS + // Construct a Player proxying the given generated binding. The + // construction of a Player needs to identify whether or not any + // callbacks will be executed asynchronously or not. + explicit Player(); + ~Player(void) override; +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ play([item, listitem, windowed, startpos]) } + /// Play an item. + /// + /// @param item [opt] string - filename, url or playlist + /// @param listitem [opt] listitem - used with setInfo() to set + /// different infolabels. + /// @param windowed [opt] bool - true=play video windowed, + /// false=play users preference.(default) + /// @param startpos [opt] int - starting position when playing + /// a playlist. Default = -1 + /// + /// @note If item is not given then the Player will try to play the + /// current item in the current playlist.\n + /// \n + /// You can use the above as keywords for arguments and skip certain + /// optional arguments.\n + /// Once you use a keyword, all following arguments require the + /// keyword. + /// + /// + /// + ///----------------------------------------------------------------------- + /// + /// **Example:** + /// ~~~~~~~~~~~~~{.py} + /// ... + /// listitem = xbmcgui.ListItem('Ironman') + /// listitem.setInfo('video', {'Title': 'Ironman', 'Genre': 'Science Fiction'}) + /// xbmc.Player().play(url, listitem, windowed) + /// xbmc.Player().play(playlist, listitem, windowed, startpos) + /// ... + /// ~~~~~~~~~~~~~ + /// + play(...); +#else + void play(const PlayParameter& item = Player::defaultPlayParameter, + const XBMCAddon::xbmcgui::ListItem* listitem = NULL, bool windowed = false, int startpos = -1); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ stop() } + /// Stop playing. + /// + stop(); +#else + void stop(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ pause() } + /// Pause or resume playing if already paused. + /// + pause(); +#else + void pause(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ playnext() } + /// Play next item in playlist. + /// + playnext(); +#else + void playnext(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ playprevious() } + /// Play previous item in playlist. + /// + playprevious(); +#else + void playprevious(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ playselected(selected) } + /// Play a certain item from the current playlist. + /// + /// @param selected Integer - Item to select + /// + playselected(...); +#else + void playselected(int selected); +#endif + + // + /// @defgroup python_PlayerCB Callback functions from Kodi to Add-On + /// \ingroup python_Player + /// @{ + /// @brief **Callback functions.** + /// + /// Functions to handle control callbacks from Kodi to Add-On. + /// + /// ---------------------------------------------------------------------- + /// + /// @link python_Player Go back to normal functions from player@endlink + // + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_PlayerCB + /// @brief \python_func{ onPlayBackStarted() } + /// onPlayBackStarted method. + /// + /// Will be called when Kodi player starts. Video or audio might not be available at this point. + /// + ///------------------------------------------------------------------------ + /// @python_v18 Use onAVStarted() instead if you need to detect if Kodi is actually playing a media file + /// (i.e, if a stream is available) + /// + onPlayBackStarted(); +#else + virtual void onPlayBackStarted(); +#endif + + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_PlayerCB + /// @brief \python_func{ onAVStarted() } + /// onAVStarted method. + /// + /// Will be called when Kodi has a video or audiostream. + /// + ///------------------------------------------------------------------------ + /// @python_v18 New function added. + /// + onAVStarted(); +#else + virtual void onAVStarted(); +#endif + + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_PlayerCB + /// @brief \python_func{ onAVChange() } + /// onAVChange method. + /// + /// Will be called when Kodi has a video, audio or subtitle stream. Also happens when the stream changes. + /// + ///------------------------------------------------------------------------ + /// @python_v18 New function added. + /// + onAVChange(); +#else + virtual void onAVChange(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_PlayerCB + /// @brief \python_func{ onPlayBackEnded() } + /// onPlayBackEnded method. + /// + /// Will be called when Kodi stops playing a file. + /// + onPlayBackEnded(); +#else + virtual void onPlayBackEnded(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_PlayerCB + /// @brief \python_func{ onPlayBackStopped() } + /// onPlayBackStopped method. + /// + /// Will be called when user stops Kodi playing a file. + /// + onPlayBackStopped(); +#else + virtual void onPlayBackStopped(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_PlayerCB + /// @brief \python_func{ onPlayBackError() } + /// onPlayBackError method. + /// + /// Will be called when playback stops due to an error. + /// + onPlayBackError(); +#else + virtual void onPlayBackError(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_PlayerCB + /// @brief \python_func{ onPlayBackPaused() } + /// onPlayBackPaused method. + /// + /// Will be called when user pauses a playing file. + /// + onPlayBackPaused(); +#else + virtual void onPlayBackPaused(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_PlayerCB + /// @brief \python_func{ onPlayBackResumed() } + /// onPlayBackResumed method. + /// + /// Will be called when user resumes a paused file. + /// + onPlayBackResumed(); +#else + virtual void onPlayBackResumed(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_PlayerCB + /// @brief \python_func{ onQueueNextItem() } + /// onQueueNextItem method. + /// + /// Will be called when user queues the next item. + /// + onQueueNextItem(); +#else + virtual void onQueueNextItem(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_PlayerCB + /// @brief \python_func{ onPlayBackSpeedChanged(speed) } + /// onPlayBackSpeedChanged method. + /// + /// Will be called when players speed changes (eg. user FF/RW). + /// + /// @param speed [integer] Current speed of player + /// + /// @note Negative speed means player is rewinding, 1 is normal playback + /// speed. + /// + onPlayBackSpeedChanged(int speed); +#else + virtual void onPlayBackSpeedChanged(int speed); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_PlayerCB + /// @brief \python_func{ onPlayBackSeek(time, seekOffset) } + /// onPlayBackSeek method. + /// + /// Will be called when user seeks to a time. + /// + /// @param time [integer] Time to seek to + /// @param seekOffset [integer] ? + /// + onPlayBackSeek(...); +#else + virtual void onPlayBackSeek(int time, int seekOffset); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_PlayerCB + /// @brief \python_func{ onPlayBackSeekChapter(chapter) } + /// onPlayBackSeekChapter method. + /// + /// Will be called when user performs a chapter seek. + /// + /// @param chapter [integer] Chapter to seek to + /// + onPlayBackSeekChapter(...); +#else + virtual void onPlayBackSeekChapter(int chapter); +#endif + /// @} + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ isPlaying() } + /// Check Kodi is playing something. + /// + /// @return True if Kodi is playing a file. + /// + isPlaying(); +#else + bool isPlaying(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ isPlayingAudio() } + /// Check for playing audio. + /// + /// @return True if Kodi is playing an audio file. + /// + isPlayingAudio(); +#else + bool isPlayingAudio(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ isPlayingVideo() } + /// Check for playing video. + /// + /// @return True if Kodi is playing a video. + /// + isPlayingVideo(); +#else + bool isPlayingVideo(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ isPlayingRDS() } + /// Check for playing radio data system (RDS). + /// + /// @return True if kodi is playing a radio data + /// system (RDS). + /// + isPlayingRDS(); +#else + bool isPlayingRDS(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ isPlayingGame() } + /// Check for playing game. + /// + /// @return True if kodi is playing a game + /// + ///------------------------------------------------------------------------ + /// @python_v20 New function added. + /// + isPlayingGame(); +#else + bool isPlayingGame(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ isExternalPlayer() } + /// Check for external player. + /// + /// @return True if kodi is playing using an + /// external player. + /// + /// + ///----------------------------------------------------------------------- + /// @python_v18 New function added. + /// + isExternalPlayer(); +#else + bool isExternalPlayer(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ getPlayingFile() } + /// Returns the current playing file as a string. + /// + /// @note For LiveTV, returns a __pvr://__ url which is not translatable + /// to an OS specific file or external url. + /// + /// @return Playing filename + /// @throws Exception If player is not playing a file. + /// + getPlayingFile(); +#else + String getPlayingFile(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ getPlayingItem() } + /// Returns the current playing item. + /// + /// @return Playing item + /// @throws Exception If player is not playing a file. + /// + ///----------------------------------------------------------------------- + /// @python_v20 New function added. + /// + getPlayingItem(); +#else + XBMCAddon::xbmcgui::ListItem* getPlayingItem(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ getTime() } + /// Get playing time. + /// + /// Returns the current time of the current playing media as fractional + /// seconds. + /// + /// @return Current time as fractional seconds + /// @throws Exception If player is not playing a file. + /// + getTime(); +#else + double getTime(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ seekTime(seekTime) } + /// Seek time. + /// + /// Seeks the specified amount of time as fractional seconds. + /// The time specified is relative to the beginning of the currently. + /// playing media file. + /// + /// @param seekTime Time to seek as fractional seconds + /// @throws Exception If player is not playing a file. + /// + seekTime(...); +#else + void seekTime(double seekTime); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ setSubtitles(subtitleFile) } + /// Set subtitle file and enable subtitles. + /// + /// @param subtitleFile File to use as source ofsubtitles + /// + setSubtitles(...); +#else + void setSubtitles(const char* subtitleFile); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ showSubtitles(visible) } + /// Enable / disable subtitles. + /// + /// @param visible [boolean] True for visible subtitles. + /// + /// + ///----------------------------------------------------------------------- + /// + /// **Example:** + /// ~~~~~~~~~~~~~{.py} + /// ... + /// xbmc.Player().showSubtitles(True) + /// ... + /// ~~~~~~~~~~~~~ + /// + showSubtitles(...); +#else + void showSubtitles(bool bVisible); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ getSubtitles() } + /// Get subtitle stream name. + /// + /// @return Stream name + /// + getSubtitles(); +#else + String getSubtitles(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ getAvailableSubtitleStreams() } + /// Get Subtitle stream names. + /// + /// @return List of subtitle streams as name + /// + getAvailableSubtitleStreams(); +#else + std::vector<String> getAvailableSubtitleStreams(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ setSubtitleStream(stream) } + /// Set Subtitle Stream. + /// + /// @param iStream [int] Subtitle stream to select for play + /// + /// + ///----------------------------------------------------------------------- + /// + /// **Example:** + /// ~~~~~~~~~~~~~{.py} + /// ... + /// xbmc.Player().setSubtitleStream(1) + /// ... + /// ~~~~~~~~~~~~~ + /// + setSubtitleStream(...); +#else + void setSubtitleStream(int iStream); +#endif + + // Player_UpdateInfoTag +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ updateInfoTag(item) } + /// Update info labels for currently playing item. + /// + /// @param item ListItem with new info + /// + /// @throws Exception If player is not playing a file + /// + /// @python_v18 New function added. + /// + /// **Example:** + /// ~~~~~~~~~~~~~{.py} + /// ... + /// item = xbmcgui.ListItem() + /// item.setPath(xbmc.Player().getPlayingFile()) + /// item.setInfo('music', {'title' : 'foo', 'artist' : 'bar'}) + /// xbmc.Player().updateInfoTag(item) + /// ... + /// ~~~~~~~~~~~~~ + /// + updateInfoTag(); +#else + void updateInfoTag(const XBMCAddon::xbmcgui::ListItem* item); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ getGameInfoTag() } + /// To get game info tag. + /// + /// Returns the GameInfoTag of the current playing game. + /// + /// @return Game info tag + /// @throws Exception If player is not playing a file or current + /// file is not a game file. + /// + ///------------------------------------------------------------------------ + /// @python_v20 New function added. + /// + getGameInfoTag(); +#else + InfoTagGame* getGameInfoTag(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ getVideoInfoTag() } + /// To get video info tag. + /// + /// Returns the VideoInfoTag of the current playing Movie. + /// + /// @return Video info tag + /// @throws Exception If player is not playing a file or current + /// file is not a movie file. + /// + getVideoInfoTag(); +#else + InfoTagVideo* getVideoInfoTag(); +#endif + + // Player_GetMusicInfoTag +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ getMusicInfoTag() } + /// To get music info tag. + /// + /// Returns the MusicInfoTag of the current playing 'Song'. + /// + /// @return Music info tag + /// @throws Exception If player is not playing a file or current + /// file is not a music file. + /// + getMusicInfoTag(); +#else + InfoTagMusic* getMusicInfoTag(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ getRadioRDSInfoTag() } + /// To get Radio RDS info tag + /// + /// Returns the RadioRDSInfoTag of the current playing 'Radio Song if. + /// present'. + /// + /// @return Radio RDS info tag + /// @throws Exception If player is not playing a file or current + /// file is not a rds file. + /// + getRadioRDSInfoTag(); +#else + InfoTagRadioRDS* getRadioRDSInfoTag(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ getTotalTime() } + /// To get total playing time. + /// + /// Returns the total time of the current playing media in seconds. + /// This is only accurate to the full second. + /// + /// @return Total time of the current playing media + /// @throws Exception If player is not playing a file. + /// + getTotalTime(); +#else + double getTotalTime(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ getAvailableAudioStreams() } + /// Get Audio stream names + /// + /// @return List of audio streams as name + /// + getAvailableAudioStreams(); +#else + std::vector<String> getAvailableAudioStreams(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ setAudioStream(stream) } + /// Set Audio Stream. + /// + /// @param iStream [int] Audio stream to select for play + /// + /// + ///----------------------------------------------------------------------- + /// + /// **Example:** + /// ~~~~~~~~~~~~~{.py} + /// ... + /// xbmc.Player().setAudioStream(1) + /// ... + /// ~~~~~~~~~~~~~ + /// + setAudioStream(...); +#else + void setAudioStream(int iStream); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ getAvailableVideoStreams() } + /// Get Video stream names + /// + /// @return List of video streams as name + /// + getAvailableVideoStreams(); +#else + std::vector<String> getAvailableVideoStreams(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_Player + /// @brief \python_func{ setVideoStream(stream) } + /// Set Video Stream. + /// + /// @param iStream [int] Video stream to select for play + /// + /// + ///----------------------------------------------------------------------- + /// + /// **Example:** + /// ~~~~~~~~~~~~~{.py} + /// ... + /// xbmc.Player().setVideoStream(1) + /// ... + /// ~~~~~~~~~~~~~ + /// + setVideoStream(...); +#else + void setVideoStream(int iStream); +#endif + +#if !defined SWIG && !defined DOXYGEN_SHOULD_SKIP_THIS + void OnPlayBackStarted(const CFileItem& file) override; + void OnAVStarted(const CFileItem& file) override; + void OnAVChange() override; + void OnPlayBackEnded() override; + void OnPlayBackStopped() override; + void OnPlayBackError() override; + void OnPlayBackPaused() override; + void OnPlayBackResumed() override; + void OnQueueNextItem() override; + void OnPlayBackSpeedChanged(int iSpeed) override; + void OnPlayBackSeek(int64_t iTime, int64_t seekOffset) override; + void OnPlayBackSeekChapter(int iChapter) override; +#endif + + protected: + }; + } +} + |