summaryrefslogtreecommitdiffstats
path: root/xbmc/pvr/PVRPlaybackState.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--xbmc/pvr/PVRPlaybackState.h284
1 files changed, 284 insertions, 0 deletions
diff --git a/xbmc/pvr/PVRPlaybackState.h b/xbmc/pvr/PVRPlaybackState.h
new file mode 100644
index 0000000..2ef7500
--- /dev/null
+++ b/xbmc/pvr/PVRPlaybackState.h
@@ -0,0 +1,284 @@
+/*
+ * Copyright (C) 2012-2019 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 "threads/CriticalSection.h"
+
+#include <memory>
+#include <string>
+
+class CDateTime;
+class CFileItem;
+
+namespace PVR
+{
+class CPVRChannel;
+class CPVRChannelGroup;
+class CPVRChannelGroupMember;
+class CPVREpgInfoTag;
+class CPVRRecording;
+
+class CPVRPlaybackState
+{
+public:
+ /*!
+ * @brief ctor.
+ */
+ CPVRPlaybackState();
+
+ /*!
+ * @brief dtor.
+ */
+ virtual ~CPVRPlaybackState();
+
+ /*!
+ * @brief clear instances, keep stored UIDs.
+ */
+ void Clear();
+
+ /*!
+ * @brief re-init using stored UIDs.
+ */
+ void ReInit();
+
+ /*!
+ * @brief Inform that playback of an item just started.
+ * @param item The item that started to play.
+ */
+ void OnPlaybackStarted(const CFileItem& item);
+
+ /*!
+ * @brief Inform that playback of an item was stopped due to user interaction.
+ * @param item The item that stopped to play.
+ * @return True, if the state has changed, false otherwise
+ */
+ bool OnPlaybackStopped(const CFileItem& item);
+
+ /*!
+ * @brief Inform that playback of an item has stopped without user interaction.
+ * @param item The item that ended to play.
+ */
+ void OnPlaybackEnded(const CFileItem& item);
+
+ /*!
+ * @brief Check if a TV channel, radio channel or recording is playing.
+ * @return True if it's playing, false otherwise.
+ */
+ bool IsPlaying() const;
+
+ /*!
+ * @brief Check if a TV channel is playing.
+ * @return True if it's playing, false otherwise.
+ */
+ bool IsPlayingTV() const;
+
+ /*!
+ * @brief Check if a radio channel is playing.
+ * @return True if it's playing, false otherwise.
+ */
+ bool IsPlayingRadio() const;
+
+ /*!
+ * @brief Check if a an encrypted TV or radio channel is playing.
+ * @return True if it's playing, false otherwise.
+ */
+ bool IsPlayingEncryptedChannel() const;
+
+ /*!
+ * @brief Check if a recording is playing.
+ * @return True if it's playing, false otherwise.
+ */
+ bool IsPlayingRecording() const;
+
+ /*!
+ * @brief Check if an epg tag is playing.
+ * @return True if it's playing, false otherwise.
+ */
+ bool IsPlayingEpgTag() const;
+
+ /*!
+ * @brief Check whether playing channel matches given uids.
+ * @param iClientID The client id.
+ * @param iUniqueChannelID The channel uid.
+ * @return True on match, false if there is no match or no channel is playing.
+ */
+ bool IsPlayingChannel(int iClientID, int iUniqueChannelID) const;
+
+ /*!
+ * @brief Check if the given channel is playing.
+ * @param channel The channel to check.
+ * @return True if it's playing, false otherwise.
+ */
+ bool IsPlayingChannel(const std::shared_ptr<CPVRChannel>& channel) const;
+
+ /*!
+ * @brief Check if the given recording is playing.
+ * @param recording The recording to check.
+ * @return True if it's playing, false otherwise.
+ */
+ bool IsPlayingRecording(const std::shared_ptr<CPVRRecording>& recording) const;
+
+ /*!
+ * @brief Check if the given epg tag is playing.
+ * @param epgTag The tag to check.
+ * @return True if it's playing, false otherwise.
+ */
+ bool IsPlayingEpgTag(const std::shared_ptr<CPVREpgInfoTag>& epgTag) const;
+
+ /*!
+ * @brief Return the channel that is currently playing.
+ * @return The channel or nullptr if none is playing.
+ */
+ std::shared_ptr<CPVRChannel> GetPlayingChannel() const;
+
+ /*!
+ * @brief Return the channel group member that is currently playing.
+ * @return The channel group member or nullptr if none is playing.
+ */
+ std::shared_ptr<CPVRChannelGroupMember> GetPlayingChannelGroupMember() const;
+
+ /*!
+ * @brief Return the recording that is currently playing.
+ * @return The recording or nullptr if none is playing.
+ */
+ std::shared_ptr<CPVRRecording> GetPlayingRecording() const;
+
+ /*!
+ * @brief Return the epg tag that is currently playing.
+ * @return The tag or nullptr if none is playing.
+ */
+ std::shared_ptr<CPVREpgInfoTag> GetPlayingEpgTag() const;
+
+ /*!
+ * @brief Return playing channel unique identifier
+ * @return The channel id or -1 if not present
+ */
+ int GetPlayingChannelUniqueID() const;
+
+ /*!
+ * @brief Get the name of the playing client, if there is one.
+ * @return The name of the client or an empty string if nothing is playing.
+ */
+ std::string GetPlayingClientName() const;
+
+ /*!
+ * @brief Get the ID of the playing client, if there is one.
+ * @return The ID or -1 if no client is playing.
+ */
+ int GetPlayingClientID() const;
+
+ /*!
+ * @brief Check whether there are active recordings.
+ * @return True if there are active recordings, false otherwise.
+ */
+ bool IsRecording() const;
+
+ /*!
+ * @brief Check whether there is an active recording on the currenlyt playing channel.
+ * @return True if there is a playing channel and there is an active recording on that channel, false otherwise.
+ */
+ bool IsRecordingOnPlayingChannel() const;
+
+ /*!
+ * @brief Check if an active recording is playing.
+ * @return True if an in-progress (active) recording is playing, false otherwise.
+ */
+ bool IsPlayingActiveRecording() const;
+
+ /*!
+ * @brief Check whether the currently playing channel can be recorded.
+ * @return True if there is a playing channel that can be recorded, false otherwise.
+ */
+ bool CanRecordOnPlayingChannel() const;
+
+ /*!
+ * @brief Set the active channel group.
+ * @param group The new group.
+ */
+ void SetActiveChannelGroup(const std::shared_ptr<CPVRChannelGroup>& group);
+
+ /*!
+ * @brief Get the active channel group.
+ * @param bRadio True to get the active radio group, false to get the active TV group.
+ * @return The current group or the group containing all channels if it's not set.
+ */
+ std::shared_ptr<CPVRChannelGroup> GetActiveChannelGroup(bool bRadio) const;
+
+ /*!
+ * @brief Get the last played channel group member.
+ * @param bRadio True to get the radio group member, false to get the TV group member.
+ * @return The last played group member or nullptr if it's not available.
+ */
+ std::shared_ptr<CPVRChannelGroupMember> GetLastPlayedChannelGroupMember(bool bRadio) const;
+
+ /*!
+ * @brief Get the channel group member that was played before the last played member.
+ * @param bRadio True to get the radio group member, false to get the TV group member.
+ * @return The previous played group member or nullptr if it's not available.
+ */
+ std::shared_ptr<CPVRChannelGroupMember> GetPreviousToLastPlayedChannelGroupMember(
+ bool bRadio) const;
+
+ /*!
+ * @brief Get current playback time for the given channel, taking timeshifting and playing
+ * epg tags into account.
+ * @param iClientID The client id.
+ * @param iUniqueChannelID The channel uid.
+ * @return The playback time or 'now' if not playing.
+ */
+ CDateTime GetPlaybackTime(int iClientID, int iUniqueChannelID) const;
+
+ /*!
+ * @brief Get current playback time for the given channel, taking timeshifting into account.
+ * @param iClientID The client id.
+ * @param iUniqueChannelID The channel uid.
+ * @return The playback time or 'now' if not playing.
+ */
+ CDateTime GetChannelPlaybackTime(int iClientID, int iUniqueChannelID) const;
+
+private:
+ void ClearData();
+
+ /*!
+ * @brief Set the active group to the group of the supplied channel group member.
+ * @param channel The channel group member
+ */
+ void SetActiveChannelGroup(const std::shared_ptr<CPVRChannelGroupMember>& channel);
+
+ /*!
+ * @brief Updates the last watched timestamps of the channel and group which are currently playing.
+ * @param channel The channel which is updated
+ * @param time The last watched time to set
+ */
+ void UpdateLastWatched(const std::shared_ptr<CPVRChannelGroupMember>& channel,
+ const CDateTime& time);
+
+ mutable CCriticalSection m_critSection;
+
+ std::shared_ptr<CPVRChannelGroupMember> m_playingChannel;
+ std::shared_ptr<CPVRRecording> m_playingRecording;
+ std::shared_ptr<CPVREpgInfoTag> m_playingEpgTag;
+ std::shared_ptr<CPVRChannelGroupMember> m_lastPlayedChannelTV;
+ std::shared_ptr<CPVRChannelGroupMember> m_lastPlayedChannelRadio;
+ std::shared_ptr<CPVRChannelGroupMember> m_previousToLastPlayedChannelTV;
+ std::shared_ptr<CPVRChannelGroupMember> m_previousToLastPlayedChannelRadio;
+ std::string m_strPlayingClientName;
+ int m_playingGroupId = -1;
+ int m_playingClientId = -1;
+ int m_playingChannelUniqueId = -1;
+ std::string m_strPlayingRecordingUniqueId;
+ int m_playingEpgTagChannelUniqueId = -1;
+ unsigned int m_playingEpgTagUniqueId = 0;
+ std::shared_ptr<CPVRChannelGroup> m_activeGroupTV;
+ std::shared_ptr<CPVRChannelGroup> m_activeGroupRadio;
+
+ class CLastWatchedUpdateTimer;
+ std::unique_ptr<CLastWatchedUpdateTimer> m_lastWatchedUpdateTimer;
+};
+} // namespace PVR