diff options
Diffstat (limited to 'xbmc/addons/kodi-dev-kit/include/kodi/addon-instance')
24 files changed, 15730 insertions, 0 deletions
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/AudioDecoder.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/AudioDecoder.h new file mode 100644 index 0000000..a6bea7d --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/AudioDecoder.h | |||
| @@ -0,0 +1,595 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2005-2018 Team Kodi | ||
| 3 | * This file is part of Kodi - https://kodi.tv | ||
| 4 | * | ||
| 5 | * SPDX-License-Identifier: GPL-2.0-or-later | ||
| 6 | * See LICENSES/README.md for more information. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #pragma once | ||
| 10 | |||
| 11 | #include "../AddonBase.h" | ||
| 12 | #include "../AudioEngine.h" | ||
| 13 | #include "../c-api/addon-instance/audio_decoder.h" | ||
| 14 | |||
| 15 | #ifdef __cplusplus | ||
| 16 | namespace kodi | ||
| 17 | { | ||
| 18 | namespace addon | ||
| 19 | { | ||
| 20 | |||
| 21 | class CInstanceAudioDecoder; | ||
| 22 | |||
| 23 | //============================================================================== | ||
| 24 | /// @defgroup cpp_kodi_addon_audiodecoder_Defs_AudioDecoderInfoTag class AudioDecoderInfoTag | ||
| 25 | /// @ingroup cpp_kodi_addon_audiodecoder_Defs | ||
| 26 | /// @brief **Info tag data structure**\n | ||
| 27 | /// Representation of available information of processed audio file. | ||
| 28 | /// | ||
| 29 | /// This is used to store all the necessary data of audio stream and to have on | ||
| 30 | /// e.g. GUI for information. | ||
| 31 | /// | ||
| 32 | /// ---------------------------------------------------------------------------- | ||
| 33 | /// | ||
| 34 | /// @copydetails cpp_kodi_addon_audiodecoder_Defs_AudioDecoderInfoTag_Help | ||
| 35 | /// | ||
| 36 | ///@{ | ||
| 37 | class AudioDecoderInfoTag : public CStructHdl<AudioDecoderInfoTag, AUDIO_DECODER_INFO_TAG> | ||
| 38 | { | ||
| 39 | /*! \cond PRIVATE */ | ||
| 40 | friend class CInstanceAudioDecoder; | ||
| 41 | /*! \endcond */ | ||
| 42 | |||
| 43 | public: | ||
| 44 | /*! \cond PRIVATE */ | ||
| 45 | AudioDecoderInfoTag() { memset(m_cStructure, 0, sizeof(AUDIO_DECODER_INFO_TAG)); } | ||
| 46 | AudioDecoderInfoTag(const AudioDecoderInfoTag& tag) : CStructHdl(tag) {} | ||
| 47 | /*! \endcond */ | ||
| 48 | |||
| 49 | /// @defgroup cpp_kodi_addon_audiodecoder_Defs_AudioDecoderInfoTag_Help Value Help | ||
| 50 | /// @ingroup cpp_kodi_addon_audiodecoder_Defs_AudioDecoderInfoTag | ||
| 51 | /// | ||
| 52 | /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_audiodecoder_Defs_AudioDecoderInfoTag :</b> | ||
| 53 | /// | Name | Type | Set call | Get call | ||
| 54 | /// |------|------|----------|---------- | ||
| 55 | /// | **Title** | `std::string` | @ref AudioDecoderInfoTag::SetTitle "SetTitle" | @ref AudioDecoderInfoTag::GetTitle "GetTitle" | ||
| 56 | /// | **Artist** | `std::string` | @ref AudioDecoderInfoTag::SetArtist "SetArtist" | @ref AudioDecoderInfoTag::GetArtist "GetArtist" | ||
| 57 | /// | **Album** | `std::string` | @ref AudioDecoderInfoTag::SetAlbum "SetAlbum" | @ref AudioDecoderInfoTag::GetAlbum "GetAlbum" | ||
| 58 | /// | **Album artist** | `std::string` | @ref AudioDecoderInfoTag::SetAlbumArtist "SetAlbumArtist" | @ref AudioDecoderInfoTag::GetAlbumArtist "GetAlbumArtist" | ||
| 59 | /// | **Media type** | `std::string` | @ref AudioDecoderInfoTag::SetMediaType "SetMediaType" | @ref AudioDecoderInfoTag::GetMediaType "GetMediaType" | ||
| 60 | /// | **Genre** | `std::string` | @ref AudioDecoderInfoTag::SetGenre "SetGenre" | @ref AudioDecoderInfoTag::GetGenre "GetGenre" | ||
| 61 | /// | **Duration** | `int` | @ref AudioDecoderInfoTag::SetDuration "SetDuration" | @ref AudioDecoderInfoTag::GetDuration "GetDuration" | ||
| 62 | /// | **Track number** | `int` | @ref AudioDecoderInfoTag::SetTrack "SetTrack" | @ref AudioDecoderInfoTag::GetTrack "GetTrack" | ||
| 63 | /// | **Disc number** | `int` | @ref AudioDecoderInfoTag::SetDisc "SetDisc" | @ref AudioDecoderInfoTag::GetDisc "GetDisc" | ||
| 64 | /// | **Disc subtitle name** | `std::string` | @ref AudioDecoderInfoTag::SetDiscSubtitle "SetDiscSubtitle" | @ref AudioDecoderInfoTag::GetDiscSubtitle "GetDiscSubtitle" | ||
| 65 | /// | **Disc total amount** | `int` | @ref AudioDecoderInfoTag::SetDiscTotal "SetDiscTotal" | @ref AudioDecoderInfoTag::GetDiscTotal "GetDiscTotal" | ||
| 66 | /// | **Release date** | `std::string` | @ref AudioDecoderInfoTag::SetReleaseDate "SetReleaseDate" | @ref AudioDecoderInfoTag::GetReleaseDate "GetReleaseDate" | ||
| 67 | /// | **Lyrics** | `std::string` | @ref AudioDecoderInfoTag::SetLyrics "SetLyrics" | @ref AudioDecoderInfoTag::GetLyrics "GetLyrics" | ||
| 68 | /// | **Samplerate** | `int` | @ref AudioDecoderInfoTag::SetSamplerate "SetSamplerate" | @ref AudioDecoderInfoTag::GetSamplerate "GetSamplerate" | ||
| 69 | /// | **Channels amount** | `int` | @ref AudioDecoderInfoTag::SetChannels "SetChannels" | @ref AudioDecoderInfoTag::GetChannels "GetChannels" | ||
| 70 | /// | **Bitrate** | `int` | @ref AudioDecoderInfoTag::SetBitrate "SetBitrate" | @ref AudioDecoderInfoTag::GetBitrate "GetBitrate" | ||
| 71 | /// | **Comment text** | `std::string` | @ref AudioDecoderInfoTag::SetComment "SetComment" | @ref AudioDecoderInfoTag::GetComment "GetComment" | ||
| 72 | /// | ||
| 73 | |||
| 74 | /// @addtogroup cpp_kodi_addon_audiodecoder_Defs_AudioDecoderInfoTag | ||
| 75 | ///@{ | ||
| 76 | |||
| 77 | /// @brief Set the title from music as string on info tag. | ||
| 78 | void SetTitle(const std::string& title) | ||
| 79 | { | ||
| 80 | strncpy(m_cStructure->title, title.c_str(), sizeof(m_cStructure->title) - 1); | ||
| 81 | } | ||
| 82 | |||
| 83 | /// @brief Get title name | ||
| 84 | std::string GetTitle() const { return m_cStructure->title; } | ||
| 85 | |||
| 86 | /// @brief Set artist name | ||
| 87 | void SetArtist(const std::string& artist) | ||
| 88 | { | ||
| 89 | strncpy(m_cStructure->artist, artist.c_str(), sizeof(m_cStructure->artist) - 1); | ||
| 90 | } | ||
| 91 | |||
| 92 | /// @brief Get artist name | ||
| 93 | std::string GetArtist() const { return m_cStructure->artist; } | ||
| 94 | |||
| 95 | /// @brief Set album name | ||
| 96 | void SetAlbum(const std::string& album) | ||
| 97 | { | ||
| 98 | strncpy(m_cStructure->album, album.c_str(), sizeof(m_cStructure->album) - 1); | ||
| 99 | } | ||
| 100 | |||
| 101 | /// @brief Set album name | ||
| 102 | std::string GetAlbum() const { return m_cStructure->album; } | ||
| 103 | |||
| 104 | /// @brief Set album artist name | ||
| 105 | void SetAlbumArtist(const std::string& albumArtist) | ||
| 106 | { | ||
| 107 | strncpy(m_cStructure->album_artist, albumArtist.c_str(), | ||
| 108 | sizeof(m_cStructure->album_artist) - 1); | ||
| 109 | } | ||
| 110 | |||
| 111 | /// @brief Get album artist name | ||
| 112 | std::string GetAlbumArtist() const { return m_cStructure->album_artist; } | ||
| 113 | |||
| 114 | /// @brief Set the media type of the music item. | ||
| 115 | /// | ||
| 116 | /// Available strings about media type for music: | ||
| 117 | /// | String | Description | | ||
| 118 | /// |---------------:|:--------------------------------------------------| | ||
| 119 | /// | artist | If it is defined as an artist | ||
| 120 | /// | album | If it is defined as an album | ||
| 121 | /// | music | If it is defined as an music | ||
| 122 | /// | song | If it is defined as a song | ||
| 123 | /// | ||
| 124 | void SetMediaType(const std::string& mediaType) | ||
| 125 | { | ||
| 126 | strncpy(m_cStructure->media_type, mediaType.c_str(), sizeof(m_cStructure->media_type) - 1); | ||
| 127 | } | ||
| 128 | |||
| 129 | /// @brief Get the media type of the music item. | ||
| 130 | std::string GetMediaType() const { return m_cStructure->media_type; } | ||
| 131 | |||
| 132 | /// @brief Set genre name from music as string if present. | ||
| 133 | void SetGenre(const std::string& genre) | ||
| 134 | { | ||
| 135 | strncpy(m_cStructure->genre, genre.c_str(), sizeof(m_cStructure->genre) - 1); | ||
| 136 | } | ||
| 137 | |||
| 138 | /// @brief Get genre name from music as string if present. | ||
| 139 | std::string GetGenre() const { return m_cStructure->genre; } | ||
| 140 | |||
| 141 | /// @brief Set the duration of music as integer from info. | ||
| 142 | void SetDuration(int duration) { m_cStructure->duration = duration; } | ||
| 143 | |||
| 144 | /// @brief Get the duration of music as integer from info. | ||
| 145 | int GetDuration() const { return m_cStructure->duration; } | ||
| 146 | |||
| 147 | /// @brief Set track number (if present) from music info as integer. | ||
| 148 | void SetTrack(int track) { m_cStructure->track = track; } | ||
| 149 | |||
| 150 | /// @brief Get track number (if present). | ||
| 151 | int GetTrack() const { return m_cStructure->track; } | ||
| 152 | |||
| 153 | /// @brief Set disk number (if present) from music info as integer. | ||
| 154 | void SetDisc(int disc) { m_cStructure->disc = disc; } | ||
| 155 | |||
| 156 | /// @brief Get disk number (if present) | ||
| 157 | int GetDisc() const { return m_cStructure->disc; } | ||
| 158 | |||
| 159 | /// @brief Set disk subtitle name (if present) from music info. | ||
| 160 | void SetDiscSubtitle(const std::string& discSubtitle) | ||
| 161 | { | ||
| 162 | strncpy(m_cStructure->disc_subtitle, discSubtitle.c_str(), | ||
| 163 | sizeof(m_cStructure->disc_subtitle) - 1); | ||
| 164 | } | ||
| 165 | |||
| 166 | /// @brief Get disk subtitle name (if present) from music info. | ||
| 167 | std::string GetDiscSubtitle() const { return m_cStructure->disc_subtitle; } | ||
| 168 | |||
| 169 | /// @brief Set disks amount quantity (if present) from music info as integer. | ||
| 170 | void SetDiscTotal(int discTotal) { m_cStructure->disc_total = discTotal; } | ||
| 171 | |||
| 172 | /// @brief Get disks amount quantity (if present) | ||
| 173 | int GetDiscTotal() const { return m_cStructure->disc_total; } | ||
| 174 | |||
| 175 | /// @brief Set release date as string from music info (if present).\n | ||
| 176 | /// [ISO8601](https://en.wikipedia.org/wiki/ISO_8601) date YYYY, YYYY-MM or YYYY-MM-DD | ||
| 177 | void SetReleaseDate(const std::string& releaseDate) | ||
| 178 | { | ||
| 179 | strncpy(m_cStructure->release_date, releaseDate.c_str(), | ||
| 180 | sizeof(m_cStructure->release_date) - 1); | ||
| 181 | } | ||
| 182 | |||
| 183 | /// @brief Get release date as string from music info (if present). | ||
| 184 | std::string GetReleaseDate() const { return m_cStructure->release_date; } | ||
| 185 | |||
| 186 | /// @brief Set string from lyrics. | ||
| 187 | void SetLyrics(const std::string& lyrics) | ||
| 188 | { | ||
| 189 | strncpy(m_cStructure->lyrics, lyrics.c_str(), sizeof(m_cStructure->lyrics) - 1); | ||
| 190 | } | ||
| 191 | |||
| 192 | /// @brief Get string from lyrics. | ||
| 193 | std::string GetLyrics() const { return m_cStructure->lyrics; } | ||
| 194 | |||
| 195 | /// @brief Set related stream samplerate. | ||
| 196 | void SetSamplerate(int samplerate) { m_cStructure->samplerate = samplerate; } | ||
| 197 | |||
| 198 | /// @brief Get related stream samplerate. | ||
| 199 | int GetSamplerate() const { return m_cStructure->samplerate; } | ||
| 200 | |||
| 201 | /// @brief Set related stream channels amount. | ||
| 202 | void SetChannels(int channels) { m_cStructure->channels = channels; } | ||
| 203 | |||
| 204 | /// @brief Get related stream channels amount. | ||
| 205 | int GetChannels() const { return m_cStructure->channels; } | ||
| 206 | |||
| 207 | /// @brief Set related stream bitrate. | ||
| 208 | void SetBitrate(int bitrate) { m_cStructure->bitrate = bitrate; } | ||
| 209 | |||
| 210 | /// @brief Get related stream bitrate. | ||
| 211 | int GetBitrate() const { return m_cStructure->bitrate; } | ||
| 212 | |||
| 213 | /// @brief Set additional information comment (if present). | ||
| 214 | void SetComment(const std::string& comment) | ||
| 215 | { | ||
| 216 | strncpy(m_cStructure->comment, comment.c_str(), sizeof(m_cStructure->comment) - 1); | ||
| 217 | } | ||
| 218 | |||
| 219 | /// @brief Get additional information comment (if present). | ||
| 220 | std::string GetComment() const { return m_cStructure->comment; } | ||
| 221 | |||
| 222 | ///@} | ||
| 223 | |||
| 224 | private: | ||
| 225 | AudioDecoderInfoTag(const AUDIO_DECODER_INFO_TAG* tag) : CStructHdl(tag) {} | ||
| 226 | AudioDecoderInfoTag(AUDIO_DECODER_INFO_TAG* tag) : CStructHdl(tag) {} | ||
| 227 | }; | ||
| 228 | ///@} | ||
| 229 | //------------------------------------------------------------------------------ | ||
| 230 | |||
| 231 | //============================================================================== | ||
| 232 | /// @defgroup cpp_kodi_addon_audiodecoder_Defs Definitions, structures and enumerators | ||
| 233 | /// @ingroup cpp_kodi_addon_audiodecoder | ||
| 234 | /// @brief **Audio decoder add-on instance definition values**\n | ||
| 235 | /// All audio decoder functions associated data structures. | ||
| 236 | /// | ||
| 237 | /// Used to exchange the available options between Kodi and addon.\n | ||
| 238 | /// The groups described here correspond to the groups of functions on audio | ||
| 239 | /// decoder instance class. | ||
| 240 | /// | ||
| 241 | |||
| 242 | //============================================================================== | ||
| 243 | /// | ||
| 244 | /// \addtogroup cpp_kodi_addon_audiodecoder | ||
| 245 | /// @brief \cpp_class{ kodi::addon::CInstanceAudioDecoder } | ||
| 246 | /// **Audio decoder add-on instance** | ||
| 247 | /// | ||
| 248 | /// For audio decoders as binary add-ons. This class implements a way to handle | ||
| 249 | /// special types of audio files. | ||
| 250 | /// | ||
| 251 | /// The add-on handles loading of the source file and outputting the audio stream | ||
| 252 | /// for consumption by the player. | ||
| 253 | /// | ||
| 254 | /// The addon.xml defines the capabilities of this add-on. | ||
| 255 | /// | ||
| 256 | /// @note The option to have multiple instances is possible with audio-decoder | ||
| 257 | /// add-ons. This is useful, since some playback engines are riddled by global | ||
| 258 | /// variables, making decoding of multiple streams using the same instance | ||
| 259 | /// impossible. | ||
| 260 | /// | ||
| 261 | /// | ||
| 262 | /// ---------------------------------------------------------------------------- | ||
| 263 | /// | ||
| 264 | /// **Here's an example on addon.xml:** | ||
| 265 | /// ~~~~~~~~~~~~~{.xml} | ||
| 266 | /// <?xml version="1.0" encoding="UTF-8"?> | ||
| 267 | /// <addon | ||
| 268 | /// id="audiodecoder.myspecialnamefor" | ||
| 269 | /// version="1.0.0" | ||
| 270 | /// name="My special audio decoder addon" | ||
| 271 | /// provider-name="Your Name"> | ||
| 272 | /// <requires>@ADDON_DEPENDS@</requires> | ||
| 273 | /// <extension | ||
| 274 | /// point="kodi.audiodecoder" | ||
| 275 | /// name="2sf" | ||
| 276 | /// extension=".2sf|.mini2sf" | ||
| 277 | /// tags="true" | ||
| 278 | /// library_@PLATFORM@="@LIBRARY_FILENAME@"/> | ||
| 279 | /// <extension point="xbmc.addon.metadata"> | ||
| 280 | /// <summary lang="en_GB">My audio decoder addon addon</summary> | ||
| 281 | /// <description lang="en_GB">My audio decoder addon description</description> | ||
| 282 | /// <platform>@PLATFORM@</platform> | ||
| 283 | /// </extension> | ||
| 284 | /// </addon> | ||
| 285 | /// ~~~~~~~~~~~~~ | ||
| 286 | /// | ||
| 287 | /// Description to audio decoder related addon.xml values: | ||
| 288 | /// | Name | Description | ||
| 289 | /// |:------------------------------|---------------------------------------- | ||
| 290 | /// | <b>`point`</b> | Addon type specification<br>At all addon types and for this kind always <b>"kodi.audiodecoder"</b>. | ||
| 291 | /// | <b>`library_@PLATFORM@`</b> | Sets the used library name, which is automatically set by cmake at addon build. | ||
| 292 | /// | <b>`name`</b> | The name of the decoder used in Kodi for display. | ||
| 293 | /// | <b>`extension`</b> | The file extensions / styles supported by this addon. | ||
| 294 | /// | <b>`tags`</b> | Boolean to point out that addon can bring own information to replayed file, if <b>`false`</b> only the file name is used as info.<br>If <b>`true`</b>, \ref CInstanceAudioDecoder::ReadTag is used and must be implemented. | ||
| 295 | /// | ||
| 296 | /// -------------------------------------------------------------------------- | ||
| 297 | /// | ||
| 298 | /// **Here is a code example how this addon is used:** | ||
| 299 | /// | ||
| 300 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 301 | /// #include <kodi/addon-instance/AudioDecoder.h> | ||
| 302 | /// | ||
| 303 | /// class CMyAudioDecoder : public kodi::addon::CInstanceAudioDecoder | ||
| 304 | /// { | ||
| 305 | /// public: | ||
| 306 | /// CMyAudioDecoder(KODI_HANDLE instance, const std::string& version); | ||
| 307 | /// | ||
| 308 | /// bool Init(const std::string& filename, unsigned int filecache, | ||
| 309 | /// int& channels, int& samplerate, | ||
| 310 | /// int& bitspersample, int64_t& totaltime, | ||
| 311 | /// int& bitrate, AudioEngineDataFormat& format, | ||
| 312 | /// std::vector<AudioEngineChannel>& channellist) override; | ||
| 313 | /// int ReadPCM(uint8_t* buffer, int size, int& actualsize) override; | ||
| 314 | /// }; | ||
| 315 | /// | ||
| 316 | /// CMyAudioDecoder::CMyAudioDecoder(KODI_HANDLE instance, const std::string& version) | ||
| 317 | /// : kodi::addon::CInstanceAudioDecoder(instance, version) | ||
| 318 | /// { | ||
| 319 | /// ... | ||
| 320 | /// } | ||
| 321 | /// | ||
| 322 | /// bool CMyAudioDecoder::Init(const std::string& filename, unsigned int filecache, | ||
| 323 | /// int& channels, int& samplerate, | ||
| 324 | /// int& bitspersample, int64_t& totaltime, | ||
| 325 | /// int& bitrate, AudioEngineDataFormat& format, | ||
| 326 | /// std::vector<AudioEngineChannel>& channellist) | ||
| 327 | /// { | ||
| 328 | /// ... | ||
| 329 | /// return true; | ||
| 330 | /// } | ||
| 331 | /// | ||
| 332 | /// int CMyAudioDecoder::ReadPCM(uint8_t* buffer, int size, int& actualsize) | ||
| 333 | /// { | ||
| 334 | /// ... | ||
| 335 | /// return 0; | ||
| 336 | /// } | ||
| 337 | /// | ||
| 338 | /// | ||
| 339 | /// //---------------------------------------------------------------------- | ||
| 340 | /// | ||
| 341 | /// class CMyAddon : public kodi::addon::CAddonBase | ||
| 342 | /// { | ||
| 343 | /// public: | ||
| 344 | /// CMyAddon() { } | ||
| 345 | /// ADDON_STATUS CreateInstance(int instanceType, | ||
| 346 | /// const std::string& instanceID, | ||
| 347 | /// KODI_HANDLE instance, | ||
| 348 | /// const std::string& version, | ||
| 349 | /// KODI_HANDLE& addonInstance) override; | ||
| 350 | /// }; | ||
| 351 | /// | ||
| 352 | /// // If you use only one instance in your add-on, can be instanceType and | ||
| 353 | /// // instanceID ignored | ||
| 354 | /// ADDON_STATUS CMyAddon::CreateInstance(int instanceType, | ||
| 355 | /// const std::string& instanceID, | ||
| 356 | /// KODI_HANDLE instance, | ||
| 357 | /// const std::string& version, | ||
| 358 | /// KODI_HANDLE& addonInstance) | ||
| 359 | /// { | ||
| 360 | /// if (instanceType == ADDON_INSTANCE_AUDIODECODER) | ||
| 361 | /// { | ||
| 362 | /// kodi::Log(ADDON_LOG_INFO, "Creating my audio decoder"); | ||
| 363 | /// addonInstance = new CMyAudioDecoder(instance, version); | ||
| 364 | /// return ADDON_STATUS_OK; | ||
| 365 | /// } | ||
| 366 | /// else if (...) | ||
| 367 | /// { | ||
| 368 | /// ... | ||
| 369 | /// } | ||
| 370 | /// return ADDON_STATUS_UNKNOWN; | ||
| 371 | /// } | ||
| 372 | /// | ||
| 373 | /// ADDONCREATOR(CMyAddon) | ||
| 374 | /// ~~~~~~~~~~~~~ | ||
| 375 | /// | ||
| 376 | /// The destruction of the example class `CMyAudioDecoder` is called from | ||
| 377 | /// Kodi's header. Manually deleting the add-on instance is not required. | ||
| 378 | /// | ||
| 379 | class ATTRIBUTE_HIDDEN CInstanceAudioDecoder : public IAddonInstance | ||
| 380 | { | ||
| 381 | public: | ||
| 382 | //========================================================================== | ||
| 383 | /// @ingroup cpp_kodi_addon_audiodecoder | ||
| 384 | /// @brief Audio decoder class constructor used to support multiple instance | ||
| 385 | /// types. | ||
| 386 | /// | ||
| 387 | /// @param[in] instance The instance value given to | ||
| 388 | /// <b>`kodi::addon::CAddonBase::CreateInstance(...)`</b>. | ||
| 389 | /// @param[in] kodiVersion [opt] Version used in Kodi for this instance, to | ||
| 390 | /// allow compatibility to older Kodi versions. | ||
| 391 | /// | ||
| 392 | /// @note Recommended to set <b>`kodiVersion`</b>. | ||
| 393 | /// | ||
| 394 | /// | ||
| 395 | /// -------------------------------------------------------------------------- | ||
| 396 | /// | ||
| 397 | /// **Here's example about the use of this:** | ||
| 398 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 399 | /// class CMyAudioDecoder : public kodi::addon::CInstanceAudioDecoder | ||
| 400 | /// { | ||
| 401 | /// public: | ||
| 402 | /// CMyAudioDecoder(KODI_HANDLE instance, const std::string& kodiVersion) | ||
| 403 | /// : kodi::addon::CInstanceAudioDecoder(instance, kodiVersion) | ||
| 404 | /// { | ||
| 405 | /// ... | ||
| 406 | /// } | ||
| 407 | /// | ||
| 408 | /// ... | ||
| 409 | /// }; | ||
| 410 | /// | ||
| 411 | /// ADDON_STATUS CMyAddon::CreateInstance(int instanceType, | ||
| 412 | /// const std::string& instanceID, | ||
| 413 | /// KODI_HANDLE instance, | ||
| 414 | /// const std::string& version, | ||
| 415 | /// KODI_HANDLE& addonInstance) | ||
| 416 | /// { | ||
| 417 | /// kodi::Log(ADDON_LOG_INFO, "Creating my audio decoder"); | ||
| 418 | /// addonInstance = new CMyAudioDecoder(instance, version); | ||
| 419 | /// return ADDON_STATUS_OK; | ||
| 420 | /// } | ||
| 421 | /// ~~~~~~~~~~~~~ | ||
| 422 | /// | ||
| 423 | explicit CInstanceAudioDecoder(KODI_HANDLE instance, const std::string& kodiVersion = "") | ||
| 424 | : IAddonInstance(ADDON_INSTANCE_AUDIODECODER, | ||
| 425 | !kodiVersion.empty() ? kodiVersion | ||
| 426 | : GetKodiTypeVersion(ADDON_INSTANCE_AUDIODECODER)) | ||
| 427 | { | ||
| 428 | if (CAddonBase::m_interface->globalSingleInstance != nullptr) | ||
| 429 | throw std::logic_error("kodi::addon::CInstanceAudioDecoder: Creation of multiple together with single instance way is not allowed!"); | ||
| 430 | |||
| 431 | SetAddonStruct(instance); | ||
| 432 | } | ||
| 433 | //-------------------------------------------------------------------------- | ||
| 434 | |||
| 435 | //========================================================================== | ||
| 436 | /// @ingroup cpp_kodi_addon_audiodecoder | ||
| 437 | /// @brief Initialize a decoder. | ||
| 438 | /// | ||
| 439 | /// @param[in] filename The file to read | ||
| 440 | /// @param[in] filecache The file cache size | ||
| 441 | /// @param[out] channels Number of channels in output stream | ||
| 442 | /// @param[out] samplerate Samplerate of output stream | ||
| 443 | /// @param[out] bitspersample Bits per sample in output stream | ||
| 444 | /// @param[out] totaltime Total time for stream | ||
| 445 | /// @param[out] bitrate Average bitrate of input stream | ||
| 446 | /// @param[out] format Data format for output stream, see | ||
| 447 | /// @ref cpp_kodi_audioengine_Defs_AudioEngineFormat for | ||
| 448 | /// available values | ||
| 449 | /// @param[out] channellist Channel mapping for output streamm, see | ||
| 450 | /// @ref cpp_kodi_audioengine_Defs_AudioEngineChannel | ||
| 451 | /// for available values | ||
| 452 | /// @return true if successfully done, otherwise false | ||
| 453 | /// | ||
| 454 | virtual bool Init(const std::string& filename, | ||
| 455 | unsigned int filecache, | ||
| 456 | int& channels, | ||
| 457 | int& samplerate, | ||
| 458 | int& bitspersample, | ||
| 459 | int64_t& totaltime, | ||
| 460 | int& bitrate, | ||
| 461 | AudioEngineDataFormat& format, | ||
| 462 | std::vector<AudioEngineChannel>& channellist) = 0; | ||
| 463 | //-------------------------------------------------------------------------- | ||
| 464 | |||
| 465 | //========================================================================== | ||
| 466 | /// @ingroup cpp_kodi_addon_audiodecoder | ||
| 467 | /// @brief Produce some noise. | ||
| 468 | /// | ||
| 469 | /// @param[in] buffer Output buffer | ||
| 470 | /// @param[in] size Size of output buffer | ||
| 471 | /// @param[out] actualsize Actual number of bytes written to output buffer | ||
| 472 | /// @return Return with following possible values: | ||
| 473 | /// | Value | Description | ||
| 474 | /// |:-----:|:------------ | ||
| 475 | /// | 0 | on success | ||
| 476 | /// | -1 | on end of stream | ||
| 477 | /// | 1 | on failure | ||
| 478 | /// | ||
| 479 | virtual int ReadPCM(uint8_t* buffer, int size, int& actualsize) = 0; | ||
| 480 | //-------------------------------------------------------------------------- | ||
| 481 | |||
| 482 | //========================================================================== | ||
| 483 | /// @ingroup cpp_kodi_addon_audiodecoder | ||
| 484 | /// @brief Seek in output stream. | ||
| 485 | /// | ||
| 486 | /// @param[in] time Time position to seek to in milliseconds | ||
| 487 | /// @return Time position seek ended up on | ||
| 488 | /// | ||
| 489 | virtual int64_t Seek(int64_t time) { return time; } | ||
| 490 | //-------------------------------------------------------------------------- | ||
| 491 | |||
| 492 | //========================================================================== | ||
| 493 | /// @ingroup cpp_kodi_addon_audiodecoder | ||
| 494 | /// @brief Read tag of a file. | ||
| 495 | /// | ||
| 496 | /// @param[in] file File to read tag for | ||
| 497 | /// @param[out] tag Information tag about | ||
| 498 | /// @return True on success, false on failure | ||
| 499 | /// | ||
| 500 | /// -------------------------------------------------------------------------- | ||
| 501 | /// | ||
| 502 | /// @copydetails cpp_kodi_addon_audiodecoder_Defs_AudioDecoderInfoTag_Help | ||
| 503 | /// | ||
| 504 | virtual bool ReadTag(const std::string& file, kodi::addon::AudioDecoderInfoTag& tag) | ||
| 505 | { | ||
| 506 | return false; | ||
| 507 | } | ||
| 508 | //-------------------------------------------------------------------------- | ||
| 509 | |||
| 510 | //========================================================================== | ||
| 511 | /// @ingroup cpp_kodi_addon_audiodecoder | ||
| 512 | /// @brief Get number of tracks in a file. | ||
| 513 | /// | ||
| 514 | /// @param[in] file File to read tag for | ||
| 515 | /// @return Number of tracks in file | ||
| 516 | /// | ||
| 517 | virtual int TrackCount(const std::string& file) { return 1; } | ||
| 518 | //-------------------------------------------------------------------------- | ||
| 519 | |||
| 520 | private: | ||
| 521 | void SetAddonStruct(KODI_HANDLE instance) | ||
| 522 | { | ||
| 523 | if (instance == nullptr) | ||
| 524 | throw std::logic_error("kodi::addon::CInstanceAudioDecoder: Creation with empty addon structure not allowed, table must be given from Kodi!"); | ||
| 525 | |||
| 526 | m_instanceData = static_cast<AddonInstance_AudioDecoder*>(instance); | ||
| 527 | |||
| 528 | m_instanceData->toAddon->addonInstance = this; | ||
| 529 | m_instanceData->toAddon->init = ADDON_Init; | ||
| 530 | m_instanceData->toAddon->read_pcm = ADDON_ReadPCM; | ||
| 531 | m_instanceData->toAddon->seek = ADDON_Seek; | ||
| 532 | m_instanceData->toAddon->read_tag = ADDON_ReadTag; | ||
| 533 | m_instanceData->toAddon->track_count = ADDON_TrackCount; | ||
| 534 | } | ||
| 535 | |||
| 536 | inline static bool ADDON_Init(const AddonInstance_AudioDecoder* instance, | ||
| 537 | const char* file, | ||
| 538 | unsigned int filecache, | ||
| 539 | int* channels, | ||
| 540 | int* samplerate, | ||
| 541 | int* bitspersample, | ||
| 542 | int64_t* totaltime, | ||
| 543 | int* bitrate, | ||
| 544 | AudioEngineDataFormat* format, | ||
| 545 | const AudioEngineChannel** info) | ||
| 546 | { | ||
| 547 | CInstanceAudioDecoder* thisClass = | ||
| 548 | static_cast<CInstanceAudioDecoder*>(instance->toAddon->addonInstance); | ||
| 549 | |||
| 550 | thisClass->m_channelList.clear(); | ||
| 551 | bool ret = thisClass->Init(file, filecache, *channels, *samplerate, *bitspersample, *totaltime, | ||
| 552 | *bitrate, *format, thisClass->m_channelList); | ||
| 553 | if (!thisClass->m_channelList.empty()) | ||
| 554 | { | ||
| 555 | if (thisClass->m_channelList.back() != AUDIOENGINE_CH_NULL) | ||
| 556 | thisClass->m_channelList.push_back(AUDIOENGINE_CH_NULL); | ||
| 557 | *info = thisClass->m_channelList.data(); | ||
| 558 | } | ||
| 559 | else | ||
| 560 | *info = nullptr; | ||
| 561 | return ret; | ||
| 562 | } | ||
| 563 | |||
| 564 | inline static int ADDON_ReadPCM(const AddonInstance_AudioDecoder* instance, uint8_t* buffer, int size, int* actualsize) | ||
| 565 | { | ||
| 566 | return static_cast<CInstanceAudioDecoder*>(instance->toAddon->addonInstance) | ||
| 567 | ->ReadPCM(buffer, size, *actualsize); | ||
| 568 | } | ||
| 569 | |||
| 570 | inline static int64_t ADDON_Seek(const AddonInstance_AudioDecoder* instance, int64_t time) | ||
| 571 | { | ||
| 572 | return static_cast<CInstanceAudioDecoder*>(instance->toAddon->addonInstance)->Seek(time); | ||
| 573 | } | ||
| 574 | |||
| 575 | inline static bool ADDON_ReadTag(const AddonInstance_AudioDecoder* instance, | ||
| 576 | const char* file, | ||
| 577 | struct AUDIO_DECODER_INFO_TAG* tag) | ||
| 578 | { | ||
| 579 | kodi::addon::AudioDecoderInfoTag cppTag(tag); | ||
| 580 | return static_cast<CInstanceAudioDecoder*>(instance->toAddon->addonInstance) | ||
| 581 | ->ReadTag(file, cppTag); | ||
| 582 | } | ||
| 583 | |||
| 584 | inline static int ADDON_TrackCount(const AddonInstance_AudioDecoder* instance, const char* file) | ||
| 585 | { | ||
| 586 | return static_cast<CInstanceAudioDecoder*>(instance->toAddon->addonInstance)->TrackCount(file); | ||
| 587 | } | ||
| 588 | |||
| 589 | std::vector<AudioEngineChannel> m_channelList; | ||
| 590 | AddonInstance_AudioDecoder* m_instanceData; | ||
| 591 | }; | ||
| 592 | |||
| 593 | } /* namespace addon */ | ||
| 594 | } /* namespace kodi */ | ||
| 595 | #endif /* __cplusplus */ | ||
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/AudioEncoder.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/AudioEncoder.h new file mode 100644 index 0000000..9a869c1 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/AudioEncoder.h | |||
| @@ -0,0 +1,353 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2005-2018 Team Kodi | ||
| 3 | * This file is part of Kodi - https://kodi.tv | ||
| 4 | * | ||
| 5 | * SPDX-License-Identifier: GPL-2.0-or-later | ||
| 6 | * See LICENSES/README.md for more information. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #pragma once | ||
| 10 | |||
| 11 | #include "../AddonBase.h" | ||
| 12 | #include "../c-api/addon-instance/audio_encoder.h" | ||
| 13 | |||
| 14 | #ifdef __cplusplus | ||
| 15 | namespace kodi | ||
| 16 | { | ||
| 17 | namespace addon | ||
| 18 | { | ||
| 19 | |||
| 20 | //============================================================================== | ||
| 21 | /// @addtogroup cpp_kodi_addon_audioencoder | ||
| 22 | /// @brief \cpp_class{ kodi::addon::CInstanceAudioEncoder } | ||
| 23 | /// **Audio encoder add-on instance.**\n | ||
| 24 | /// For audio encoders as binary add-ons. This class implements a way to handle | ||
| 25 | /// the encode of given stream to a new format. | ||
| 26 | /// | ||
| 27 | /// The addon.xml defines the capabilities of this add-on. | ||
| 28 | /// | ||
| 29 | /// | ||
| 30 | /// ---------------------------------------------------------------------------- | ||
| 31 | /// | ||
| 32 | /// **Here's an example on addon.xml:** | ||
| 33 | /// ~~~~~~~~~~~~~{.xml} | ||
| 34 | /// <extension | ||
| 35 | /// point="kodi.audioencoder" | ||
| 36 | /// extension=".flac" | ||
| 37 | /// library_@PLATFORM@="@LIBRARY_FILENAME@"/> | ||
| 38 | /// ~~~~~~~~~~~~~ | ||
| 39 | /// | ||
| 40 | /// Description to audio encoder related addon.xml values: | ||
| 41 | /// | Name | Description | ||
| 42 | /// |:------------------------------|---------------------------------------- | ||
| 43 | /// | <b>`point`</b> | Addon type specification<br>At all addon types and for this kind always <b>"kodi.audioencoder"</b>. | ||
| 44 | /// | <b>`library_@PLATFORM@`</b> | Sets the used library name, which is automatically set by cmake at addon build. | ||
| 45 | /// | <b>`extension`</b> | The file extensions / styles supported by this addon. | ||
| 46 | /// | ||
| 47 | /// -------------------------------------------------------------------------- | ||
| 48 | /// | ||
| 49 | /// -------------------------------------------------------------------------- | ||
| 50 | /// | ||
| 51 | /// **Here is a code example how this addon is used:** | ||
| 52 | /// | ||
| 53 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 54 | /// #include <kodi/addon-instance/AudioEncoder.h> | ||
| 55 | /// | ||
| 56 | /// class ATTRIBUTE_HIDDEN CMyAudioEncoder : public kodi::addon::CInstanceAudioEncoder | ||
| 57 | /// { | ||
| 58 | /// public: | ||
| 59 | /// CMyAudioEncoder(KODI_HANDLE instance, const std::string& kodiVersion) | ||
| 60 | /// : kodi::addon::CInstanceAudioEncoder(instance, kodiVersion) | ||
| 61 | /// | ||
| 62 | /// bool Init(const std::string& filename, unsigned int filecache, | ||
| 63 | /// int& channels, int& samplerate, | ||
| 64 | /// int& bitspersample, int64_t& totaltime, | ||
| 65 | /// int& bitrate, AEDataFormat& format, | ||
| 66 | /// std::vector<AEChannel>& channellist) override; | ||
| 67 | /// int Encode(int numBytesRead, const uint8_t* pbtStream) override; | ||
| 68 | /// bool Finish() override; // Optional | ||
| 69 | /// }; | ||
| 70 | /// | ||
| 71 | /// CMyAudioEncoder::CMyAudioEncoder(KODI_HANDLE instance) | ||
| 72 | /// : kodi::addon::CInstanceAudioEncoder(instance) | ||
| 73 | /// { | ||
| 74 | /// ... | ||
| 75 | /// } | ||
| 76 | /// | ||
| 77 | /// bool CMyAudioEncoder::Start(int inChannels, | ||
| 78 | /// int inRate, | ||
| 79 | /// int inBits, | ||
| 80 | /// const std::string& title, | ||
| 81 | /// const std::string& artist, | ||
| 82 | /// const std::string& albumartist, | ||
| 83 | /// const std::string& album, | ||
| 84 | /// const std::string& year, | ||
| 85 | /// const std::string& track, | ||
| 86 | /// const std::string& genre, | ||
| 87 | /// const std::string& comment, | ||
| 88 | /// int trackLength) | ||
| 89 | /// { | ||
| 90 | /// ... | ||
| 91 | /// return true; | ||
| 92 | /// } | ||
| 93 | /// | ||
| 94 | /// int CMyAudioEncoder::Encode(int numBytesRead, const uint8_t* pbtStream) | ||
| 95 | /// { | ||
| 96 | /// uint8_t* data = nullptr; | ||
| 97 | /// int length = 0; | ||
| 98 | /// ... | ||
| 99 | /// kodi::addon::CInstanceAudioEncoder::Write(data, length); | ||
| 100 | /// | ||
| 101 | /// return 0; | ||
| 102 | /// } | ||
| 103 | /// | ||
| 104 | /// | ||
| 105 | /// bool CMyAudioEncoder::Finish() | ||
| 106 | /// { | ||
| 107 | /// ... | ||
| 108 | /// return true; | ||
| 109 | /// } | ||
| 110 | /// | ||
| 111 | /// //---------------------------------------------------------------------- | ||
| 112 | /// | ||
| 113 | /// class CMyAddon : public kodi::addon::CAddonBase | ||
| 114 | /// { | ||
| 115 | /// public: | ||
| 116 | /// CMyAddon() = default; | ||
| 117 | /// ADDON_STATUS CreateInstance(int instanceType, | ||
| 118 | /// const std::string& instanceID, | ||
| 119 | /// KODI_HANDLE instance, | ||
| 120 | /// const std::string& version, | ||
| 121 | /// KODI_HANDLE& addonInstance) override; | ||
| 122 | /// }; | ||
| 123 | /// | ||
| 124 | /// // If you use only one instance in your add-on, can be instanceType and | ||
| 125 | /// // instanceID ignored | ||
| 126 | /// ADDON_STATUS CMyAddon::CreateInstance(int instanceType, | ||
| 127 | /// const std::string& instanceID, | ||
| 128 | /// KODI_HANDLE instance, | ||
| 129 | /// const std::string& version, | ||
| 130 | /// KODI_HANDLE& addonInstance) | ||
| 131 | /// { | ||
| 132 | /// if (instanceType == ADDON_INSTANCE_AUDIOENCODER) | ||
| 133 | /// { | ||
| 134 | /// kodi::Log(ADDON_LOG_INFO, "Creating my audio encoder instance"); | ||
| 135 | /// addonInstance = new CMyAudioEncoder(instance, version); | ||
| 136 | /// return ADDON_STATUS_OK; | ||
| 137 | /// } | ||
| 138 | /// else if (...) | ||
| 139 | /// { | ||
| 140 | /// ... | ||
| 141 | /// } | ||
| 142 | /// return ADDON_STATUS_UNKNOWN; | ||
| 143 | /// } | ||
| 144 | /// | ||
| 145 | /// ADDONCREATOR(CMyAddon) | ||
| 146 | /// ~~~~~~~~~~~~~ | ||
| 147 | /// | ||
| 148 | /// The destruction of the example class `CMyAudioEncoder` is called from | ||
| 149 | /// Kodi's header. Manually deleting the add-on instance is not required. | ||
| 150 | /// | ||
| 151 | class ATTRIBUTE_HIDDEN CInstanceAudioEncoder : public IAddonInstance | ||
| 152 | { | ||
| 153 | public: | ||
| 154 | //============================================================================ | ||
| 155 | /// @ingroup cpp_kodi_addon_audioencoder | ||
| 156 | /// @brief Audio encoder class constructor used to support multiple instances. | ||
| 157 | /// | ||
| 158 | /// @param[in] instance The instance value given to | ||
| 159 | /// <b>`kodi::addon::CAddonBase::CreateInstance(...)`</b>. | ||
| 160 | /// @param[in] kodiVersion [opt] Version used in Kodi for this instance, to | ||
| 161 | /// allow compatibility to older Kodi versions. | ||
| 162 | /// | ||
| 163 | /// @note Recommended to set <b>`kodiVersion`</b>. | ||
| 164 | /// | ||
| 165 | /// | ||
| 166 | /// -------------------------------------------------------------------------- | ||
| 167 | /// | ||
| 168 | /// **Here's example about the use of this:** | ||
| 169 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 170 | /// class CMyAudioEncoder : public kodi::addon::CInstanceAudioEncoder | ||
| 171 | /// { | ||
| 172 | /// public: | ||
| 173 | /// CMyAudioEncoder(KODI_HANDLE instance, const std::string& kodiVersion) | ||
| 174 | /// : kodi::addon::CInstanceAudioEncoder(instance, kodiVersion) | ||
| 175 | /// { | ||
| 176 | /// ... | ||
| 177 | /// } | ||
| 178 | /// | ||
| 179 | /// ... | ||
| 180 | /// }; | ||
| 181 | /// | ||
| 182 | /// ADDON_STATUS CMyAddon::CreateInstance(int instanceType, | ||
| 183 | /// const std::string& instanceID, | ||
| 184 | /// KODI_HANDLE instance, | ||
| 185 | /// const std::string& version, | ||
| 186 | /// KODI_HANDLE& addonInstance) | ||
| 187 | /// { | ||
| 188 | /// kodi::Log(ADDON_LOG_INFO, "Creating my audio encoder instance"); | ||
| 189 | /// addonInstance = new CMyAudioEncoder(instance, version); | ||
| 190 | /// return ADDON_STATUS_OK; | ||
| 191 | /// } | ||
| 192 | /// ~~~~~~~~~~~~~ | ||
| 193 | /// | ||
| 194 | explicit CInstanceAudioEncoder(KODI_HANDLE instance, const std::string& kodiVersion = "") | ||
| 195 | : IAddonInstance(ADDON_INSTANCE_AUDIOENCODER, | ||
| 196 | !kodiVersion.empty() ? kodiVersion | ||
| 197 | : GetKodiTypeVersion(ADDON_INSTANCE_AUDIOENCODER)) | ||
| 198 | { | ||
| 199 | if (CAddonBase::m_interface->globalSingleInstance != nullptr) | ||
| 200 | throw std::logic_error("kodi::addon::CInstanceAudioEncoder: Creation of multiple together " | ||
| 201 | "with single instance way is not allowed!"); | ||
| 202 | |||
| 203 | SetAddonStruct(instance); | ||
| 204 | } | ||
| 205 | //---------------------------------------------------------------------------- | ||
| 206 | |||
| 207 | //============================================================================ | ||
| 208 | /// @ingroup cpp_kodi_addon_audioencoder | ||
| 209 | /// @brief Start encoder (**required**) | ||
| 210 | /// | ||
| 211 | /// @param[in] inChannels Number of channels | ||
| 212 | /// @param[in] inRate Sample rate of input data | ||
| 213 | /// @param[in] inBits Bits per sample in input data | ||
| 214 | /// @param[in] title The title of the song | ||
| 215 | /// @param[in] artist The artist of the song | ||
| 216 | /// @param[in] albumartist The albumartist of the song | ||
| 217 | /// @param[in] year The year of the song | ||
| 218 | /// @param[in] track The track number of the song | ||
| 219 | /// @param[in] genre The genre of the song | ||
| 220 | /// @param[in] comment A comment to attach to the song | ||
| 221 | /// @param[in] trackLength Total track length in seconds | ||
| 222 | /// @return True on success, false on failure. | ||
| 223 | /// | ||
| 224 | virtual bool Start(int inChannels, | ||
| 225 | int inRate, | ||
| 226 | int inBits, | ||
| 227 | const std::string& title, | ||
| 228 | const std::string& artist, | ||
| 229 | const std::string& albumartist, | ||
| 230 | const std::string& album, | ||
| 231 | const std::string& year, | ||
| 232 | const std::string& track, | ||
| 233 | const std::string& genre, | ||
| 234 | const std::string& comment, | ||
| 235 | int trackLength) = 0; | ||
| 236 | //---------------------------------------------------------------------------- | ||
| 237 | |||
| 238 | //============================================================================ | ||
| 239 | /// @ingroup cpp_kodi_addon_audioencoder | ||
| 240 | /// @brief Encode a chunk of audio (**required**) | ||
| 241 | /// | ||
| 242 | /// @param[in] numBytesRead Number of bytes in input buffer | ||
| 243 | /// @param[in] pbtStream The input buffer | ||
| 244 | /// @return Number of bytes consumed | ||
| 245 | /// | ||
| 246 | virtual int Encode(int numBytesRead, const uint8_t* pbtStream) = 0; | ||
| 247 | //---------------------------------------------------------------------------- | ||
| 248 | |||
| 249 | //============================================================================ | ||
| 250 | /// @ingroup cpp_kodi_addon_audioencoder | ||
| 251 | /// @brief Finalize encoding (**optional**) | ||
| 252 | /// | ||
| 253 | /// @return True on success, false on failure. | ||
| 254 | /// | ||
| 255 | virtual bool Finish() { return true; } | ||
| 256 | //---------------------------------------------------------------------------- | ||
| 257 | |||
| 258 | //============================================================================ | ||
| 259 | /// @ingroup cpp_kodi_addon_audioencoder | ||
| 260 | /// @brief Write block of data | ||
| 261 | /// | ||
| 262 | /// @param[in] data Pointer to the array of elements to be written | ||
| 263 | /// @param[in] length Size in bytes to be written. | ||
| 264 | /// @return The total number of bytes successfully written is returned. | ||
| 265 | /// | ||
| 266 | /// @remarks Only called from addon itself. | ||
| 267 | /// | ||
| 268 | int Write(const uint8_t* data, int length) | ||
| 269 | { | ||
| 270 | return m_instanceData->toKodi->write(m_instanceData->toKodi->kodiInstance, data, length); | ||
| 271 | } | ||
| 272 | //---------------------------------------------------------------------------- | ||
| 273 | |||
| 274 | //============================================================================ | ||
| 275 | /// @ingroup cpp_kodi_addon_audioencoder | ||
| 276 | /// @brief Set the file's current position. | ||
| 277 | /// | ||
| 278 | /// The whence argument is optional and defaults to SEEK_SET (0) | ||
| 279 | /// | ||
| 280 | /// @param[in] position The position that you want to seek to | ||
| 281 | /// @param[in] whence [optional] offset relative to\n | ||
| 282 | /// You can set the value of whence to one | ||
| 283 | /// of three things: | ||
| 284 | /// | Value | int | Description | | ||
| 285 | /// |:--------:|:---:|:---------------------------------------------------| | ||
| 286 | /// | SEEK_SET | 0 | position is relative to the beginning of the file. This is probably what you had in mind anyway, and is the most commonly used value for whence. | ||
| 287 | /// | SEEK_CUR | 1 | position is relative to the current file pointer position. So, in effect, you can say, "Move to my current position plus 30 bytes," or, "move to my current position minus 20 bytes." | ||
| 288 | /// | SEEK_END | 2 | position is relative to the end of the file. Just like SEEK_SET except from the other end of the file. Be sure to use negative values for offset if you want to back up from the end of the file, instead of going past the end into oblivion. | ||
| 289 | /// | ||
| 290 | /// @return Returns the resulting offset location as measured in bytes from | ||
| 291 | /// the beginning of the file. On error, the value -1 is returned. | ||
| 292 | /// | ||
| 293 | /// @remarks Only called from addon itself. | ||
| 294 | /// | ||
| 295 | int64_t Seek(int64_t position, int whence = SEEK_SET) | ||
| 296 | { | ||
| 297 | return m_instanceData->toKodi->seek(m_instanceData->toKodi->kodiInstance, position, whence); | ||
| 298 | } | ||
| 299 | //---------------------------------------------------------------------------- | ||
| 300 | |||
| 301 | private: | ||
| 302 | void SetAddonStruct(KODI_HANDLE instance) | ||
| 303 | { | ||
| 304 | if (instance == nullptr) | ||
| 305 | throw std::logic_error("kodi::addon::CInstanceAudioEncoder: Creation with empty addon " | ||
| 306 | "structure not allowed, table must be given from Kodi!"); | ||
| 307 | |||
| 308 | m_instanceData = static_cast<AddonInstance_AudioEncoder*>(instance); | ||
| 309 | m_instanceData->toAddon->addonInstance = this; | ||
| 310 | m_instanceData->toAddon->start = ADDON_Start; | ||
| 311 | m_instanceData->toAddon->encode = ADDON_Encode; | ||
| 312 | m_instanceData->toAddon->finish = ADDON_Finish; | ||
| 313 | } | ||
| 314 | |||
| 315 | inline static bool ADDON_Start(const AddonInstance_AudioEncoder* instance, | ||
| 316 | int inChannels, | ||
| 317 | int inRate, | ||
| 318 | int inBits, | ||
| 319 | const char* title, | ||
| 320 | const char* artist, | ||
| 321 | const char* albumartist, | ||
| 322 | const char* album, | ||
| 323 | const char* year, | ||
| 324 | const char* track, | ||
| 325 | const char* genre, | ||
| 326 | const char* comment, | ||
| 327 | int trackLength) | ||
| 328 | { | ||
| 329 | return static_cast<CInstanceAudioEncoder*>(instance->toAddon->addonInstance) | ||
| 330 | ->Start(inChannels, inRate, inBits, title, artist, albumartist, album, year, track, genre, | ||
| 331 | comment, trackLength); | ||
| 332 | } | ||
| 333 | |||
| 334 | inline static int ADDON_Encode(const AddonInstance_AudioEncoder* instance, | ||
| 335 | int numBytesRead, | ||
| 336 | const uint8_t* pbtStream) | ||
| 337 | { | ||
| 338 | return static_cast<CInstanceAudioEncoder*>(instance->toAddon->addonInstance) | ||
| 339 | ->Encode(numBytesRead, pbtStream); | ||
| 340 | } | ||
| 341 | |||
| 342 | inline static bool ADDON_Finish(const AddonInstance_AudioEncoder* instance) | ||
| 343 | { | ||
| 344 | return static_cast<CInstanceAudioEncoder*>(instance->toAddon->addonInstance)->Finish(); | ||
| 345 | } | ||
| 346 | |||
| 347 | AddonInstance_AudioEncoder* m_instanceData; | ||
| 348 | }; | ||
| 349 | |||
| 350 | } /* namespace addon */ | ||
| 351 | } /* namespace kodi */ | ||
| 352 | |||
| 353 | #endif /* __cplusplus */ | ||
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/CMakeLists.txt new file mode 100644 index 0000000..a57def3 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/CMakeLists.txt | |||
| @@ -0,0 +1,15 @@ | |||
| 1 | set(HEADERS AudioDecoder.h | ||
| 2 | AudioEncoder.h | ||
| 3 | Game.h | ||
| 4 | ImageDecoder.h | ||
| 5 | Inputstream.h | ||
| 6 | Peripheral.h | ||
| 7 | PVR.h | ||
| 8 | Screensaver.h | ||
| 9 | VFS.h | ||
| 10 | VideoCodec.h | ||
| 11 | Visualization.h) | ||
| 12 | |||
| 13 | if(NOT ENABLE_STATIC_LIBS) | ||
| 14 | core_add_library(addons_kodi-dev-kit_include_kodi_addon-instance) | ||
| 15 | endif() | ||
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Game.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Game.h new file mode 100644 index 0000000..3dca94d --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Game.h | |||
| @@ -0,0 +1,1190 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2014-2018 Team Kodi | ||
| 3 | * This file is part of Kodi - https://kodi.tv | ||
| 4 | * | ||
| 5 | * SPDX-License-Identifier: GPL-2.0-or-later | ||
| 6 | * See LICENSES/README.md for more information. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #pragma once | ||
| 10 | |||
| 11 | #include "../AddonBase.h" | ||
| 12 | #include "../c-api/addon-instance/game.h" | ||
| 13 | |||
| 14 | #ifdef __cplusplus | ||
| 15 | |||
| 16 | namespace kodi | ||
| 17 | { | ||
| 18 | namespace addon | ||
| 19 | { | ||
| 20 | |||
| 21 | //============================================================================== | ||
| 22 | /// @addtogroup cpp_kodi_addon_game | ||
| 23 | /// | ||
| 24 | /// To use on Libretro and for stand-alone games or emulators that does not use | ||
| 25 | /// the Libretro API. | ||
| 26 | /// | ||
| 27 | /// Possible examples could be, Nvidia GameStream via Limelight or WINE capture | ||
| 28 | /// could possible through the Game API. | ||
| 29 | /// | ||
| 30 | |||
| 31 | //============================================================================== | ||
| 32 | /// @defgroup cpp_kodi_addon_game_Defs Definitions, structures and enumerators | ||
| 33 | /// @ingroup cpp_kodi_addon_game | ||
| 34 | /// @brief **Game add-on instance definition values** | ||
| 35 | /// | ||
| 36 | |||
| 37 | //============================================================================== | ||
| 38 | /// @defgroup cpp_kodi_addon_game_Defs_InputTypes_GameControllerLayout class GameControllerLayout | ||
| 39 | /// @ingroup cpp_kodi_addon_game_Defs_InputTypes | ||
| 40 | /// @brief Data of layouts for known controllers. | ||
| 41 | /// | ||
| 42 | /// Used on @ref kodi::addon::CInstanceGame::SetControllerLayouts(). | ||
| 43 | ///@{ | ||
| 44 | class GameControllerLayout | ||
| 45 | { | ||
| 46 | public: | ||
| 47 | /*! @cond PRIVATE */ | ||
| 48 | explicit GameControllerLayout() = default; | ||
| 49 | GameControllerLayout(const game_controller_layout& layout) | ||
| 50 | { | ||
| 51 | controller_id = layout.controller_id; | ||
| 52 | provides_input = layout.provides_input; | ||
| 53 | for (unsigned int i = 0; i < layout.digital_button_count; ++i) | ||
| 54 | digital_buttons.push_back(layout.digital_buttons[i]); | ||
| 55 | for (unsigned int i = 0; i < layout.analog_button_count; ++i) | ||
| 56 | analog_buttons.push_back(layout.analog_buttons[i]); | ||
| 57 | for (unsigned int i = 0; i < layout.analog_stick_count; ++i) | ||
| 58 | analog_sticks.push_back(layout.analog_sticks[i]); | ||
| 59 | for (unsigned int i = 0; i < layout.accelerometer_count; ++i) | ||
| 60 | accelerometers.push_back(layout.accelerometers[i]); | ||
| 61 | for (unsigned int i = 0; i < layout.key_count; ++i) | ||
| 62 | keys.push_back(layout.keys[i]); | ||
| 63 | for (unsigned int i = 0; i < layout.rel_pointer_count; ++i) | ||
| 64 | rel_pointers.push_back(layout.rel_pointers[i]); | ||
| 65 | for (unsigned int i = 0; i < layout.abs_pointer_count; ++i) | ||
| 66 | abs_pointers.push_back(layout.abs_pointers[i]); | ||
| 67 | for (unsigned int i = 0; i < layout.motor_count; ++i) | ||
| 68 | motors.push_back(layout.motors[i]); | ||
| 69 | } | ||
| 70 | /*! @endcond */ | ||
| 71 | |||
| 72 | /// @brief Controller identifier. | ||
| 73 | std::string controller_id; | ||
| 74 | |||
| 75 | /// @brief Provides input. | ||
| 76 | /// | ||
| 77 | /// False for multitaps | ||
| 78 | bool provides_input; | ||
| 79 | |||
| 80 | /// @brief Digital buttons. | ||
| 81 | std::vector<std::string> digital_buttons; | ||
| 82 | |||
| 83 | /// @brief Analog buttons. | ||
| 84 | std::vector<std::string> analog_buttons; | ||
| 85 | |||
| 86 | /// @brief Analog sticks. | ||
| 87 | std::vector<std::string> analog_sticks; | ||
| 88 | |||
| 89 | /// @brief Accelerometers. | ||
| 90 | std::vector<std::string> accelerometers; | ||
| 91 | |||
| 92 | /// @brief Keys. | ||
| 93 | std::vector<std::string> keys; | ||
| 94 | |||
| 95 | /// @brief Relative pointers. | ||
| 96 | std::vector<std::string> rel_pointers; | ||
| 97 | |||
| 98 | /// @brief Absolute pointers. | ||
| 99 | std::vector<std::string> abs_pointers; | ||
| 100 | |||
| 101 | /// @brief Motors. | ||
| 102 | std::vector<std::string> motors; | ||
| 103 | }; | ||
| 104 | ///@} | ||
| 105 | //------------------------------------------------------------------------------ | ||
| 106 | |||
| 107 | //============================================================================== | ||
| 108 | /// @addtogroup cpp_kodi_addon_game | ||
| 109 | /// @brief @cpp_class{ kodi::addon::CInstanceGame } | ||
| 110 | /// **Game add-on instance**\n | ||
| 111 | /// This class provides the basic game processing system for use as an add-on in | ||
| 112 | /// Kodi. | ||
| 113 | /// | ||
| 114 | /// This class is created at addon by Kodi. | ||
| 115 | /// | ||
| 116 | class ATTRIBUTE_HIDDEN CInstanceGame : public IAddonInstance | ||
| 117 | { | ||
| 118 | public: | ||
| 119 | //============================================================================ | ||
| 120 | /// @defgroup cpp_kodi_addon_game_Base 1. Basic functions | ||
| 121 | /// @ingroup cpp_kodi_addon_game | ||
| 122 | /// @brief **Functions to manage the addon and get basic information about it** | ||
| 123 | /// | ||
| 124 | ///@{ | ||
| 125 | |||
| 126 | //============================================================================ | ||
| 127 | /// @brief Game class constructor | ||
| 128 | /// | ||
| 129 | /// Used by an add-on that only supports only Game and only in one instance. | ||
| 130 | /// | ||
| 131 | /// This class is created at addon by Kodi. | ||
| 132 | /// | ||
| 133 | /// | ||
| 134 | /// -------------------------------------------------------------------------- | ||
| 135 | /// | ||
| 136 | /// | ||
| 137 | /// **Here's example about the use of this:** | ||
| 138 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 139 | /// #include <kodi/addon-instance/Game.h> | ||
| 140 | /// ... | ||
| 141 | /// | ||
| 142 | /// class ATTRIBUTE_HIDDEN CGameExample | ||
| 143 | /// : public kodi::addon::CAddonBase, | ||
| 144 | /// public kodi::addon::CInstanceGame | ||
| 145 | /// { | ||
| 146 | /// public: | ||
| 147 | /// CGameExample() | ||
| 148 | /// { | ||
| 149 | /// } | ||
| 150 | /// | ||
| 151 | /// virtual ~CGameExample(); | ||
| 152 | /// { | ||
| 153 | /// } | ||
| 154 | /// | ||
| 155 | /// ... | ||
| 156 | /// }; | ||
| 157 | /// | ||
| 158 | /// ADDONCREATOR(CGameExample) | ||
| 159 | /// ~~~~~~~~~~~~~ | ||
| 160 | /// | ||
| 161 | CInstanceGame() : IAddonInstance(ADDON_INSTANCE_GAME, GetKodiTypeVersion(ADDON_INSTANCE_GAME)) | ||
| 162 | { | ||
| 163 | if (CAddonBase::m_interface->globalSingleInstance != nullptr) | ||
| 164 | throw std::logic_error("kodi::addon::CInstanceGame: Creation of more as one in single " | ||
| 165 | "instance way is not allowed!"); | ||
| 166 | |||
| 167 | SetAddonStruct(CAddonBase::m_interface->firstKodiInstance); | ||
| 168 | CAddonBase::m_interface->globalSingleInstance = this; | ||
| 169 | } | ||
| 170 | //---------------------------------------------------------------------------- | ||
| 171 | |||
| 172 | //============================================================================ | ||
| 173 | /// @brief Destructor | ||
| 174 | /// | ||
| 175 | ~CInstanceGame() override = default; | ||
| 176 | //---------------------------------------------------------------------------- | ||
| 177 | |||
| 178 | //============================================================================ | ||
| 179 | /// @brief **Callback to Kodi Function**\n | ||
| 180 | /// The path of the game client being loaded. | ||
| 181 | /// | ||
| 182 | /// @return the used game client Dll path | ||
| 183 | /// | ||
| 184 | /// @remarks Only called from addon itself | ||
| 185 | /// | ||
| 186 | std::string GameClientDllPath() const { return m_instanceData->props->game_client_dll_path; } | ||
| 187 | //---------------------------------------------------------------------------- | ||
| 188 | |||
| 189 | //============================================================================ | ||
| 190 | /// @brief **Callback to Kodi Function**\n | ||
| 191 | /// Paths to proxy DLLs used to load the game client. | ||
| 192 | /// | ||
| 193 | /// @param[out] paths vector list to store available dll paths | ||
| 194 | /// @return true if success and dll paths present | ||
| 195 | /// | ||
| 196 | /// @remarks Only called from addon itself | ||
| 197 | /// | ||
| 198 | bool ProxyDllPaths(std::vector<std::string>& paths) | ||
| 199 | { | ||
| 200 | for (unsigned int i = 0; i < m_instanceData->props->proxy_dll_count; ++i) | ||
| 201 | { | ||
| 202 | if (m_instanceData->props->proxy_dll_paths[i] != nullptr) | ||
| 203 | paths.push_back(m_instanceData->props->proxy_dll_paths[i]); | ||
| 204 | } | ||
| 205 | return !paths.empty(); | ||
| 206 | } | ||
| 207 | //---------------------------------------------------------------------------- | ||
| 208 | |||
| 209 | //============================================================================ | ||
| 210 | /// @brief **Callback to Kodi Function**\n | ||
| 211 | /// The "system" directories of the frontend. | ||
| 212 | /// | ||
| 213 | /// These directories can be used to store system-specific ROMs such as | ||
| 214 | /// BIOSes, configuration data, etc. | ||
| 215 | /// | ||
| 216 | /// @return the used resource directory | ||
| 217 | /// | ||
| 218 | /// @remarks Only called from addon itself | ||
| 219 | /// | ||
| 220 | bool ResourceDirectories(std::vector<std::string>& dirs) | ||
| 221 | { | ||
| 222 | for (unsigned int i = 0; i < m_instanceData->props->resource_directory_count; ++i) | ||
| 223 | { | ||
| 224 | if (m_instanceData->props->resource_directories[i] != nullptr) | ||
| 225 | dirs.push_back(m_instanceData->props->resource_directories[i]); | ||
| 226 | } | ||
| 227 | return !dirs.empty(); | ||
| 228 | } | ||
| 229 | //---------------------------------------------------------------------------- | ||
| 230 | |||
| 231 | //============================================================================ | ||
| 232 | /// @brief **Callback to Kodi Function**\n | ||
| 233 | /// The writable directory of the frontend. | ||
| 234 | /// | ||
| 235 | /// This directory can be used to store SRAM, memory cards, high scores, | ||
| 236 | /// etc, if the game client cannot use the regular memory interface, | ||
| 237 | /// GetMemoryData(). | ||
| 238 | /// | ||
| 239 | /// @return the used profile directory | ||
| 240 | /// | ||
| 241 | /// @remarks Only called from addon itself | ||
| 242 | /// | ||
| 243 | std::string ProfileDirectory() const { return m_instanceData->props->profile_directory; } | ||
| 244 | //---------------------------------------------------------------------------- | ||
| 245 | |||
| 246 | //============================================================================ | ||
| 247 | /// @brief **Callback to Kodi Function**\n | ||
| 248 | /// The value of the <supports_vfs> property from addon.xml. | ||
| 249 | /// | ||
| 250 | /// @return true if VFS is supported | ||
| 251 | /// | ||
| 252 | /// @remarks Only called from addon itself | ||
| 253 | /// | ||
| 254 | bool SupportsVFS() const { return m_instanceData->props->supports_vfs; } | ||
| 255 | //---------------------------------------------------------------------------- | ||
| 256 | |||
| 257 | //============================================================================ | ||
| 258 | /// @brief **Callback to Kodi Function**\n | ||
| 259 | /// The extensions in the <extensions> property from addon.xml. | ||
| 260 | /// | ||
| 261 | /// @param[out] extensions vector list to store available extension | ||
| 262 | /// @return true if success and extensions present | ||
| 263 | /// | ||
| 264 | /// @remarks Only called from addon itself | ||
| 265 | /// | ||
| 266 | bool Extensions(std::vector<std::string>& extensions) | ||
| 267 | { | ||
| 268 | for (unsigned int i = 0; i < m_instanceData->props->extension_count; ++i) | ||
| 269 | { | ||
| 270 | if (m_instanceData->props->extensions[i] != nullptr) | ||
| 271 | extensions.push_back(m_instanceData->props->extensions[i]); | ||
| 272 | } | ||
| 273 | return !extensions.empty(); | ||
| 274 | } | ||
| 275 | //---------------------------------------------------------------------------- | ||
| 276 | |||
| 277 | ///@} | ||
| 278 | |||
| 279 | //--==----==----==----==----==----==----==----==----==----==----==----==----==-- | ||
| 280 | |||
| 281 | //============================================================================ | ||
| 282 | /// | ||
| 283 | /// @defgroup cpp_kodi_addon_game_Operation 2. Game operations | ||
| 284 | /// @ingroup cpp_kodi_addon_game | ||
| 285 | /// @brief **Game operations** | ||
| 286 | /// | ||
| 287 | /// These are mandatory functions for using this addon to get the available | ||
| 288 | /// channels. | ||
| 289 | /// | ||
| 290 | /// | ||
| 291 | ///--------------------------------------------------------------------------- | ||
| 292 | /// | ||
| 293 | /// **Game operation parts in interface:**\n | ||
| 294 | /// Copy this to your project and extend with your parts or leave functions | ||
| 295 | /// complete away where not used or supported. | ||
| 296 | /// | ||
| 297 | /// @copydetails cpp_kodi_addon_game_Operation_header_addon_auto_check | ||
| 298 | /// @copydetails cpp_kodi_addon_game_Operation_source_addon_auto_check | ||
| 299 | /// | ||
| 300 | ///@{ | ||
| 301 | |||
| 302 | //============================================================================ | ||
| 303 | /// @brief Load a game | ||
| 304 | /// | ||
| 305 | /// @param[in] url The URL to load | ||
| 306 | /// @return the error, or @ref GAME_ERROR_NO_ERROR if the game was loaded | ||
| 307 | /// | ||
| 308 | virtual GAME_ERROR LoadGame(const std::string& url) | ||
| 309 | { | ||
| 310 | return GAME_ERROR_NOT_IMPLEMENTED; | ||
| 311 | } | ||
| 312 | //---------------------------------------------------------------------------- | ||
| 313 | |||
| 314 | //============================================================================ | ||
| 315 | /// @brief Load a game that requires multiple files | ||
| 316 | /// | ||
| 317 | /// @param[in] type The game type | ||
| 318 | /// @param[in] urls An array of urls | ||
| 319 | /// @return the error, or @ref GAME_ERROR_NO_ERROR if the game was loaded | ||
| 320 | /// | ||
| 321 | virtual GAME_ERROR LoadGameSpecial(SPECIAL_GAME_TYPE type, const std::vector<std::string>& urls) | ||
| 322 | { | ||
| 323 | return GAME_ERROR_NOT_IMPLEMENTED; | ||
| 324 | } | ||
| 325 | //---------------------------------------------------------------------------- | ||
| 326 | |||
| 327 | //============================================================================ | ||
| 328 | /// @brief Begin playing without a game file | ||
| 329 | /// | ||
| 330 | /// If the add-on supports standalone mode, it must add the <supports_standalone> | ||
| 331 | /// tag to the extension point in addon.xml: | ||
| 332 | /// | ||
| 333 | /// <supports_no_game>false</supports_no_game> | ||
| 334 | /// | ||
| 335 | /// @return the error, or @ref GAME_ERROR_NO_ERROR if the game add-on was loaded | ||
| 336 | /// | ||
| 337 | virtual GAME_ERROR LoadStandalone() | ||
| 338 | { | ||
| 339 | return GAME_ERROR_NOT_IMPLEMENTED; | ||
| 340 | } | ||
| 341 | //---------------------------------------------------------------------------- | ||
| 342 | |||
| 343 | //============================================================================ | ||
| 344 | /// @brief Unload the current game | ||
| 345 | /// | ||
| 346 | /// Unloads a currently loaded game | ||
| 347 | /// | ||
| 348 | /// @return the error, or @ref GAME_ERROR_NO_ERROR if the game was unloaded | ||
| 349 | /// | ||
| 350 | virtual GAME_ERROR UnloadGame() | ||
| 351 | { | ||
| 352 | return GAME_ERROR_NOT_IMPLEMENTED; | ||
| 353 | } | ||
| 354 | //---------------------------------------------------------------------------- | ||
| 355 | |||
| 356 | //============================================================================ | ||
| 357 | /// @brief Get timing information about the loaded game | ||
| 358 | /// | ||
| 359 | /// @param[out] timing_info The info structure to fill | ||
| 360 | /// | ||
| 361 | /// @return the error, or @ref GAME_ERROR_NO_ERROR if info was filled | ||
| 362 | /// | ||
| 363 | virtual GAME_ERROR GetGameTiming(game_system_timing& timing_info) | ||
| 364 | { | ||
| 365 | return GAME_ERROR_NOT_IMPLEMENTED; | ||
| 366 | } | ||
| 367 | //---------------------------------------------------------------------------- | ||
| 368 | |||
| 369 | //============================================================================ | ||
| 370 | /// @brief Get region of the loaded game | ||
| 371 | /// | ||
| 372 | /// @return the region, or @ref GAME_REGION_UNKNOWN if unknown or no game is loaded | ||
| 373 | /// | ||
| 374 | virtual GAME_REGION GetRegion() | ||
| 375 | { | ||
| 376 | return GAME_REGION_UNKNOWN; | ||
| 377 | } | ||
| 378 | //---------------------------------------------------------------------------- | ||
| 379 | |||
| 380 | //============================================================================ | ||
| 381 | /// @brief Return true if the client requires the frontend to provide a game loop | ||
| 382 | /// | ||
| 383 | /// The game loop is a thread that calls RunFrame() in a loop at a rate | ||
| 384 | /// determined by the playback speed and the client's FPS. | ||
| 385 | /// | ||
| 386 | /// @return true if the frontend should provide a game loop, false otherwise | ||
| 387 | /// | ||
| 388 | virtual bool RequiresGameLoop() | ||
| 389 | { | ||
| 390 | return false; | ||
| 391 | } | ||
| 392 | //---------------------------------------------------------------------------- | ||
| 393 | |||
| 394 | //============================================================================ | ||
| 395 | /// @brief Run a single frame for add-ons that use a game loop | ||
| 396 | /// | ||
| 397 | /// @return the error, or @ref GAME_ERROR_NO_ERROR if there was no error | ||
| 398 | /// | ||
| 399 | virtual GAME_ERROR RunFrame() | ||
| 400 | { | ||
| 401 | return GAME_ERROR_NOT_IMPLEMENTED; | ||
| 402 | } | ||
| 403 | //---------------------------------------------------------------------------- | ||
| 404 | |||
| 405 | //============================================================================ | ||
| 406 | /// @brief Reset the current game | ||
| 407 | /// | ||
| 408 | /// @return the error, or @ref GAME_ERROR_NO_ERROR if the game was reset | ||
| 409 | /// | ||
| 410 | virtual GAME_ERROR Reset() | ||
| 411 | { | ||
| 412 | return GAME_ERROR_NOT_IMPLEMENTED; | ||
| 413 | } | ||
| 414 | //---------------------------------------------------------------------------- | ||
| 415 | |||
| 416 | //========================================================================== | ||
| 417 | /// @brief **Callback to Kodi Function**\n | ||
| 418 | /// Requests the frontend to stop the current game | ||
| 419 | /// | ||
| 420 | /// @remarks Only called from addon itself | ||
| 421 | /// | ||
| 422 | void CloseGame(void) { m_instanceData->toKodi->CloseGame(m_instanceData->toKodi->kodiInstance); } | ||
| 423 | //---------------------------------------------------------------------------- | ||
| 424 | |||
| 425 | //============================================================================ | ||
| 426 | /// @defgroup cpp_kodi_addon_game_Operation_CStream Class: CStream | ||
| 427 | /// @ingroup cpp_kodi_addon_game_Operation | ||
| 428 | /// @brief @cpp_class{ kodi::addon::CInstanceGame::CStream } | ||
| 429 | /// **Game stream handler** | ||
| 430 | /// | ||
| 431 | /// This class will be integrated into the addon, which can then open it if | ||
| 432 | /// necessary for the processing of an audio or video stream. | ||
| 433 | /// | ||
| 434 | /// | ||
| 435 | /// @note Callback to Kodi class | ||
| 436 | ///@{ | ||
| 437 | class CStream | ||
| 438 | { | ||
| 439 | public: | ||
| 440 | CStream() = default; | ||
| 441 | |||
| 442 | CStream(const game_stream_properties& properties) | ||
| 443 | { | ||
| 444 | Open(properties); | ||
| 445 | } | ||
| 446 | |||
| 447 | ~CStream() | ||
| 448 | { | ||
| 449 | Close(); | ||
| 450 | } | ||
| 451 | |||
| 452 | //========================================================================== | ||
| 453 | /// @ingroup cpp_kodi_addon_game_Operation_CStream | ||
| 454 | /// @brief Create a stream for gameplay data | ||
| 455 | /// | ||
| 456 | /// @param[in] properties The stream properties | ||
| 457 | /// @return A stream handle, or `nullptr` on failure | ||
| 458 | /// | ||
| 459 | /// @remarks Only called from addon itself | ||
| 460 | /// | ||
| 461 | bool Open(const game_stream_properties& properties) | ||
| 462 | { | ||
| 463 | if (!CAddonBase::m_interface->globalSingleInstance) | ||
| 464 | return false; | ||
| 465 | |||
| 466 | if (m_handle) | ||
| 467 | { | ||
| 468 | kodi::Log(ADDON_LOG_INFO, "kodi::addon::CInstanceGame::CStream already becomes reopened"); | ||
| 469 | Close(); | ||
| 470 | } | ||
| 471 | |||
| 472 | AddonToKodiFuncTable_Game& cb = | ||
| 473 | *static_cast<CInstanceGame*>(CAddonBase::m_interface->globalSingleInstance) | ||
| 474 | ->m_instanceData->toKodi; | ||
| 475 | m_handle = cb.OpenStream(cb.kodiInstance, &properties); | ||
| 476 | return m_handle != nullptr; | ||
| 477 | } | ||
| 478 | //-------------------------------------------------------------------------- | ||
| 479 | |||
| 480 | //========================================================================== | ||
| 481 | /// @ingroup cpp_kodi_addon_game_Operation_CStream | ||
| 482 | /// @brief Free the specified stream | ||
| 483 | /// | ||
| 484 | /// @remarks Only called from addon itself | ||
| 485 | /// | ||
| 486 | void Close() | ||
| 487 | { | ||
| 488 | if (!m_handle || !CAddonBase::m_interface->globalSingleInstance) | ||
| 489 | return; | ||
| 490 | |||
| 491 | AddonToKodiFuncTable_Game& cb = | ||
| 492 | *static_cast<CInstanceGame*>(CAddonBase::m_interface->globalSingleInstance) | ||
| 493 | ->m_instanceData->toKodi; | ||
| 494 | cb.CloseStream(cb.kodiInstance, m_handle); | ||
| 495 | m_handle = nullptr; | ||
| 496 | } | ||
| 497 | //-------------------------------------------------------------------------- | ||
| 498 | |||
| 499 | //========================================================================== | ||
| 500 | /// @ingroup cpp_kodi_addon_game_Operation_CStream | ||
| 501 | /// @brief Get a buffer for zero-copy stream data | ||
| 502 | /// | ||
| 503 | /// @param[in] width The framebuffer width, or 0 for no width specified | ||
| 504 | /// @param[in] height The framebuffer height, or 0 for no height specified | ||
| 505 | /// @param[out] buffer The buffer, or unmodified if false is returned | ||
| 506 | /// @return True if buffer was set, false otherwise | ||
| 507 | /// | ||
| 508 | /// @note If this returns true, buffer must be freed using @ref ReleaseBuffer(). | ||
| 509 | /// | ||
| 510 | /// @remarks Only called from addon itself | ||
| 511 | /// | ||
| 512 | bool GetBuffer(unsigned int width, unsigned int height, game_stream_buffer& buffer) | ||
| 513 | { | ||
| 514 | if (!m_handle || !CAddonBase::m_interface->globalSingleInstance) | ||
| 515 | return false; | ||
| 516 | |||
| 517 | AddonToKodiFuncTable_Game& cb = | ||
| 518 | *static_cast<CInstanceGame*>(CAddonBase::m_interface->globalSingleInstance) | ||
| 519 | ->m_instanceData->toKodi; | ||
| 520 | return cb.GetStreamBuffer(cb.kodiInstance, m_handle, width, height, &buffer); | ||
| 521 | } | ||
| 522 | //-------------------------------------------------------------------------- | ||
| 523 | |||
| 524 | //========================================================================== | ||
| 525 | /// @ingroup cpp_kodi_addon_game_Operation_CStream | ||
| 526 | /// @brief Add a data packet to a stream | ||
| 527 | /// | ||
| 528 | /// @param[in] packet The data packet | ||
| 529 | /// | ||
| 530 | /// @remarks Only called from addon itself | ||
| 531 | /// | ||
| 532 | void AddData(const game_stream_packet& packet) | ||
| 533 | { | ||
| 534 | if (!m_handle || !CAddonBase::m_interface->globalSingleInstance) | ||
| 535 | return; | ||
| 536 | |||
| 537 | AddonToKodiFuncTable_Game& cb = | ||
| 538 | *static_cast<CInstanceGame*>(CAddonBase::m_interface->globalSingleInstance) | ||
| 539 | ->m_instanceData->toKodi; | ||
| 540 | cb.AddStreamData(cb.kodiInstance, m_handle, &packet); | ||
| 541 | } | ||
| 542 | //-------------------------------------------------------------------------- | ||
| 543 | |||
| 544 | //========================================================================== | ||
| 545 | /// @ingroup cpp_kodi_addon_game_Operation_CStream | ||
| 546 | /// @brief Free an allocated buffer | ||
| 547 | /// | ||
| 548 | /// @param[in] buffer The buffer returned from GetStreamBuffer() | ||
| 549 | /// | ||
| 550 | /// @remarks Only called from addon itself | ||
| 551 | /// | ||
| 552 | void ReleaseBuffer(game_stream_buffer& buffer) | ||
| 553 | { | ||
| 554 | if (!m_handle || !CAddonBase::m_interface->globalSingleInstance) | ||
| 555 | return; | ||
| 556 | |||
| 557 | AddonToKodiFuncTable_Game& cb = | ||
| 558 | *static_cast<CInstanceGame*>(CAddonBase::m_interface->globalSingleInstance) | ||
| 559 | ->m_instanceData->toKodi; | ||
| 560 | cb.ReleaseStreamBuffer(cb.kodiInstance, m_handle, &buffer); | ||
| 561 | } | ||
| 562 | //-------------------------------------------------------------------------- | ||
| 563 | |||
| 564 | //========================================================================== | ||
| 565 | /// @ingroup cpp_kodi_addon_game_Operation_CStream | ||
| 566 | /// @brief To check stream open was OK, e.g. after use of constructor | ||
| 567 | /// | ||
| 568 | /// @return true if stream was successfully opened | ||
| 569 | /// | ||
| 570 | /// @remarks Only called from addon itself | ||
| 571 | /// | ||
| 572 | bool IsOpen() const { return m_handle != nullptr; } | ||
| 573 | //-------------------------------------------------------------------------- | ||
| 574 | |||
| 575 | private: | ||
| 576 | KODI_GAME_STREAM_HANDLE m_handle = nullptr; | ||
| 577 | }; | ||
| 578 | ///@} | ||
| 579 | |||
| 580 | ///@} | ||
| 581 | |||
| 582 | //--==----==----==----==----==----==----==----==----==----==----==----==----==-- | ||
| 583 | |||
| 584 | //============================================================================ | ||
| 585 | /// | ||
| 586 | /// @defgroup cpp_kodi_addon_game_HardwareRendering 3. Hardware rendering operations | ||
| 587 | /// @ingroup cpp_kodi_addon_game | ||
| 588 | /// @brief **Hardware rendering operations** | ||
| 589 | /// | ||
| 590 | /// | ||
| 591 | ///--------------------------------------------------------------------------- | ||
| 592 | /// | ||
| 593 | /// **Hardware rendering operation parts in interface:**\n | ||
| 594 | /// Copy this to your project and extend with your parts or leave functions | ||
| 595 | /// complete away where not used or supported. | ||
| 596 | /// | ||
| 597 | /// @copydetails cpp_kodi_addon_game_HardwareRendering_header_addon_auto_check | ||
| 598 | /// @copydetails cpp_kodi_addon_game_HardwareRendering_source_addon_auto_check | ||
| 599 | /// | ||
| 600 | ///@{ | ||
| 601 | |||
| 602 | //============================================================================ | ||
| 603 | /// @brief Invalidates the current HW context and reinitializes GPU resources | ||
| 604 | /// | ||
| 605 | /// Any GL state is lost, and must not be deinitialized explicitly. | ||
| 606 | /// | ||
| 607 | /// @return the error, or @ref GAME_ERROR_NO_ERROR if the HW context was reset | ||
| 608 | /// | ||
| 609 | virtual GAME_ERROR HwContextReset() | ||
| 610 | { | ||
| 611 | return GAME_ERROR_NOT_IMPLEMENTED; | ||
| 612 | } | ||
| 613 | //---------------------------------------------------------------------------- | ||
| 614 | |||
| 615 | //============================================================================ | ||
| 616 | /// @brief Called before the context is destroyed | ||
| 617 | /// | ||
| 618 | /// Resources can be deinitialized at this step. | ||
| 619 | /// | ||
| 620 | /// @return the error, or @ref GAME_ERROR_NO_ERROR if the HW context was destroyed | ||
| 621 | /// | ||
| 622 | virtual GAME_ERROR HwContextDestroy() | ||
| 623 | { | ||
| 624 | return GAME_ERROR_NOT_IMPLEMENTED; | ||
| 625 | } | ||
| 626 | |||
| 627 | //============================================================================ | ||
| 628 | /// @brief **Callback to Kodi Function**<br>Get a symbol from the hardware context | ||
| 629 | /// | ||
| 630 | /// @param[in] sym The symbol's name | ||
| 631 | /// | ||
| 632 | /// @return A function pointer for the specified symbol | ||
| 633 | /// | ||
| 634 | /// @remarks Only called from addon itself | ||
| 635 | /// | ||
| 636 | game_proc_address_t HwGetProcAddress(const char* sym) | ||
| 637 | { | ||
| 638 | return m_instanceData->toKodi->HwGetProcAddress(m_instanceData->toKodi->kodiInstance, sym); | ||
| 639 | } | ||
| 640 | //---------------------------------------------------------------------------- | ||
| 641 | |||
| 642 | ///@} | ||
| 643 | |||
| 644 | //--==----==----==----==----==----==----==----==----==----==----==----==----==-- | ||
| 645 | |||
| 646 | //============================================================================ | ||
| 647 | /// @defgroup cpp_kodi_addon_game_InputOperations 4. Input operations | ||
| 648 | /// @ingroup cpp_kodi_addon_game | ||
| 649 | /// @brief **Input operations** | ||
| 650 | /// | ||
| 651 | /// | ||
| 652 | ///--------------------------------------------------------------------------- | ||
| 653 | /// | ||
| 654 | /// **Hardware rendering operation parts in interface:**\n | ||
| 655 | /// Copy this to your project and extend with your parts or leave functions | ||
| 656 | /// complete away where not used or supported. | ||
| 657 | /// | ||
| 658 | /// @copydetails cpp_kodi_addon_game_InputOperations_header_addon_auto_check | ||
| 659 | /// @copydetails cpp_kodi_addon_game_InputOperations_source_addon_auto_check | ||
| 660 | /// | ||
| 661 | ///@{ | ||
| 662 | |||
| 663 | //============================================================================ | ||
| 664 | /// @brief Check if input is accepted for a feature on the controller | ||
| 665 | /// | ||
| 666 | /// If only a subset of the controller profile is used, this can return false | ||
| 667 | /// for unsupported features to not absorb their input. | ||
| 668 | /// | ||
| 669 | /// If the entire controller profile is used, this should always return true. | ||
| 670 | /// | ||
| 671 | /// @param[in] controller_id The ID of the controller profile | ||
| 672 | /// @param[in] feature_name The name of a feature in that profile | ||
| 673 | /// @return true if input is accepted for the feature, false otherwise | ||
| 674 | /// | ||
| 675 | virtual bool HasFeature(const std::string& controller_id, const std::string& feature_name) | ||
| 676 | { | ||
| 677 | return false; | ||
| 678 | } | ||
| 679 | //---------------------------------------------------------------------------- | ||
| 680 | |||
| 681 | //============================================================================ | ||
| 682 | /// @brief Get the input topology that specifies which controllers can be connected | ||
| 683 | /// | ||
| 684 | /// @return The input topology, or null to use the default | ||
| 685 | /// | ||
| 686 | /// If this returns non-null, topology must be freed using FreeTopology(). | ||
| 687 | /// | ||
| 688 | /// If this returns null, the topology will default to a single port that can | ||
| 689 | /// accept all controllers imported by addon.xml. The port ID is set to | ||
| 690 | /// the @ref DEFAULT_PORT_ID constant. | ||
| 691 | /// | ||
| 692 | virtual game_input_topology* GetTopology() | ||
| 693 | { | ||
| 694 | return nullptr; | ||
| 695 | } | ||
| 696 | //---------------------------------------------------------------------------- | ||
| 697 | |||
| 698 | //============================================================================ | ||
| 699 | /// @brief Free the topology's resources | ||
| 700 | /// | ||
| 701 | /// @param[in] topology The topology returned by GetTopology() | ||
| 702 | /// | ||
| 703 | virtual void FreeTopology(game_input_topology* topology) | ||
| 704 | { | ||
| 705 | } | ||
| 706 | //---------------------------------------------------------------------------- | ||
| 707 | |||
| 708 | //============================================================================ | ||
| 709 | /// @brief Set the layouts for known controllers | ||
| 710 | /// | ||
| 711 | /// @param[in] controllers The controller layouts | ||
| 712 | /// | ||
| 713 | /// After loading the input topology, the frontend will call this with | ||
| 714 | /// controller layouts for all controllers discovered in the topology. | ||
| 715 | /// | ||
| 716 | virtual void SetControllerLayouts(const std::vector<kodi::addon::GameControllerLayout>& controllers) | ||
| 717 | { | ||
| 718 | } | ||
| 719 | //---------------------------------------------------------------------------- | ||
| 720 | |||
| 721 | //============================================================================ | ||
| 722 | /// @brief Enable/disable keyboard input using the specified controller | ||
| 723 | /// | ||
| 724 | /// @param[in] enable True to enable input, false otherwise | ||
| 725 | /// @param[in] controller_id The controller ID if enabling, or unused if disabling | ||
| 726 | /// | ||
| 727 | /// @return True if keyboard input was enabled, false otherwise | ||
| 728 | /// | ||
| 729 | virtual bool EnableKeyboard(bool enable, const std::string& controller_id) | ||
| 730 | { | ||
| 731 | return false; | ||
| 732 | } | ||
| 733 | //---------------------------------------------------------------------------- | ||
| 734 | |||
| 735 | //============================================================================ | ||
| 736 | /// @brief Enable/disable mouse input using the specified controller | ||
| 737 | /// | ||
| 738 | /// @param[in] enable True to enable input, false otherwise | ||
| 739 | /// @param[in] controller_id The controller ID if enabling, or unused if disabling | ||
| 740 | /// | ||
| 741 | /// @return True if mouse input was enabled, false otherwise | ||
| 742 | /// | ||
| 743 | virtual bool EnableMouse(bool enable, const std::string& controller_id) | ||
| 744 | { | ||
| 745 | return false; | ||
| 746 | } | ||
| 747 | //-------------------------------------------------------------------------- | ||
| 748 | |||
| 749 | //========================================================================== | ||
| 750 | /// @brief Connect/disconnect a controller to a port on the virtual game console | ||
| 751 | /// | ||
| 752 | /// @param[in] connect True to connect a controller, false to disconnect | ||
| 753 | /// @param[in] port_address The address of the port | ||
| 754 | /// @param[in] controller_id The controller ID if connecting, or unused if disconnecting | ||
| 755 | /// @return True if the \p controller was (dis-)connected to the port, false otherwise | ||
| 756 | /// | ||
| 757 | /// The address is a string that allows traversal of the controller topology. | ||
| 758 | /// It is formed by alternating port IDs and controller IDs separated by "/". | ||
| 759 | /// | ||
| 760 | /// For example, assume that the topology represented in XML for Snes9x is: | ||
| 761 | /// | ||
| 762 | /// ~~~~~~~~~~~~~{.xml} | ||
| 763 | /// <logicaltopology> | ||
| 764 | /// <port type="controller" id="1"> | ||
| 765 | /// <accepts controller="game.controller.snes"/> | ||
| 766 | /// <accepts controller="game.controller.snes.multitap"> | ||
| 767 | /// <port type="controller" id="1"> | ||
| 768 | /// <accepts controller="game.controller.snes"/> | ||
| 769 | /// </port> | ||
| 770 | /// <port type="controller" id="2"> | ||
| 771 | /// <accepts controller="game.controller.snes"/> | ||
| 772 | /// </port> | ||
| 773 | /// ... | ||
| 774 | /// </accepts> | ||
| 775 | /// </port> | ||
| 776 | /// </logicaltopology> | ||
| 777 | /// ~~~~~~~~~~~~~ | ||
| 778 | /// | ||
| 779 | /// To connect a multitap to the console's first port, the multitap's controller | ||
| 780 | /// info is set using the port address: | ||
| 781 | /// | ||
| 782 | /// 1 | ||
| 783 | /// | ||
| 784 | /// To connect a SNES controller to the second port of the multitap, the | ||
| 785 | /// controller info is next set using the address: | ||
| 786 | /// | ||
| 787 | /// 1/game.controller.multitap/2 | ||
| 788 | /// | ||
| 789 | /// Any attempts to connect a controller to a port on a disconnected multitap | ||
| 790 | /// will return false. | ||
| 791 | /// | ||
| 792 | virtual bool ConnectController(bool connect, | ||
| 793 | const std::string& port_address, | ||
| 794 | const std::string& controller_id) | ||
| 795 | { | ||
| 796 | return false; | ||
| 797 | } | ||
| 798 | //---------------------------------------------------------------------------- | ||
| 799 | |||
| 800 | //============================================================================ | ||
| 801 | /// @brief Notify the add-on of an input event | ||
| 802 | /// | ||
| 803 | /// @param[in] event The input event | ||
| 804 | /// | ||
| 805 | /// @return true if the event was handled, false otherwise | ||
| 806 | /// | ||
| 807 | virtual bool InputEvent(const game_input_event& event) | ||
| 808 | { | ||
| 809 | return false; | ||
| 810 | } | ||
| 811 | //---------------------------------------------------------------------------- | ||
| 812 | |||
| 813 | //============================================================================ | ||
| 814 | /// @brief **Callback to Kodi Function**<br>Notify the port of an input event | ||
| 815 | /// | ||
| 816 | /// @param[in] event The input event | ||
| 817 | /// @return true if the event was handled, false otherwise | ||
| 818 | /// | ||
| 819 | /// @note Input events can arrive for the following sources: | ||
| 820 | /// - @ref GAME_INPUT_EVENT_MOTOR | ||
| 821 | /// | ||
| 822 | /// @remarks Only called from addon itself | ||
| 823 | /// | ||
| 824 | bool KodiInputEvent(const game_input_event& event) | ||
| 825 | { | ||
| 826 | return m_instanceData->toKodi->InputEvent(m_instanceData->toKodi->kodiInstance, &event); | ||
| 827 | } | ||
| 828 | //---------------------------------------------------------------------------- | ||
| 829 | |||
| 830 | ///@} | ||
| 831 | |||
| 832 | //--==----==----==----==----==----==----==----==----==----==----==----==----==-- | ||
| 833 | |||
| 834 | //============================================================================ | ||
| 835 | /// @defgroup cpp_kodi_addon_game_SerializationOperations 5. Serialization operations | ||
| 836 | /// @ingroup cpp_kodi_addon_game | ||
| 837 | /// @brief **Serialization operations** | ||
| 838 | /// | ||
| 839 | /// | ||
| 840 | ///--------------------------------------------------------------------------- | ||
| 841 | /// | ||
| 842 | /// **Serialization operation parts in interface:**\n | ||
| 843 | /// Copy this to your project and extend with your parts or leave functions | ||
| 844 | /// complete away where not used or supported. | ||
| 845 | /// | ||
| 846 | /// @copydetails cpp_kodi_addon_game_SerializationOperations_header_addon_auto_check | ||
| 847 | /// @copydetails cpp_kodi_addon_game_SerializationOperations_source_addon_auto_check | ||
| 848 | /// | ||
| 849 | ///@{ | ||
| 850 | |||
| 851 | //============================================================================ | ||
| 852 | /// @brief Get the number of bytes required to serialize the game | ||
| 853 | /// | ||
| 854 | /// @return the number of bytes, or 0 if serialization is not supported | ||
| 855 | /// | ||
| 856 | virtual size_t SerializeSize() | ||
| 857 | { | ||
| 858 | return 0; | ||
| 859 | } | ||
| 860 | //---------------------------------------------------------------------------- | ||
| 861 | |||
| 862 | //============================================================================ | ||
| 863 | /// @brief Serialize the state of the game | ||
| 864 | /// | ||
| 865 | /// @param[in] data The buffer receiving the serialized game data | ||
| 866 | /// @param[in] size The size of the buffer | ||
| 867 | /// | ||
| 868 | /// @return the error, or @ref GAME_ERROR_NO_ERROR if the game was serialized into the buffer | ||
| 869 | /// | ||
| 870 | virtual GAME_ERROR Serialize(uint8_t* data, size_t size) | ||
| 871 | { | ||
| 872 | return GAME_ERROR_NOT_IMPLEMENTED; | ||
| 873 | } | ||
| 874 | //---------------------------------------------------------------------------- | ||
| 875 | |||
| 876 | //============================================================================ | ||
| 877 | /// @brief Deserialize the game from the given state | ||
| 878 | /// | ||
| 879 | /// @param[in] data A buffer containing the game's new state | ||
| 880 | /// @param[in] size The size of the buffer | ||
| 881 | /// | ||
| 882 | /// @return the error, or @ref GAME_ERROR_NO_ERROR if the game deserialized | ||
| 883 | /// | ||
| 884 | virtual GAME_ERROR Deserialize(const uint8_t* data, size_t size) | ||
| 885 | { | ||
| 886 | return GAME_ERROR_NOT_IMPLEMENTED; | ||
| 887 | } | ||
| 888 | //---------------------------------------------------------------------------- | ||
| 889 | |||
| 890 | ///@} | ||
| 891 | |||
| 892 | //--==----==----==----==----==----==----==----==----==----==----==----==----==-- | ||
| 893 | |||
| 894 | //============================================================================ | ||
| 895 | /// @defgroup cpp_kodi_addon_game_CheatOperations 6. Cheat operations | ||
| 896 | /// @ingroup cpp_kodi_addon_game | ||
| 897 | /// @brief **Cheat operations** | ||
| 898 | /// | ||
| 899 | /// | ||
| 900 | ///--------------------------------------------------------------------------- | ||
| 901 | /// | ||
| 902 | /// **Cheat operation parts in interface:**\n | ||
| 903 | /// Copy this to your project and extend with your parts or leave functions | ||
| 904 | /// complete away where not used or supported. | ||
| 905 | /// | ||
| 906 | /// @copydetails cpp_kodi_addon_game_CheatOperations_header_addon_auto_check | ||
| 907 | /// @copydetails cpp_kodi_addon_game_CheatOperations_source_addon_auto_check | ||
| 908 | /// | ||
| 909 | ///@{ | ||
| 910 | |||
| 911 | //============================================================================ | ||
| 912 | /// @brief Reset the cheat system | ||
| 913 | /// | ||
| 914 | /// @return the error, or @ref GAME_ERROR_NO_ERROR if the cheat system was reset | ||
| 915 | /// | ||
| 916 | virtual GAME_ERROR CheatReset() | ||
| 917 | { | ||
| 918 | return GAME_ERROR_NOT_IMPLEMENTED; | ||
| 919 | } | ||
| 920 | //---------------------------------------------------------------------------- | ||
| 921 | |||
| 922 | //============================================================================ | ||
| 923 | /// @brief Get a region of memory | ||
| 924 | /// | ||
| 925 | /// @param[in] type The type of memory to retrieve | ||
| 926 | /// @param[in] data Set to the region of memory; must remain valid until UnloadGame() is called | ||
| 927 | /// @param[in] size Set to the size of the region of memory | ||
| 928 | /// | ||
| 929 | /// @return the error, or @ref GAME_ERROR_NO_ERROR if data was set to a valid buffer | ||
| 930 | /// | ||
| 931 | virtual GAME_ERROR GetMemory(GAME_MEMORY type, uint8_t*& data, size_t& size) | ||
| 932 | { | ||
| 933 | return GAME_ERROR_NOT_IMPLEMENTED; | ||
| 934 | } | ||
| 935 | //---------------------------------------------------------------------------- | ||
| 936 | |||
| 937 | //============================================================================ | ||
| 938 | /// @brief Set a cheat code | ||
| 939 | /// | ||
| 940 | /// @param[in] index | ||
| 941 | /// @param[in] enabled | ||
| 942 | /// @param[in] code | ||
| 943 | /// | ||
| 944 | /// @return the error, or @ref GAME_ERROR_NO_ERROR if the cheat was set | ||
| 945 | /// | ||
| 946 | virtual GAME_ERROR SetCheat(unsigned int index, bool enabled, const std::string& code) | ||
| 947 | { | ||
| 948 | return GAME_ERROR_NOT_IMPLEMENTED; | ||
| 949 | } | ||
| 950 | //---------------------------------------------------------------------------- | ||
| 951 | |||
| 952 | ///@} | ||
| 953 | |||
| 954 | private: | ||
| 955 | void SetAddonStruct(KODI_HANDLE instance) | ||
| 956 | { | ||
| 957 | if (instance == nullptr) | ||
| 958 | throw std::logic_error("kodi::addon::CInstanceGame: Creation with empty addon structure not" | ||
| 959 | "allowed, table must be given from Kodi!"); | ||
| 960 | |||
| 961 | m_instanceData = static_cast<AddonInstance_Game*>(instance); | ||
| 962 | m_instanceData->toAddon->addonInstance = this; | ||
| 963 | |||
| 964 | m_instanceData->toAddon->LoadGame = ADDON_LoadGame; | ||
| 965 | m_instanceData->toAddon->LoadGameSpecial = ADDON_LoadGameSpecial; | ||
| 966 | m_instanceData->toAddon->LoadStandalone = ADDON_LoadStandalone; | ||
| 967 | m_instanceData->toAddon->UnloadGame = ADDON_UnloadGame; | ||
| 968 | m_instanceData->toAddon->GetGameTiming = ADDON_GetGameTiming; | ||
| 969 | m_instanceData->toAddon->GetRegion = ADDON_GetRegion; | ||
| 970 | m_instanceData->toAddon->RequiresGameLoop = ADDON_RequiresGameLoop; | ||
| 971 | m_instanceData->toAddon->RunFrame = ADDON_RunFrame; | ||
| 972 | m_instanceData->toAddon->Reset = ADDON_Reset; | ||
| 973 | |||
| 974 | m_instanceData->toAddon->HwContextReset = ADDON_HwContextReset; | ||
| 975 | m_instanceData->toAddon->HwContextDestroy = ADDON_HwContextDestroy; | ||
| 976 | |||
| 977 | m_instanceData->toAddon->HasFeature = ADDON_HasFeature; | ||
| 978 | m_instanceData->toAddon->GetTopology = ADDON_GetTopology; | ||
| 979 | m_instanceData->toAddon->FreeTopology = ADDON_FreeTopology; | ||
| 980 | m_instanceData->toAddon->SetControllerLayouts = ADDON_SetControllerLayouts; | ||
| 981 | m_instanceData->toAddon->EnableKeyboard = ADDON_EnableKeyboard; | ||
| 982 | m_instanceData->toAddon->EnableMouse = ADDON_EnableMouse; | ||
| 983 | m_instanceData->toAddon->ConnectController = ADDON_ConnectController; | ||
| 984 | m_instanceData->toAddon->InputEvent = ADDON_InputEvent; | ||
| 985 | |||
| 986 | m_instanceData->toAddon->SerializeSize = ADDON_SerializeSize; | ||
| 987 | m_instanceData->toAddon->Serialize = ADDON_Serialize; | ||
| 988 | m_instanceData->toAddon->Deserialize = ADDON_Deserialize; | ||
| 989 | |||
| 990 | m_instanceData->toAddon->CheatReset = ADDON_CheatReset; | ||
| 991 | m_instanceData->toAddon->GetMemory = ADDON_GetMemory; | ||
| 992 | m_instanceData->toAddon->SetCheat = ADDON_SetCheat; | ||
| 993 | } | ||
| 994 | |||
| 995 | // --- Game operations --------------------------------------------------------- | ||
| 996 | |||
| 997 | inline static GAME_ERROR ADDON_LoadGame(const AddonInstance_Game* instance, const char* url) | ||
| 998 | { | ||
| 999 | return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->LoadGame(url); | ||
| 1000 | } | ||
| 1001 | |||
| 1002 | inline static GAME_ERROR ADDON_LoadGameSpecial(const AddonInstance_Game* instance, | ||
| 1003 | SPECIAL_GAME_TYPE type, | ||
| 1004 | const char** urls, | ||
| 1005 | size_t urlCount) | ||
| 1006 | { | ||
| 1007 | std::vector<std::string> urlList; | ||
| 1008 | for (size_t i = 0; i < urlCount; ++i) | ||
| 1009 | { | ||
| 1010 | if (urls[i] != nullptr) | ||
| 1011 | urlList.push_back(urls[i]); | ||
| 1012 | } | ||
| 1013 | |||
| 1014 | return static_cast<CInstanceGame*>(instance->toAddon->addonInstance) | ||
| 1015 | ->LoadGameSpecial(type, urlList); | ||
| 1016 | } | ||
| 1017 | |||
| 1018 | inline static GAME_ERROR ADDON_LoadStandalone(const AddonInstance_Game* instance) | ||
| 1019 | { | ||
| 1020 | return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->LoadStandalone(); | ||
| 1021 | } | ||
| 1022 | |||
| 1023 | inline static GAME_ERROR ADDON_UnloadGame(const AddonInstance_Game* instance) | ||
| 1024 | { | ||
| 1025 | return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->UnloadGame(); | ||
| 1026 | } | ||
| 1027 | |||
| 1028 | inline static GAME_ERROR ADDON_GetGameTiming(const AddonInstance_Game* instance, | ||
| 1029 | game_system_timing* timing_info) | ||
| 1030 | { | ||
| 1031 | return static_cast<CInstanceGame*>(instance->toAddon->addonInstance) | ||
| 1032 | ->GetGameTiming(*timing_info); | ||
| 1033 | } | ||
| 1034 | |||
| 1035 | inline static GAME_REGION ADDON_GetRegion(const AddonInstance_Game* instance) | ||
| 1036 | { | ||
| 1037 | return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->GetRegion(); | ||
| 1038 | } | ||
| 1039 | |||
| 1040 | inline static bool ADDON_RequiresGameLoop(const AddonInstance_Game* instance) | ||
| 1041 | { | ||
| 1042 | return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->RequiresGameLoop(); | ||
| 1043 | } | ||
| 1044 | |||
| 1045 | inline static GAME_ERROR ADDON_RunFrame(const AddonInstance_Game* instance) | ||
| 1046 | { | ||
| 1047 | return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->RunFrame(); | ||
| 1048 | } | ||
| 1049 | |||
| 1050 | inline static GAME_ERROR ADDON_Reset(const AddonInstance_Game* instance) | ||
| 1051 | { | ||
| 1052 | return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->Reset(); | ||
| 1053 | } | ||
| 1054 | |||
| 1055 | |||
| 1056 | // --- Hardware rendering operations ------------------------------------------- | ||
| 1057 | |||
| 1058 | inline static GAME_ERROR ADDON_HwContextReset(const AddonInstance_Game* instance) | ||
| 1059 | { | ||
| 1060 | return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->HwContextReset(); | ||
| 1061 | } | ||
| 1062 | |||
| 1063 | inline static GAME_ERROR ADDON_HwContextDestroy(const AddonInstance_Game* instance) | ||
| 1064 | { | ||
| 1065 | return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->HwContextDestroy(); | ||
| 1066 | } | ||
| 1067 | |||
| 1068 | |||
| 1069 | // --- Input operations -------------------------------------------------------- | ||
| 1070 | |||
| 1071 | inline static bool ADDON_HasFeature(const AddonInstance_Game* instance, | ||
| 1072 | const char* controller_id, | ||
| 1073 | const char* feature_name) | ||
| 1074 | { | ||
| 1075 | return static_cast<CInstanceGame*>(instance->toAddon->addonInstance) | ||
| 1076 | ->HasFeature(controller_id, feature_name); | ||
| 1077 | } | ||
| 1078 | |||
| 1079 | inline static game_input_topology* ADDON_GetTopology(const AddonInstance_Game* instance) | ||
| 1080 | { | ||
| 1081 | return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->GetTopology(); | ||
| 1082 | } | ||
| 1083 | |||
| 1084 | inline static void ADDON_FreeTopology(const AddonInstance_Game* instance, | ||
| 1085 | game_input_topology* topology) | ||
| 1086 | { | ||
| 1087 | static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->FreeTopology(topology); | ||
| 1088 | } | ||
| 1089 | |||
| 1090 | inline static void ADDON_SetControllerLayouts(const AddonInstance_Game* instance, | ||
| 1091 | const game_controller_layout* controllers, | ||
| 1092 | unsigned int controller_count) | ||
| 1093 | { | ||
| 1094 | if (controllers == nullptr) | ||
| 1095 | return; | ||
| 1096 | |||
| 1097 | std::vector<GameControllerLayout> controllerList; | ||
| 1098 | for (unsigned int i = 0; i < controller_count; ++i) | ||
| 1099 | controllerList.push_back(controllers[i]); | ||
| 1100 | |||
| 1101 | static_cast<CInstanceGame*>(instance->toAddon->addonInstance) | ||
| 1102 | ->SetControllerLayouts(controllerList); | ||
| 1103 | } | ||
| 1104 | |||
| 1105 | inline static bool ADDON_EnableKeyboard(const AddonInstance_Game* instance, | ||
| 1106 | bool enable, | ||
| 1107 | const char* controller_id) | ||
| 1108 | { | ||
| 1109 | return static_cast<CInstanceGame*>(instance->toAddon->addonInstance) | ||
| 1110 | ->EnableKeyboard(enable, controller_id); | ||
| 1111 | } | ||
| 1112 | |||
| 1113 | inline static bool ADDON_EnableMouse(const AddonInstance_Game* instance, | ||
| 1114 | bool enable, | ||
| 1115 | const char* controller_id) | ||
| 1116 | { | ||
| 1117 | return static_cast<CInstanceGame*>(instance->toAddon->addonInstance) | ||
| 1118 | ->EnableMouse(enable, controller_id); | ||
| 1119 | } | ||
| 1120 | |||
| 1121 | inline static bool ADDON_ConnectController(const AddonInstance_Game* instance, | ||
| 1122 | bool connect, | ||
| 1123 | const char* port_address, | ||
| 1124 | const char* controller_id) | ||
| 1125 | { | ||
| 1126 | return static_cast<CInstanceGame*>(instance->toAddon->addonInstance) | ||
| 1127 | ->ConnectController(connect, port_address, controller_id); | ||
| 1128 | } | ||
| 1129 | |||
| 1130 | inline static bool ADDON_InputEvent(const AddonInstance_Game* instance, | ||
| 1131 | const game_input_event* event) | ||
| 1132 | { | ||
| 1133 | return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->InputEvent(*event); | ||
| 1134 | } | ||
| 1135 | |||
| 1136 | |||
| 1137 | // --- Serialization operations ------------------------------------------------ | ||
| 1138 | |||
| 1139 | inline static size_t ADDON_SerializeSize(const AddonInstance_Game* instance) | ||
| 1140 | { | ||
| 1141 | return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->SerializeSize(); | ||
| 1142 | } | ||
| 1143 | |||
| 1144 | inline static GAME_ERROR ADDON_Serialize(const AddonInstance_Game* instance, | ||
| 1145 | uint8_t* data, | ||
| 1146 | size_t size) | ||
| 1147 | { | ||
| 1148 | return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->Serialize(data, size); | ||
| 1149 | } | ||
| 1150 | |||
| 1151 | inline static GAME_ERROR ADDON_Deserialize(const AddonInstance_Game* instance, | ||
| 1152 | const uint8_t* data, | ||
| 1153 | size_t size) | ||
| 1154 | { | ||
| 1155 | return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->Deserialize(data, size); | ||
| 1156 | } | ||
| 1157 | |||
| 1158 | |||
| 1159 | // --- Cheat operations -------------------------------------------------------- | ||
| 1160 | |||
| 1161 | inline static GAME_ERROR ADDON_CheatReset(const AddonInstance_Game* instance) | ||
| 1162 | { | ||
| 1163 | return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->CheatReset(); | ||
| 1164 | } | ||
| 1165 | |||
| 1166 | inline static GAME_ERROR ADDON_GetMemory(const AddonInstance_Game* instance, | ||
| 1167 | GAME_MEMORY type, | ||
| 1168 | uint8_t** data, | ||
| 1169 | size_t* size) | ||
| 1170 | { | ||
| 1171 | return static_cast<CInstanceGame*>(instance->toAddon->addonInstance) | ||
| 1172 | ->GetMemory(type, *data, *size); | ||
| 1173 | } | ||
| 1174 | |||
| 1175 | inline static GAME_ERROR ADDON_SetCheat(const AddonInstance_Game* instance, | ||
| 1176 | unsigned int index, | ||
| 1177 | bool enabled, | ||
| 1178 | const char* code) | ||
| 1179 | { | ||
| 1180 | return static_cast<CInstanceGame*>(instance->toAddon->addonInstance) | ||
| 1181 | ->SetCheat(index, enabled, code); | ||
| 1182 | } | ||
| 1183 | |||
| 1184 | AddonInstance_Game* m_instanceData; | ||
| 1185 | }; | ||
| 1186 | |||
| 1187 | } /* namespace addon */ | ||
| 1188 | } /* namespace kodi */ | ||
| 1189 | |||
| 1190 | #endif /* __cplusplus */ | ||
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/ImageDecoder.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/ImageDecoder.h new file mode 100644 index 0000000..7aeef7b --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/ImageDecoder.h | |||
| @@ -0,0 +1,315 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2005-2018 Team Kodi | ||
| 3 | * This file is part of Kodi - https://kodi.tv | ||
| 4 | * | ||
| 5 | * SPDX-License-Identifier: GPL-2.0-or-later | ||
| 6 | * See LICENSES/README.md for more information. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #pragma once | ||
| 10 | |||
| 11 | #include "../AddonBase.h" | ||
| 12 | #include "../c-api/addon-instance/image_decoder.h" | ||
| 13 | |||
| 14 | #ifdef __cplusplus | ||
| 15 | namespace kodi | ||
| 16 | { | ||
| 17 | namespace addon | ||
| 18 | { | ||
| 19 | |||
| 20 | //############################################################################## | ||
| 21 | /// @defgroup cpp_kodi_addon_imagedecoder_Defs Definitions, structures and enumerators | ||
| 22 | /// @ingroup cpp_kodi_addon_imagedecoder | ||
| 23 | /// @brief **Image decoder add-on general variables** | ||
| 24 | /// | ||
| 25 | /// Used to exchange the available options between Kodi and addon. | ||
| 26 | /// | ||
| 27 | /// | ||
| 28 | |||
| 29 | //============================================================================== | ||
| 30 | /// | ||
| 31 | /// @addtogroup cpp_kodi_addon_imagedecoder | ||
| 32 | /// @brief @cpp_class{ kodi::addon::CInstanceImageDecoder } | ||
| 33 | /// **Image decoder add-on instance**\n | ||
| 34 | /// This instance type is used to allow Kodi various additional image format | ||
| 35 | /// types. | ||
| 36 | /// | ||
| 37 | /// This usage can be requested under various conditions, by a Mimetype protocol | ||
| 38 | /// defined in <b>`addon.xml`</b> or supported file extensions. | ||
| 39 | /// | ||
| 40 | /// Include the header @ref ImageDecoder.h "#include <kodi/addon-instance/ImageDecoder.h>" | ||
| 41 | /// to use this class. | ||
| 42 | /// | ||
| 43 | /// ---------------------------------------------------------------------------- | ||
| 44 | /// | ||
| 45 | /// Here is an example of what the <b>`addon.xml.in`</b> would look like for an | ||
| 46 | /// image decoder addon: | ||
| 47 | /// | ||
| 48 | /// ~~~~~~~~~~~~~{.xml} | ||
| 49 | /// <?xml version="1.0" encoding="UTF-8"?> | ||
| 50 | /// <addon | ||
| 51 | /// id="imagedecoder.myspecialnamefor" | ||
| 52 | /// version="1.0.0" | ||
| 53 | /// name="My image decoder addon" | ||
| 54 | /// provider-name="Your Name"> | ||
| 55 | /// <requires>@ADDON_DEPENDS@</requires> | ||
| 56 | /// <extension | ||
| 57 | /// point="kodi.imagedecoder" | ||
| 58 | /// extension=".imga|.imgb" | ||
| 59 | /// mimetype="image/mymimea|image/mymimea" | ||
| 60 | /// library_@PLATFORM@="@LIBRARY_FILENAME@"/> | ||
| 61 | /// <extension point="xbmc.addon.metadata"> | ||
| 62 | /// <summary lang="en_GB">My image decoder addon summary</summary> | ||
| 63 | /// <description lang="en_GB">My image decoder description</description> | ||
| 64 | /// <platform>@PLATFORM@</platform> | ||
| 65 | /// </extension> | ||
| 66 | /// </addon> | ||
| 67 | /// ~~~~~~~~~~~~~ | ||
| 68 | /// | ||
| 69 | /// ### Standard values that can be declared for processing in `addon.xml`. | ||
| 70 | /// | ||
| 71 | /// These values are used by Kodi to identify associated images and file | ||
| 72 | /// extensions and then to select the associated addon. | ||
| 73 | /// | ||
| 74 | /// \table_start | ||
| 75 | /// \table_h3{ Labels, Type, Description } | ||
| 76 | /// \table_row3{ <b>`point`</b>, | ||
| 77 | /// @anchor cpp_kodi_addon_imagedecoder_point | ||
| 78 | /// string, | ||
| 79 | /// The identification of the addon instance to image decoder is mandatory | ||
| 80 | /// <b>`kodi.imagedecoder`</b>. In addition\, the instance declared in the | ||
| 81 | /// first <b>`<extension ... />`</b> is also the main type of addon. | ||
| 82 | /// } | ||
| 83 | /// \table_row3{ <b>`extension`</b>, | ||
| 84 | /// @anchor cpp_kodi_addon_imagedecoder_defaultPort | ||
| 85 | /// string, | ||
| 86 | /// The from addon operated and supported image file endings.\n | ||
| 87 | /// Use a <b>`|`</b> to separate between different ones. | ||
| 88 | /// } | ||
| 89 | /// \table_row3{ <b>`defaultPort`</b>, | ||
| 90 | /// @anchor cpp_kodi_addon_imagedecoder_defaultPort | ||
| 91 | /// string, | ||
| 92 | /// The from addon operated image [mimetypes](https://en.wikipedia.org/wiki/Media_type).\n | ||
| 93 | /// Use a <b>`|`</b> to separate between different ones. | ||
| 94 | /// } | ||
| 95 | /// \table_row3{ <b>`library_@PLATFORM@`</b>, | ||
| 96 | /// @anchor cpp_kodi_addon_imagedecoder_library | ||
| 97 | /// string, | ||
| 98 | /// The runtime library used for the addon. This is usually declared by `cmake` and correctly displayed in the translated <b>`addon.xml`</b>. | ||
| 99 | /// } | ||
| 100 | /// \table_end | ||
| 101 | /// | ||
| 102 | /// @remark For more detailed description of the <b>`addon.xml`</b>, see also https://kodi.wiki/view/Addon.xml. | ||
| 103 | /// | ||
| 104 | /// | ||
| 105 | /// -------------------------------------------------------------------------- | ||
| 106 | /// | ||
| 107 | /// | ||
| 108 | /// **Example:** | ||
| 109 | /// | ||
| 110 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 111 | /// #include <kodi/addon-instance/ImageDecoder.h> | ||
| 112 | /// | ||
| 113 | /// class ATTRIBUTE_HIDDEN CMyImageDecoder : public kodi::addon::CInstanceImageDecoder | ||
| 114 | /// { | ||
| 115 | /// public: | ||
| 116 | /// CMyImageDecoder(KODI_HANDLE instance, const std::string& kodiVersion); | ||
| 117 | /// | ||
| 118 | /// bool LoadImageFromMemory(unsigned char* buffer, | ||
| 119 | /// unsigned int bufSize, | ||
| 120 | /// unsigned int& width, | ||
| 121 | /// unsigned int& height) override; | ||
| 122 | /// | ||
| 123 | /// bool Decode(unsigned char* pixels, | ||
| 124 | /// unsigned int width, | ||
| 125 | /// unsigned int height, | ||
| 126 | /// unsigned int pitch, | ||
| 127 | /// ImageFormat format) override; | ||
| 128 | /// | ||
| 129 | /// ... | ||
| 130 | /// }; | ||
| 131 | /// | ||
| 132 | /// CMyImageDecoder::CMyImageDecoder(KODI_HANDLE instance, const std::string& kodiVersion) | ||
| 133 | /// : CInstanceImageDecoder(instance, kodiVersion) | ||
| 134 | /// { | ||
| 135 | /// ... | ||
| 136 | /// } | ||
| 137 | /// | ||
| 138 | /// bool CMyImageDecoder::LoadImageFromMemory(unsigned char* buffer, | ||
| 139 | /// unsigned int bufSize, | ||
| 140 | /// unsigned int& width, | ||
| 141 | /// unsigned int& height) | ||
| 142 | /// { | ||
| 143 | /// ... | ||
| 144 | /// return true; | ||
| 145 | /// } | ||
| 146 | /// | ||
| 147 | /// bool CMyImageDecoder::Decode(unsigned char* pixels, | ||
| 148 | /// unsigned int width, | ||
| 149 | /// unsigned int height, | ||
| 150 | /// unsigned int pitch, | ||
| 151 | /// ImageFormat format) override; | ||
| 152 | /// { | ||
| 153 | /// ... | ||
| 154 | /// return true; | ||
| 155 | /// } | ||
| 156 | /// | ||
| 157 | /// //---------------------------------------------------------------------- | ||
| 158 | /// | ||
| 159 | /// class ATTRIBUTE_HIDDEN CMyAddon : public kodi::addon::CAddonBase | ||
| 160 | /// { | ||
| 161 | /// public: | ||
| 162 | /// CMyAddon() = default; | ||
| 163 | /// ADDON_STATUS CreateInstance(int instanceType, | ||
| 164 | /// const std::string& instanceID, | ||
| 165 | /// KODI_HANDLE instance, | ||
| 166 | /// const std::string& version, | ||
| 167 | /// KODI_HANDLE& addonInstance) override; | ||
| 168 | /// }; | ||
| 169 | /// | ||
| 170 | /// // If you use only one instance in your add-on, can be instanceType and | ||
| 171 | /// // instanceID ignored | ||
| 172 | /// ADDON_STATUS CMyAddon::CreateInstance(int instanceType, | ||
| 173 | /// const std::string& instanceID, | ||
| 174 | /// KODI_HANDLE instance, | ||
| 175 | /// const std::string& version, | ||
| 176 | /// KODI_HANDLE& addonInstance) | ||
| 177 | /// { | ||
| 178 | /// if (instanceType == ADDON_INSTANCE_IMAGEDECODER) | ||
| 179 | /// { | ||
| 180 | /// kodi::Log(ADDON_LOG_INFO, "Creating my image decoder instance"); | ||
| 181 | /// addonInstance = new CMyImageDecoder(instance, version); | ||
| 182 | /// return ADDON_STATUS_OK; | ||
| 183 | /// } | ||
| 184 | /// else if (...) | ||
| 185 | /// { | ||
| 186 | /// ... | ||
| 187 | /// } | ||
| 188 | /// return ADDON_STATUS_UNKNOWN; | ||
| 189 | /// } | ||
| 190 | /// | ||
| 191 | /// ADDONCREATOR(CMyAddon) | ||
| 192 | /// ~~~~~~~~~~~~~ | ||
| 193 | /// | ||
| 194 | /// The destruction of the example class `CMyImageDecoder` is called from | ||
| 195 | /// Kodi's header. Manually deleting the add-on instance is not required. | ||
| 196 | /// | ||
| 197 | //------------------------------------------------------------------------------ | ||
| 198 | class ATTRIBUTE_HIDDEN CInstanceImageDecoder : public IAddonInstance | ||
| 199 | { | ||
| 200 | public: | ||
| 201 | //============================================================================ | ||
| 202 | /// @ingroup cpp_kodi_addon_imagedecoder | ||
| 203 | /// @brief Class constructor. | ||
| 204 | /// | ||
| 205 | /// @param[in] instance The from Kodi given instance given be add-on | ||
| 206 | /// CreateInstance call with instance id | ||
| 207 | /// @ref ADDON_INSTANCE_IMAGEDECODER. | ||
| 208 | /// @param[in] kodiVersion [opt] Version used in Kodi for this instance, to | ||
| 209 | /// allow compatibility to older Kodi versions. | ||
| 210 | /// | ||
| 211 | /// @note Recommended to set <b>`kodiVersion`</b>. | ||
| 212 | /// | ||
| 213 | explicit CInstanceImageDecoder(KODI_HANDLE instance, const std::string& kodiVersion = "") | ||
| 214 | : IAddonInstance(ADDON_INSTANCE_IMAGEDECODER, | ||
| 215 | !kodiVersion.empty() ? kodiVersion | ||
| 216 | : GetKodiTypeVersion(ADDON_INSTANCE_IMAGEDECODER)) | ||
| 217 | { | ||
| 218 | if (CAddonBase::m_interface->globalSingleInstance != nullptr) | ||
| 219 | throw std::logic_error("kodi::addon::CInstanceImageDecoder: Creation of multiple together " | ||
| 220 | "with single instance way is not allowed!"); | ||
| 221 | |||
| 222 | SetAddonStruct(instance); | ||
| 223 | } | ||
| 224 | //---------------------------------------------------------------------------- | ||
| 225 | |||
| 226 | ~CInstanceImageDecoder() override = default; | ||
| 227 | |||
| 228 | //============================================================================ | ||
| 229 | /// @ingroup cpp_kodi_addon_imagedecoder | ||
| 230 | /// @brief Initialize an encoder. | ||
| 231 | /// | ||
| 232 | /// @param[in] buffer The data to read from memory | ||
| 233 | /// @param[in] bufSize The buffer size | ||
| 234 | /// @param[in,out] width The optimal width of image on entry, obtained width | ||
| 235 | /// on return | ||
| 236 | /// @param[in,out] height The optimal height of image, actual obtained height | ||
| 237 | /// on return | ||
| 238 | /// @return true if successful done, false on error | ||
| 239 | /// | ||
| 240 | virtual bool LoadImageFromMemory(unsigned char* buffer, | ||
| 241 | unsigned int bufSize, | ||
| 242 | unsigned int& width, | ||
| 243 | unsigned int& height) = 0; | ||
| 244 | //---------------------------------------------------------------------------- | ||
| 245 | |||
| 246 | //============================================================================ | ||
| 247 | /// @ingroup cpp_kodi_addon_imagedecoder | ||
| 248 | /// @brief Decode previously loaded image. | ||
| 249 | /// | ||
| 250 | /// @param[in] pixels Output buffer | ||
| 251 | /// @param[in] width Width of output image | ||
| 252 | /// @param[in] height Height of output image | ||
| 253 | /// @param[in] pitch Pitch of output image | ||
| 254 | /// @param[in] format Format of output image | ||
| 255 | /// @return true if successful done, false on error | ||
| 256 | /// | ||
| 257 | virtual bool Decode(unsigned char* pixels, | ||
| 258 | unsigned int width, | ||
| 259 | unsigned int height, | ||
| 260 | unsigned int pitch, | ||
| 261 | ImageFormat format) = 0; | ||
| 262 | //---------------------------------------------------------------------------- | ||
| 263 | |||
| 264 | //============================================================================ | ||
| 265 | /// @ingroup cpp_kodi_addon_imagedecoder | ||
| 266 | /// @brief **Callback to Kodi Function**\n | ||
| 267 | /// Get the wanted mime type from Kodi. | ||
| 268 | /// | ||
| 269 | /// @return the mimetype wanted from Kodi | ||
| 270 | /// | ||
| 271 | /// @remarks Only called from addon itself. | ||
| 272 | /// | ||
| 273 | inline std::string MimeType() { return m_instanceData->props->mimetype; } | ||
| 274 | //---------------------------------------------------------------------------- | ||
| 275 | |||
| 276 | private: | ||
| 277 | void SetAddonStruct(KODI_HANDLE instance) | ||
| 278 | { | ||
| 279 | if (instance == nullptr) | ||
| 280 | throw std::logic_error("kodi::addon::CInstanceImageDecoder: Creation with empty addon " | ||
| 281 | "structure not allowed, table must be given from Kodi!"); | ||
| 282 | |||
| 283 | m_instanceData = static_cast<AddonInstance_ImageDecoder*>(instance); | ||
| 284 | m_instanceData->toAddon->addonInstance = this; | ||
| 285 | m_instanceData->toAddon->load_image_from_memory = ADDON_LoadImageFromMemory; | ||
| 286 | m_instanceData->toAddon->decode = ADDON_Decode; | ||
| 287 | } | ||
| 288 | |||
| 289 | inline static bool ADDON_LoadImageFromMemory(const AddonInstance_ImageDecoder* instance, | ||
| 290 | unsigned char* buffer, | ||
| 291 | unsigned int bufSize, | ||
| 292 | unsigned int* width, | ||
| 293 | unsigned int* height) | ||
| 294 | { | ||
| 295 | return static_cast<CInstanceImageDecoder*>(instance->toAddon->addonInstance) | ||
| 296 | ->LoadImageFromMemory(buffer, bufSize, *width, *height); | ||
| 297 | } | ||
| 298 | |||
| 299 | inline static bool ADDON_Decode(const AddonInstance_ImageDecoder* instance, | ||
| 300 | unsigned char* pixels, | ||
| 301 | unsigned int width, | ||
| 302 | unsigned int height, | ||
| 303 | unsigned int pitch, | ||
| 304 | enum ImageFormat format) | ||
| 305 | { | ||
| 306 | return static_cast<CInstanceImageDecoder*>(instance->toAddon->addonInstance) | ||
| 307 | ->Decode(pixels, width, height, pitch, format); | ||
| 308 | } | ||
| 309 | |||
| 310 | AddonInstance_ImageDecoder* m_instanceData; | ||
| 311 | }; | ||
| 312 | |||
| 313 | } /* namespace addon */ | ||
| 314 | } /* namespace kodi */ | ||
| 315 | #endif /* __cplusplus */ | ||
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Inputstream.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Inputstream.h new file mode 100644 index 0000000..396b92e --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Inputstream.h | |||
| @@ -0,0 +1,934 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2005-2018 Team Kodi | ||
| 3 | * This file is part of Kodi - https://kodi.tv | ||
| 4 | * | ||
| 5 | * SPDX-License-Identifier: GPL-2.0-or-later | ||
| 6 | * See LICENSES/README.md for more information. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #pragma once | ||
| 10 | |||
| 11 | /* | ||
| 12 | * Parts with a comment named "internal" are only used inside header and not | ||
| 13 | * used or accessed direct during add-on development! | ||
| 14 | */ | ||
| 15 | |||
| 16 | #include "../AddonBase.h" | ||
| 17 | #include "../StreamCodec.h" | ||
| 18 | #include "../StreamCrypto.h" | ||
| 19 | |||
| 20 | #ifdef BUILD_KODI_ADDON | ||
| 21 | #include "../DemuxPacket.h" | ||
| 22 | #include "../InputStreamConstants.h" | ||
| 23 | #else | ||
| 24 | #include "cores/VideoPlayer/Interface/Addon/DemuxPacket.h" | ||
| 25 | #include "cores/VideoPlayer/Interface/Addon/InputStreamConstants.h" | ||
| 26 | #endif | ||
| 27 | |||
| 28 | //Increment this level always if you add features which can lead to compile failures in the addon | ||
| 29 | #define INPUTSTREAM_VERSION_LEVEL 2 | ||
| 30 | |||
| 31 | #define INPUTSTREAM_MAX_STREAM_COUNT 256 | ||
| 32 | #define INPUTSTREAM_MAX_STRING_NAME_SIZE 256 | ||
| 33 | #define INPUTSTREAM_MAX_STRING_CODEC_SIZE 32 | ||
| 34 | #define INPUTSTREAM_MAX_STRING_LANGUAGE_SIZE 64 | ||
| 35 | |||
| 36 | #ifdef __cplusplus | ||
| 37 | extern "C" | ||
| 38 | { | ||
| 39 | #endif /* __cplusplus */ | ||
| 40 | |||
| 41 | /*! | ||
| 42 | * @brief InputStream add-on capabilities. All capabilities are set to "false" as default. | ||
| 43 | */ | ||
| 44 | struct INPUTSTREAM_CAPABILITIES | ||
| 45 | { | ||
| 46 | enum MASKTYPE : uint32_t | ||
| 47 | { | ||
| 48 | /// supports interface IDemux | ||
| 49 | SUPPORTS_IDEMUX = (1 << 0), | ||
| 50 | |||
| 51 | /// supports interface IPosTime | ||
| 52 | SUPPORTS_IPOSTIME = (1 << 1), | ||
| 53 | |||
| 54 | /// supports interface IDisplayTime | ||
| 55 | SUPPORTS_IDISPLAYTIME = (1 << 2), | ||
| 56 | |||
| 57 | /// supports seek | ||
| 58 | SUPPORTS_SEEK = (1 << 3), | ||
| 59 | |||
| 60 | /// supports pause | ||
| 61 | SUPPORTS_PAUSE = (1 << 4), | ||
| 62 | |||
| 63 | /// supports interface ITime | ||
| 64 | SUPPORTS_ITIME = (1 << 5), | ||
| 65 | |||
| 66 | /// supports interface IChapter | ||
| 67 | SUPPORTS_ICHAPTER = (1 << 6), | ||
| 68 | }; | ||
| 69 | |||
| 70 | /// set of supported capabilities | ||
| 71 | uint32_t m_mask; | ||
| 72 | }; | ||
| 73 | |||
| 74 | /*! | ||
| 75 | * @brief structure of key/value pairs passed to addon on Open() | ||
| 76 | */ | ||
| 77 | struct INPUTSTREAM | ||
| 78 | { | ||
| 79 | const char* m_strURL; | ||
| 80 | const char* m_mimeType; | ||
| 81 | |||
| 82 | unsigned int m_nCountInfoValues; | ||
| 83 | struct LISTITEMPROPERTY | ||
| 84 | { | ||
| 85 | const char* m_strKey; | ||
| 86 | const char* m_strValue; | ||
| 87 | } m_ListItemProperties[STREAM_MAX_PROPERTY_COUNT]; | ||
| 88 | |||
| 89 | const char* m_libFolder; | ||
| 90 | const char* m_profileFolder; | ||
| 91 | }; | ||
| 92 | |||
| 93 | /*! | ||
| 94 | * @brief Array of stream IDs | ||
| 95 | */ | ||
| 96 | struct INPUTSTREAM_IDS | ||
| 97 | { | ||
| 98 | unsigned int m_streamCount; | ||
| 99 | unsigned int m_streamIds[INPUTSTREAM_MAX_STREAM_COUNT]; | ||
| 100 | }; | ||
| 101 | |||
| 102 | /*! | ||
| 103 | * @brief MASTERING Metadata | ||
| 104 | */ | ||
| 105 | struct INPUTSTREAM_MASTERING_METADATA | ||
| 106 | { | ||
| 107 | double primary_r_chromaticity_x; | ||
| 108 | double primary_r_chromaticity_y; | ||
| 109 | double primary_g_chromaticity_x; | ||
| 110 | double primary_g_chromaticity_y; | ||
| 111 | double primary_b_chromaticity_x; | ||
| 112 | double primary_b_chromaticity_y; | ||
| 113 | double white_point_chromaticity_x; | ||
| 114 | double white_point_chromaticity_y; | ||
| 115 | double luminance_max; | ||
| 116 | double luminance_min; | ||
| 117 | }; | ||
| 118 | |||
| 119 | /*! | ||
| 120 | * @brief CONTENTLIGHT Metadata | ||
| 121 | */ | ||
| 122 | struct INPUTSTREAM_CONTENTLIGHT_METADATA | ||
| 123 | { | ||
| 124 | uint64_t max_cll; | ||
| 125 | uint64_t max_fall; | ||
| 126 | }; | ||
| 127 | |||
| 128 | /*! | ||
| 129 | * @brief stream properties | ||
| 130 | */ | ||
| 131 | struct INPUTSTREAM_INFO | ||
| 132 | { | ||
| 133 | enum STREAM_TYPE | ||
| 134 | { | ||
| 135 | TYPE_NONE = 0, | ||
| 136 | TYPE_VIDEO, | ||
| 137 | TYPE_AUDIO, | ||
| 138 | TYPE_SUBTITLE, | ||
| 139 | TYPE_TELETEXT, | ||
| 140 | TYPE_RDS, | ||
| 141 | } m_streamType; | ||
| 142 | |||
| 143 | enum Codec_FEATURES : uint32_t | ||
| 144 | { | ||
| 145 | FEATURE_DECODE = 1 | ||
| 146 | }; | ||
| 147 | uint32_t m_features; | ||
| 148 | |||
| 149 | enum STREAM_FLAGS : uint32_t | ||
| 150 | { | ||
| 151 | FLAG_NONE = 0x0000, | ||
| 152 | FLAG_DEFAULT = 0x0001, | ||
| 153 | FLAG_DUB = 0x0002, | ||
| 154 | FLAG_ORIGINAL = 0x0004, | ||
| 155 | FLAG_COMMENT = 0x0008, | ||
| 156 | FLAG_LYRICS = 0x0010, | ||
| 157 | FLAG_KARAOKE = 0x0020, | ||
| 158 | FLAG_FORCED = 0x0040, | ||
| 159 | FLAG_HEARING_IMPAIRED = 0x0080, | ||
| 160 | FLAG_VISUAL_IMPAIRED = 0x0100, | ||
| 161 | }; | ||
| 162 | |||
| 163 | // Keep in sync with AVColorSpace | ||
| 164 | enum COLORSPACE | ||
| 165 | { | ||
| 166 | COLORSPACE_RGB = 0, | ||
| 167 | COLORSPACE_BT709 = 1, | ||
| 168 | COLORSPACE_UNSPECIFIED = 2, | ||
| 169 | COLORSPACE_UNKNOWN = COLORSPACE_UNSPECIFIED, // compatibility | ||
| 170 | COLORSPACE_RESERVED = 3, | ||
| 171 | COLORSPACE_FCC = 4, | ||
| 172 | COLORSPACE_BT470BG = 5, | ||
| 173 | COLORSPACE_SMPTE170M = 6, | ||
| 174 | COLORSPACE_SMPTE240M = 7, | ||
| 175 | COLORSPACE_YCGCO = 8, | ||
| 176 | COLORSPACE_YCOCG = COLORSPACE_YCGCO, | ||
| 177 | COLORSPACE_BT2020_NCL = 9, | ||
| 178 | COLORSPACE_BT2020_CL = 10, | ||
| 179 | COLORSPACE_SMPTE2085 = 11, | ||
| 180 | COLORSPACE_CHROMA_DERIVED_NCL = 12, | ||
| 181 | COLORSPACE_CHROMA_DERIVED_CL = 13, | ||
| 182 | COLORSPACE_ICTCP = 14, | ||
| 183 | COLORSPACE_MAX | ||
| 184 | }; | ||
| 185 | |||
| 186 | // Keep in sync with AVColorPrimaries | ||
| 187 | enum COLORPRIMARIES : int32_t | ||
| 188 | { | ||
| 189 | COLORPRIMARY_RESERVED0 = 0, | ||
| 190 | COLORPRIMARY_BT709 = 1, | ||
| 191 | COLORPRIMARY_UNSPECIFIED = 2, | ||
| 192 | COLORPRIMARY_RESERVED = 3, | ||
| 193 | COLORPRIMARY_BT470M = 4, | ||
| 194 | COLORPRIMARY_BT470BG = 5, | ||
| 195 | COLORPRIMARY_SMPTE170M = 6, | ||
| 196 | COLORPRIMARY_SMPTE240M = 7, | ||
| 197 | COLORPRIMARY_FILM = 8, | ||
| 198 | COLORPRIMARY_BT2020 = 9, | ||
| 199 | COLORPRIMARY_SMPTE428 = 10, | ||
| 200 | COLORPRIMARY_SMPTEST428_1 = COLORPRIMARY_SMPTE428, | ||
| 201 | COLORPRIMARY_SMPTE431 = 11, | ||
| 202 | COLORPRIMARY_SMPTE432 = 12, | ||
| 203 | COLORPRIMARY_JEDEC_P22 = 22, | ||
| 204 | COLORPRIMARY_MAX | ||
| 205 | }; | ||
| 206 | |||
| 207 | // Keep in sync with AVColorRange | ||
| 208 | enum COLORRANGE | ||
| 209 | { | ||
| 210 | COLORRANGE_UNKNOWN = 0, | ||
| 211 | COLORRANGE_LIMITED, | ||
| 212 | COLORRANGE_FULLRANGE, | ||
| 213 | COLORRANGE_MAX | ||
| 214 | }; | ||
| 215 | |||
| 216 | // keep in sync with AVColorTransferCharacteristic | ||
| 217 | enum COLORTRC : int32_t | ||
| 218 | { | ||
| 219 | COLORTRC_RESERVED0 = 0, | ||
| 220 | COLORTRC_BT709 = 1, | ||
| 221 | COLORTRC_UNSPECIFIED = 2, | ||
| 222 | COLORTRC_RESERVED = 3, | ||
| 223 | COLORTRC_GAMMA22 = 4, | ||
| 224 | COLORTRC_GAMMA28 = 5, | ||
| 225 | COLORTRC_SMPTE170M = 6, | ||
| 226 | COLORTRC_SMPTE240M = 7, | ||
| 227 | COLORTRC_LINEAR = 8, | ||
| 228 | COLORTRC_LOG = 9, | ||
| 229 | COLORTRC_LOG_SQRT = 10, | ||
| 230 | COLORTRC_IEC61966_2_4 = 11, | ||
| 231 | COLORTRC_BT1361_ECG = 12, | ||
| 232 | COLORTRC_IEC61966_2_1 = 13, | ||
| 233 | COLORTRC_BT2020_10 = 14, | ||
| 234 | COLORTRC_BT2020_12 = 15, | ||
| 235 | COLORTRC_SMPTE2084 = 16, | ||
| 236 | COLORTRC_SMPTEST2084 = COLORTRC_SMPTE2084, | ||
| 237 | COLORTRC_SMPTE428 = 17, | ||
| 238 | COLORTRC_SMPTEST428_1 = COLORTRC_SMPTE428, | ||
| 239 | COLORTRC_ARIB_STD_B67 = 18, | ||
| 240 | COLORTRC_MAX | ||
| 241 | }; | ||
| 242 | |||
| 243 | uint32_t m_flags; | ||
| 244 | |||
| 245 | //! @brief (optional) name of the stream, \0 for default handling | ||
| 246 | char m_name[INPUTSTREAM_MAX_STRING_NAME_SIZE]; | ||
| 247 | |||
| 248 | //! @brief (required) name of codec according to ffmpeg | ||
| 249 | char m_codecName[INPUTSTREAM_MAX_STRING_CODEC_SIZE]; | ||
| 250 | |||
| 251 | //! @brief (optional) internal name of codec (selectionstream info) | ||
| 252 | char m_codecInternalName[INPUTSTREAM_MAX_STRING_CODEC_SIZE]; | ||
| 253 | |||
| 254 | //! @brief (optional) the profile of the codec | ||
| 255 | STREAMCODEC_PROFILE m_codecProfile; | ||
| 256 | |||
| 257 | //! @brief (required) physical index | ||
| 258 | unsigned int m_pID; | ||
| 259 | |||
| 260 | const uint8_t* m_ExtraData; | ||
| 261 | unsigned int m_ExtraSize; | ||
| 262 | |||
| 263 | //! @brief RFC 5646 language code (empty string if undefined) | ||
| 264 | char m_language[INPUTSTREAM_MAX_STRING_LANGUAGE_SIZE]; | ||
| 265 | |||
| 266 | //! Video stream related data | ||
| 267 | //@{ | ||
| 268 | |||
| 269 | //! @brief Scale of 1000 and a rate of 29970 will result in 29.97 fps | ||
| 270 | unsigned int m_FpsScale; | ||
| 271 | |||
| 272 | unsigned int m_FpsRate; | ||
| 273 | |||
| 274 | //! @brief height of the stream reported by the demuxer | ||
| 275 | unsigned int m_Height; | ||
| 276 | |||
| 277 | //! @brief width of the stream reported by the demuxer | ||
| 278 | unsigned int m_Width; | ||
| 279 | |||
| 280 | //! @brief display aspect of stream | ||
| 281 | float m_Aspect; | ||
| 282 | |||
| 283 | //@} | ||
| 284 | |||
| 285 | //! Audio stream related data | ||
| 286 | //@{ | ||
| 287 | |||
| 288 | //! @brief (required) amount of channels | ||
| 289 | unsigned int m_Channels; | ||
| 290 | |||
| 291 | //! @brief (required) sample rate | ||
| 292 | unsigned int m_SampleRate; | ||
| 293 | |||
| 294 | //! @brief (required) bit rate | ||
| 295 | unsigned int m_BitRate; | ||
| 296 | |||
| 297 | //! @brief (required) bits per sample | ||
| 298 | unsigned int m_BitsPerSample; | ||
| 299 | |||
| 300 | unsigned int m_BlockAlign; | ||
| 301 | |||
| 302 | //@} | ||
| 303 | |||
| 304 | CRYPTO_INFO m_cryptoInfo; | ||
| 305 | |||
| 306 | // new in API version 2.0.8 | ||
| 307 | //@{ | ||
| 308 | //! @brief Codec If available, the fourcc code codec | ||
| 309 | unsigned int m_codecFourCC; | ||
| 310 | |||
| 311 | //! @brief definition of colorspace | ||
| 312 | COLORSPACE m_colorSpace; | ||
| 313 | |||
| 314 | //! @brief color range if available | ||
| 315 | COLORRANGE m_colorRange; | ||
| 316 | //@} | ||
| 317 | |||
| 318 | //new in API 2.0.9 / INPUTSTREAM_VERSION_LEVEL 1 | ||
| 319 | //@{ | ||
| 320 | COLORPRIMARIES m_colorPrimaries; | ||
| 321 | COLORTRC m_colorTransferCharacteristic; | ||
| 322 | //@} | ||
| 323 | |||
| 324 | //! @brief mastering static Metadata | ||
| 325 | INPUTSTREAM_MASTERING_METADATA* m_masteringMetadata; | ||
| 326 | |||
| 327 | //! @brief content light static Metadata | ||
| 328 | INPUTSTREAM_CONTENTLIGHT_METADATA* m_contentLightMetadata; | ||
| 329 | }; | ||
| 330 | |||
| 331 | struct INPUTSTREAM_TIMES | ||
| 332 | { | ||
| 333 | time_t startTime; | ||
| 334 | double ptsStart; | ||
| 335 | double ptsBegin; | ||
| 336 | double ptsEnd; | ||
| 337 | }; | ||
| 338 | |||
| 339 | /*! | ||
| 340 | * @brief "C" ABI Structures to transfer the methods from this to Kodi | ||
| 341 | */ | ||
| 342 | |||
| 343 | // this are properties given to the addon on create | ||
| 344 | // at this time we have no parameters for the addon | ||
| 345 | typedef struct AddonProps_InputStream /* internal */ | ||
| 346 | { | ||
| 347 | int dummy; | ||
| 348 | } AddonProps_InputStream; | ||
| 349 | |||
| 350 | typedef struct AddonToKodiFuncTable_InputStream /* internal */ | ||
| 351 | { | ||
| 352 | KODI_HANDLE kodiInstance; | ||
| 353 | DemuxPacket* (*allocate_demux_packet)(void* kodiInstance, int data_size); | ||
| 354 | DemuxPacket* (*allocate_encrypted_demux_packet)(void* kodiInstance, | ||
| 355 | unsigned int data_size, | ||
| 356 | unsigned int encrypted_subsample_count); | ||
| 357 | void (*free_demux_packet)(void* kodiInstance, DemuxPacket* packet); | ||
| 358 | } AddonToKodiFuncTable_InputStream; | ||
| 359 | |||
| 360 | struct AddonInstance_InputStream; | ||
| 361 | typedef struct KodiToAddonFuncTable_InputStream /* internal */ | ||
| 362 | { | ||
| 363 | KODI_HANDLE addonInstance; | ||
| 364 | |||
| 365 | bool(__cdecl* open)(const AddonInstance_InputStream* instance, INPUTSTREAM* props); | ||
| 366 | void(__cdecl* close)(const AddonInstance_InputStream* instance); | ||
| 367 | const char*(__cdecl* get_path_list)(const AddonInstance_InputStream* instance); | ||
| 368 | void(__cdecl* get_capabilities)(const AddonInstance_InputStream* instance, | ||
| 369 | INPUTSTREAM_CAPABILITIES* capabilities); | ||
| 370 | |||
| 371 | // IDemux | ||
| 372 | struct INPUTSTREAM_IDS(__cdecl* get_stream_ids)(const AddonInstance_InputStream* instance); | ||
| 373 | struct INPUTSTREAM_INFO(__cdecl* get_stream)(const AddonInstance_InputStream* instance, | ||
| 374 | int streamid); | ||
| 375 | void(__cdecl* enable_stream)(const AddonInstance_InputStream* instance, | ||
| 376 | int streamid, | ||
| 377 | bool enable); | ||
| 378 | bool(__cdecl* open_stream)(const AddonInstance_InputStream* instance, int streamid); | ||
| 379 | void(__cdecl* demux_reset)(const AddonInstance_InputStream* instance); | ||
| 380 | void(__cdecl* demux_abort)(const AddonInstance_InputStream* instance); | ||
| 381 | void(__cdecl* demux_flush)(const AddonInstance_InputStream* instance); | ||
| 382 | DemuxPacket*(__cdecl* demux_read)(const AddonInstance_InputStream* instance); | ||
| 383 | bool(__cdecl* demux_seek_time)(const AddonInstance_InputStream* instance, | ||
| 384 | double time, | ||
| 385 | bool backwards, | ||
| 386 | double* startpts); | ||
| 387 | void(__cdecl* demux_set_speed)(const AddonInstance_InputStream* instance, int speed); | ||
| 388 | void(__cdecl* set_video_resolution)(const AddonInstance_InputStream* instance, | ||
| 389 | int width, | ||
| 390 | int height); | ||
| 391 | |||
| 392 | // IDisplayTime | ||
| 393 | int(__cdecl* get_total_time)(const AddonInstance_InputStream* instance); | ||
| 394 | int(__cdecl* get_time)(const AddonInstance_InputStream* instance); | ||
| 395 | |||
| 396 | // ITime | ||
| 397 | bool(__cdecl* get_times)(const AddonInstance_InputStream* instance, INPUTSTREAM_TIMES* times); | ||
| 398 | |||
| 399 | // IPosTime | ||
| 400 | bool(__cdecl* pos_time)(const AddonInstance_InputStream* instance, int ms); | ||
| 401 | |||
| 402 | int(__cdecl* read_stream)(const AddonInstance_InputStream* instance, | ||
| 403 | uint8_t* buffer, | ||
| 404 | unsigned int bufferSize); | ||
| 405 | int64_t(__cdecl* seek_stream)(const AddonInstance_InputStream* instance, | ||
| 406 | int64_t position, | ||
| 407 | int whence); | ||
| 408 | int64_t(__cdecl* position_stream)(const AddonInstance_InputStream* instance); | ||
| 409 | int64_t(__cdecl* length_stream)(const AddonInstance_InputStream* instance); | ||
| 410 | bool(__cdecl* is_real_time_stream)(const AddonInstance_InputStream* instance); | ||
| 411 | |||
| 412 | // IChapter | ||
| 413 | int(__cdecl* get_chapter)(const AddonInstance_InputStream* instance); | ||
| 414 | int(__cdecl* get_chapter_count)(const AddonInstance_InputStream* instance); | ||
| 415 | const char*(__cdecl* get_chapter_name)(const AddonInstance_InputStream* instance, int ch); | ||
| 416 | int64_t(__cdecl* get_chapter_pos)(const AddonInstance_InputStream* instance, int ch); | ||
| 417 | bool(__cdecl* seek_chapter)(const AddonInstance_InputStream* instance, int ch); | ||
| 418 | |||
| 419 | int(__cdecl* block_size_stream)(const AddonInstance_InputStream* instance); | ||
| 420 | } KodiToAddonFuncTable_InputStream; | ||
| 421 | |||
| 422 | typedef struct AddonInstance_InputStream /* internal */ | ||
| 423 | { | ||
| 424 | AddonProps_InputStream* props; | ||
| 425 | AddonToKodiFuncTable_InputStream* toKodi; | ||
| 426 | KodiToAddonFuncTable_InputStream* toAddon; | ||
| 427 | } AddonInstance_InputStream; | ||
| 428 | |||
| 429 | #ifdef __cplusplus | ||
| 430 | } /* extern "C" */ | ||
| 431 | |||
| 432 | namespace kodi | ||
| 433 | { | ||
| 434 | namespace addon | ||
| 435 | { | ||
| 436 | |||
| 437 | class ATTRIBUTE_HIDDEN CInstanceInputStream : public IAddonInstance | ||
| 438 | { | ||
| 439 | public: | ||
| 440 | explicit CInstanceInputStream(KODI_HANDLE instance, const std::string& kodiVersion = "") | ||
| 441 | : IAddonInstance(ADDON_INSTANCE_INPUTSTREAM, | ||
| 442 | !kodiVersion.empty() ? kodiVersion | ||
| 443 | : GetKodiTypeVersion(ADDON_INSTANCE_INPUTSTREAM)) | ||
| 444 | { | ||
| 445 | if (CAddonBase::m_interface->globalSingleInstance != nullptr) | ||
| 446 | throw std::logic_error("kodi::addon::CInstanceInputStream: Creation of multiple together " | ||
| 447 | "with single instance way is not allowed!"); | ||
| 448 | |||
| 449 | SetAddonStruct(instance, m_kodiVersion); | ||
| 450 | } | ||
| 451 | |||
| 452 | ~CInstanceInputStream() override = default; | ||
| 453 | |||
| 454 | /*! | ||
| 455 | * Open a stream. | ||
| 456 | * @param props | ||
| 457 | * @return True if the stream has been opened successfully, false otherwise. | ||
| 458 | * @remarks | ||
| 459 | */ | ||
| 460 | virtual bool Open(INPUTSTREAM& props) = 0; | ||
| 461 | |||
| 462 | /*! | ||
| 463 | * Close an open stream. | ||
| 464 | * @remarks | ||
| 465 | */ | ||
| 466 | virtual void Close() = 0; | ||
| 467 | |||
| 468 | /*! | ||
| 469 | * Get Capabilities of this addon. | ||
| 470 | * @param capabilities The add-on's capabilities. | ||
| 471 | * @remarks | ||
| 472 | */ | ||
| 473 | virtual void GetCapabilities(INPUTSTREAM_CAPABILITIES& capabilities) = 0; | ||
| 474 | |||
| 475 | /*! | ||
| 476 | * Get IDs of available streams | ||
| 477 | * @remarks | ||
| 478 | */ | ||
| 479 | virtual INPUTSTREAM_IDS GetStreamIds() = 0; | ||
| 480 | |||
| 481 | /*! | ||
| 482 | * Get stream properties of a stream. | ||
| 483 | * @param streamid unique id of stream | ||
| 484 | * @return struc of stream properties | ||
| 485 | * @remarks | ||
| 486 | */ | ||
| 487 | virtual INPUTSTREAM_INFO GetStream(int streamid) = 0; | ||
| 488 | |||
| 489 | /*! | ||
| 490 | * Enable or disable a stream. | ||
| 491 | * A disabled stream does not send demux packets | ||
| 492 | * @param streamid unique id of stream | ||
| 493 | * @param enable true for enable, false for disable | ||
| 494 | * @remarks | ||
| 495 | */ | ||
| 496 | virtual void EnableStream(int streamid, bool enable) = 0; | ||
| 497 | |||
| 498 | /*! | ||
| 499 | * Opens a stream for playback. | ||
| 500 | * @param streamid unique id of stream | ||
| 501 | * @remarks | ||
| 502 | */ | ||
| 503 | virtual bool OpenStream(int streamid) = 0; | ||
| 504 | |||
| 505 | /*! | ||
| 506 | * Reset the demultiplexer in the add-on. | ||
| 507 | * @remarks Required if bHandlesDemuxing is set to true. | ||
| 508 | */ | ||
| 509 | virtual void DemuxReset() {} | ||
| 510 | |||
| 511 | /*! | ||
| 512 | * Abort the demultiplexer thread in the add-on. | ||
| 513 | * @remarks Required if bHandlesDemuxing is set to true. | ||
| 514 | */ | ||
| 515 | virtual void DemuxAbort() {} | ||
| 516 | |||
| 517 | /*! | ||
| 518 | * Flush all data that's currently in the demultiplexer buffer in the add-on. | ||
| 519 | * @remarks Required if bHandlesDemuxing is set to true. | ||
| 520 | */ | ||
| 521 | virtual void DemuxFlush() {} | ||
| 522 | |||
| 523 | /*! | ||
| 524 | * Read the next packet from the demultiplexer, if there is one. | ||
| 525 | * @return The next packet. | ||
| 526 | * If there is no next packet, then the add-on should return the | ||
| 527 | * packet created by calling AllocateDemuxPacket(0) on the callback. | ||
| 528 | * If the stream changed and Kodi's player needs to be reinitialised, | ||
| 529 | * then, the add-on should call AllocateDemuxPacket(0) on the | ||
| 530 | * callback, and set the streamid to DMX_SPECIALID_STREAMCHANGE and | ||
| 531 | * return the value. | ||
| 532 | * The add-on should return NULL if an error occurred. | ||
| 533 | * @remarks Return NULL if this add-on won't provide this function. | ||
| 534 | */ | ||
| 535 | virtual DemuxPacket* DemuxRead() { return nullptr; } | ||
| 536 | |||
| 537 | /*! | ||
| 538 | * Notify the InputStream addon/demuxer that Kodi wishes to seek the stream by time | ||
| 539 | * Demuxer is required to set stream to an IDR frame | ||
| 540 | * @param time The absolute time since stream start | ||
| 541 | * @param backwards True to seek to keyframe BEFORE time, else AFTER | ||
| 542 | * @param startpts can be updated to point to where display should start | ||
| 543 | * @return True if the seek operation was possible | ||
| 544 | * @remarks Optional, and only used if addon has its own demuxer. | ||
| 545 | */ | ||
| 546 | virtual bool DemuxSeekTime(double time, bool backwards, double& startpts) { return false; } | ||
| 547 | |||
| 548 | /*! | ||
| 549 | * Notify the InputStream addon/demuxer that Kodi wishes to change playback speed | ||
| 550 | * @param speed The requested playback speed | ||
| 551 | * @remarks Optional, and only used if addon has its own demuxer. | ||
| 552 | */ | ||
| 553 | virtual void DemuxSetSpeed(int speed) {} | ||
| 554 | |||
| 555 | /*! | ||
| 556 | * Sets desired width / height | ||
| 557 | * @param width / hight | ||
| 558 | */ | ||
| 559 | virtual void SetVideoResolution(int width, int height) {} | ||
| 560 | |||
| 561 | /*! | ||
| 562 | * Totel time in ms | ||
| 563 | * @remarks | ||
| 564 | */ | ||
| 565 | virtual int GetTotalTime() { return -1; } | ||
| 566 | |||
| 567 | /*! | ||
| 568 | * Playing time in ms | ||
| 569 | * @remarks | ||
| 570 | */ | ||
| 571 | virtual int GetTime() { return -1; } | ||
| 572 | |||
| 573 | /*! | ||
| 574 | * Get current timing values in PTS scale | ||
| 575 | * @remarks | ||
| 576 | */ | ||
| 577 | virtual bool GetTimes(INPUTSTREAM_TIMES& times) { return false; } | ||
| 578 | |||
| 579 | /*! | ||
| 580 | * Positions inputstream to playing time given in ms | ||
| 581 | * @remarks | ||
| 582 | */ | ||
| 583 | virtual bool PosTime(int ms) { return false; } | ||
| 584 | |||
| 585 | /*! | ||
| 586 | * Return currently selected chapter | ||
| 587 | * @remarks | ||
| 588 | */ | ||
| 589 | virtual int GetChapter() { return -1; }; | ||
| 590 | |||
| 591 | /*! | ||
| 592 | * Return number of available chapters | ||
| 593 | * @remarks | ||
| 594 | */ | ||
| 595 | virtual int GetChapterCount() { return 0; }; | ||
| 596 | |||
| 597 | /*! | ||
| 598 | * Return name of chapter # ch | ||
| 599 | * @remarks | ||
| 600 | */ | ||
| 601 | virtual const char* GetChapterName(int ch) { return nullptr; }; | ||
| 602 | |||
| 603 | /*! | ||
| 604 | * Return position if chapter # ch in milliseconds | ||
| 605 | * @remarks | ||
| 606 | */ | ||
| 607 | virtual int64_t GetChapterPos(int ch) { return 0; }; | ||
| 608 | |||
| 609 | /*! | ||
| 610 | * Seek to the beginning of chapter # ch | ||
| 611 | * @remarks | ||
| 612 | */ | ||
| 613 | virtual bool SeekChapter(int ch) { return false; }; | ||
| 614 | |||
| 615 | /*! | ||
| 616 | * Read from an open stream. | ||
| 617 | * @param buffer The buffer to store the data in. | ||
| 618 | * @param bufferSize The amount of bytes to read. | ||
| 619 | * @return The amount of bytes that were actually read from the stream. | ||
| 620 | * @remarks Return -1 if this add-on won't provide this function. | ||
| 621 | */ | ||
| 622 | virtual int ReadStream(uint8_t* buffer, unsigned int bufferSize) { return -1; } | ||
| 623 | |||
| 624 | /*! | ||
| 625 | * Seek in a stream. | ||
| 626 | * @param position The position to seek to. | ||
| 627 | * @param whence ? | ||
| 628 | * @return The new position. | ||
| 629 | * @remarks Return -1 if this add-on won't provide this function. | ||
| 630 | */ | ||
| 631 | virtual int64_t SeekStream(int64_t position, int whence = SEEK_SET) { return -1; } | ||
| 632 | |||
| 633 | /*! | ||
| 634 | * @return The position in the stream that's currently being read. | ||
| 635 | * @remarks Return -1 if this add-on won't provide this function. | ||
| 636 | */ | ||
| 637 | virtual int64_t PositionStream() { return -1; } | ||
| 638 | |||
| 639 | /*! | ||
| 640 | * @return The total length of the stream that's currently being read. | ||
| 641 | * @remarks Return -1 if this add-on won't provide this function. | ||
| 642 | */ | ||
| 643 | virtual int64_t LengthStream() { return -1; } | ||
| 644 | |||
| 645 | /*! | ||
| 646 | * @return Obtain the chunk size to use when reading streams. | ||
| 647 | * @remarks Return 0 if this add-on won't provide this function. | ||
| 648 | */ | ||
| 649 | virtual int GetBlockSize() { return 0; } | ||
| 650 | |||
| 651 | /*! | ||
| 652 | * Check for real-time streaming | ||
| 653 | * @return true if current stream is real-time | ||
| 654 | */ | ||
| 655 | virtual bool IsRealTimeStream() { return true; } | ||
| 656 | |||
| 657 | /*! | ||
| 658 | * @brief Allocate a demux packet. Free with FreeDemuxPacket | ||
| 659 | * @param dataSize The size of the data that will go into the packet | ||
| 660 | * @return The allocated packet | ||
| 661 | */ | ||
| 662 | DemuxPacket* AllocateDemuxPacket(int dataSize) | ||
| 663 | { | ||
| 664 | return m_instanceData->toKodi->allocate_demux_packet(m_instanceData->toKodi->kodiInstance, | ||
| 665 | dataSize); | ||
| 666 | } | ||
| 667 | |||
| 668 | /*! | ||
| 669 | * @brief Allocate a demux packet. Free with FreeDemuxPacket | ||
| 670 | * @param dataSize The size of the data that will go into the packet | ||
| 671 | * @return The allocated packet | ||
| 672 | */ | ||
| 673 | DemuxPacket* AllocateEncryptedDemuxPacket(int dataSize, unsigned int encryptedSubsampleCount) | ||
| 674 | { | ||
| 675 | return m_instanceData->toKodi->allocate_encrypted_demux_packet( | ||
| 676 | m_instanceData->toKodi->kodiInstance, dataSize, encryptedSubsampleCount); | ||
| 677 | } | ||
| 678 | |||
| 679 | /*! | ||
| 680 | * @brief Free a packet that was allocated with AllocateDemuxPacket | ||
| 681 | * @param packet The packet to free | ||
| 682 | */ | ||
| 683 | void FreeDemuxPacket(DemuxPacket* packet) | ||
| 684 | { | ||
| 685 | return m_instanceData->toKodi->free_demux_packet(m_instanceData->toKodi->kodiInstance, packet); | ||
| 686 | } | ||
| 687 | |||
| 688 | private: | ||
| 689 | static int compareVersion(const int v1[3], const int v2[3]) | ||
| 690 | { | ||
| 691 | for (unsigned i(0); i < 3; ++i) | ||
| 692 | if (v1[i] != v2[i]) | ||
| 693 | return v1[i] - v2[i]; | ||
| 694 | return 0; | ||
| 695 | } | ||
| 696 | |||
| 697 | void SetAddonStruct(KODI_HANDLE instance, const std::string& kodiVersion) | ||
| 698 | { | ||
| 699 | if (instance == nullptr) | ||
| 700 | throw std::logic_error("kodi::addon::CInstanceInputStream: Creation with empty addon " | ||
| 701 | "structure not allowed, table must be given from Kodi!"); | ||
| 702 | int api[3] = { 0, 0, 0 }; | ||
| 703 | sscanf(kodiVersion.c_str(), "%d.%d.%d", &api[0], &api[1], &api[2]); | ||
| 704 | |||
| 705 | m_instanceData = static_cast<AddonInstance_InputStream*>(instance); | ||
| 706 | m_instanceData->toAddon->addonInstance = this; | ||
| 707 | m_instanceData->toAddon->open = ADDON_Open; | ||
| 708 | m_instanceData->toAddon->close = ADDON_Close; | ||
| 709 | m_instanceData->toAddon->get_capabilities = ADDON_GetCapabilities; | ||
| 710 | |||
| 711 | m_instanceData->toAddon->get_stream_ids = ADDON_GetStreamIds; | ||
| 712 | m_instanceData->toAddon->get_stream = ADDON_GetStream; | ||
| 713 | m_instanceData->toAddon->enable_stream = ADDON_EnableStream; | ||
| 714 | m_instanceData->toAddon->open_stream = ADDON_OpenStream; | ||
| 715 | m_instanceData->toAddon->demux_reset = ADDON_DemuxReset; | ||
| 716 | m_instanceData->toAddon->demux_abort = ADDON_DemuxAbort; | ||
| 717 | m_instanceData->toAddon->demux_flush = ADDON_DemuxFlush; | ||
| 718 | m_instanceData->toAddon->demux_read = ADDON_DemuxRead; | ||
| 719 | m_instanceData->toAddon->demux_seek_time = ADDON_DemuxSeekTime; | ||
| 720 | m_instanceData->toAddon->demux_set_speed = ADDON_DemuxSetSpeed; | ||
| 721 | m_instanceData->toAddon->set_video_resolution = ADDON_SetVideoResolution; | ||
| 722 | |||
| 723 | m_instanceData->toAddon->get_total_time = ADDON_GetTotalTime; | ||
| 724 | m_instanceData->toAddon->get_time = ADDON_GetTime; | ||
| 725 | |||
| 726 | m_instanceData->toAddon->get_times = ADDON_GetTimes; | ||
| 727 | m_instanceData->toAddon->pos_time = ADDON_PosTime; | ||
| 728 | |||
| 729 | m_instanceData->toAddon->read_stream = ADDON_ReadStream; | ||
| 730 | m_instanceData->toAddon->seek_stream = ADDON_SeekStream; | ||
| 731 | m_instanceData->toAddon->position_stream = ADDON_PositionStream; | ||
| 732 | m_instanceData->toAddon->length_stream = ADDON_LengthStream; | ||
| 733 | m_instanceData->toAddon->is_real_time_stream = ADDON_IsRealTimeStream; | ||
| 734 | |||
| 735 | // Added on 2.0.10 | ||
| 736 | m_instanceData->toAddon->get_chapter = ADDON_GetChapter; | ||
| 737 | m_instanceData->toAddon->get_chapter_count = ADDON_GetChapterCount; | ||
| 738 | m_instanceData->toAddon->get_chapter_name = ADDON_GetChapterName; | ||
| 739 | m_instanceData->toAddon->get_chapter_pos = ADDON_GetChapterPos; | ||
| 740 | m_instanceData->toAddon->seek_chapter = ADDON_SeekChapter; | ||
| 741 | |||
| 742 | // Added on 2.0.12 | ||
| 743 | m_instanceData->toAddon->block_size_stream = ADDON_GetBlockSize; | ||
| 744 | |||
| 745 | /* | ||
| 746 | // Way to include part on new API version | ||
| 747 | int minPartVersion[3] = { 3, 0, 0 }; | ||
| 748 | if (compareVersion(api, minPartVersion) >= 0) | ||
| 749 | { | ||
| 750 | |||
| 751 | } | ||
| 752 | */ | ||
| 753 | } | ||
| 754 | |||
| 755 | inline static bool ADDON_Open(const AddonInstance_InputStream* instance, INPUTSTREAM* props) | ||
| 756 | { | ||
| 757 | return static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance)->Open(*props); | ||
| 758 | } | ||
| 759 | |||
| 760 | inline static void ADDON_Close(const AddonInstance_InputStream* instance) | ||
| 761 | { | ||
| 762 | static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance)->Close(); | ||
| 763 | } | ||
| 764 | |||
| 765 | inline static void ADDON_GetCapabilities(const AddonInstance_InputStream* instance, | ||
| 766 | INPUTSTREAM_CAPABILITIES* capabilities) | ||
| 767 | { | ||
| 768 | static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance) | ||
| 769 | ->GetCapabilities(*capabilities); | ||
| 770 | } | ||
| 771 | |||
| 772 | |||
| 773 | // IDemux | ||
| 774 | inline static struct INPUTSTREAM_IDS ADDON_GetStreamIds(const AddonInstance_InputStream* instance) | ||
| 775 | { | ||
| 776 | return static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance)->GetStreamIds(); | ||
| 777 | } | ||
| 778 | |||
| 779 | inline static struct INPUTSTREAM_INFO ADDON_GetStream(const AddonInstance_InputStream* instance, | ||
| 780 | int streamid) | ||
| 781 | { | ||
| 782 | return static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance) | ||
| 783 | ->GetStream(streamid); | ||
| 784 | } | ||
| 785 | |||
| 786 | inline static void ADDON_EnableStream(const AddonInstance_InputStream* instance, | ||
| 787 | int streamid, | ||
| 788 | bool enable) | ||
| 789 | { | ||
| 790 | static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance) | ||
| 791 | ->EnableStream(streamid, enable); | ||
| 792 | } | ||
| 793 | |||
| 794 | inline static bool ADDON_OpenStream(const AddonInstance_InputStream* instance, int streamid) | ||
| 795 | { | ||
| 796 | return static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance) | ||
| 797 | ->OpenStream(streamid); | ||
| 798 | } | ||
| 799 | |||
| 800 | inline static void ADDON_DemuxReset(const AddonInstance_InputStream* instance) | ||
| 801 | { | ||
| 802 | static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance)->DemuxReset(); | ||
| 803 | } | ||
| 804 | |||
| 805 | inline static void ADDON_DemuxAbort(const AddonInstance_InputStream* instance) | ||
| 806 | { | ||
| 807 | static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance)->DemuxAbort(); | ||
| 808 | } | ||
| 809 | |||
| 810 | inline static void ADDON_DemuxFlush(const AddonInstance_InputStream* instance) | ||
| 811 | { | ||
| 812 | static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance)->DemuxFlush(); | ||
| 813 | } | ||
| 814 | |||
| 815 | inline static DemuxPacket* ADDON_DemuxRead(const AddonInstance_InputStream* instance) | ||
| 816 | { | ||
| 817 | return static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance)->DemuxRead(); | ||
| 818 | } | ||
| 819 | |||
| 820 | inline static bool ADDON_DemuxSeekTime(const AddonInstance_InputStream* instance, | ||
| 821 | double time, | ||
| 822 | bool backwards, | ||
| 823 | double* startpts) | ||
| 824 | { | ||
| 825 | return static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance) | ||
| 826 | ->DemuxSeekTime(time, backwards, *startpts); | ||
| 827 | } | ||
| 828 | |||
| 829 | inline static void ADDON_DemuxSetSpeed(const AddonInstance_InputStream* instance, int speed) | ||
| 830 | { | ||
| 831 | static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance)->DemuxSetSpeed(speed); | ||
| 832 | } | ||
| 833 | |||
| 834 | inline static void ADDON_SetVideoResolution(const AddonInstance_InputStream* instance, | ||
| 835 | int width, | ||
| 836 | int height) | ||
| 837 | { | ||
| 838 | static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance) | ||
| 839 | ->SetVideoResolution(width, height); | ||
| 840 | } | ||
| 841 | |||
| 842 | |||
| 843 | // IDisplayTime | ||
| 844 | inline static int ADDON_GetTotalTime(const AddonInstance_InputStream* instance) | ||
| 845 | { | ||
| 846 | return static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance)->GetTotalTime(); | ||
| 847 | } | ||
| 848 | |||
| 849 | inline static int ADDON_GetTime(const AddonInstance_InputStream* instance) | ||
| 850 | { | ||
| 851 | return static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance)->GetTime(); | ||
| 852 | } | ||
| 853 | |||
| 854 | // ITime | ||
| 855 | inline static bool ADDON_GetTimes(const AddonInstance_InputStream* instance, | ||
| 856 | INPUTSTREAM_TIMES* times) | ||
| 857 | { | ||
| 858 | return static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance)->GetTimes(*times); | ||
| 859 | } | ||
| 860 | |||
| 861 | // IPosTime | ||
| 862 | inline static bool ADDON_PosTime(const AddonInstance_InputStream* instance, int ms) | ||
| 863 | { | ||
| 864 | return static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance)->PosTime(ms); | ||
| 865 | } | ||
| 866 | |||
| 867 | inline static int ADDON_GetChapter(const AddonInstance_InputStream* instance) | ||
| 868 | { | ||
| 869 | return static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance)->GetChapter(); | ||
| 870 | } | ||
| 871 | |||
| 872 | inline static int ADDON_GetChapterCount(const AddonInstance_InputStream* instance) | ||
| 873 | { | ||
| 874 | return static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance)->GetChapterCount(); | ||
| 875 | } | ||
| 876 | |||
| 877 | inline static const char* ADDON_GetChapterName(const AddonInstance_InputStream* instance, int ch) | ||
| 878 | { | ||
| 879 | return static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance)->GetChapterName(ch); | ||
| 880 | } | ||
| 881 | |||
| 882 | inline static int64_t ADDON_GetChapterPos(const AddonInstance_InputStream* instance, int ch) | ||
| 883 | { | ||
| 884 | return static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance)->GetChapterPos(ch); | ||
| 885 | } | ||
| 886 | |||
| 887 | inline static bool ADDON_SeekChapter(const AddonInstance_InputStream* instance, int ch) | ||
| 888 | { | ||
| 889 | return static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance)->SeekChapter(ch); | ||
| 890 | } | ||
| 891 | |||
| 892 | inline static int ADDON_ReadStream(const AddonInstance_InputStream* instance, | ||
| 893 | uint8_t* buffer, | ||
| 894 | unsigned int bufferSize) | ||
| 895 | { | ||
| 896 | return static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance) | ||
| 897 | ->ReadStream(buffer, bufferSize); | ||
| 898 | } | ||
| 899 | |||
| 900 | inline static int64_t ADDON_SeekStream(const AddonInstance_InputStream* instance, | ||
| 901 | int64_t position, | ||
| 902 | int whence) | ||
| 903 | { | ||
| 904 | return static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance) | ||
| 905 | ->SeekStream(position, whence); | ||
| 906 | } | ||
| 907 | |||
| 908 | inline static int64_t ADDON_PositionStream(const AddonInstance_InputStream* instance) | ||
| 909 | { | ||
| 910 | return static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance)->PositionStream(); | ||
| 911 | } | ||
| 912 | |||
| 913 | inline static int64_t ADDON_LengthStream(const AddonInstance_InputStream* instance) | ||
| 914 | { | ||
| 915 | return static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance)->LengthStream(); | ||
| 916 | } | ||
| 917 | |||
| 918 | inline static int ADDON_GetBlockSize(const AddonInstance_InputStream* instance) | ||
| 919 | { | ||
| 920 | return static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance)->GetBlockSize(); | ||
| 921 | } | ||
| 922 | |||
| 923 | inline static bool ADDON_IsRealTimeStream(const AddonInstance_InputStream* instance) | ||
| 924 | { | ||
| 925 | return static_cast<CInstanceInputStream*>(instance->toAddon->addonInstance)->IsRealTimeStream(); | ||
| 926 | } | ||
| 927 | |||
| 928 | AddonInstance_InputStream* m_instanceData; | ||
| 929 | }; | ||
| 930 | |||
| 931 | } /* namespace addon */ | ||
| 932 | } /* namespace kodi */ | ||
| 933 | |||
| 934 | #endif /* __cplusplus */ | ||
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/PVR.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/PVR.h new file mode 100644 index 0000000..d5977a7 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/PVR.h | |||
| @@ -0,0 +1,3423 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2005-2018 Team Kodi | ||
| 3 | * This file is part of Kodi - https://kodi.tv | ||
| 4 | * | ||
| 5 | * SPDX-License-Identifier: GPL-2.0-or-later | ||
| 6 | * See LICENSES/README.md for more information. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #pragma once | ||
| 10 | |||
| 11 | #include "../c-api/addon-instance/pvr.h" | ||
| 12 | #include "pvr/ChannelGroups.h" | ||
| 13 | #include "pvr/Channels.h" | ||
| 14 | #include "pvr/EDL.h" | ||
| 15 | #include "pvr/EPG.h" | ||
| 16 | #include "pvr/General.h" | ||
| 17 | #include "pvr/MenuHook.h" | ||
| 18 | #include "pvr/Recordings.h" | ||
| 19 | #include "pvr/Stream.h" | ||
| 20 | #include "pvr/Timers.h" | ||
| 21 | |||
| 22 | #ifdef __cplusplus | ||
| 23 | |||
| 24 | /*! | ||
| 25 | * @internal | ||
| 26 | * @brief PVR "C++" API interface | ||
| 27 | * | ||
| 28 | * In this field are the pure addon-side C++ data. | ||
| 29 | * | ||
| 30 | * @note Changes can be made without problems and have no influence on other | ||
| 31 | * PVR addons that have already been created.\n | ||
| 32 | * \n | ||
| 33 | * Therefore, @ref ADDON_INSTANCE_VERSION_PVR_MIN can be ignored for these | ||
| 34 | * fields and only the @ref ADDON_INSTANCE_VERSION_PVR needs to be increased.\n | ||
| 35 | * \n | ||
| 36 | * Only must be min version increased if a new compile of addon breaks after | ||
| 37 | * changes here. | ||
| 38 | * | ||
| 39 | * Have by add of new parts a look about **Doxygen** `\\ingroup`, so that | ||
| 40 | * added parts included in documentation. | ||
| 41 | * | ||
| 42 | * If you add addon side related documentation, where his dev need know, use `///`. | ||
| 43 | * For parts only for Kodi make it like here. | ||
| 44 | * | ||
| 45 | * @endinternal | ||
| 46 | */ | ||
| 47 | |||
| 48 | namespace kodi | ||
| 49 | { | ||
| 50 | namespace addon | ||
| 51 | { | ||
| 52 | |||
| 53 | //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ | ||
| 54 | // "C++" Doxygen group set for the definitions | ||
| 55 | //{{{ | ||
| 56 | |||
| 57 | //============================================================================== | ||
| 58 | /// @defgroup cpp_kodi_addon_pvr_Defs Definitions, structures and enumerators | ||
| 59 | /// @ingroup cpp_kodi_addon_pvr | ||
| 60 | /// @brief **PVR client add-on instance definition values**\n | ||
| 61 | /// All PVR functions associated data structures. | ||
| 62 | /// | ||
| 63 | /// Used to exchange the available options between Kodi and addon.\n | ||
| 64 | /// The groups described here correspond to the groups of functions on PVR | ||
| 65 | /// instance class. | ||
| 66 | /// | ||
| 67 | |||
| 68 | //############################################################################## | ||
| 69 | /// @defgroup cpp_kodi_addon_pvr_Defs_General 1. General | ||
| 70 | /// @ingroup cpp_kodi_addon_pvr_Defs | ||
| 71 | /// @brief **PVR add-on general variables**\n | ||
| 72 | /// Used to exchange the available options between Kodi and addon. | ||
| 73 | /// | ||
| 74 | /// This group also includes @ref cpp_kodi_addon_pvr_Defs_PVRCapabilities with | ||
| 75 | /// which Kodi an @ref kodi::addon::CInstancePVRClient::GetCapabilities() | ||
| 76 | /// queries the supported **modules** of the addon. | ||
| 77 | /// | ||
| 78 | /// The standard values are also below, once for error messages and once to | ||
| 79 | /// @ref kodi::addon::CInstancePVRClient::ConnectionStateChange() to give Kodi | ||
| 80 | /// any information. | ||
| 81 | /// | ||
| 82 | ///@{ | ||
| 83 | //############################################################################## | ||
| 84 | /// @defgroup cpp_kodi_addon_pvr_Defs_General_Inputstream class PVRStreamProperty & definition PVR_STREAM_PROPERTY | ||
| 85 | /// @ingroup cpp_kodi_addon_pvr_Defs_General | ||
| 86 | /// @brief **Inputstream variables**\n | ||
| 87 | /// This includes values related to the outside of PVR available inputstream | ||
| 88 | /// system. | ||
| 89 | /// | ||
| 90 | /// This can be by separate instance on same addon, by handling in Kodi itself | ||
| 91 | /// or to reference of another addon where support needed inputstream. | ||
| 92 | /// | ||
| 93 | /// @note This is complete independent from own system included here | ||
| 94 | /// @ref cpp_kodi_addon_pvr_Streams "inputstream". | ||
| 95 | /// | ||
| 96 | //------------------------------------------------------------------------------ | ||
| 97 | ///@} | ||
| 98 | |||
| 99 | //############################################################################## | ||
| 100 | /// @defgroup cpp_kodi_addon_pvr_Defs_Channel 2. Channel | ||
| 101 | /// @ingroup cpp_kodi_addon_pvr_Defs | ||
| 102 | /// @brief **PVR add-on channel**\n | ||
| 103 | /// Used to exchange the available channel options between Kodi and addon. | ||
| 104 | /// | ||
| 105 | /// Modules here are mainly intended for @ref cpp_kodi_addon_pvr_Channels "channels", | ||
| 106 | /// but are also used on other modules to identify the respective TV/radio | ||
| 107 | /// channel. | ||
| 108 | /// | ||
| 109 | /// Because of @ref cpp_kodi_addon_pvr_Defs_Channel_PVRSignalStatus and | ||
| 110 | /// @ref cpp_kodi_addon_pvr_Defs_Channel_PVRDescrambleInfo is a special case at | ||
| 111 | /// this point. This is currently only used on running streams, but it may be | ||
| 112 | /// possible that this must always be usable in connection with PiP in the | ||
| 113 | /// future. | ||
| 114 | /// | ||
| 115 | //------------------------------------------------------------------------------ | ||
| 116 | |||
| 117 | //############################################################################## | ||
| 118 | /// @defgroup cpp_kodi_addon_pvr_Defs_ChannelGroup 3. Channel Group | ||
| 119 | /// @ingroup cpp_kodi_addon_pvr_Defs | ||
| 120 | /// @brief **PVR add-on channel group**\n | ||
| 121 | /// This group contains data classes and values which are used in PVR on | ||
| 122 | /// @ref cpp_kodi_addon_pvr_supportsChannelGroups "channel groups". | ||
| 123 | /// | ||
| 124 | //------------------------------------------------------------------------------ | ||
| 125 | |||
| 126 | //############################################################################## | ||
| 127 | /// @defgroup cpp_kodi_addon_pvr_Defs_epg 4. EPG Tag | ||
| 128 | /// @ingroup cpp_kodi_addon_pvr_Defs | ||
| 129 | /// @brief **PVR add-on EPG data**\n | ||
| 130 | /// Used on @ref cpp_kodi_addon_pvr_EPGTag "EPG methods in PVR instance class". | ||
| 131 | /// | ||
| 132 | /// See related modules about, also below in this view are few macros where | ||
| 133 | /// default values of associated places. | ||
| 134 | /// | ||
| 135 | //------------------------------------------------------------------------------ | ||
| 136 | |||
| 137 | //############################################################################## | ||
| 138 | /// @defgroup cpp_kodi_addon_pvr_Defs_Recording 5. Recording | ||
| 139 | /// @ingroup cpp_kodi_addon_pvr_Defs | ||
| 140 | /// @brief **Representation of a recording**\n | ||
| 141 | /// Used to exchange the available recording data between Kodi and addon on | ||
| 142 | /// @ref cpp_kodi_addon_pvr_Recordings "Recordings methods in PVR instance class". | ||
| 143 | /// | ||
| 144 | //------------------------------------------------------------------------------ | ||
| 145 | |||
| 146 | //############################################################################## | ||
| 147 | /// @defgroup cpp_kodi_addon_pvr_Defs_Timer 6. Timer | ||
| 148 | /// @ingroup cpp_kodi_addon_pvr_Defs | ||
| 149 | /// @brief **PVR add-on timer data**\n | ||
| 150 | /// Used to exchange the available timer data between Kodi and addon on | ||
| 151 | /// @ref cpp_kodi_addon_pvr_Timers "Timers methods in PVR instance class". | ||
| 152 | /// | ||
| 153 | //------------------------------------------------------------------------------ | ||
| 154 | |||
| 155 | //############################################################################## | ||
| 156 | /// @defgroup cpp_kodi_addon_pvr_Defs_Menuhook 7. Menuhook | ||
| 157 | /// @ingroup cpp_kodi_addon_pvr_Defs | ||
| 158 | /// @brief **PVR Context menu data**\n | ||
| 159 | /// Define data for the context menus available to the user | ||
| 160 | /// | ||
| 161 | //------------------------------------------------------------------------------ | ||
| 162 | |||
| 163 | //############################################################################## | ||
| 164 | /// @defgroup cpp_kodi_addon_pvr_Defs_EDLEntry 8. Edit decision list (EDL) | ||
| 165 | /// @ingroup cpp_kodi_addon_pvr_Defs | ||
| 166 | /// @brief **An edit decision list or EDL is used in the post-production process | ||
| 167 | /// of film editing and video editing**\n | ||
| 168 | /// Used on @ref kodi::addon::CInstancePVRClient::GetEPGTagEdl and | ||
| 169 | /// @ref kodi::addon::CInstancePVRClient::GetRecordingEdl | ||
| 170 | /// | ||
| 171 | //------------------------------------------------------------------------------ | ||
| 172 | |||
| 173 | //############################################################################## | ||
| 174 | /// @defgroup cpp_kodi_addon_pvr_Defs_Stream 9. Inputstream | ||
| 175 | /// @ingroup cpp_kodi_addon_pvr_Defs | ||
| 176 | /// @brief **Inputstream**\n | ||
| 177 | /// This includes classes and values that are used in the PVR inputstream. | ||
| 178 | /// | ||
| 179 | /// Used on @ref cpp_kodi_addon_pvr_Streams "Inputstream methods in PVR instance class". | ||
| 180 | /// | ||
| 181 | /// @note The parts here will be removed in the future and replaced by the | ||
| 182 | /// separate @ref cpp_kodi_addon_inputstream "inputstream addon instance". | ||
| 183 | /// If there is already a possibility, new addons should do it via the | ||
| 184 | /// inputstream instance. | ||
| 185 | /// | ||
| 186 | //------------------------------------------------------------------------------ | ||
| 187 | |||
| 188 | //}}} | ||
| 189 | //______________________________________________________________________________ | ||
| 190 | |||
| 191 | //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ | ||
| 192 | // "C++" PVR addon instance class | ||
| 193 | //{{{ | ||
| 194 | |||
| 195 | //============================================================================== | ||
| 196 | /// @addtogroup cpp_kodi_addon_pvr | ||
| 197 | /// @brief \cpp_class{ kodi::addon::CInstancePVRClient } | ||
| 198 | /// **PVR client add-on instance** | ||
| 199 | /// | ||
| 200 | /// Kodi features powerful [Live TV](https://kodi.wiki/view/Live_TV) and | ||
| 201 | /// [video recording (DVR/PVR)](http://en.wikipedia.org/wiki/Digital_video_recorder) | ||
| 202 | /// abilities using a very flexible distributed application structure. That is, by | ||
| 203 | /// leveraging other existing third-party | ||
| 204 | /// [PVR backend applications](https://kodi.wiki/view/PVR_backend) or | ||
| 205 | /// [DVR devices](https://kodi.wiki/view/PVR_backend) | ||
| 206 | /// that specialize in receiving television signals and also support the same type | ||
| 207 | /// of [client–server model](http://en.wikipedia.org/wiki/client%E2%80%93server_model) | ||
| 208 | /// which Kodi uses, (following a [frontend-backend](http://en.wikipedia.org/wiki/Front_and_back_ends) | ||
| 209 | /// design principle for [separation of concerns](http://en.wikipedia.org/wiki/Separation_of_concerns)), | ||
| 210 | /// these PVR features in Kodi allow you to watch Live TV, listen to radio, view an EPG TV-Guide | ||
| 211 | /// and schedule recordings, and also enables many other TV related features, all using | ||
| 212 | /// Kodi as your primary interface once the initial pairing connection and | ||
| 213 | /// configuration have been done. | ||
| 214 | /// | ||
| 215 | /// @note It is very important to understand that with "Live TV" in the reference | ||
| 216 | /// to PVR in Kodi, we do not mean [streaming video](http://en.wikipedia.org/wiki/Streaming_media) | ||
| 217 | /// from the internet via websites providing [free content](https://kodi.wiki/view/Free_content) | ||
| 218 | /// or online services such as Netflix, Hulu, Vudu and similar, no matter if that | ||
| 219 | /// content is actually streamed live or not. If that is what you are looking for | ||
| 220 | /// then you might want to look into [Video Addons](https://kodi.wiki/view/Add-ons) | ||
| 221 | /// for Kodi instead, (which again is not the same as the "PVR" or "Live TV" we | ||
| 222 | /// discuss in this article), but remember that [Kodi does not provide any video | ||
| 223 | /// content or video streaming services](https://kodi.wiki/view/Free_content). | ||
| 224 | /// | ||
| 225 | /// The use of the PVR is based on the @ref CInstancePVRClient. | ||
| 226 | /// | ||
| 227 | /// Include the header @ref PVR.h "#include <kodi/addon-instance/PVR.h>" | ||
| 228 | /// to use this class. | ||
| 229 | /// | ||
| 230 | /// | ||
| 231 | /// ---------------------------------------------------------------------------- | ||
| 232 | /// | ||
| 233 | /// Here is an example of what the <b>`addon.xml.in`</b> would look like for an PVR addon: | ||
| 234 | /// | ||
| 235 | /// ~~~~~~~~~~~~~{.xml} | ||
| 236 | /// <?xml version="1.0" encoding="UTF-8"?> | ||
| 237 | /// <addon | ||
| 238 | /// id="pvr.myspecialnamefor" | ||
| 239 | /// version="1.0.0" | ||
| 240 | /// name="My special PVR addon" | ||
| 241 | /// provider-name="Your Name"> | ||
| 242 | /// <requires>@ADDON_DEPENDS@</requires> | ||
| 243 | /// <extension | ||
| 244 | /// point="kodi.pvrclient" | ||
| 245 | /// library_@PLATFORM@="@LIBRARY_FILENAME@"/> | ||
| 246 | /// <extension point="xbmc.addon.metadata"> | ||
| 247 | /// <summary lang="en_GB">My PVR addon addon</summary> | ||
| 248 | /// <description lang="en_GB">My PVR addon description</description> | ||
| 249 | /// <platform>@PLATFORM@</platform> | ||
| 250 | /// </extension> | ||
| 251 | /// </addon> | ||
| 252 | /// ~~~~~~~~~~~~~ | ||
| 253 | /// | ||
| 254 | /// | ||
| 255 | /// At <b>`<extension point="kodi.pvrclient" ...>`</b> the basic instance definition is declared, this is intended to identify the addon as an PVR and to see its supported types: | ||
| 256 | /// | Name | Description | ||
| 257 | /// |------|---------------------- | ||
| 258 | /// | <b>`point`</b> | The identification of the addon instance to inputstream is mandatory <b>`kodi.pvrclient`</b>. In addition, the instance declared in the first <b>`<extension ... />`</b> is also the main type of addon. | ||
| 259 | /// | <b>`library_@PLATFORM@`</b> | The runtime library used for the addon. This is usually declared by cmake and correctly displayed in the translated `addon.xml`. | ||
| 260 | /// | ||
| 261 | /// | ||
| 262 | /// @remark For more detailed description of the <b>`addon.xml`</b>, see also https://kodi.wiki/view/Addon.xml. | ||
| 263 | /// | ||
| 264 | /// | ||
| 265 | /// -------------------------------------------------------------------------- | ||
| 266 | /// | ||
| 267 | /// **Example:** | ||
| 268 | /// | ||
| 269 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 270 | /// #include <kodi/addon-instance/PVR.h> | ||
| 271 | /// | ||
| 272 | /// class CMyPVRClient : public ::kodi::addon::CInstancePVRClient | ||
| 273 | /// { | ||
| 274 | /// public: | ||
| 275 | /// CMyPVRClient(KODI_HANDLE instance, const std::string& kodiVersion); | ||
| 276 | /// | ||
| 277 | /// PVR_ERROR GetCapabilities(kodi::addon::PVRCapabilities& capabilities) override; | ||
| 278 | /// PVR_ERROR GetBackendName(std::string& name) override; | ||
| 279 | /// PVR_ERROR GetBackendVersion(std::string& version) override; | ||
| 280 | /// | ||
| 281 | /// PVR_ERROR GetChannelsAmount(int& amount) override; | ||
| 282 | /// PVR_ERROR GetChannels(bool radio, std::vector<kodi::addon::PVRChannel>& channels) override; | ||
| 283 | /// PVR_ERROR GetChannelStreamProperties(const kodi::addon::PVRChannel& channel, | ||
| 284 | /// std::vector<kodi::addon::PVRStreamProperty>& properties) override; | ||
| 285 | /// | ||
| 286 | /// private: | ||
| 287 | /// std::vector<kodi::addon::PVRChannel> m_myChannels; | ||
| 288 | /// }; | ||
| 289 | /// | ||
| 290 | /// CMyPVRClient::CMyPVRClient(KODI_HANDLE instance, const std::string& kodiVersion) | ||
| 291 | /// : CInstancePVRClient(instance, kodiVersion) | ||
| 292 | /// { | ||
| 293 | /// kodi::addon::PVRChannel channel; | ||
| 294 | /// channel.SetUniqueId(123); | ||
| 295 | /// channel.SetChannelNumber(1); | ||
| 296 | /// channel.SetChannelName("My test channel"); | ||
| 297 | /// m_myChannels.push_back(channel); | ||
| 298 | /// } | ||
| 299 | /// | ||
| 300 | /// PVR_ERROR CMyPVRClient::GetCapabilities(kodi::addon::PVRCapabilities& capabilities) | ||
| 301 | /// { | ||
| 302 | /// capabilities.SetSupportsTV(true); | ||
| 303 | /// return PVR_ERROR_NO_ERROR; | ||
| 304 | /// } | ||
| 305 | /// | ||
| 306 | /// PVR_ERROR CMyPVRClient::GetBackendName(std::string& name) | ||
| 307 | /// { | ||
| 308 | /// name = "My special PVR client"; | ||
| 309 | /// return PVR_ERROR_NO_ERROR; | ||
| 310 | /// } | ||
| 311 | /// | ||
| 312 | /// PVR_ERROR CMyPVRClient::GetBackendVersion(std::string& version) | ||
| 313 | /// { | ||
| 314 | /// version = "1.0.0"; | ||
| 315 | /// return PVR_ERROR_NO_ERROR; | ||
| 316 | /// } | ||
| 317 | /// | ||
| 318 | /// PVR_ERROR CMyInstance::GetChannelsAmount(int& amount) | ||
| 319 | /// { | ||
| 320 | /// amount = m_myChannels.size(); | ||
| 321 | /// return PVR_ERROR_NO_ERROR; | ||
| 322 | /// } | ||
| 323 | /// | ||
| 324 | /// PVR_ERROR CMyPVRClient::GetChannels(bool radio, std::vector<kodi::addon::PVRChannel>& channels) | ||
| 325 | /// { | ||
| 326 | /// channels = m_myChannels; | ||
| 327 | /// return PVR_ERROR_NO_ERROR; | ||
| 328 | /// } | ||
| 329 | /// | ||
| 330 | /// PVR_ERROR CMyPVRClient::GetChannelStreamProperties(const kodi::addon::PVRChannel& channel, | ||
| 331 | /// std::vector<kodi::addon::PVRStreamProperty>& properties) | ||
| 332 | /// { | ||
| 333 | /// if (channel.GetUniqueId() == 123) | ||
| 334 | /// { | ||
| 335 | /// properties.push_back(PVR_STREAM_PROPERTY_STREAMURL, "http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_30fps_normal.mp4"); | ||
| 336 | /// properties.push_back(PVR_STREAM_PROPERTY_ISREALTIMESTREAM, "true"); | ||
| 337 | /// return PVR_ERROR_NO_ERROR; | ||
| 338 | /// } | ||
| 339 | /// return PVR_ERROR_UNKNOWN; | ||
| 340 | /// } | ||
| 341 | /// | ||
| 342 | /// ... | ||
| 343 | /// | ||
| 344 | /// //---------------------------------------------------------------------- | ||
| 345 | /// | ||
| 346 | /// class CMyAddon : public ::kodi::addon::CAddonBase | ||
| 347 | /// { | ||
| 348 | /// public: | ||
| 349 | /// CMyAddon() = default; | ||
| 350 | /// ADDON_STATUS CreateInstance(int instanceType, | ||
| 351 | /// const std::string& instanceID, | ||
| 352 | /// KODI_HANDLE instance, | ||
| 353 | /// const std::string& version, | ||
| 354 | /// KODI_HANDLE& addonInstance) override; | ||
| 355 | /// }; | ||
| 356 | /// | ||
| 357 | /// // If you use only one instance in your add-on, can be instanceType and | ||
| 358 | /// // instanceID ignored | ||
| 359 | /// ADDON_STATUS CMyAddon::CreateInstance(int instanceType, | ||
| 360 | /// const std::string& instanceID, | ||
| 361 | /// KODI_HANDLE instance, | ||
| 362 | /// const std::string& version, | ||
| 363 | /// KODI_HANDLE& addonInstance) | ||
| 364 | /// { | ||
| 365 | /// if (instanceType == ADDON_INSTANCE_PVR) | ||
| 366 | /// { | ||
| 367 | /// kodi::Log(ADDON_LOG_INFO, "Creating my PVR client instance"); | ||
| 368 | /// addonInstance = new CMyPVRClient(instance, version); | ||
| 369 | /// return ADDON_STATUS_OK; | ||
| 370 | /// } | ||
| 371 | /// else if (...) | ||
| 372 | /// { | ||
| 373 | /// ... | ||
| 374 | /// } | ||
| 375 | /// return ADDON_STATUS_UNKNOWN; | ||
| 376 | /// } | ||
| 377 | /// | ||
| 378 | /// ADDONCREATOR(CMyAddon) | ||
| 379 | /// ~~~~~~~~~~~~~ | ||
| 380 | /// | ||
| 381 | /// The destruction of the example class `CMyPVRClient` is called from | ||
| 382 | /// Kodi's header. Manually deleting the add-on instance is not required. | ||
| 383 | /// | ||
| 384 | class ATTRIBUTE_HIDDEN CInstancePVRClient : public IAddonInstance | ||
| 385 | { | ||
| 386 | public: | ||
| 387 | //============================================================================ | ||
| 388 | /// @defgroup cpp_kodi_addon_pvr_Base 1. Basic functions | ||
| 389 | /// @ingroup cpp_kodi_addon_pvr | ||
| 390 | /// @brief **Functions to manage the addon and get basic information about it**\n | ||
| 391 | /// These are e.g. @ref GetCapabilities to know supported groups at | ||
| 392 | /// this addon or the others to get information about the source of the PVR | ||
| 393 | /// stream. | ||
| 394 | /// | ||
| 395 | /// The with "Valid implementation required." declared functions are mandatory, | ||
| 396 | /// all others are an option. | ||
| 397 | /// | ||
| 398 | /// | ||
| 399 | ///--------------------------------------------------------------------------- | ||
| 400 | /// | ||
| 401 | /// **Basic parts in interface:**\n | ||
| 402 | /// Copy this to your project and extend with your parts or leave functions | ||
| 403 | /// complete away where not used or supported. | ||
| 404 | /// | ||
| 405 | /// @copydetails cpp_kodi_addon_pvr_Base_header_addon_auto_check | ||
| 406 | /// @copydetails cpp_kodi_addon_pvr_Base_source_addon_auto_check | ||
| 407 | /// | ||
| 408 | ///@{ | ||
| 409 | |||
| 410 | //============================================================================ | ||
| 411 | /// @brief PVR client class constructor. | ||
| 412 | /// | ||
| 413 | /// Used by an add-on that only supports only PVR and only in one instance. | ||
| 414 | /// | ||
| 415 | /// | ||
| 416 | /// -------------------------------------------------------------------------- | ||
| 417 | /// | ||
| 418 | /// **Here's example about the use of this:** | ||
| 419 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 420 | /// #include <kodi/addon-instance/PVR.h> | ||
| 421 | /// ... | ||
| 422 | /// | ||
| 423 | /// class ATTRIBUTE_HIDDEN CPVRExample | ||
| 424 | /// : public kodi::addon::CAddonBase, | ||
| 425 | /// public kodi::addon::CInstancePVRClient | ||
| 426 | /// { | ||
| 427 | /// public: | ||
| 428 | /// CPVRExample() | ||
| 429 | /// { | ||
| 430 | /// } | ||
| 431 | /// | ||
| 432 | /// ~CPVRExample() override; | ||
| 433 | /// { | ||
| 434 | /// } | ||
| 435 | /// | ||
| 436 | /// ... | ||
| 437 | /// }; | ||
| 438 | /// | ||
| 439 | /// ADDONCREATOR(CPVRExample) | ||
| 440 | /// ~~~~~~~~~~~~~ | ||
| 441 | /// | ||
| 442 | CInstancePVRClient() : IAddonInstance(ADDON_INSTANCE_PVR, GetKodiTypeVersion(ADDON_INSTANCE_PVR)) | ||
| 443 | { | ||
| 444 | if (CAddonBase::m_interface->globalSingleInstance != nullptr) | ||
| 445 | throw std::logic_error("kodi::addon::CInstancePVRClient: Creation of more as one in single " | ||
| 446 | "instance way is not allowed!"); | ||
| 447 | |||
| 448 | SetAddonStruct(CAddonBase::m_interface->firstKodiInstance, m_kodiVersion); | ||
| 449 | CAddonBase::m_interface->globalSingleInstance = this; | ||
| 450 | } | ||
| 451 | //---------------------------------------------------------------------------- | ||
| 452 | |||
| 453 | //============================================================================ | ||
| 454 | /// @brief PVR client class constructor used to support multiple instance | ||
| 455 | /// types. | ||
| 456 | /// | ||
| 457 | /// @param[in] instance The instance value given to | ||
| 458 | /// <b>`kodi::addon::CAddonBase::CreateInstance(...)`</b>. | ||
| 459 | /// @param[in] kodiVersion [opt] Version used in Kodi for this instance, to | ||
| 460 | /// allow compatibility to older Kodi versions. | ||
| 461 | /// | ||
| 462 | /// @note Recommended to set <b>`kodiVersion`</b>. | ||
| 463 | /// | ||
| 464 | /// | ||
| 465 | /// -------------------------------------------------------------------------- | ||
| 466 | /// | ||
| 467 | /// **Here's example about the use of this:** | ||
| 468 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 469 | /// class CMyPVRClient : public ::kodi::addon::CInstancePVRClient | ||
| 470 | /// { | ||
| 471 | /// public: | ||
| 472 | /// CMyPVRClient(KODI_HANDLE instance, const std::string& kodiVersion) | ||
| 473 | /// : CInstancePVRClient(instance, kodiVersion) | ||
| 474 | /// { | ||
| 475 | /// ... | ||
| 476 | /// } | ||
| 477 | /// | ||
| 478 | /// ... | ||
| 479 | /// }; | ||
| 480 | /// | ||
| 481 | /// ADDON_STATUS CMyAddon::CreateInstance(int instanceType, | ||
| 482 | /// const std::string& instanceID, | ||
| 483 | /// KODI_HANDLE instance, | ||
| 484 | /// const std::string& version, | ||
| 485 | /// KODI_HANDLE& addonInstance) | ||
| 486 | /// { | ||
| 487 | /// kodi::Log(ADDON_LOG_INFO, "Creating my PVR client instance"); | ||
| 488 | /// addonInstance = new CMyPVRClient(instance, version); | ||
| 489 | /// return ADDON_STATUS_OK; | ||
| 490 | /// } | ||
| 491 | /// ~~~~~~~~~~~~~ | ||
| 492 | /// | ||
| 493 | explicit CInstancePVRClient(KODI_HANDLE instance, const std::string& kodiVersion = "") | ||
| 494 | : IAddonInstance(ADDON_INSTANCE_PVR, | ||
| 495 | !kodiVersion.empty() ? kodiVersion : GetKodiTypeVersion(ADDON_INSTANCE_PVR)) | ||
| 496 | { | ||
| 497 | if (CAddonBase::m_interface->globalSingleInstance != nullptr) | ||
| 498 | throw std::logic_error("kodi::addon::CInstancePVRClient: Creation of multiple together with " | ||
| 499 | "single instance way is not allowed!"); | ||
| 500 | |||
| 501 | SetAddonStruct(instance, m_kodiVersion); | ||
| 502 | } | ||
| 503 | //---------------------------------------------------------------------------- | ||
| 504 | |||
| 505 | //============================================================================ | ||
| 506 | /// @brief Destructor | ||
| 507 | /// | ||
| 508 | ~CInstancePVRClient() override = default; | ||
| 509 | //---------------------------------------------------------------------------- | ||
| 510 | |||
| 511 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 512 | |||
| 513 | //============================================================================ | ||
| 514 | /// @brief Get the list of features that this add-on provides. | ||
| 515 | /// | ||
| 516 | /// Called by Kodi to query the add-on's capabilities. | ||
| 517 | /// Used to check which options should be presented in the UI, which methods to call, etc. | ||
| 518 | /// All capabilities that the add-on supports should be set to true. | ||
| 519 | /// | ||
| 520 | /// @param capabilities The with @ref cpp_kodi_addon_pvr_Defs_PVRCapabilities defined add-on's capabilities. | ||
| 521 | /// @return @ref PVR_ERROR_NO_ERROR if the properties were fetched successfully. | ||
| 522 | /// | ||
| 523 | /// -------------------------------------------------------------------------- | ||
| 524 | /// | ||
| 525 | /// @copydetails cpp_kodi_addon_pvr_Defs_PVRCapabilities_Help | ||
| 526 | /// | ||
| 527 | /// | ||
| 528 | /// -------------------------------------------------------------------------- | ||
| 529 | /// | ||
| 530 | /// **Example:** | ||
| 531 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 532 | /// PVR_ERROR CMyPVRClient::GetCapabilities(kodi::addon::PVRCapabilities& capabilities) | ||
| 533 | /// { | ||
| 534 | /// capabilities.SetSupportsTV(true); | ||
| 535 | /// capabilities.SetSupportsEPG(true); | ||
| 536 | /// return PVR_ERROR_NO_ERROR; | ||
| 537 | /// } | ||
| 538 | /// ~~~~~~~~~~~~~ | ||
| 539 | /// | ||
| 540 | /// -------------------------------------------------------------------------- | ||
| 541 | /// | ||
| 542 | /// @note Valid implementation required. | ||
| 543 | /// | ||
| 544 | virtual PVR_ERROR GetCapabilities(kodi::addon::PVRCapabilities& capabilities) = 0; | ||
| 545 | //---------------------------------------------------------------------------- | ||
| 546 | |||
| 547 | //============================================================================ | ||
| 548 | /// @brief Get the name reported by the backend that will be displayed in the UI. | ||
| 549 | /// | ||
| 550 | /// @param[out] name The name reported by the backend that will be displayed in the UI. | ||
| 551 | /// @return @ref PVR_ERROR_NO_ERROR if successfully done | ||
| 552 | /// | ||
| 553 | /// | ||
| 554 | /// -------------------------------------------------------------------------- | ||
| 555 | /// | ||
| 556 | /// **Example:** | ||
| 557 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 558 | /// PVR_ERROR CMyPVRClient::GetBackendName(std::string& name) | ||
| 559 | /// { | ||
| 560 | /// name = "My special PVR client"; | ||
| 561 | /// return PVR_ERROR_NO_ERROR; | ||
| 562 | /// } | ||
| 563 | /// ~~~~~~~~~~~~~ | ||
| 564 | /// | ||
| 565 | /// -------------------------------------------------------------------------- | ||
| 566 | /// | ||
| 567 | /// @note Valid implementation required. | ||
| 568 | /// | ||
| 569 | virtual PVR_ERROR GetBackendName(std::string& name) = 0; | ||
| 570 | //---------------------------------------------------------------------------- | ||
| 571 | |||
| 572 | //============================================================================ | ||
| 573 | /// @brief Get the version string reported by the backend that will be | ||
| 574 | /// displayed in the UI. | ||
| 575 | /// | ||
| 576 | /// @param[out] version The version string reported by the backend that will be | ||
| 577 | /// displayed in the UI. | ||
| 578 | /// @return @ref PVR_ERROR_NO_ERROR if successfully done | ||
| 579 | /// | ||
| 580 | /// | ||
| 581 | /// -------------------------------------------------------------------------- | ||
| 582 | /// | ||
| 583 | /// **Example:** | ||
| 584 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 585 | /// PVR_ERROR CMyPVRClient::GetBackendVersion(std::string& version) | ||
| 586 | /// { | ||
| 587 | /// version = "1.0.0"; | ||
| 588 | /// return PVR_ERROR_NO_ERROR; | ||
| 589 | /// } | ||
| 590 | /// ~~~~~~~~~~~~~ | ||
| 591 | /// | ||
| 592 | /// -------------------------------------------------------------------------- | ||
| 593 | /// | ||
| 594 | /// @note Valid implementation required. | ||
| 595 | /// | ||
| 596 | virtual PVR_ERROR GetBackendVersion(std::string& version) = 0; | ||
| 597 | //---------------------------------------------------------------------------- | ||
| 598 | |||
| 599 | //============================================================================ | ||
| 600 | /// @brief Get the hostname of the pvr backend server | ||
| 601 | /// | ||
| 602 | /// @param[out] hostname Hostname as ip address or alias. If backend does not | ||
| 603 | /// utilize a server, return empty string. | ||
| 604 | /// @return @ref PVR_ERROR_NO_ERROR if successfully done | ||
| 605 | /// | ||
| 606 | virtual PVR_ERROR GetBackendHostname(std::string& hostname) { return PVR_ERROR_NOT_IMPLEMENTED; } | ||
| 607 | //---------------------------------------------------------------------------- | ||
| 608 | |||
| 609 | //============================================================================ | ||
| 610 | /// @brief To get the connection string reported by the backend that will be | ||
| 611 | /// displayed in the UI. | ||
| 612 | /// | ||
| 613 | /// @param[out] connection The connection string reported by the backend that | ||
| 614 | /// will be displayed in the UI. | ||
| 615 | /// @return @ref PVR_ERROR_NO_ERROR if successfully done | ||
| 616 | /// | ||
| 617 | virtual PVR_ERROR GetConnectionString(std::string& connection) | ||
| 618 | { | ||
| 619 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 620 | } | ||
| 621 | //---------------------------------------------------------------------------- | ||
| 622 | |||
| 623 | //============================================================================ | ||
| 624 | /// @brief Get the disk space reported by the backend (if supported). | ||
| 625 | /// | ||
| 626 | /// @param[in] total The total disk space in KiB. | ||
| 627 | /// @param[in] used The used disk space in KiB. | ||
| 628 | /// @return @ref PVR_ERROR_NO_ERROR if the drive space has been fetched | ||
| 629 | /// successfully. | ||
| 630 | /// | ||
| 631 | /// | ||
| 632 | /// -------------------------------------------------------------------------- | ||
| 633 | /// | ||
| 634 | /// **Example:** | ||
| 635 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 636 | /// PVR_ERROR CMyPVRClient::GetDriveSpace(uint64_t& total, uint64_t& used) | ||
| 637 | /// { | ||
| 638 | /// total = 100 * 1024 * 1024; // To set complete size of drive in KiB (100GB) | ||
| 639 | /// used = 12232424; // To set the used amount | ||
| 640 | /// return PVR_ERROR_NO_ERROR; | ||
| 641 | /// } | ||
| 642 | /// ~~~~~~~~~~~~~ | ||
| 643 | /// | ||
| 644 | virtual PVR_ERROR GetDriveSpace(uint64_t& total, uint64_t& used) | ||
| 645 | { | ||
| 646 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 647 | } | ||
| 648 | //---------------------------------------------------------------------------- | ||
| 649 | |||
| 650 | //============================================================================ | ||
| 651 | /// @brief Call one of the settings related menu hooks (if supported). | ||
| 652 | /// | ||
| 653 | /// Supported @ref cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook "menu hook " | ||
| 654 | /// instances have to be added in `constructor()`, by calling @ref AddMenuHook() | ||
| 655 | /// on the callback. | ||
| 656 | /// | ||
| 657 | /// @param[in] menuhook The hook to call. | ||
| 658 | /// @return @ref PVR_ERROR_NO_ERROR if the hook was called successfully. | ||
| 659 | /// | ||
| 660 | /// -------------------------------------------------------------------------- | ||
| 661 | /// | ||
| 662 | /// @copydetails cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook_Help | ||
| 663 | /// | ||
| 664 | /// | ||
| 665 | /// -------------------------------------------------------------------------- | ||
| 666 | /// | ||
| 667 | /// **Example:** | ||
| 668 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 669 | /// PVR_ERROR CMyPVRClient::CallSettingsMenuHook(const kodi::addon::PVRMenuhook& menuhook) | ||
| 670 | /// { | ||
| 671 | /// if (menuhook.GetHookId() == 2) | ||
| 672 | /// kodi::QueueNotification(QUEUE_INFO, "", kodi::GetLocalizedString(menuhook.GetLocalizedStringId())); | ||
| 673 | /// return PVR_ERROR_NO_ERROR; | ||
| 674 | /// } | ||
| 675 | /// ~~~~~~~~~~~~~ | ||
| 676 | /// | ||
| 677 | virtual PVR_ERROR CallSettingsMenuHook(const kodi::addon::PVRMenuhook& menuhook) | ||
| 678 | { | ||
| 679 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 680 | } | ||
| 681 | //---------------------------------------------------------------------------- | ||
| 682 | |||
| 683 | //========================================================================== | ||
| 684 | /// @brief **Callback to Kodi Function**\nAdd or replace a menu hook for the context menu for this add-on | ||
| 685 | /// | ||
| 686 | /// This is a callback function, called from addon to give Kodi his context menu's. | ||
| 687 | /// | ||
| 688 | /// @param[in] menuhook The with @ref cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook defined hook to add | ||
| 689 | /// | ||
| 690 | /// @remarks Only called from addon itself | ||
| 691 | /// | ||
| 692 | /// -------------------------------------------------------------------------- | ||
| 693 | /// | ||
| 694 | /// @copydetails cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook_Help | ||
| 695 | /// | ||
| 696 | /// | ||
| 697 | /// -------------------------------------------------------------------------- | ||
| 698 | /// | ||
| 699 | /// **Here's an example of the use of it:** | ||
| 700 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 701 | /// #include <kodi/addon-instance/PVR.h> | ||
| 702 | /// ... | ||
| 703 | /// | ||
| 704 | /// { | ||
| 705 | /// kodi::addon::PVRMenuhook hook; | ||
| 706 | /// hook.SetHookId(1); | ||
| 707 | /// hook.SetCategory(PVR_MENUHOOK_CHANNEL); | ||
| 708 | /// hook.SetLocalizedStringId(30000); | ||
| 709 | /// AddMenuHook(hook); | ||
| 710 | /// } | ||
| 711 | /// | ||
| 712 | /// { | ||
| 713 | /// kodi::addon::PVRMenuhook hook; | ||
| 714 | /// hook.SetHookId(2); | ||
| 715 | /// hook.SetCategory(PVR_MENUHOOK_SETTING); | ||
| 716 | /// hook.SetLocalizedStringId(30001); | ||
| 717 | /// AddMenuHook(hook); | ||
| 718 | /// } | ||
| 719 | /// ... | ||
| 720 | /// ~~~~~~~~~~~~~ | ||
| 721 | /// | ||
| 722 | /// **Here another way:** | ||
| 723 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 724 | /// #include <kodi/addon-instance/PVR.h> | ||
| 725 | /// ... | ||
| 726 | /// | ||
| 727 | /// AddMenuHook(kodi::addon::PVRMenuhook(1, 30000, PVR_MENUHOOK_CHANNEL)); | ||
| 728 | /// AddMenuHook(kodi::addon::PVRMenuhook(2, 30001, PVR_MENUHOOK_SETTING)); | ||
| 729 | /// ... | ||
| 730 | /// ~~~~~~~~~~~~~ | ||
| 731 | /// | ||
| 732 | inline void AddMenuHook(const kodi::addon::PVRMenuhook& hook) | ||
| 733 | { | ||
| 734 | m_instanceData->toKodi->AddMenuHook(m_instanceData->toKodi->kodiInstance, hook); | ||
| 735 | } | ||
| 736 | //---------------------------------------------------------------------------- | ||
| 737 | |||
| 738 | //========================================================================== | ||
| 739 | /// @brief **Callback to Kodi Function**\n | ||
| 740 | /// Notify a state change for a PVR backend connection. | ||
| 741 | /// | ||
| 742 | /// @param[in] connectionString The connection string reported by the backend | ||
| 743 | /// that can be displayed in the UI. | ||
| 744 | /// @param[in] newState The by @ref PVR_CONNECTION_STATE defined new state. | ||
| 745 | /// @param[in] message A localized addon-defined string representing the new | ||
| 746 | /// state, that can be displayed in the UI or **empty** if | ||
| 747 | /// the Kodi-defined default string for the new state | ||
| 748 | /// shall be displayed. | ||
| 749 | /// | ||
| 750 | /// @remarks Only called from addon itself | ||
| 751 | /// | ||
| 752 | /// | ||
| 753 | /// -------------------------------------------------------------------------- | ||
| 754 | /// | ||
| 755 | /// | ||
| 756 | /// **Here's an example of the use of it:** | ||
| 757 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 758 | /// #include <kodi/addon-instance/PVR.h> | ||
| 759 | /// #include <kodi/General.h> /* for kodi::GetLocalizedString(...) */ | ||
| 760 | /// ... | ||
| 761 | /// | ||
| 762 | /// ConnectionStateChange("PVR demo connection lost", PVR_CONNECTION_STATE_DISCONNECTED, kodi::GetLocalizedString(30005, "Lost connection to Server");); | ||
| 763 | /// ... | ||
| 764 | /// ~~~~~~~~~~~~~ | ||
| 765 | /// | ||
| 766 | inline void ConnectionStateChange(const std::string& connectionString, | ||
| 767 | PVR_CONNECTION_STATE newState, | ||
| 768 | const std::string& message) | ||
| 769 | { | ||
| 770 | m_instanceData->toKodi->ConnectionStateChange( | ||
| 771 | m_instanceData->toKodi->kodiInstance, connectionString.c_str(), newState, message.c_str()); | ||
| 772 | } | ||
| 773 | //---------------------------------------------------------------------------- | ||
| 774 | |||
| 775 | //========================================================================== | ||
| 776 | /// @brief **Callback to Kodi Function**\n | ||
| 777 | /// Get user data path of the PVR addon. | ||
| 778 | /// | ||
| 779 | /// @return Path of current Kodi user | ||
| 780 | /// | ||
| 781 | /// @remarks Only called from addon itself | ||
| 782 | /// | ||
| 783 | /// @note Alternatively, @ref kodi::GetAddonPath() can be used for this. | ||
| 784 | /// | ||
| 785 | inline std::string UserPath() const { return m_instanceData->props->strUserPath; } | ||
| 786 | //---------------------------------------------------------------------------- | ||
| 787 | |||
| 788 | //========================================================================== | ||
| 789 | /// @brief **Callback to Kodi Function**\n | ||
| 790 | /// Get main client path of the PVR addon. | ||
| 791 | /// | ||
| 792 | /// @return Path of addon client | ||
| 793 | /// | ||
| 794 | /// @remarks Only called from addon itself. | ||
| 795 | /// | ||
| 796 | /// @note Alternatively, @ref kodi::GetBaseUserPath() can be used for this. | ||
| 797 | /// | ||
| 798 | inline std::string ClientPath() const { return m_instanceData->props->strClientPath; } | ||
| 799 | //---------------------------------------------------------------------------- | ||
| 800 | |||
| 801 | ///@} | ||
| 802 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 803 | |||
| 804 | //============================================================================ | ||
| 805 | /// @defgroup cpp_kodi_addon_pvr_Channels 2. Channels (required) | ||
| 806 | /// @ingroup cpp_kodi_addon_pvr | ||
| 807 | /// @brief **Functions to get available TV or Radio channels**\n | ||
| 808 | /// These are mandatory functions for using this addon to get the available | ||
| 809 | /// channels. | ||
| 810 | /// | ||
| 811 | /// @remarks Either @ref PVRCapabilities::SetSupportsTV "SetSupportsTV()" or | ||
| 812 | /// @ref PVRCapabilities::SetSupportsRadio "SetSupportsRadio()" is required to | ||
| 813 | /// be set to <b>`true`</b>.\n | ||
| 814 | /// If a channel changes after the initial import, or if a new one was added, | ||
| 815 | /// then the add-on should call @ref TriggerChannelUpdate(). | ||
| 816 | /// | ||
| 817 | /// | ||
| 818 | ///--------------------------------------------------------------------------- | ||
| 819 | /// | ||
| 820 | /// **Channel parts in interface:**\n | ||
| 821 | /// Copy this to your project and extend with your parts or leave functions | ||
| 822 | /// complete away where not used or supported. | ||
| 823 | /// | ||
| 824 | /// @copydetails cpp_kodi_addon_pvr_Channels_header_addon_auto_check | ||
| 825 | /// @copydetails cpp_kodi_addon_pvr_Channels_source_addon_auto_check | ||
| 826 | /// | ||
| 827 | ///@{ | ||
| 828 | |||
| 829 | //============================================================================ | ||
| 830 | /// @brief The total amount of channels on the backend | ||
| 831 | /// | ||
| 832 | /// @param[out] amount The total amount of channels on the backend | ||
| 833 | /// @return @ref PVR_ERROR_NO_ERROR if the amount has been fetched successfully. | ||
| 834 | /// | ||
| 835 | /// @remarks Valid implementation required. | ||
| 836 | /// | ||
| 837 | virtual PVR_ERROR GetChannelsAmount(int& amount) { return PVR_ERROR_NOT_IMPLEMENTED; } | ||
| 838 | //---------------------------------------------------------------------------- | ||
| 839 | |||
| 840 | //============================================================================ | ||
| 841 | /// @brief Request the list of all channels from the backend. | ||
| 842 | /// | ||
| 843 | /// @param[in] radio True to get the radio channels, false to get the TV channels. | ||
| 844 | /// @param[out] results The channels defined with @ref cpp_kodi_addon_pvr_Defs_Channel_PVRChannel | ||
| 845 | /// and available at the addon, them transferred with | ||
| 846 | /// @ref cpp_kodi_addon_pvr_Defs_Channel_PVRChannelsResultSet. | ||
| 847 | /// @return @ref PVR_ERROR_NO_ERROR if the list has been fetched successfully. | ||
| 848 | /// | ||
| 849 | /// -------------------------------------------------------------------------- | ||
| 850 | /// | ||
| 851 | /// @copydetails cpp_kodi_addon_pvr_Defs_Channel_PVRChannel_Help | ||
| 852 | /// | ||
| 853 | /// | ||
| 854 | /// -------------------------------------------------------------------------- | ||
| 855 | /// | ||
| 856 | /// @remarks | ||
| 857 | /// If @ref PVRCapabilities::SetSupportsTV() is set to | ||
| 858 | /// <b>`true`</b>, a valid result set needs to be provided for <b>`radio = false`</b>.\n | ||
| 859 | /// If @ref PVRCapabilities::SetSupportsRadio() is set to | ||
| 860 | /// <b>`true`</b>, a valid result set needs to be provided for <b>`radio = true`</b>. | ||
| 861 | /// At least one of these two must provide a valid result set. | ||
| 862 | /// | ||
| 863 | /// | ||
| 864 | ///--------------------------------------------------------------------------- | ||
| 865 | /// | ||
| 866 | /// **Example:** | ||
| 867 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 868 | /// ... | ||
| 869 | /// PVR_ERROR CMyPVRInstance::GetChannels(bool radio, kodi::addon::PVRChannelsResultSet& results) | ||
| 870 | /// { | ||
| 871 | /// // Minimal demo example, in reality bigger and loop to transfer all | ||
| 872 | /// kodi::addon::PVRChannel channel; | ||
| 873 | /// channel.SetUniqueId(123); | ||
| 874 | /// channel.SetIsRadio(false); | ||
| 875 | /// channel.SetChannelNumber(1); | ||
| 876 | /// channel.SetChannelName("My channel name"); | ||
| 877 | /// ... | ||
| 878 | /// | ||
| 879 | /// // Give it now to Kodi | ||
| 880 | /// results.Add(channel); | ||
| 881 | /// return PVR_ERROR_NO_ERROR; | ||
| 882 | /// } | ||
| 883 | /// ... | ||
| 884 | /// ~~~~~~~~~~~~~ | ||
| 885 | /// | ||
| 886 | virtual PVR_ERROR GetChannels(bool radio, kodi::addon::PVRChannelsResultSet& results) | ||
| 887 | { | ||
| 888 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 889 | } | ||
| 890 | //---------------------------------------------------------------------------- | ||
| 891 | |||
| 892 | //============================================================================ | ||
| 893 | /// @brief Get the stream properties for a channel from the backend. | ||
| 894 | /// | ||
| 895 | /// @param[in] channel The channel to get the stream properties for. | ||
| 896 | /// @param[out] properties the properties required to play the stream. | ||
| 897 | /// @return @ref PVR_ERROR_NO_ERROR if the stream is available. | ||
| 898 | /// | ||
| 899 | /// @remarks If @ref PVRCapabilities::SetSupportsTV "SetSupportsTV" or | ||
| 900 | /// @ref PVRCapabilities::SetSupportsRadio "SetSupportsRadio" are set to true | ||
| 901 | /// and @ref PVRCapabilities::SetHandlesInputStream "SetHandlesInputStream" is | ||
| 902 | /// set to false.\n\n | ||
| 903 | /// In this case the implementation must fill the property @ref PVR_STREAM_PROPERTY_STREAMURL | ||
| 904 | /// with the URL Kodi should resolve to playback the channel. | ||
| 905 | /// | ||
| 906 | /// @note The value directly related to inputstream must always begin with the | ||
| 907 | /// name of the associated add-on, e.g. <b>`"inputstream.adaptive.manifest_update_parameter"`</b>. | ||
| 908 | /// | ||
| 909 | /// | ||
| 910 | ///--------------------------------------------------------------------------- | ||
| 911 | /// | ||
| 912 | /// **Example:** | ||
| 913 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 914 | /// ... | ||
| 915 | /// PVR_ERROR CMyPVRInstance::GetChannelStreamProperties(const kodi::addon::PVRChannel& channel, | ||
| 916 | /// std::vector<kodi::addon::PVRStreamProperty>& properties) | ||
| 917 | /// { | ||
| 918 | /// ... | ||
| 919 | /// properties.emplace_back(PVR_STREAM_PROPERTY_INPUTSTREAM, "inputstream.adaptive"); | ||
| 920 | /// properties.emplace_back("inputstream.adaptive.manifest_type", "mpd"); | ||
| 921 | /// properties.emplace_back("inputstream.adaptive.manifest_update_parameter", "full"); | ||
| 922 | /// properties.emplace_back(PVR_STREAM_PROPERTY_MIMETYPE, "application/xml+dash"); | ||
| 923 | /// return PVR_ERROR_NO_ERROR; | ||
| 924 | /// } | ||
| 925 | /// ... | ||
| 926 | /// ~~~~~~~~~~~~~ | ||
| 927 | /// | ||
| 928 | virtual PVR_ERROR GetChannelStreamProperties( | ||
| 929 | const kodi::addon::PVRChannel& channel, | ||
| 930 | std::vector<kodi::addon::PVRStreamProperty>& properties) | ||
| 931 | { | ||
| 932 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 933 | } | ||
| 934 | //---------------------------------------------------------------------------- | ||
| 935 | |||
| 936 | //============================================================================ | ||
| 937 | /// @brief Get the signal status of the stream that's currently open. | ||
| 938 | /// | ||
| 939 | /// @param[out] signalStatus The signal status. | ||
| 940 | /// @return @ref PVR_ERROR_NO_ERROR if the signal status has been read successfully, false otherwise. | ||
| 941 | /// | ||
| 942 | /// @remarks Optional, and only used if @ref PVRCapabilities::SetHandlesInputStream "SetHandlesInputStream" | ||
| 943 | /// is set to true. | ||
| 944 | /// | ||
| 945 | /// -------------------------------------------------------------------------- | ||
| 946 | /// | ||
| 947 | /// @copydetails cpp_kodi_addon_pvr_Defs_Channel_PVRSignalStatus_Help | ||
| 948 | /// | ||
| 949 | /// | ||
| 950 | /// -------------------------------------------------------------------------- | ||
| 951 | /// | ||
| 952 | /// | ||
| 953 | /// **Here's example about the use of this:** | ||
| 954 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 955 | /// #include <kodi/addon-instance/PVR.h> | ||
| 956 | /// ... | ||
| 957 | /// | ||
| 958 | /// class ATTRIBUTE_HIDDEN CPVRExample | ||
| 959 | /// : public kodi::addon::CAddonBase, | ||
| 960 | /// public kodi::addon::CInstancePVRClient | ||
| 961 | /// { | ||
| 962 | /// public: | ||
| 963 | /// ... | ||
| 964 | /// PVR_ERROR SignalStatus(PVRSignalStatus &signalStatus) override | ||
| 965 | /// { | ||
| 966 | /// signalStatus.SetAapterName("Example adapter 1"); | ||
| 967 | /// signalStatus.SetAdapterStatus("OK"); | ||
| 968 | /// signalStatus.SetSignal(0xFFFF); // 100% | ||
| 969 | /// | ||
| 970 | /// return PVR_ERROR_NO_ERROR; | ||
| 971 | /// } | ||
| 972 | /// }; | ||
| 973 | /// | ||
| 974 | /// ADDONCREATOR(CPVRExample) | ||
| 975 | /// ~~~~~~~~~~~~~ | ||
| 976 | /// | ||
| 977 | virtual PVR_ERROR GetSignalStatus(int channelUid, kodi::addon::PVRSignalStatus& signalStatus) | ||
| 978 | { | ||
| 979 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 980 | } | ||
| 981 | //---------------------------------------------------------------------------- | ||
| 982 | |||
| 983 | //============================================================================ | ||
| 984 | /// @brief Get the descramble information of the stream that's currently open. | ||
| 985 | /// | ||
| 986 | /// @param[out] descrambleInfo The descramble information. | ||
| 987 | /// @return @ref PVR_ERROR_NO_ERROR if the descramble information has been | ||
| 988 | /// read successfully, false otherwise. | ||
| 989 | /// | ||
| 990 | /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsDescrambleInfo "supportsDescrambleInfo" | ||
| 991 | /// is set to true. | ||
| 992 | /// | ||
| 993 | /// -------------------------------------------------------------------------- | ||
| 994 | /// | ||
| 995 | /// @copydetails cpp_kodi_addon_pvr_Defs_Channel_PVRDescrambleInfo_Help | ||
| 996 | /// | ||
| 997 | virtual PVR_ERROR GetDescrambleInfo(int channelUid, | ||
| 998 | kodi::addon::PVRDescrambleInfo& descrambleInfo) | ||
| 999 | { | ||
| 1000 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 1001 | } | ||
| 1002 | //---------------------------------------------------------------------------- | ||
| 1003 | |||
| 1004 | //============================================================================ | ||
| 1005 | /// @brief **Callback to Kodi Function**\n | ||
| 1006 | /// Request Kodi to update it's list of channels. | ||
| 1007 | /// | ||
| 1008 | /// @remarks Only called from addon itself. | ||
| 1009 | /// | ||
| 1010 | inline void TriggerChannelUpdate() | ||
| 1011 | { | ||
| 1012 | m_instanceData->toKodi->TriggerChannelUpdate(m_instanceData->toKodi->kodiInstance); | ||
| 1013 | } | ||
| 1014 | //---------------------------------------------------------------------------- | ||
| 1015 | |||
| 1016 | ///@} | ||
| 1017 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 1018 | |||
| 1019 | //============================================================================ | ||
| 1020 | /// @defgroup cpp_kodi_addon_pvr_supportsChannelGroups 3. Channel Groups (optional) | ||
| 1021 | /// @ingroup cpp_kodi_addon_pvr | ||
| 1022 | /// @brief <b>Bring in this functions if you have set @ref PVRCapabilities::SetSupportsChannelGroups "supportsChannelGroups" | ||
| 1023 | /// to true</b>\n | ||
| 1024 | /// This is used to divide available addon channels into groups, which can | ||
| 1025 | /// then be selected by the user. | ||
| 1026 | /// | ||
| 1027 | /// | ||
| 1028 | ///--------------------------------------------------------------------------- | ||
| 1029 | /// | ||
| 1030 | /// **Channel group parts in interface:**\n | ||
| 1031 | /// Copy this to your project and extend with your parts or leave functions | ||
| 1032 | /// complete away where not used or supported. | ||
| 1033 | /// | ||
| 1034 | /// @copydetails cpp_kodi_addon_pvr_supportsChannelGroups_header_addon_auto_check | ||
| 1035 | /// @copydetails cpp_kodi_addon_pvr_supportsChannelGroups_source_addon_auto_check | ||
| 1036 | /// | ||
| 1037 | ///@{ | ||
| 1038 | |||
| 1039 | //============================================================================ | ||
| 1040 | /// @brief Get the total amount of channel groups on the backend if it supports channel groups. | ||
| 1041 | /// | ||
| 1042 | /// @param[out] amount The total amount of channel groups on the backend | ||
| 1043 | /// @return @ref PVR_ERROR_NO_ERROR if the amount has been fetched successfully. | ||
| 1044 | /// | ||
| 1045 | /// @remarks Required if @ref PVRCapabilities::SetSupportsChannelGroups "supportsChannelGroups" is set to true. | ||
| 1046 | /// | ||
| 1047 | virtual PVR_ERROR GetChannelGroupsAmount(int& amount) { return PVR_ERROR_NOT_IMPLEMENTED; } | ||
| 1048 | //---------------------------------------------------------------------------- | ||
| 1049 | |||
| 1050 | //============================================================================ | ||
| 1051 | /// @brief Get a list of available channel groups on addon | ||
| 1052 | /// | ||
| 1053 | /// Request the list of all channel groups from the backend if it supports | ||
| 1054 | /// channel groups. | ||
| 1055 | /// | ||
| 1056 | /// @param[in] radio True to get the radio channel groups, false to get the | ||
| 1057 | /// TV channel groups. | ||
| 1058 | /// @param[out] results List of available groups on addon defined with | ||
| 1059 | /// @ref cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroup, | ||
| 1060 | /// them transferred with | ||
| 1061 | /// @ref cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupsResultSet. | ||
| 1062 | /// @return @ref PVR_ERROR_NO_ERROR if the list has been fetched successfully. | ||
| 1063 | /// | ||
| 1064 | /// -------------------------------------------------------------------------- | ||
| 1065 | /// | ||
| 1066 | /// @copydetails cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroup_Help | ||
| 1067 | /// | ||
| 1068 | /// | ||
| 1069 | /// -------------------------------------------------------------------------- | ||
| 1070 | /// | ||
| 1071 | /// @remarks Required if @ref PVRCapabilities::SetSupportsChannelGroups "supportsChannelGroups" | ||
| 1072 | /// is set to true. | ||
| 1073 | /// | ||
| 1074 | /// | ||
| 1075 | ///--------------------------------------------------------------------------- | ||
| 1076 | /// | ||
| 1077 | /// **Example:** | ||
| 1078 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 1079 | /// ... | ||
| 1080 | /// PVR_ERROR CMyPVRInstance::GetChannelGroups(bool radio, kodi::addon::PVRChannelGroupsResultSet& groups) | ||
| 1081 | /// { | ||
| 1082 | /// kodi::addon::PVRChannelGroup group; | ||
| 1083 | /// group.SetIsRadio(false); | ||
| 1084 | /// group.SetGroupName("My group name"); | ||
| 1085 | /// group.SetPosition(1); | ||
| 1086 | /// ... | ||
| 1087 | /// | ||
| 1088 | /// // Give it now to Kodi | ||
| 1089 | /// results.Add(group); | ||
| 1090 | /// return PVR_ERROR_NO_ERROR; | ||
| 1091 | /// } | ||
| 1092 | /// ... | ||
| 1093 | /// ~~~~~~~~~~~~~ | ||
| 1094 | /// | ||
| 1095 | virtual PVR_ERROR GetChannelGroups(bool radio, kodi::addon::PVRChannelGroupsResultSet& results) | ||
| 1096 | { | ||
| 1097 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 1098 | } | ||
| 1099 | //---------------------------------------------------------------------------- | ||
| 1100 | |||
| 1101 | //============================================================================ | ||
| 1102 | /// @brief Get a list of members on a group | ||
| 1103 | /// | ||
| 1104 | /// Request the list of all group members of a group from the backend if it | ||
| 1105 | /// supports channel groups. | ||
| 1106 | /// | ||
| 1107 | /// @param[in] group The group to get the members for. | ||
| 1108 | /// @param[out] results List of available group member channels defined with | ||
| 1109 | /// @ref cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember, | ||
| 1110 | /// them transferred with | ||
| 1111 | /// @ref PVRChannelGroupMembersResultSet. | ||
| 1112 | /// @return @ref PVR_ERROR_NO_ERROR if the list has been fetched successfully. | ||
| 1113 | /// | ||
| 1114 | /// -------------------------------------------------------------------------- | ||
| 1115 | /// | ||
| 1116 | /// @copydetails cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember_Help | ||
| 1117 | /// | ||
| 1118 | /// -------------------------------------------------------------------------- | ||
| 1119 | /// | ||
| 1120 | /// @remarks Required if @ref PVRCapabilities::SetSupportsChannelGroups "supportsChannelGroups" | ||
| 1121 | /// is set to true. | ||
| 1122 | /// | ||
| 1123 | /// | ||
| 1124 | ///--------------------------------------------------------------------------- | ||
| 1125 | /// | ||
| 1126 | /// **Example:** | ||
| 1127 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 1128 | /// ... | ||
| 1129 | /// PVR_ERROR CMyPVRInstance::GetChannelGroupMembers(const kodi::addon::PVRChannelGroup& group, | ||
| 1130 | /// kodi::addon::PVRChannelGroupMembersResultSet& results) | ||
| 1131 | /// { | ||
| 1132 | /// for (const auto& myGroup : m_myGroups) | ||
| 1133 | /// { | ||
| 1134 | /// if (myGroup.strGroupName == group.GetGroupName()) | ||
| 1135 | /// { | ||
| 1136 | /// for (unsigned int iChannelPtr = 0; iChannelPtr < myGroup.members.size(); iChannelPtr++) | ||
| 1137 | /// { | ||
| 1138 | /// int iId = myGroup.members.at(iChannelPtr) - 1; | ||
| 1139 | /// if (iId < 0 || iId > (int)m_channels.size() - 1) | ||
| 1140 | /// continue; | ||
| 1141 | /// | ||
| 1142 | /// PVRDemoChannel &channel = m_channels.at(iId); | ||
| 1143 | /// kodi::addon::PVRChannelGroupMember kodiGroupMember; | ||
| 1144 | /// kodiGroupMember.SetGroupName(group.GetGroupName()); | ||
| 1145 | /// kodiGroupMember.SetChannelUniqueId(channel.iUniqueId); | ||
| 1146 | /// kodiGroupMember.SetChannelNumber(channel.iChannelNumber); | ||
| 1147 | /// kodiGroupMember.SetSubChannelNumber(channel.iSubChannelNumber); | ||
| 1148 | /// | ||
| 1149 | /// results.Add(kodiGroupMember); | ||
| 1150 | /// } | ||
| 1151 | /// } | ||
| 1152 | /// } | ||
| 1153 | /// return PVR_ERROR_NO_ERROR; | ||
| 1154 | /// } | ||
| 1155 | /// ... | ||
| 1156 | /// ~~~~~~~~~~~~~ | ||
| 1157 | /// | ||
| 1158 | virtual PVR_ERROR GetChannelGroupMembers(const kodi::addon::PVRChannelGroup& group, | ||
| 1159 | kodi::addon::PVRChannelGroupMembersResultSet& results) | ||
| 1160 | { | ||
| 1161 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 1162 | } | ||
| 1163 | //---------------------------------------------------------------------------- | ||
| 1164 | |||
| 1165 | //============================================================================ | ||
| 1166 | /// @brief **Callback to Kodi Function**\n | ||
| 1167 | /// Request Kodi to update it's list of channel groups. | ||
| 1168 | /// | ||
| 1169 | /// @remarks Only called from addon itself | ||
| 1170 | /// | ||
| 1171 | inline void TriggerChannelGroupsUpdate() | ||
| 1172 | { | ||
| 1173 | m_instanceData->toKodi->TriggerChannelGroupsUpdate(m_instanceData->toKodi->kodiInstance); | ||
| 1174 | } | ||
| 1175 | //---------------------------------------------------------------------------- | ||
| 1176 | |||
| 1177 | ///@} | ||
| 1178 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 1179 | |||
| 1180 | //============================================================================ | ||
| 1181 | /// @defgroup cpp_kodi_addon_pvr_supportsChannelEdit 4. Channel edit (optional) | ||
| 1182 | /// @ingroup cpp_kodi_addon_pvr | ||
| 1183 | /// @brief <b>Bring in this functions if you have set @ref PVRCapabilities::SetSupportsChannelSettings "supportsChannelSettings" | ||
| 1184 | /// to true or for @ref OpenDialogChannelScan() set @ref PVRCapabilities::SetSupportsChannelScan "supportsChannelScan" | ||
| 1185 | /// to true</b>\n | ||
| 1186 | /// The support of this is a pure option and not mandatory. | ||
| 1187 | /// | ||
| 1188 | /// | ||
| 1189 | ///--------------------------------------------------------------------------- | ||
| 1190 | /// | ||
| 1191 | /// **Channel edit parts in interface:**\n | ||
| 1192 | /// Copy this to your project and extend with your parts or leave functions | ||
| 1193 | /// complete away where not used or supported. | ||
| 1194 | /// | ||
| 1195 | /// @copydetails cpp_kodi_addon_pvr_supportsChannelEdit_header_addon_auto_check | ||
| 1196 | /// @copydetails cpp_kodi_addon_pvr_supportsChannelEdit_source_addon_auto_check | ||
| 1197 | /// | ||
| 1198 | ///@{ | ||
| 1199 | |||
| 1200 | //============================================================================ | ||
| 1201 | /// @brief Delete a channel from the backend. | ||
| 1202 | /// | ||
| 1203 | /// @param[in] channel The channel to delete. | ||
| 1204 | /// @return @ref PVR_ERROR_NO_ERROR if the channel has been deleted successfully. | ||
| 1205 | /// @remarks Required if @ref PVRCapabilities::SetSupportsChannelSettings "supportsChannelSettings" | ||
| 1206 | /// is set to true. | ||
| 1207 | /// | ||
| 1208 | virtual PVR_ERROR DeleteChannel(const kodi::addon::PVRChannel& channel) | ||
| 1209 | { | ||
| 1210 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 1211 | } | ||
| 1212 | //---------------------------------------------------------------------------- | ||
| 1213 | |||
| 1214 | //========================================================================== | ||
| 1215 | /// @brief Rename a channel on the backend. | ||
| 1216 | /// | ||
| 1217 | /// @param[in] channel The channel to rename, containing the new channel name. | ||
| 1218 | /// @return @ref PVR_ERROR_NO_ERROR if the channel has been renamed successfully. | ||
| 1219 | /// | ||
| 1220 | /// -------------------------------------------------------------------------- | ||
| 1221 | /// | ||
| 1222 | /// @copydetails cpp_kodi_addon_pvr_Defs_Channel_PVRChannel_Help | ||
| 1223 | /// | ||
| 1224 | /// | ||
| 1225 | /// -------------------------------------------------------------------------- | ||
| 1226 | /// | ||
| 1227 | /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsChannelSettings "supportsChannelSettings" | ||
| 1228 | /// is set to true. | ||
| 1229 | /// | ||
| 1230 | virtual PVR_ERROR RenameChannel(const kodi::addon::PVRChannel& channel) | ||
| 1231 | { | ||
| 1232 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 1233 | } | ||
| 1234 | //---------------------------------------------------------------------------- | ||
| 1235 | |||
| 1236 | //========================================================================== | ||
| 1237 | /// @brief Show the channel settings dialog, if supported by the backend. | ||
| 1238 | /// | ||
| 1239 | /// @param[in] channel The channel to show the dialog for. | ||
| 1240 | /// @return @ref PVR_ERROR_NO_ERROR if the dialog has been displayed successfully. | ||
| 1241 | /// | ||
| 1242 | /// @remarks Required if @ref PVRCapabilities::SetSupportsChannelSettings "supportsChannelSettings" is set to true. | ||
| 1243 | /// @note Use @ref cpp_kodi_gui_CWindow "kodi::gui::CWindow" to create dialog for them. | ||
| 1244 | /// | ||
| 1245 | virtual PVR_ERROR OpenDialogChannelSettings(const kodi::addon::PVRChannel& channel) | ||
| 1246 | { | ||
| 1247 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 1248 | } | ||
| 1249 | //---------------------------------------------------------------------------- | ||
| 1250 | |||
| 1251 | //========================================================================== | ||
| 1252 | /// @brief Show the dialog to add a channel on the backend, if supported by the backend. | ||
| 1253 | /// | ||
| 1254 | /// @param[in] channel The channel to add. | ||
| 1255 | /// @return @ref PVR_ERROR_NO_ERROR if the channel has been added successfully. | ||
| 1256 | /// | ||
| 1257 | /// @remarks Required if @ref PVRCapabilities::SetSupportsChannelSettings "supportsChannelSettings" is set to true. | ||
| 1258 | /// @note Use @ref cpp_kodi_gui_CWindow "kodi::gui::CWindow" to create dialog for them. | ||
| 1259 | /// | ||
| 1260 | virtual PVR_ERROR OpenDialogChannelAdd(const kodi::addon::PVRChannel& channel) | ||
| 1261 | { | ||
| 1262 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 1263 | } | ||
| 1264 | //---------------------------------------------------------------------------- | ||
| 1265 | |||
| 1266 | //========================================================================== | ||
| 1267 | /// @brief Show the channel scan dialog if this backend supports it. | ||
| 1268 | /// | ||
| 1269 | /// @return @ref PVR_ERROR_NO_ERROR if the dialog was displayed successfully. | ||
| 1270 | /// | ||
| 1271 | /// @remarks Required if @ref PVRCapabilities::SetSupportsChannelScan "supportsChannelScan" is set to true. | ||
| 1272 | /// @note Use @ref cpp_kodi_gui_CWindow "kodi::gui::CWindow" to create dialog for them. | ||
| 1273 | /// | ||
| 1274 | virtual PVR_ERROR OpenDialogChannelScan() { return PVR_ERROR_NOT_IMPLEMENTED; } | ||
| 1275 | //---------------------------------------------------------------------------- | ||
| 1276 | |||
| 1277 | //========================================================================== | ||
| 1278 | /// @brief Call one of the channel related menu hooks (if supported). | ||
| 1279 | /// | ||
| 1280 | /// Supported @ref cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook instances have to be added in | ||
| 1281 | /// `constructor()`, by calling @ref AddMenuHook() on the callback. | ||
| 1282 | /// | ||
| 1283 | /// @param[in] menuhook The hook to call. | ||
| 1284 | /// @param[in] item The selected channel item for which the hook was called. | ||
| 1285 | /// @return @ref PVR_ERROR_NO_ERROR if the hook was called successfully. | ||
| 1286 | /// | ||
| 1287 | /// -------------------------------------------------------------------------- | ||
| 1288 | /// | ||
| 1289 | /// @copydetails cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook_Help | ||
| 1290 | /// | ||
| 1291 | virtual PVR_ERROR CallChannelMenuHook(const kodi::addon::PVRMenuhook& menuhook, | ||
| 1292 | const kodi::addon::PVRChannel& item) | ||
| 1293 | { | ||
| 1294 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 1295 | } | ||
| 1296 | //---------------------------------------------------------------------------- | ||
| 1297 | |||
| 1298 | ///@} | ||
| 1299 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 1300 | |||
| 1301 | //============================================================================ | ||
| 1302 | /// @defgroup cpp_kodi_addon_pvr_EPGTag 4. EPG methods (optional) | ||
| 1303 | /// @ingroup cpp_kodi_addon_pvr | ||
| 1304 | /// @brief **PVR EPG methods**\n | ||
| 1305 | /// These C ++ class functions of are intended for processing EPG information | ||
| 1306 | /// and for giving it to Kodi. | ||
| 1307 | /// | ||
| 1308 | /// The necessary data is transferred with @ref cpp_kodi_addon_pvr_Defs_epg_PVREPGTag. | ||
| 1309 | /// | ||
| 1310 | /// @remarks Only used by Kodi if @ref PVRCapabilities::SetSupportsEPG "supportsEPG" | ||
| 1311 | /// is set to true.\n\n | ||
| 1312 | /// | ||
| 1313 | /// | ||
| 1314 | ///--------------------------------------------------------------------------- | ||
| 1315 | /// | ||
| 1316 | /// **EPG parts in interface:**\n | ||
| 1317 | /// Copy this to your project and extend with your parts or leave functions | ||
| 1318 | /// complete away where not used or supported. | ||
| 1319 | /// | ||
| 1320 | /// @copydetails cpp_kodi_addon_pvr_EPGTag_header_addon_auto_check | ||
| 1321 | /// @copydetails cpp_kodi_addon_pvr_EPGTag_source_addon_auto_check | ||
| 1322 | /// | ||
| 1323 | ///@{ | ||
| 1324 | |||
| 1325 | //============================================================================ | ||
| 1326 | /// @brief Request the EPG for a channel from the backend. | ||
| 1327 | /// | ||
| 1328 | /// @param[in] channelUid The UID of the channel to get the EPG table for. | ||
| 1329 | /// @param[in] start Get events after this time (UTC). | ||
| 1330 | /// @param[in] end Get events before this time (UTC). | ||
| 1331 | /// @param[out] results List where available EPG information becomes | ||
| 1332 | /// transferred with @ref cpp_kodi_addon_pvr_Defs_epg_PVREPGTag | ||
| 1333 | /// and given to Kodi | ||
| 1334 | /// @return @ref PVR_ERROR_NO_ERROR if the table has been fetched successfully. | ||
| 1335 | /// | ||
| 1336 | /// -------------------------------------------------------------------------- | ||
| 1337 | /// | ||
| 1338 | /// @copydetails cpp_kodi_addon_pvr_Defs_epg_PVREPGTag_Help | ||
| 1339 | /// | ||
| 1340 | /// | ||
| 1341 | /// -------------------------------------------------------------------------- | ||
| 1342 | /// | ||
| 1343 | /// @remarks Required if @ref PVRCapabilities::SetSupportsEPG "supportsEPG" is set to true. | ||
| 1344 | /// | ||
| 1345 | /// | ||
| 1346 | ///--------------------------------------------------------------------------- | ||
| 1347 | /// | ||
| 1348 | /// **Example:** | ||
| 1349 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 1350 | /// ... | ||
| 1351 | /// PVR_ERROR CMyPVRInstance::GetEPGForChannel(int channelUid, | ||
| 1352 | /// time_t start, | ||
| 1353 | /// time_t end, | ||
| 1354 | /// kodi::addon::PVREPGTagsResultSet& results) | ||
| 1355 | /// { | ||
| 1356 | /// // Minimal demo example, in reality bigger, loop to transfer all and to | ||
| 1357 | /// // match wanted times. | ||
| 1358 | /// kodi::addon::PVREPGTag tag; | ||
| 1359 | /// tag.SetUniqueBroadcastId(123); | ||
| 1360 | /// tag.SetUniqueChannelId(123); | ||
| 1361 | /// tag.SetTitle("My epg entry name"); | ||
| 1362 | /// tag.SetGenreType(EPG_EVENT_CONTENTMASK_MOVIEDRAMA); | ||
| 1363 | /// tag.SetStartTime(1589148283); // Seconds elapsed since 00:00 hours, Jan 1, 1970 UTC | ||
| 1364 | /// tag.SetEndTime(1589151913); | ||
| 1365 | /// ... | ||
| 1366 | /// | ||
| 1367 | /// // Give it now to Kodi | ||
| 1368 | /// results.Add(tag); | ||
| 1369 | /// return PVR_ERROR_NO_ERROR; | ||
| 1370 | /// } | ||
| 1371 | /// ... | ||
| 1372 | /// ~~~~~~~~~~~~~ | ||
| 1373 | /// | ||
| 1374 | virtual PVR_ERROR GetEPGForChannel(int channelUid, | ||
| 1375 | time_t start, | ||
| 1376 | time_t end, | ||
| 1377 | kodi::addon::PVREPGTagsResultSet& results) | ||
| 1378 | { | ||
| 1379 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 1380 | } | ||
| 1381 | //---------------------------------------------------------------------------- | ||
| 1382 | |||
| 1383 | //============================================================================ | ||
| 1384 | /// @brief Check if the given EPG tag can be recorded. | ||
| 1385 | /// | ||
| 1386 | /// @param[in] tag the @ref cpp_kodi_addon_pvr_Defs_epg_PVREPGTag "epg tag" to check. | ||
| 1387 | /// @param[out] isRecordable Set to true if the tag can be recorded. | ||
| 1388 | /// @return @ref PVR_ERROR_NO_ERROR if bIsRecordable has been set successfully. | ||
| 1389 | /// | ||
| 1390 | /// @remarks Optional, it return @ref PVR_ERROR_NOT_IMPLEMENTED by parent to let Kodi decide. | ||
| 1391 | /// | ||
| 1392 | virtual PVR_ERROR IsEPGTagRecordable(const kodi::addon::PVREPGTag& tag, bool& isRecordable) | ||
| 1393 | { | ||
| 1394 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 1395 | } | ||
| 1396 | //---------------------------------------------------------------------------- | ||
| 1397 | |||
| 1398 | //============================================================================ | ||
| 1399 | /// @brief Check if the given EPG tag can be played. | ||
| 1400 | /// | ||
| 1401 | /// @param[in] tag the @ref cpp_kodi_addon_pvr_Defs_epg_PVREPGTag "epg tag" to check. | ||
| 1402 | /// @param[out] isPlayable Set to true if the tag can be played. | ||
| 1403 | /// @return @ref PVR_ERROR_NO_ERROR if bIsPlayable has been set successfully. | ||
| 1404 | /// | ||
| 1405 | /// @remarks Required if add-on supports playing epg tags. | ||
| 1406 | /// | ||
| 1407 | virtual PVR_ERROR IsEPGTagPlayable(const kodi::addon::PVREPGTag& tag, bool& isPlayable) | ||
| 1408 | { | ||
| 1409 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 1410 | } | ||
| 1411 | //---------------------------------------------------------------------------- | ||
| 1412 | |||
| 1413 | //============================================================================ | ||
| 1414 | /// @brief Retrieve the edit decision list (EDL) of an EPG tag on the backend. | ||
| 1415 | /// | ||
| 1416 | /// @param[in] tag The @ref cpp_kodi_addon_pvr_Defs_epg_PVREPGTag "epg tag". | ||
| 1417 | /// @param[out] edl The function has to write the EDL into this array. | ||
| 1418 | /// @return @ref PVR_ERROR_NO_ERROR if the EDL was successfully read or no EDL exists. | ||
| 1419 | /// | ||
| 1420 | /// @remarks Required if @ref PVRCapabilities::SetSupportsEPGEdl "supportsEPGEdl" is set to true. | ||
| 1421 | /// | ||
| 1422 | /// -------------------------------------------------------------------------- | ||
| 1423 | /// | ||
| 1424 | /// @copydetails cpp_kodi_addon_pvr_Defs_EDLEntry_PVREDLEntry_Help | ||
| 1425 | /// | ||
| 1426 | /// | ||
| 1427 | /// -------------------------------------------------------------------------- | ||
| 1428 | /// | ||
| 1429 | /// @remarks Required if @ref PVRCapabilities::SetSupportsEPGEdl "supportsEPGEdl" is set to true. | ||
| 1430 | /// | ||
| 1431 | virtual PVR_ERROR GetEPGTagEdl(const kodi::addon::PVREPGTag& tag, | ||
| 1432 | std::vector<kodi::addon::PVREDLEntry>& edl) | ||
| 1433 | { | ||
| 1434 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 1435 | } | ||
| 1436 | //---------------------------------------------------------------------------- | ||
| 1437 | |||
| 1438 | //============================================================================ | ||
| 1439 | /// @brief Get the stream properties for an epg tag from the backend. | ||
| 1440 | /// | ||
| 1441 | /// @param[in] tag The @ref cpp_kodi_addon_pvr_Defs_epg_PVREPGTag "epg tag" to get the stream properties for. | ||
| 1442 | /// @param[out] properties the properties required to play the stream. | ||
| 1443 | /// @return @ref PVR_ERROR_NO_ERROR if the stream is available. | ||
| 1444 | /// | ||
| 1445 | /// @remarks Required if add-on supports playing epg tags. | ||
| 1446 | /// In this case your implementation must fill the property @ref PVR_STREAM_PROPERTY_STREAMURL | ||
| 1447 | /// with the URL Kodi should resolve to playback the epg tag. | ||
| 1448 | /// It return @ref PVR_ERROR_NOT_IMPLEMENTED from parent if this add-on won't provide this function. | ||
| 1449 | /// | ||
| 1450 | /// @note The value directly related to inputstream must always begin with the | ||
| 1451 | /// name of the associated add-on, e.g. <b>`"inputstream.adaptive.manifest_update_parameter"`</b>. | ||
| 1452 | /// | ||
| 1453 | /// | ||
| 1454 | ///--------------------------------------------------------------------------- | ||
| 1455 | /// | ||
| 1456 | /// **Example:** | ||
| 1457 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 1458 | /// ... | ||
| 1459 | /// PVR_ERROR CMyPVRInstance::GetEPGTagStreamProperties(const kodi::addon::PVREPGTag& tag, | ||
| 1460 | /// std::vector<kodi::addon::PVRStreamProperty>& properties) | ||
| 1461 | /// { | ||
| 1462 | /// ... | ||
| 1463 | /// properties.emplace_back(PVR_STREAM_PROPERTY_INPUTSTREAM, "inputstream.adaptive"); | ||
| 1464 | /// properties.emplace_back("inputstream.adaptive.manifest_type", "mpd"); | ||
| 1465 | /// properties.emplace_back("inputstream.adaptive.manifest_update_parameter", "full"); | ||
| 1466 | /// properties.emplace_back(PVR_STREAM_PROPERTY_MIMETYPE, "application/xml+dash"); | ||
| 1467 | /// return PVR_ERROR_NO_ERROR; | ||
| 1468 | /// } | ||
| 1469 | /// ... | ||
| 1470 | /// ~~~~~~~~~~~~~ | ||
| 1471 | /// | ||
| 1472 | virtual PVR_ERROR GetEPGTagStreamProperties( | ||
| 1473 | const kodi::addon::PVREPGTag& tag, std::vector<kodi::addon::PVRStreamProperty>& properties) | ||
| 1474 | { | ||
| 1475 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 1476 | } | ||
| 1477 | //---------------------------------------------------------------------------- | ||
| 1478 | |||
| 1479 | //============================================================================ | ||
| 1480 | /// @brief Tell the client the time frame to use when notifying epg events back to Kodi | ||
| 1481 | /// | ||
| 1482 | /// The client might push epg events asynchronously to Kodi using the callback function | ||
| 1483 | /// @ref EpgEventStateChange. To be able to only push events that are actually of | ||
| 1484 | /// interest for Kodi, client needs to know about the epg time frame Kodi uses. Kodi | ||
| 1485 | /// supplies the current epg time frame value in @ref EpgMaxDays() when creating the | ||
| 1486 | /// addon and calls @ref SetEPGTimeFrame later whenever Kodi's epg time frame value | ||
| 1487 | /// changes. | ||
| 1488 | /// | ||
| 1489 | /// @param[in] days number of days from "now". @ref EPG_TIMEFRAME_UNLIMITED means that Kodi | ||
| 1490 | /// is interested in all epg events, regardless of event times. | ||
| 1491 | /// @return @ref PVR_ERROR_NO_ERROR if new value was successfully set. | ||
| 1492 | /// | ||
| 1493 | /// @remarks Required if @ref PVRCapabilities::SetSupportsEPG "supportsEPG" is set to true. | ||
| 1494 | /// | ||
| 1495 | virtual PVR_ERROR SetEPGTimeFrame(int days) { return PVR_ERROR_NOT_IMPLEMENTED; } | ||
| 1496 | //---------------------------------------------------------------------------- | ||
| 1497 | |||
| 1498 | //========================================================================== | ||
| 1499 | /// @brief Call one of the EPG related menu hooks (if supported). | ||
| 1500 | /// | ||
| 1501 | /// Supported @ref cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook instances have to be added in | ||
| 1502 | /// `constructor()`, by calling @ref AddMenuHook() on the callback. | ||
| 1503 | /// | ||
| 1504 | /// @param[in] menuhook The hook to call. | ||
| 1505 | /// @param[in] tag The selected EPG item for which the hook was called. | ||
| 1506 | /// @return @ref PVR_ERROR_NO_ERROR if the hook was called successfully. | ||
| 1507 | /// | ||
| 1508 | /// -------------------------------------------------------------------------- | ||
| 1509 | /// | ||
| 1510 | /// @copydetails cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook_Help | ||
| 1511 | /// | ||
| 1512 | virtual PVR_ERROR CallEPGMenuHook(const kodi::addon::PVRMenuhook& menuhook, | ||
| 1513 | const kodi::addon::PVREPGTag& tag) | ||
| 1514 | { | ||
| 1515 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 1516 | } | ||
| 1517 | //---------------------------------------------------------------------------- | ||
| 1518 | |||
| 1519 | //========================================================================== | ||
| 1520 | /// @brief **Callback to Kodi Function**\n | ||
| 1521 | /// Get the Max days handled by Kodi. | ||
| 1522 | /// | ||
| 1523 | /// If > @ref EPG_TIMEFRAME_UNLIMITED, in async epg mode, deliver only events | ||
| 1524 | /// in the range from 'end time > now' to 'start time < now + EpgMaxDays(). | ||
| 1525 | /// @ref EPG_TIMEFRAME_UNLIMITED, notify all events. | ||
| 1526 | /// | ||
| 1527 | /// @return The Max days handled by Kodi | ||
| 1528 | /// | ||
| 1529 | inline int EpgMaxDays() const { return m_instanceData->props->iEpgMaxDays; } | ||
| 1530 | //---------------------------------------------------------------------------- | ||
| 1531 | |||
| 1532 | //========================================================================== | ||
| 1533 | /// @brief **Callback to Kodi Function**\n | ||
| 1534 | /// Schedule an EPG update for the given channel channel. | ||
| 1535 | /// | ||
| 1536 | /// @param[in] channelUid The unique id of the channel for this add-on | ||
| 1537 | /// | ||
| 1538 | /// @remarks Only called from addon itself | ||
| 1539 | /// | ||
| 1540 | inline void TriggerEpgUpdate(unsigned int channelUid) | ||
| 1541 | { | ||
| 1542 | m_instanceData->toKodi->TriggerEpgUpdate(m_instanceData->toKodi->kodiInstance, channelUid); | ||
| 1543 | } | ||
| 1544 | //---------------------------------------------------------------------------- | ||
| 1545 | |||
| 1546 | //========================================================================== | ||
| 1547 | /// @brief **Callback to Kodi Function**\n | ||
| 1548 | /// Notify a state change for an EPG event. | ||
| 1549 | /// | ||
| 1550 | /// @param[in] tag The @ref cpp_kodi_addon_pvr_Defs_epg_PVREPGTag "EPG tag" where have event. | ||
| 1551 | /// @param[in] newState The new state. | ||
| 1552 | /// - For @ref EPG_EVENT_CREATED and @ref EPG_EVENT_UPDATED, tag must be filled with all available event data, not just a delta. | ||
| 1553 | /// - For @ref EPG_EVENT_DELETED, it is sufficient to fill @ref kodi::addon::PVREPGTag::SetUniqueBroadcastId | ||
| 1554 | /// | ||
| 1555 | /// @remarks Only called from addon itself, | ||
| 1556 | /// | ||
| 1557 | /// | ||
| 1558 | ///--------------------------------------------------------------------------- | ||
| 1559 | /// | ||
| 1560 | /// **Example:** | ||
| 1561 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 1562 | /// ... | ||
| 1563 | /// | ||
| 1564 | /// void CMyPVRInstance::MyProcessFunction() | ||
| 1565 | /// { | ||
| 1566 | /// ... | ||
| 1567 | /// kodi::addon::PVREPGTag tag; // Here as mini add, in real it should be a complete tag | ||
| 1568 | /// tag.SetUniqueId(123); | ||
| 1569 | /// | ||
| 1570 | /// // added namespace here not needed to have, only to have more clear for where is | ||
| 1571 | /// kodi::addon::CInstancePVRClient::EpgEventStateChange(tag, EPG_EVENT_UPDATED); | ||
| 1572 | /// ... | ||
| 1573 | /// } | ||
| 1574 | /// | ||
| 1575 | /// ... | ||
| 1576 | /// ~~~~~~~~~~~~~ | ||
| 1577 | /// | ||
| 1578 | inline void EpgEventStateChange(kodi::addon::PVREPGTag& tag, EPG_EVENT_STATE newState) | ||
| 1579 | { | ||
| 1580 | m_instanceData->toKodi->EpgEventStateChange(m_instanceData->toKodi->kodiInstance, tag.GetTag(), | ||
| 1581 | newState); | ||
| 1582 | } | ||
| 1583 | //---------------------------------------------------------------------------- | ||
| 1584 | |||
| 1585 | ///@} | ||
| 1586 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 1587 | |||
| 1588 | //============================================================================ | ||
| 1589 | /// @defgroup cpp_kodi_addon_pvr_Recordings 5. Recordings (optional) | ||
| 1590 | /// @ingroup cpp_kodi_addon_pvr | ||
| 1591 | /// @brief **PVR recording methods**\n | ||
| 1592 | /// To transfer available recordings of the PVR backend and to allow possible | ||
| 1593 | /// playback. | ||
| 1594 | /// | ||
| 1595 | /// @remarks Only used by Kodi if @ref PVRCapabilities::SetSupportsRecordings "supportsRecordings" | ||
| 1596 | /// is set to true.\n\n | ||
| 1597 | /// If a recordings changes after the initial import, or if a new one was added, | ||
| 1598 | /// then the add-on should call @ref TriggerRecordingUpdate(). | ||
| 1599 | /// | ||
| 1600 | /// | ||
| 1601 | ///--------------------------------------------------------------------------- | ||
| 1602 | /// | ||
| 1603 | /// **Recordings parts in interface:**\n | ||
| 1604 | /// Copy this to your project and extend with your parts or leave functions | ||
| 1605 | /// complete away where not used or supported. | ||
| 1606 | /// | ||
| 1607 | /// @copydetails cpp_kodi_addon_pvr_Recordings_header_addon_auto_check | ||
| 1608 | /// @copydetails cpp_kodi_addon_pvr_Recordings_source_addon_auto_check | ||
| 1609 | /// | ||
| 1610 | ///@{ | ||
| 1611 | |||
| 1612 | //============================================================================ | ||
| 1613 | /// @brief To get amount of recording present on backend | ||
| 1614 | /// | ||
| 1615 | /// @param[in] deleted if set return deleted recording (called if | ||
| 1616 | /// @ref PVRCapabilities::SetSupportsRecordingsUndelete "supportsRecordingsUndelete" | ||
| 1617 | /// set to true) | ||
| 1618 | /// @param[out] amount The total amount of recordings on the backend | ||
| 1619 | /// @return @ref PVR_ERROR_NO_ERROR if the amount has been fetched successfully. | ||
| 1620 | /// | ||
| 1621 | /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordings "supportsRecordings" is set to true. | ||
| 1622 | /// | ||
| 1623 | virtual PVR_ERROR GetRecordingsAmount(bool deleted, int& amount) | ||
| 1624 | { | ||
| 1625 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 1626 | } | ||
| 1627 | //---------------------------------------------------------------------------- | ||
| 1628 | |||
| 1629 | //============================================================================ | ||
| 1630 | /// @brief Request the list of all recordings from the backend, if supported. | ||
| 1631 | /// | ||
| 1632 | /// Recording entries are added to Kodi by calling TransferRecordingEntry() on the callback. | ||
| 1633 | /// | ||
| 1634 | /// @param[in] deleted if set return deleted recording (called if | ||
| 1635 | /// @ref PVRCapabilities::SetSupportsRecordingsUndelete "supportsRecordingsUndelete" | ||
| 1636 | /// set to true) | ||
| 1637 | /// @param[out] results List of available recordings with @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording | ||
| 1638 | /// becomes transferred with @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecordingsResultSet | ||
| 1639 | /// and given to Kodi | ||
| 1640 | /// @return @ref PVR_ERROR_NO_ERROR if the recordings have been fetched successfully. | ||
| 1641 | /// | ||
| 1642 | /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordings "supportsRecordings" | ||
| 1643 | /// is set to true. | ||
| 1644 | /// | ||
| 1645 | /// -------------------------------------------------------------------------- | ||
| 1646 | /// | ||
| 1647 | /// @copydetails cpp_kodi_addon_pvr_Defs_Recording_PVRRecording_Help | ||
| 1648 | /// | ||
| 1649 | /// | ||
| 1650 | ///--------------------------------------------------------------------------- | ||
| 1651 | /// | ||
| 1652 | /// **Example:** | ||
| 1653 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 1654 | /// ... | ||
| 1655 | /// PVR_ERROR CMyPVRInstance::GetRecordings(bool deleted, kodi::addon::PVRRecordingsResultSet& results) | ||
| 1656 | /// { | ||
| 1657 | /// // Minimal demo example, in reality bigger and loop to transfer all | ||
| 1658 | /// kodi::addon::PVRRecording recording; | ||
| 1659 | /// recording.SetRecordingId(123); | ||
| 1660 | /// recording.SetTitle("My recording name"); | ||
| 1661 | /// ... | ||
| 1662 | /// | ||
| 1663 | /// // Give it now to Kodi | ||
| 1664 | /// results.Add(recording); | ||
| 1665 | /// return PVR_ERROR_NO_ERROR; | ||
| 1666 | /// } | ||
| 1667 | /// ... | ||
| 1668 | /// ~~~~~~~~~~~~~ | ||
| 1669 | /// | ||
| 1670 | virtual PVR_ERROR GetRecordings(bool deleted, kodi::addon::PVRRecordingsResultSet& results) | ||
| 1671 | { | ||
| 1672 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 1673 | } | ||
| 1674 | //---------------------------------------------------------------------------- | ||
| 1675 | |||
| 1676 | //============================================================================ | ||
| 1677 | /// @brief Delete a recording on the backend. | ||
| 1678 | /// | ||
| 1679 | /// @param[in] recording The @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording to delete. | ||
| 1680 | /// @return @ref PVR_ERROR_NO_ERROR if the recording has been deleted successfully. | ||
| 1681 | /// | ||
| 1682 | /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordings "supportsRecordings" | ||
| 1683 | /// is set to true. | ||
| 1684 | /// | ||
| 1685 | virtual PVR_ERROR DeleteRecording(const kodi::addon::PVRRecording& recording) | ||
| 1686 | { | ||
| 1687 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 1688 | } | ||
| 1689 | //---------------------------------------------------------------------------- | ||
| 1690 | |||
| 1691 | //============================================================================ | ||
| 1692 | /// @brief Undelete a recording on the backend. | ||
| 1693 | /// | ||
| 1694 | /// @param[in] recording The @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording to undelete. | ||
| 1695 | /// @return @ref PVR_ERROR_NO_ERROR if the recording has been undeleted successfully. | ||
| 1696 | /// | ||
| 1697 | /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordingsUndelete "supportsRecordingsUndelete" | ||
| 1698 | /// is set to true. | ||
| 1699 | /// | ||
| 1700 | virtual PVR_ERROR UndeleteRecording(const kodi::addon::PVRRecording& recording) | ||
| 1701 | { | ||
| 1702 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 1703 | } | ||
| 1704 | //---------------------------------------------------------------------------- | ||
| 1705 | |||
| 1706 | //============================================================================ | ||
| 1707 | /// @brief Delete all recordings permanent which in the deleted folder on the backend. | ||
| 1708 | /// | ||
| 1709 | /// @return @ref PVR_ERROR_NO_ERROR if the recordings has been deleted successfully. | ||
| 1710 | /// | ||
| 1711 | virtual PVR_ERROR DeleteAllRecordingsFromTrash() { return PVR_ERROR_NOT_IMPLEMENTED; } | ||
| 1712 | //---------------------------------------------------------------------------- | ||
| 1713 | |||
| 1714 | //============================================================================ | ||
| 1715 | /// @brief Rename a recording on the backend. | ||
| 1716 | /// | ||
| 1717 | /// @param[in] recording The @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording | ||
| 1718 | /// to rename, containing the new name. | ||
| 1719 | /// @return @ref PVR_ERROR_NO_ERROR if the recording has been renamed successfully. | ||
| 1720 | /// | ||
| 1721 | /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordings "supportsRecordings" | ||
| 1722 | /// is set to true. | ||
| 1723 | /// | ||
| 1724 | virtual PVR_ERROR RenameRecording(const kodi::addon::PVRRecording& recording) | ||
| 1725 | { | ||
| 1726 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 1727 | } | ||
| 1728 | //---------------------------------------------------------------------------- | ||
| 1729 | |||
| 1730 | //============================================================================ | ||
| 1731 | /// @brief Set the lifetime of a recording on the backend. | ||
| 1732 | /// | ||
| 1733 | /// @param[in] recording The @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording | ||
| 1734 | /// to change the lifetime for. recording.iLifetime | ||
| 1735 | /// contains the new lieftime value. | ||
| 1736 | /// @return @ref PVR_ERROR_NO_ERROR if the recording's lifetime has been set | ||
| 1737 | /// successfully. | ||
| 1738 | /// | ||
| 1739 | /// @remarks Required if @ref PVRCapabilities::SetSupportsRecordingsLifetimeChange "supportsRecordingsLifetimeChange" | ||
| 1740 | /// is set to true. | ||
| 1741 | /// | ||
| 1742 | virtual PVR_ERROR SetRecordingLifetime(const kodi::addon::PVRRecording& recording) | ||
| 1743 | { | ||
| 1744 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 1745 | } | ||
| 1746 | //---------------------------------------------------------------------------- | ||
| 1747 | |||
| 1748 | //============================================================================ | ||
| 1749 | /// @brief Set the play count of a recording on the backend. | ||
| 1750 | /// | ||
| 1751 | /// @param[in] recording The @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording | ||
| 1752 | /// to change the play count. | ||
| 1753 | /// @param[in] count Play count. | ||
| 1754 | /// @return @ref PVR_ERROR_NO_ERROR if the recording's play count has been set | ||
| 1755 | /// successfully. | ||
| 1756 | /// | ||
| 1757 | /// @remarks Required if @ref PVRCapabilities::SetSupportsRecordingPlayCount "supportsRecordingPlayCount" | ||
| 1758 | /// is set to true. | ||
| 1759 | /// | ||
| 1760 | virtual PVR_ERROR SetRecordingPlayCount(const kodi::addon::PVRRecording& recording, int count) | ||
| 1761 | { | ||
| 1762 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 1763 | } | ||
| 1764 | //---------------------------------------------------------------------------- | ||
| 1765 | |||
| 1766 | //============================================================================ | ||
| 1767 | /// @brief Set the last watched position of a recording on the backend. | ||
| 1768 | /// | ||
| 1769 | /// @param[in] recording The @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording. | ||
| 1770 | /// @param[in] lastplayedposition The last watched position in seconds | ||
| 1771 | /// @return @ref PVR_ERROR_NO_ERROR if the position has been stored successfully. | ||
| 1772 | /// | ||
| 1773 | /// @remarks Required if @ref PVRCapabilities::SetSupportsLastPlayedPosition "supportsLastPlayedPosition" | ||
| 1774 | /// is set to true. | ||
| 1775 | /// | ||
| 1776 | virtual PVR_ERROR SetRecordingLastPlayedPosition(const kodi::addon::PVRRecording& recording, | ||
| 1777 | int lastplayedposition) | ||
| 1778 | { | ||
| 1779 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 1780 | } | ||
| 1781 | //---------------------------------------------------------------------------- | ||
| 1782 | |||
| 1783 | //============================================================================ | ||
| 1784 | /// @brief Retrieve the last watched position of a recording on the backend. | ||
| 1785 | /// | ||
| 1786 | /// @param[in] recording The @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording. | ||
| 1787 | /// @param[out] position The last watched position in seconds | ||
| 1788 | /// @return @ref PVR_ERROR_NO_ERROR if the amount has been fetched successfully. | ||
| 1789 | /// | ||
| 1790 | /// @remarks Required if @ref PVRCapabilities::SetSupportsRecordingPlayCount "supportsRecordingPlayCount" | ||
| 1791 | /// is set to true. | ||
| 1792 | /// | ||
| 1793 | virtual PVR_ERROR GetRecordingLastPlayedPosition(const kodi::addon::PVRRecording& recording, | ||
| 1794 | int& position) | ||
| 1795 | { | ||
| 1796 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 1797 | } | ||
| 1798 | //---------------------------------------------------------------------------- | ||
| 1799 | |||
| 1800 | //============================================================================ | ||
| 1801 | /// @brief Retrieve the edit decision list (EDL) of a recording on the backend. | ||
| 1802 | /// | ||
| 1803 | /// @param[in] recording The @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording. | ||
| 1804 | /// @param[out] edl The function has to write the EDL into this array. | ||
| 1805 | /// @return @ref PVR_ERROR_NO_ERROR if the EDL was successfully read or no EDL exists. | ||
| 1806 | /// | ||
| 1807 | /// @remarks Required if @ref PVRCapabilities::SetSupportsRecordingEdl "supportsRecordingEdl" | ||
| 1808 | /// is set to true. | ||
| 1809 | /// | ||
| 1810 | /// -------------------------------------------------------------------------- | ||
| 1811 | /// | ||
| 1812 | /// @copydetails cpp_kodi_addon_pvr_Defs_EDLEntry_PVREDLEntry_Help | ||
| 1813 | /// | ||
| 1814 | virtual PVR_ERROR GetRecordingEdl(const kodi::addon::PVRRecording& recording, | ||
| 1815 | std::vector<kodi::addon::PVREDLEntry>& edl) | ||
| 1816 | { | ||
| 1817 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 1818 | } | ||
| 1819 | //---------------------------------------------------------------------------- | ||
| 1820 | |||
| 1821 | //============================================================================ | ||
| 1822 | /// @brief Retrieve the size of a recording on the backend. | ||
| 1823 | /// | ||
| 1824 | /// @param[in] recording The recording to get the size in bytes for. | ||
| 1825 | /// @param[out] size The size in bytes of the recording | ||
| 1826 | /// @return @ref PVR_ERROR_NO_ERROR if the recording's size has been set successfully. | ||
| 1827 | /// | ||
| 1828 | /// @remarks Required if @ref PVRCapabilities::SetSupportsRecordingSize "supportsRecordingSize" | ||
| 1829 | /// is set to true. | ||
| 1830 | /// | ||
| 1831 | virtual PVR_ERROR GetRecordingSize(const kodi::addon::PVRRecording& recording, int64_t& size) | ||
| 1832 | { | ||
| 1833 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 1834 | } | ||
| 1835 | //---------------------------------------------------------------------------- | ||
| 1836 | |||
| 1837 | //============================================================================ | ||
| 1838 | /// @brief Get the stream properties for a recording from the backend. | ||
| 1839 | /// | ||
| 1840 | /// @param[in] recording The @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording | ||
| 1841 | /// to get the stream properties for. | ||
| 1842 | /// @param[out] properties The properties required to play the stream. | ||
| 1843 | /// @return @ref PVR_ERROR_NO_ERROR if the stream is available. | ||
| 1844 | /// | ||
| 1845 | /// @remarks Required if @ref PVRCapabilities::SetSupportsRecordings "supportsRecordings" | ||
| 1846 | /// is set to true and the add-on does not implement recording stream functions | ||
| 1847 | /// (@ref OpenRecordedStream, ...).\n | ||
| 1848 | /// In this case your implementation must fill the property @ref PVR_STREAM_PROPERTY_STREAMURL | ||
| 1849 | /// with the URL Kodi should resolve to playback the recording. | ||
| 1850 | /// | ||
| 1851 | /// @note The value directly related to inputstream must always begin with the | ||
| 1852 | /// name of the associated add-on, e.g. <b>`"inputstream.adaptive.manifest_update_parameter"`</b>. | ||
| 1853 | /// | ||
| 1854 | /// | ||
| 1855 | ///--------------------------------------------------------------------------- | ||
| 1856 | /// | ||
| 1857 | /// **Example:** | ||
| 1858 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 1859 | /// ... | ||
| 1860 | /// PVR_ERROR CMyPVRInstance::GetRecordingStreamProperties(const kodi::addon::PVRRecording& recording, | ||
| 1861 | /// std::vector<kodi::addon::PVRStreamProperty>& properties) | ||
| 1862 | /// { | ||
| 1863 | /// ... | ||
| 1864 | /// properties.emplace_back(PVR_STREAM_PROPERTY_INPUTSTREAM, "inputstream.adaptive"); | ||
| 1865 | /// properties.emplace_back("inputstream.adaptive.manifest_type", "mpd"); | ||
| 1866 | /// properties.emplace_back("inputstream.adaptive.manifest_update_parameter", "full"); | ||
| 1867 | /// properties.emplace_back(PVR_STREAM_PROPERTY_MIMETYPE, "application/xml+dash"); | ||
| 1868 | /// return PVR_ERROR_NO_ERROR; | ||
| 1869 | /// } | ||
| 1870 | /// ... | ||
| 1871 | /// ~~~~~~~~~~~~~ | ||
| 1872 | /// | ||
| 1873 | virtual PVR_ERROR GetRecordingStreamProperties( | ||
| 1874 | const kodi::addon::PVRRecording& recording, | ||
| 1875 | std::vector<kodi::addon::PVRStreamProperty>& properties) | ||
| 1876 | { | ||
| 1877 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 1878 | } | ||
| 1879 | //---------------------------------------------------------------------------- | ||
| 1880 | |||
| 1881 | //========================================================================== | ||
| 1882 | /// @brief Call one of the recording related menu hooks (if supported). | ||
| 1883 | /// | ||
| 1884 | /// Supported @ref cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook instances have to be added in | ||
| 1885 | /// `constructor()`, by calling @ref AddMenuHook() on the callback. | ||
| 1886 | /// | ||
| 1887 | /// @param[in] menuhook The hook to call. | ||
| 1888 | /// @param[in] item The selected recording item for which the hook was called. | ||
| 1889 | /// @return @ref PVR_ERROR_NO_ERROR if the hook was called successfully. | ||
| 1890 | /// | ||
| 1891 | /// -------------------------------------------------------------------------- | ||
| 1892 | /// | ||
| 1893 | /// @copydetails cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook_Help | ||
| 1894 | /// | ||
| 1895 | virtual PVR_ERROR CallRecordingMenuHook(const kodi::addon::PVRMenuhook& menuhook, | ||
| 1896 | const kodi::addon::PVRRecording& item) | ||
| 1897 | { | ||
| 1898 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 1899 | } | ||
| 1900 | //---------------------------------------------------------------------------- | ||
| 1901 | |||
| 1902 | //============================================================================ | ||
| 1903 | /// @brief **Callback to Kodi Function**\n | ||
| 1904 | /// Display a notification in Kodi that a recording started or stopped on the | ||
| 1905 | /// server. | ||
| 1906 | /// | ||
| 1907 | /// @param[in] recordingName The name of the recording to display | ||
| 1908 | /// @param[in] fileName The filename of the recording | ||
| 1909 | /// @param[in] on True when recording started, false when it stopped | ||
| 1910 | /// | ||
| 1911 | /// @remarks Only called from addon itself | ||
| 1912 | /// | ||
| 1913 | inline void RecordingNotification(const std::string& recordingName, | ||
| 1914 | const std::string& fileName, | ||
| 1915 | bool on) | ||
| 1916 | { | ||
| 1917 | m_instanceData->toKodi->RecordingNotification(m_instanceData->toKodi->kodiInstance, | ||
| 1918 | recordingName.c_str(), fileName.c_str(), on); | ||
| 1919 | } | ||
| 1920 | //---------------------------------------------------------------------------- | ||
| 1921 | |||
| 1922 | //============================================================================ | ||
| 1923 | /// @brief **Callback to Kodi Function**\n | ||
| 1924 | /// Request Kodi to update it's list of recordings. | ||
| 1925 | /// | ||
| 1926 | /// @remarks Only called from addon itself | ||
| 1927 | /// | ||
| 1928 | inline void TriggerRecordingUpdate() | ||
| 1929 | { | ||
| 1930 | m_instanceData->toKodi->TriggerRecordingUpdate(m_instanceData->toKodi->kodiInstance); | ||
| 1931 | } | ||
| 1932 | //---------------------------------------------------------------------------- | ||
| 1933 | |||
| 1934 | ///@} | ||
| 1935 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 1936 | |||
| 1937 | //============================================================================ | ||
| 1938 | /// @defgroup cpp_kodi_addon_pvr_Timers 6. Timers (optional) | ||
| 1939 | /// @ingroup cpp_kodi_addon_pvr | ||
| 1940 | /// @brief **PVR timer methods**\n | ||
| 1941 | /// For editing and displaying timed work, such as video recording. | ||
| 1942 | /// | ||
| 1943 | /// @remarks Only used by Kodi if @ref PVRCapabilities::SetSupportsTimers "supportsTimers" | ||
| 1944 | /// is set to true.\n\n | ||
| 1945 | /// If a timer changes after the initial import, or if a new one was added, | ||
| 1946 | /// then the add-on should call @ref TriggerTimerUpdate(). | ||
| 1947 | /// | ||
| 1948 | /// | ||
| 1949 | ///--------------------------------------------------------------------------- | ||
| 1950 | /// | ||
| 1951 | /// **Timer parts in interface:**\n | ||
| 1952 | /// Copy this to your project and extend with your parts or leave functions | ||
| 1953 | /// complete away where not used or supported. | ||
| 1954 | /// | ||
| 1955 | /// @copydetails cpp_kodi_addon_pvr_Timers_header_addon_auto_check | ||
| 1956 | /// @copydetails cpp_kodi_addon_pvr_Timers_source_addon_auto_check | ||
| 1957 | /// | ||
| 1958 | ///@{ | ||
| 1959 | |||
| 1960 | //============================================================================ | ||
| 1961 | /// @brief Retrieve the timer types supported by the backend. | ||
| 1962 | /// | ||
| 1963 | /// @param[out] types The function has to write the definition of the | ||
| 1964 | /// @ref cpp_kodi_addon_pvr_Defs_Timer_PVRTimerType types | ||
| 1965 | /// into this array. | ||
| 1966 | /// @return @ref PVR_ERROR_NO_ERROR if the types were successfully written to | ||
| 1967 | /// the array. | ||
| 1968 | /// | ||
| 1969 | /// @note Maximal 32 entries are allowed inside. | ||
| 1970 | /// | ||
| 1971 | /// -------------------------------------------------------------------------- | ||
| 1972 | /// | ||
| 1973 | /// @copydetails cpp_kodi_addon_pvr_Defs_Timer_PVRTimerType_Help | ||
| 1974 | /// | ||
| 1975 | virtual PVR_ERROR GetTimerTypes(std::vector<kodi::addon::PVRTimerType>& types) | ||
| 1976 | { | ||
| 1977 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 1978 | } | ||
| 1979 | //---------------------------------------------------------------------------- | ||
| 1980 | |||
| 1981 | //============================================================================ | ||
| 1982 | /// @brief To get total amount of timers on the backend or -1 on error. | ||
| 1983 | /// | ||
| 1984 | /// @param[out] amount The total amount of timers on the backend | ||
| 1985 | /// @return @ref PVR_ERROR_NO_ERROR if the amount has been fetched successfully. | ||
| 1986 | /// | ||
| 1987 | /// @note Required to use if @ref PVRCapabilities::SetSupportsTimers "supportsTimers" | ||
| 1988 | /// is set to true. | ||
| 1989 | /// | ||
| 1990 | virtual PVR_ERROR GetTimersAmount(int& amount) { return PVR_ERROR_NOT_IMPLEMENTED; } | ||
| 1991 | //---------------------------------------------------------------------------- | ||
| 1992 | |||
| 1993 | //============================================================================ | ||
| 1994 | /// @brief Request the list of all timers from the backend if supported. | ||
| 1995 | /// | ||
| 1996 | /// @param[out] results List of available timers with @ref cpp_kodi_addon_pvr_Defs_Timer_PVRTimer | ||
| 1997 | /// becomes transferred with @ref cpp_kodi_addon_pvr_Defs_Timer_PVRTimersResultSet | ||
| 1998 | /// and given to Kodi | ||
| 1999 | /// @return @ref PVR_ERROR_NO_ERROR if the list has been fetched successfully. | ||
| 2000 | /// | ||
| 2001 | /// @note Required to use if @ref PVRCapabilities::SetSupportsTimers "supportsTimers" | ||
| 2002 | /// is set to true. | ||
| 2003 | /// | ||
| 2004 | /// -------------------------------------------------------------------------- | ||
| 2005 | /// | ||
| 2006 | /// @copydetails cpp_kodi_addon_pvr_Defs_Timer_PVRTimer_Help | ||
| 2007 | /// | ||
| 2008 | /// | ||
| 2009 | ///--------------------------------------------------------------------------- | ||
| 2010 | /// | ||
| 2011 | /// **Example:** | ||
| 2012 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 2013 | /// ... | ||
| 2014 | /// PVR_ERROR CMyPVRInstance::GetTimers(kodi::addon::PVRTimersResultSet& results) | ||
| 2015 | /// { | ||
| 2016 | /// // Minimal demo example, in reality bigger and loop to transfer all | ||
| 2017 | /// kodi::addon::PVRTimer timer; | ||
| 2018 | /// timer.SetClientIndex(123); | ||
| 2019 | /// timer.SetState(PVR_TIMER_STATE_SCHEDULED); | ||
| 2020 | /// timer.SetTitle("My timer name"); | ||
| 2021 | /// ... | ||
| 2022 | /// | ||
| 2023 | /// // Give it now to Kodi | ||
| 2024 | /// results.Add(timer); | ||
| 2025 | /// return PVR_ERROR_NO_ERROR; | ||
| 2026 | /// } | ||
| 2027 | /// ... | ||
| 2028 | /// ~~~~~~~~~~~~~ | ||
| 2029 | /// | ||
| 2030 | virtual PVR_ERROR GetTimers(kodi::addon::PVRTimersResultSet& results) | ||
| 2031 | { | ||
| 2032 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 2033 | } | ||
| 2034 | //---------------------------------------------------------------------------- | ||
| 2035 | |||
| 2036 | //============================================================================ | ||
| 2037 | /// @brief Add a timer on the backend. | ||
| 2038 | /// | ||
| 2039 | /// @param[in] timer The timer to add. | ||
| 2040 | /// @return @ref PVR_ERROR_NO_ERROR if the timer has been added successfully. | ||
| 2041 | /// | ||
| 2042 | /// @note Required to use if @ref PVRCapabilities::SetSupportsTimers "supportsTimers" | ||
| 2043 | /// is set to true. | ||
| 2044 | /// | ||
| 2045 | virtual PVR_ERROR AddTimer(const kodi::addon::PVRTimer& timer) | ||
| 2046 | { | ||
| 2047 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 2048 | } | ||
| 2049 | //---------------------------------------------------------------------------- | ||
| 2050 | |||
| 2051 | //============================================================================ | ||
| 2052 | /// @brief Delete a timer on the backend. | ||
| 2053 | /// | ||
| 2054 | /// @param[in] timer The timer to delete. | ||
| 2055 | /// @param[in] forceDelete Set to true to delete a timer that is currently | ||
| 2056 | /// recording a program. | ||
| 2057 | /// @return @ref PVR_ERROR_NO_ERROR if the timer has been deleted successfully. | ||
| 2058 | /// | ||
| 2059 | /// @note Required to use if @ref PVRCapabilities::SetSupportsTimers "supportsTimers" | ||
| 2060 | /// is set to true. | ||
| 2061 | /// | ||
| 2062 | virtual PVR_ERROR DeleteTimer(const kodi::addon::PVRTimer& timer, bool forceDelete) | ||
| 2063 | { | ||
| 2064 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 2065 | } | ||
| 2066 | //---------------------------------------------------------------------------- | ||
| 2067 | |||
| 2068 | //============================================================================ | ||
| 2069 | /// @brief Update the timer information on the backend. | ||
| 2070 | /// | ||
| 2071 | /// @param[in] timer The timer to update. | ||
| 2072 | /// @return @ref PVR_ERROR_NO_ERROR if the timer has been updated successfully. | ||
| 2073 | /// | ||
| 2074 | /// @note Required to use if @ref PVRCapabilities::SetSupportsTimers "supportsTimers" | ||
| 2075 | /// is set to true. | ||
| 2076 | /// | ||
| 2077 | virtual PVR_ERROR UpdateTimer(const kodi::addon::PVRTimer& timer) | ||
| 2078 | { | ||
| 2079 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 2080 | } | ||
| 2081 | //---------------------------------------------------------------------------- | ||
| 2082 | |||
| 2083 | //============================================================================ | ||
| 2084 | /// @brief Call one of the timer related menu hooks (if supported). | ||
| 2085 | /// | ||
| 2086 | /// Supported @ref cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook instances have | ||
| 2087 | /// to be added in `constructor()`, by calling @ref AddMenuHook() on the | ||
| 2088 | /// callback. | ||
| 2089 | /// | ||
| 2090 | /// @param[in] menuhook The hook to call. | ||
| 2091 | /// @param[in] item The selected timer item for which the hook was called. | ||
| 2092 | /// @return @ref PVR_ERROR_NO_ERROR if the hook was called successfully. | ||
| 2093 | /// | ||
| 2094 | /// -------------------------------------------------------------------------- | ||
| 2095 | /// | ||
| 2096 | /// @copydetails cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook_Help | ||
| 2097 | /// | ||
| 2098 | virtual PVR_ERROR CallTimerMenuHook(const kodi::addon::PVRMenuhook& menuhook, | ||
| 2099 | const kodi::addon::PVRTimer& item) | ||
| 2100 | { | ||
| 2101 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 2102 | } | ||
| 2103 | //---------------------------------------------------------------------------- | ||
| 2104 | |||
| 2105 | //============================================================================ | ||
| 2106 | /// @brief **Callback to Kodi Function**\n | ||
| 2107 | /// Request Kodi to update it's list of timers. | ||
| 2108 | /// | ||
| 2109 | /// @remarks Only called from addon itself | ||
| 2110 | /// | ||
| 2111 | inline void TriggerTimerUpdate() | ||
| 2112 | { | ||
| 2113 | m_instanceData->toKodi->TriggerTimerUpdate(m_instanceData->toKodi->kodiInstance); | ||
| 2114 | } | ||
| 2115 | //---------------------------------------------------------------------------- | ||
| 2116 | |||
| 2117 | ///@} | ||
| 2118 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 2119 | |||
| 2120 | //============================================================================ | ||
| 2121 | /// @defgroup cpp_kodi_addon_pvr_PowerManagement 7. Power management events (optional) | ||
| 2122 | /// @ingroup cpp_kodi_addon_pvr | ||
| 2123 | /// @brief **Used to notify the pvr addon for power management events**\n | ||
| 2124 | /// Used to allow any energy savings. | ||
| 2125 | /// | ||
| 2126 | /// | ||
| 2127 | ///--------------------------------------------------------------------------- | ||
| 2128 | /// | ||
| 2129 | /// **Power management events in interface:**\n | ||
| 2130 | /// Copy this to your project and extend with your parts or leave functions | ||
| 2131 | /// complete away where not used or supported. | ||
| 2132 | /// | ||
| 2133 | /// @copydetails cpp_kodi_addon_pvr_PowerManagement_header_addon_auto_check | ||
| 2134 | /// @copydetails cpp_kodi_addon_pvr_PowerManagement_source_addon_auto_check | ||
| 2135 | /// | ||
| 2136 | ///@{ | ||
| 2137 | |||
| 2138 | //============================================================================ | ||
| 2139 | /// @brief To notify addon about system sleep | ||
| 2140 | /// | ||
| 2141 | /// @return @ref PVR_ERROR_NO_ERROR If successfully done. | ||
| 2142 | /// | ||
| 2143 | virtual PVR_ERROR OnSystemSleep() { return PVR_ERROR_NOT_IMPLEMENTED; } | ||
| 2144 | //---------------------------------------------------------------------------- | ||
| 2145 | |||
| 2146 | //============================================================================ | ||
| 2147 | /// @brief To notify addon about system wake up | ||
| 2148 | /// | ||
| 2149 | /// @return @ref PVR_ERROR_NO_ERROR If successfully done. | ||
| 2150 | /// | ||
| 2151 | virtual PVR_ERROR OnSystemWake() { return PVR_ERROR_NOT_IMPLEMENTED; } | ||
| 2152 | //---------------------------------------------------------------------------- | ||
| 2153 | |||
| 2154 | //============================================================================ | ||
| 2155 | /// @brief To notify addon power saving on system is activated | ||
| 2156 | /// | ||
| 2157 | /// @return @ref PVR_ERROR_NO_ERROR If successfully done. | ||
| 2158 | /// | ||
| 2159 | virtual PVR_ERROR OnPowerSavingActivated() { return PVR_ERROR_NOT_IMPLEMENTED; } | ||
| 2160 | //---------------------------------------------------------------------------- | ||
| 2161 | |||
| 2162 | //============================================================================ | ||
| 2163 | /// @brief To notify addon power saving on system is deactivated | ||
| 2164 | /// | ||
| 2165 | /// @return @ref PVR_ERROR_NO_ERROR If successfully done. | ||
| 2166 | /// | ||
| 2167 | virtual PVR_ERROR OnPowerSavingDeactivated() { return PVR_ERROR_NOT_IMPLEMENTED; } | ||
| 2168 | //---------------------------------------------------------------------------- | ||
| 2169 | |||
| 2170 | ///@} | ||
| 2171 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 2172 | |||
| 2173 | //============================================================================ | ||
| 2174 | /// @defgroup cpp_kodi_addon_pvr_Streams 8. Inputstream | ||
| 2175 | /// @ingroup cpp_kodi_addon_pvr | ||
| 2176 | /// @brief **PVR Inputstream**\n | ||
| 2177 | /// This includes functions that are used in the PVR inputstream. | ||
| 2178 | /// | ||
| 2179 | /// @warning The parts here will be removed in the future and replaced by the | ||
| 2180 | /// separate @ref cpp_kodi_addon_inputstream "inputstream addon instance". | ||
| 2181 | /// If there is already a possibility, new addons should do it via the | ||
| 2182 | /// inputstream instance. | ||
| 2183 | /// | ||
| 2184 | ///@{ | ||
| 2185 | |||
| 2186 | //============================================================================ | ||
| 2187 | /// @defgroup cpp_kodi_addon_pvr_Streams_TV 8.1. TV stream | ||
| 2188 | /// @ingroup cpp_kodi_addon_pvr_Streams | ||
| 2189 | /// @brief **PVR TV stream**\n | ||
| 2190 | /// Stream processing regarding live TV. | ||
| 2191 | /// | ||
| 2192 | /// | ||
| 2193 | ///--------------------------------------------------------------------------- | ||
| 2194 | /// | ||
| 2195 | /// **TV stream parts in interface:**\n | ||
| 2196 | /// Copy this to your project and extend with your parts or leave functions | ||
| 2197 | /// complete away where not used or supported. | ||
| 2198 | /// | ||
| 2199 | /// @copydetails cpp_kodi_addon_pvr_Streams_TV_header_addon_auto_check | ||
| 2200 | /// @copydetails cpp_kodi_addon_pvr_Streams_TV_source_addon_auto_check | ||
| 2201 | /// | ||
| 2202 | ///@{ | ||
| 2203 | |||
| 2204 | //============================================================================ | ||
| 2205 | /// @brief Open a live stream on the backend. | ||
| 2206 | /// | ||
| 2207 | /// @param[in] channel The channel to stream. | ||
| 2208 | /// @return True if the stream has been opened successfully, false otherwise. | ||
| 2209 | /// | ||
| 2210 | /// -------------------------------------------------------------------------- | ||
| 2211 | /// | ||
| 2212 | /// @copydetails cpp_kodi_addon_pvr_Defs_Channel_PVRChannel_Help | ||
| 2213 | /// | ||
| 2214 | /// | ||
| 2215 | /// -------------------------------------------------------------------------- | ||
| 2216 | /// | ||
| 2217 | /// @remarks Required if @ref PVRCapabilities::SetHandlesInputStream() or | ||
| 2218 | /// @ref PVRCapabilities::SetHandlesDemuxing() is set to true. | ||
| 2219 | /// @ref CloseLiveStream() will always be called by Kodi prior to calling this | ||
| 2220 | /// function. | ||
| 2221 | /// | ||
| 2222 | virtual bool OpenLiveStream(const kodi::addon::PVRChannel& channel) { return false; } | ||
| 2223 | //---------------------------------------------------------------------------- | ||
| 2224 | |||
| 2225 | //============================================================================ | ||
| 2226 | /// @brief Close an open live stream. | ||
| 2227 | /// | ||
| 2228 | /// @remarks Required if @ref PVRCapabilities::SetHandlesInputStream() or | ||
| 2229 | /// @ref PVRCapabilities::SetHandlesDemuxing() is set to true. | ||
| 2230 | /// | ||
| 2231 | virtual void CloseLiveStream() {} | ||
| 2232 | //---------------------------------------------------------------------------- | ||
| 2233 | |||
| 2234 | //============================================================================ | ||
| 2235 | /// @brief Read from an open live stream. | ||
| 2236 | /// | ||
| 2237 | /// @param[in] pBuffer The buffer to store the data in. | ||
| 2238 | /// @param[in] iBufferSize The amount of bytes to read. | ||
| 2239 | /// @return The amount of bytes that were actually read from the stream. | ||
| 2240 | /// | ||
| 2241 | /// @remarks Required if @ref PVRCapabilities::SetHandlesInputStream() is set | ||
| 2242 | /// to true. | ||
| 2243 | /// | ||
| 2244 | virtual int ReadLiveStream(unsigned char* buffer, unsigned int size) { return 0; } | ||
| 2245 | //---------------------------------------------------------------------------- | ||
| 2246 | |||
| 2247 | //============================================================================ | ||
| 2248 | /// @brief Seek in a live stream on a backend that supports timeshifting. | ||
| 2249 | /// | ||
| 2250 | /// @param[in] position The position to seek to. | ||
| 2251 | /// @param[in] whence [optional] offset relative to | ||
| 2252 | /// You can set the value of whence to one of three things: | ||
| 2253 | /// | Value | int | Description | | ||
| 2254 | /// |:--------:|:---:|:----------------------------------------------------| | ||
| 2255 | /// | SEEK_SET | 0 | position is relative to the beginning of the file. This is probably what you had in mind anyway, and is the most commonly used value for whence. | ||
| 2256 | /// | SEEK_CUR | 1 | position is relative to the current file pointer position. So, in effect, you can say, "Move to my current position plus 30 bytes," or, "move to my current position minus 20 bytes." | ||
| 2257 | /// | SEEK_END | 2 | position is relative to the end of the file. Just like SEEK_SET except from the other end of the file. Be sure to use negative values for offset if you want to back up from the end of the file, instead of going past the end into oblivion. | ||
| 2258 | /// | ||
| 2259 | /// @return The new position. | ||
| 2260 | /// | ||
| 2261 | /// @remarks Optional, and only used if @ref PVRCapabilities::SetHandlesInputStream() | ||
| 2262 | /// is set to true. | ||
| 2263 | /// | ||
| 2264 | virtual int64_t SeekLiveStream(int64_t position, int whence) { return 0; } | ||
| 2265 | //---------------------------------------------------------------------------- | ||
| 2266 | |||
| 2267 | //============================================================================ | ||
| 2268 | /// @brief Obtain the length of a live stream. | ||
| 2269 | /// | ||
| 2270 | /// @return The total length of the stream that's currently being read. | ||
| 2271 | /// | ||
| 2272 | /// @remarks Optional, and only used if @ref PVRCapabilities::SetHandlesInputStream() | ||
| 2273 | /// is set to true. | ||
| 2274 | /// | ||
| 2275 | virtual int64_t LengthLiveStream() { return 0; } | ||
| 2276 | //---------------------------------------------------------------------------- | ||
| 2277 | |||
| 2278 | //============================================================================ | ||
| 2279 | /// @defgroup cpp_kodi_addon_pvr_Streams_TV_Demux 8.1.1. Stream demuxing | ||
| 2280 | /// @ingroup cpp_kodi_addon_pvr_Streams_TV | ||
| 2281 | /// @brief **PVR stream demuxing**\n | ||
| 2282 | /// Read TV streams with own demux within addon. | ||
| 2283 | /// | ||
| 2284 | /// This is only on Live TV streams and only if @ref PVRCapabilities::SetHandlesDemuxing() | ||
| 2285 | /// has been set to "true". | ||
| 2286 | /// | ||
| 2287 | /// | ||
| 2288 | ///--------------------------------------------------------------------------- | ||
| 2289 | /// | ||
| 2290 | /// **Stream demuxing parts in interface:**\n | ||
| 2291 | /// Copy this to your project and extend with your parts or leave functions | ||
| 2292 | /// complete away where not used or supported. | ||
| 2293 | /// | ||
| 2294 | /// @copydetails cpp_kodi_addon_pvr_Streams_TV_Demux_header_addon_auto_check | ||
| 2295 | /// @copydetails cpp_kodi_addon_pvr_Streams_TV_Demux_source_addon_auto_check | ||
| 2296 | /// | ||
| 2297 | ///@{ | ||
| 2298 | |||
| 2299 | //============================================================================ | ||
| 2300 | /// @brief Get the stream properties of the stream that's currently being read. | ||
| 2301 | /// | ||
| 2302 | /// @param[in] properties The properties of the currently playing stream. | ||
| 2303 | /// @return @ref PVR_ERROR_NO_ERROR if the properties have been fetched successfully. | ||
| 2304 | /// | ||
| 2305 | /// @remarks Required, and only used if addon has its own demuxer. | ||
| 2306 | /// | ||
| 2307 | virtual PVR_ERROR GetStreamProperties(std::vector<kodi::addon::PVRStreamProperties>& properties) | ||
| 2308 | { | ||
| 2309 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 2310 | } | ||
| 2311 | //---------------------------------------------------------------------------- | ||
| 2312 | |||
| 2313 | //============================================================================ | ||
| 2314 | /// @brief Read the next packet from the demultiplexer, if there is one. | ||
| 2315 | /// | ||
| 2316 | /// @return The next packet. | ||
| 2317 | /// If there is no next packet, then the add-on should return the packet | ||
| 2318 | /// created by calling @ref AllocateDemuxPacket(0) on the callback. | ||
| 2319 | /// If the stream changed and Kodi's player needs to be reinitialised, then, | ||
| 2320 | /// the add-on should call @ref AllocateDemuxPacket(0) on the callback, and set | ||
| 2321 | /// the streamid to @ref DMX_SPECIALID_STREAMCHANGE and return the value. | ||
| 2322 | /// The add-on should return `nullptr` if an error occurred. | ||
| 2323 | /// | ||
| 2324 | /// @remarks Required, and only used if addon has its own demuxer. | ||
| 2325 | /// Return `nullptr` if this add-on won't provide this function. | ||
| 2326 | /// | ||
| 2327 | virtual DemuxPacket* DemuxRead() { return nullptr; } | ||
| 2328 | //---------------------------------------------------------------------------- | ||
| 2329 | |||
| 2330 | //============================================================================ | ||
| 2331 | /// @brief Reset the demultiplexer in the add-on. | ||
| 2332 | /// | ||
| 2333 | /// @remarks Required, and only used if addon has its own demuxer. | ||
| 2334 | /// | ||
| 2335 | virtual void DemuxReset() {} | ||
| 2336 | //---------------------------------------------------------------------------- | ||
| 2337 | |||
| 2338 | //============================================================================ | ||
| 2339 | /// @brief Abort the demultiplexer thread in the add-on. | ||
| 2340 | /// | ||
| 2341 | /// @remarks Required, and only used if addon has its own demuxer. | ||
| 2342 | /// | ||
| 2343 | virtual void DemuxAbort() {} | ||
| 2344 | //---------------------------------------------------------------------------- | ||
| 2345 | |||
| 2346 | //============================================================================ | ||
| 2347 | /// @brief Flush all data that's currently in the demultiplexer buffer in the | ||
| 2348 | /// add-on. | ||
| 2349 | /// | ||
| 2350 | /// @remarks Required, and only used if addon has its own demuxer. | ||
| 2351 | /// | ||
| 2352 | virtual void DemuxFlush() {} | ||
| 2353 | //---------------------------------------------------------------------------- | ||
| 2354 | |||
| 2355 | //============================================================================ | ||
| 2356 | /// @brief Notify the pvr addon/demuxer that Kodi wishes to change playback | ||
| 2357 | /// speed. | ||
| 2358 | /// | ||
| 2359 | /// @param[in] speed The requested playback speed | ||
| 2360 | /// | ||
| 2361 | /// @remarks Optional, and only used if addon has its own demuxer. | ||
| 2362 | /// | ||
| 2363 | virtual void SetSpeed(int speed) {} | ||
| 2364 | //---------------------------------------------------------------------------- | ||
| 2365 | |||
| 2366 | //============================================================================ | ||
| 2367 | /// @brief Notify the pvr addon/demuxer that Kodi wishes to fill demux queue. | ||
| 2368 | /// | ||
| 2369 | /// @param[in] mode The requested filling mode | ||
| 2370 | /// | ||
| 2371 | /// @remarks Optional, and only used if addon has its own demuxer. | ||
| 2372 | /// | ||
| 2373 | virtual void FillBuffer(bool mode) {} | ||
| 2374 | //---------------------------------------------------------------------------- | ||
| 2375 | |||
| 2376 | //============================================================================ | ||
| 2377 | /// @brief Notify the pvr addon/demuxer that Kodi wishes to seek the stream by | ||
| 2378 | /// time. | ||
| 2379 | /// | ||
| 2380 | /// @param[in] time The absolute time since stream start | ||
| 2381 | /// @param[in] backwards True to seek to keyframe BEFORE time, else AFTER | ||
| 2382 | /// @param[in] startpts can be updated to point to where display should start | ||
| 2383 | /// @return True if the seek operation was possible | ||
| 2384 | /// | ||
| 2385 | /// @remarks Optional, and only used if addon has its own demuxer. | ||
| 2386 | /// Return False if this add-on won't provide this function. | ||
| 2387 | /// | ||
| 2388 | virtual bool SeekTime(double time, bool backwards, double& startpts) { return false; } | ||
| 2389 | //---------------------------------------------------------------------------- | ||
| 2390 | |||
| 2391 | //============================================================================ | ||
| 2392 | /// @brief **Callback to Kodi Function**\n | ||
| 2393 | /// Get the codec id used by Kodi. | ||
| 2394 | /// | ||
| 2395 | /// @param[in] codecName The name of the codec | ||
| 2396 | /// @return The codec_id, or a codec_id with 0 values when not supported | ||
| 2397 | /// | ||
| 2398 | /// @remarks Only called from addon itself | ||
| 2399 | /// | ||
| 2400 | inline PVRCodec GetCodecByName(const std::string& codecName) const | ||
| 2401 | { | ||
| 2402 | return PVRCodec(m_instanceData->toKodi->GetCodecByName(m_instanceData->toKodi->kodiInstance, | ||
| 2403 | codecName.c_str())); | ||
| 2404 | } | ||
| 2405 | //---------------------------------------------------------------------------- | ||
| 2406 | |||
| 2407 | //============================================================================ | ||
| 2408 | /// @brief **Callback to Kodi Function**\n | ||
| 2409 | /// Allocate a demux packet. Free with @ref FreeDemuxPacket(). | ||
| 2410 | /// | ||
| 2411 | /// @param[in] iDataSize The size of the data that will go into the packet | ||
| 2412 | /// @return The allocated packet | ||
| 2413 | /// | ||
| 2414 | /// @remarks Only called from addon itself | ||
| 2415 | /// | ||
| 2416 | inline DemuxPacket* AllocateDemuxPacket(int iDataSize) | ||
| 2417 | { | ||
| 2418 | return m_instanceData->toKodi->AllocateDemuxPacket(m_instanceData->toKodi->kodiInstance, | ||
| 2419 | iDataSize); | ||
| 2420 | } | ||
| 2421 | //---------------------------------------------------------------------------- | ||
| 2422 | |||
| 2423 | //============================================================================ | ||
| 2424 | /// @brief **Callback to Kodi Function**\n | ||
| 2425 | /// Free a packet that was allocated with @ref AllocateDemuxPacket(). | ||
| 2426 | /// | ||
| 2427 | /// @param[in] pPacket The packet to free | ||
| 2428 | /// | ||
| 2429 | /// @remarks Only called from addon itself. | ||
| 2430 | /// | ||
| 2431 | inline void FreeDemuxPacket(DemuxPacket* pPacket) | ||
| 2432 | { | ||
| 2433 | m_instanceData->toKodi->FreeDemuxPacket(m_instanceData->toKodi->kodiInstance, pPacket); | ||
| 2434 | } | ||
| 2435 | //---------------------------------------------------------------------------- | ||
| 2436 | ///@} | ||
| 2437 | |||
| 2438 | ///@} | ||
| 2439 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 2440 | |||
| 2441 | //============================================================================ | ||
| 2442 | /// @defgroup cpp_kodi_addon_pvr_Streams_Recording 8.2. Recording stream | ||
| 2443 | /// @ingroup cpp_kodi_addon_pvr_Streams | ||
| 2444 | /// @brief **PVR Recording stream**\n | ||
| 2445 | /// Stream processing regarding recordings. | ||
| 2446 | /// | ||
| 2447 | /// @note Demuxing is not possible with the recordings. | ||
| 2448 | /// | ||
| 2449 | /// | ||
| 2450 | ///--------------------------------------------------------------------------- | ||
| 2451 | /// | ||
| 2452 | /// **Recording stream parts in interface:**\n | ||
| 2453 | /// Copy this to your project and extend with your parts or leave functions | ||
| 2454 | /// complete away where not used or supported. | ||
| 2455 | /// | ||
| 2456 | /// @copydetails cpp_kodi_addon_pvr_Streams_Recording_header_addon_auto_check | ||
| 2457 | /// @copydetails cpp_kodi_addon_pvr_Streams_Recording_source_addon_auto_check | ||
| 2458 | /// | ||
| 2459 | ///@{ | ||
| 2460 | |||
| 2461 | //============================================================================ | ||
| 2462 | /// @brief Open a stream to a recording on the backend. | ||
| 2463 | /// | ||
| 2464 | /// @param[in] recording The recording to open. | ||
| 2465 | /// @return True if the stream has been opened successfully, false otherwise. | ||
| 2466 | /// | ||
| 2467 | /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordings() | ||
| 2468 | /// is set to true. @ref CloseRecordedStream() will always be called by Kodi | ||
| 2469 | /// prior to calling this function. | ||
| 2470 | /// | ||
| 2471 | virtual bool OpenRecordedStream(const kodi::addon::PVRRecording& recording) { return false; } | ||
| 2472 | //---------------------------------------------------------------------------- | ||
| 2473 | |||
| 2474 | //============================================================================ | ||
| 2475 | /// @brief Close an open stream from a recording. | ||
| 2476 | /// | ||
| 2477 | /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordings() | ||
| 2478 | /// is set to true. | ||
| 2479 | /// | ||
| 2480 | virtual void CloseRecordedStream() {} | ||
| 2481 | //---------------------------------------------------------------------------- | ||
| 2482 | |||
| 2483 | //============================================================================ | ||
| 2484 | /// @brief Read from a recording. | ||
| 2485 | /// | ||
| 2486 | /// @param[in] buffer The buffer to store the data in. | ||
| 2487 | /// @param[in] size The amount of bytes to read. | ||
| 2488 | /// @return The amount of bytes that were actually read from the stream. | ||
| 2489 | /// | ||
| 2490 | /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordings() | ||
| 2491 | /// is set to true. | ||
| 2492 | /// | ||
| 2493 | virtual int ReadRecordedStream(unsigned char* buffer, unsigned int size) { return 0; } | ||
| 2494 | //---------------------------------------------------------------------------- | ||
| 2495 | |||
| 2496 | //============================================================================ | ||
| 2497 | /// @brief Seek in a recorded stream. | ||
| 2498 | /// | ||
| 2499 | /// @param[in] position The position to seek to. | ||
| 2500 | /// @param[in] whence [optional] offset relative to | ||
| 2501 | /// You can set the value of whence to one of three things: | ||
| 2502 | /// | Value | int | Description | | ||
| 2503 | /// |:--------:|:---:|:----------------------------------------------------| | ||
| 2504 | /// | SEEK_SET | 0 | position is relative to the beginning of the file. This is probably what you had in mind anyway, and is the most commonly used value for whence. | ||
| 2505 | /// | SEEK_CUR | 1 | position is relative to the current file pointer position. So, in effect, you can say, "Move to my current position plus 30 bytes," or, "move to my current position minus 20 bytes." | ||
| 2506 | /// | SEEK_END | 2 | position is relative to the end of the file. Just like SEEK_SET except from the other end of the file. Be sure to use negative values for offset if you want to back up from the end of the file, instead of going past the end into oblivion. | ||
| 2507 | /// | ||
| 2508 | /// @return The new position. | ||
| 2509 | /// | ||
| 2510 | /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordings() | ||
| 2511 | /// is set to true. | ||
| 2512 | /// | ||
| 2513 | virtual int64_t SeekRecordedStream(int64_t position, int whence) { return 0; } | ||
| 2514 | //---------------------------------------------------------------------------- | ||
| 2515 | |||
| 2516 | //============================================================================ | ||
| 2517 | /// @brief Obtain the length of a recorded stream. | ||
| 2518 | /// | ||
| 2519 | /// @return The total length of the stream that's currently being read. | ||
| 2520 | /// | ||
| 2521 | /// @remarks Optional, and only used if @ref PVRCapabilities::SetSupportsRecordings() | ||
| 2522 | /// is true (=> @ref ReadRecordedStream). | ||
| 2523 | /// | ||
| 2524 | virtual int64_t LengthRecordedStream() { return 0; } | ||
| 2525 | //---------------------------------------------------------------------------- | ||
| 2526 | |||
| 2527 | ///@} | ||
| 2528 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 2529 | |||
| 2530 | //============================================================================ | ||
| 2531 | /// @defgroup cpp_kodi_addon_pvr_Streams_Various 8.3. Various functions | ||
| 2532 | /// @ingroup cpp_kodi_addon_pvr_Streams | ||
| 2533 | /// @brief **Various other PVR stream related functions**\n | ||
| 2534 | /// These apply to all other groups in inputstream and are therefore declared | ||
| 2535 | /// as several. | ||
| 2536 | /// | ||
| 2537 | /// | ||
| 2538 | ///--------------------------------------------------------------------------- | ||
| 2539 | /// | ||
| 2540 | /// **Various stream parts in interface:**\n | ||
| 2541 | /// Copy this to your project and extend with your parts or leave functions | ||
| 2542 | /// complete away where not used or supported. | ||
| 2543 | /// | ||
| 2544 | /// @copydetails cpp_kodi_addon_pvr_Streams_Various_header_addon_auto_check | ||
| 2545 | /// @copydetails cpp_kodi_addon_pvr_Streams_Various_source_addon_auto_check | ||
| 2546 | /// | ||
| 2547 | ///@{ | ||
| 2548 | |||
| 2549 | //============================================================================ | ||
| 2550 | /// | ||
| 2551 | /// @brief Check if the backend support pausing the currently playing stream. | ||
| 2552 | /// | ||
| 2553 | /// This will enable/disable the pause button in Kodi based on the return | ||
| 2554 | /// value. | ||
| 2555 | /// | ||
| 2556 | /// @return false if the PVR addon/backend does not support pausing, true if | ||
| 2557 | /// possible | ||
| 2558 | /// | ||
| 2559 | virtual bool CanPauseStream() { return false; } | ||
| 2560 | //---------------------------------------------------------------------------- | ||
| 2561 | |||
| 2562 | //============================================================================ | ||
| 2563 | /// | ||
| 2564 | /// @brief Check if the backend supports seeking for the currently playing | ||
| 2565 | /// stream. | ||
| 2566 | /// | ||
| 2567 | /// This will enable/disable the rewind/forward buttons in Kodi based on the | ||
| 2568 | /// return value. | ||
| 2569 | /// | ||
| 2570 | /// @return false if the PVR addon/backend does not support seeking, true if | ||
| 2571 | /// possible | ||
| 2572 | /// | ||
| 2573 | virtual bool CanSeekStream() { return false; } | ||
| 2574 | //---------------------------------------------------------------------------- | ||
| 2575 | |||
| 2576 | //============================================================================ | ||
| 2577 | /// | ||
| 2578 | /// @brief Notify the pvr addon that Kodi (un)paused the currently playing | ||
| 2579 | /// stream. | ||
| 2580 | /// | ||
| 2581 | /// @param[in] paused To inform by `true` is paused and with `false` playing | ||
| 2582 | /// | ||
| 2583 | virtual void PauseStream(bool paused) {} | ||
| 2584 | //---------------------------------------------------------------------------- | ||
| 2585 | |||
| 2586 | //============================================================================ | ||
| 2587 | /// | ||
| 2588 | /// @brief Check for real-time streaming. | ||
| 2589 | /// | ||
| 2590 | /// @return true if current stream is real-time | ||
| 2591 | /// | ||
| 2592 | virtual bool IsRealTimeStream() { return false; } | ||
| 2593 | //---------------------------------------------------------------------------- | ||
| 2594 | |||
| 2595 | //============================================================================ | ||
| 2596 | /// | ||
| 2597 | /// @brief Get stream times. | ||
| 2598 | /// | ||
| 2599 | /// @param[out] times A pointer to the data to be filled by the implementation. | ||
| 2600 | /// @return @ref PVR_ERROR_NO_ERROR on success. | ||
| 2601 | /// | ||
| 2602 | virtual PVR_ERROR GetStreamTimes(kodi::addon::PVRStreamTimes& times) | ||
| 2603 | { | ||
| 2604 | return PVR_ERROR_NOT_IMPLEMENTED; | ||
| 2605 | } | ||
| 2606 | //---------------------------------------------------------------------------- | ||
| 2607 | |||
| 2608 | //============================================================================ | ||
| 2609 | /// | ||
| 2610 | /// @brief Obtain the chunk size to use when reading streams. | ||
| 2611 | /// | ||
| 2612 | /// @param[out] chunksize must be filled with the chunk size in bytes. | ||
| 2613 | /// @return @ref PVR_ERROR_NO_ERROR if the chunk size has been fetched successfully. | ||
| 2614 | /// | ||
| 2615 | /// @remarks Optional, and only used if not reading from demuxer (=> @ref DemuxRead) and | ||
| 2616 | /// @ref PVRCapabilities::SetSupportsRecordings() is true (=> @ref ReadRecordedStream) or | ||
| 2617 | /// @ref PVRCapabilities::SetHandlesInputStream() is true (=> @ref ReadLiveStream). | ||
| 2618 | /// | ||
| 2619 | virtual PVR_ERROR GetStreamReadChunkSize(int& chunksize) { return PVR_ERROR_NOT_IMPLEMENTED; } | ||
| 2620 | //---------------------------------------------------------------------------- | ||
| 2621 | |||
| 2622 | ///@} | ||
| 2623 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 2624 | |||
| 2625 | private: | ||
| 2626 | void SetAddonStruct(KODI_HANDLE instance, const std::string& kodiVersion) | ||
| 2627 | { | ||
| 2628 | if (instance == nullptr) | ||
| 2629 | throw std::logic_error("kodi::addon::CInstancePVRClient: Creation with empty addon " | ||
| 2630 | "structure not allowed, table must be given from Kodi!"); | ||
| 2631 | |||
| 2632 | m_instanceData = static_cast<AddonInstance_PVR*>(instance); | ||
| 2633 | m_instanceData->toAddon->addonInstance = this; | ||
| 2634 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 2635 | m_instanceData->toAddon->GetCapabilities = ADDON_GetCapabilities; | ||
| 2636 | m_instanceData->toAddon->GetConnectionString = ADDON_GetConnectionString; | ||
| 2637 | m_instanceData->toAddon->GetBackendName = ADDON_GetBackendName; | ||
| 2638 | m_instanceData->toAddon->GetBackendVersion = ADDON_GetBackendVersion; | ||
| 2639 | m_instanceData->toAddon->GetBackendHostname = ADDON_GetBackendHostname; | ||
| 2640 | m_instanceData->toAddon->GetDriveSpace = ADDON_GetDriveSpace; | ||
| 2641 | m_instanceData->toAddon->CallSettingsMenuHook = ADDON_CallSettingsMenuHook; | ||
| 2642 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 2643 | m_instanceData->toAddon->GetChannelsAmount = ADDON_GetChannelsAmount; | ||
| 2644 | m_instanceData->toAddon->GetChannels = ADDON_GetChannels; | ||
| 2645 | m_instanceData->toAddon->GetChannelStreamProperties = ADDON_GetChannelStreamProperties; | ||
| 2646 | m_instanceData->toAddon->GetSignalStatus = ADDON_GetSignalStatus; | ||
| 2647 | m_instanceData->toAddon->GetDescrambleInfo = ADDON_GetDescrambleInfo; | ||
| 2648 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 2649 | m_instanceData->toAddon->GetChannelGroupsAmount = ADDON_GetChannelGroupsAmount; | ||
| 2650 | m_instanceData->toAddon->GetChannelGroups = ADDON_GetChannelGroups; | ||
| 2651 | m_instanceData->toAddon->GetChannelGroupMembers = ADDON_GetChannelGroupMembers; | ||
| 2652 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 2653 | m_instanceData->toAddon->DeleteChannel = ADDON_DeleteChannel; | ||
| 2654 | m_instanceData->toAddon->RenameChannel = ADDON_RenameChannel; | ||
| 2655 | m_instanceData->toAddon->OpenDialogChannelSettings = ADDON_OpenDialogChannelSettings; | ||
| 2656 | m_instanceData->toAddon->OpenDialogChannelAdd = ADDON_OpenDialogChannelAdd; | ||
| 2657 | m_instanceData->toAddon->OpenDialogChannelScan = ADDON_OpenDialogChannelScan; | ||
| 2658 | m_instanceData->toAddon->CallChannelMenuHook = ADDON_CallChannelMenuHook; | ||
| 2659 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 2660 | m_instanceData->toAddon->GetEPGForChannel = ADDON_GetEPGForChannel; | ||
| 2661 | m_instanceData->toAddon->IsEPGTagRecordable = ADDON_IsEPGTagRecordable; | ||
| 2662 | m_instanceData->toAddon->IsEPGTagPlayable = ADDON_IsEPGTagPlayable; | ||
| 2663 | m_instanceData->toAddon->GetEPGTagEdl = ADDON_GetEPGTagEdl; | ||
| 2664 | m_instanceData->toAddon->GetEPGTagStreamProperties = ADDON_GetEPGTagStreamProperties; | ||
| 2665 | m_instanceData->toAddon->SetEPGTimeFrame = ADDON_SetEPGTimeFrame; | ||
| 2666 | m_instanceData->toAddon->CallEPGMenuHook = ADDON_CallEPGMenuHook; | ||
| 2667 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 2668 | m_instanceData->toAddon->GetRecordingsAmount = ADDON_GetRecordingsAmount; | ||
| 2669 | m_instanceData->toAddon->GetRecordings = ADDON_GetRecordings; | ||
| 2670 | m_instanceData->toAddon->DeleteRecording = ADDON_DeleteRecording; | ||
| 2671 | m_instanceData->toAddon->UndeleteRecording = ADDON_UndeleteRecording; | ||
| 2672 | m_instanceData->toAddon->DeleteAllRecordingsFromTrash = ADDON_DeleteAllRecordingsFromTrash; | ||
| 2673 | m_instanceData->toAddon->RenameRecording = ADDON_RenameRecording; | ||
| 2674 | m_instanceData->toAddon->SetRecordingLifetime = ADDON_SetRecordingLifetime; | ||
| 2675 | m_instanceData->toAddon->SetRecordingPlayCount = ADDON_SetRecordingPlayCount; | ||
| 2676 | m_instanceData->toAddon->SetRecordingLastPlayedPosition = ADDON_SetRecordingLastPlayedPosition; | ||
| 2677 | m_instanceData->toAddon->GetRecordingLastPlayedPosition = ADDON_GetRecordingLastPlayedPosition; | ||
| 2678 | m_instanceData->toAddon->GetRecordingEdl = ADDON_GetRecordingEdl; | ||
| 2679 | m_instanceData->toAddon->GetRecordingSize = ADDON_GetRecordingSize; | ||
| 2680 | m_instanceData->toAddon->GetRecordingStreamProperties = ADDON_GetRecordingStreamProperties; | ||
| 2681 | m_instanceData->toAddon->CallRecordingMenuHook = ADDON_CallRecordingMenuHook; | ||
| 2682 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 2683 | m_instanceData->toAddon->GetTimerTypes = ADDON_GetTimerTypes; | ||
| 2684 | m_instanceData->toAddon->GetTimersAmount = ADDON_GetTimersAmount; | ||
| 2685 | m_instanceData->toAddon->GetTimers = ADDON_GetTimers; | ||
| 2686 | m_instanceData->toAddon->AddTimer = ADDON_AddTimer; | ||
| 2687 | m_instanceData->toAddon->DeleteTimer = ADDON_DeleteTimer; | ||
| 2688 | m_instanceData->toAddon->UpdateTimer = ADDON_UpdateTimer; | ||
| 2689 | m_instanceData->toAddon->CallTimerMenuHook = ADDON_CallTimerMenuHook; | ||
| 2690 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 2691 | m_instanceData->toAddon->OnSystemSleep = ADDON_OnSystemSleep; | ||
| 2692 | m_instanceData->toAddon->OnSystemWake = ADDON_OnSystemWake; | ||
| 2693 | m_instanceData->toAddon->OnPowerSavingActivated = ADDON_OnPowerSavingActivated; | ||
| 2694 | m_instanceData->toAddon->OnPowerSavingDeactivated = ADDON_OnPowerSavingDeactivated; | ||
| 2695 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 2696 | m_instanceData->toAddon->OpenLiveStream = ADDON_OpenLiveStream; | ||
| 2697 | m_instanceData->toAddon->CloseLiveStream = ADDON_CloseLiveStream; | ||
| 2698 | m_instanceData->toAddon->ReadLiveStream = ADDON_ReadLiveStream; | ||
| 2699 | m_instanceData->toAddon->SeekLiveStream = ADDON_SeekLiveStream; | ||
| 2700 | m_instanceData->toAddon->LengthLiveStream = ADDON_LengthLiveStream; | ||
| 2701 | m_instanceData->toAddon->GetStreamProperties = ADDON_GetStreamProperties; | ||
| 2702 | m_instanceData->toAddon->GetStreamReadChunkSize = ADDON_GetStreamReadChunkSize; | ||
| 2703 | m_instanceData->toAddon->IsRealTimeStream = ADDON_IsRealTimeStream; | ||
| 2704 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 2705 | m_instanceData->toAddon->OpenRecordedStream = ADDON_OpenRecordedStream; | ||
| 2706 | m_instanceData->toAddon->CloseRecordedStream = ADDON_CloseRecordedStream; | ||
| 2707 | m_instanceData->toAddon->ReadRecordedStream = ADDON_ReadRecordedStream; | ||
| 2708 | m_instanceData->toAddon->SeekRecordedStream = ADDON_SeekRecordedStream; | ||
| 2709 | m_instanceData->toAddon->LengthRecordedStream = ADDON_LengthRecordedStream; | ||
| 2710 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 2711 | m_instanceData->toAddon->DemuxReset = ADDON_DemuxReset; | ||
| 2712 | m_instanceData->toAddon->DemuxAbort = ADDON_DemuxAbort; | ||
| 2713 | m_instanceData->toAddon->DemuxFlush = ADDON_DemuxFlush; | ||
| 2714 | m_instanceData->toAddon->DemuxRead = ADDON_DemuxRead; | ||
| 2715 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 2716 | m_instanceData->toAddon->CanPauseStream = ADDON_CanPauseStream; | ||
| 2717 | m_instanceData->toAddon->PauseStream = ADDON_PauseStream; | ||
| 2718 | m_instanceData->toAddon->CanSeekStream = ADDON_CanSeekStream; | ||
| 2719 | m_instanceData->toAddon->SeekTime = ADDON_SeekTime; | ||
| 2720 | m_instanceData->toAddon->SetSpeed = ADDON_SetSpeed; | ||
| 2721 | m_instanceData->toAddon->FillBuffer = ADDON_FillBuffer; | ||
| 2722 | m_instanceData->toAddon->GetStreamTimes = ADDON_GetStreamTimes; | ||
| 2723 | } | ||
| 2724 | |||
| 2725 | inline static PVR_ERROR ADDON_GetCapabilities(const AddonInstance_PVR* instance, | ||
| 2726 | PVR_ADDON_CAPABILITIES* capabilities) | ||
| 2727 | { | ||
| 2728 | PVRCapabilities cppCapabilities(capabilities); | ||
| 2729 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 2730 | ->GetCapabilities(cppCapabilities); | ||
| 2731 | } | ||
| 2732 | |||
| 2733 | inline static PVR_ERROR ADDON_GetBackendName(const AddonInstance_PVR* instance, | ||
| 2734 | char* str, | ||
| 2735 | int memSize) | ||
| 2736 | { | ||
| 2737 | std::string backendName; | ||
| 2738 | PVR_ERROR err = static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 2739 | ->GetBackendName(backendName); | ||
| 2740 | if (err == PVR_ERROR_NO_ERROR) | ||
| 2741 | strncpy(str, backendName.c_str(), memSize); | ||
| 2742 | return err; | ||
| 2743 | } | ||
| 2744 | |||
| 2745 | inline static PVR_ERROR ADDON_GetBackendVersion(const AddonInstance_PVR* instance, | ||
| 2746 | char* str, | ||
| 2747 | int memSize) | ||
| 2748 | { | ||
| 2749 | std::string backendVersion; | ||
| 2750 | PVR_ERROR err = static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 2751 | ->GetBackendVersion(backendVersion); | ||
| 2752 | if (err == PVR_ERROR_NO_ERROR) | ||
| 2753 | strncpy(str, backendVersion.c_str(), memSize); | ||
| 2754 | return err; | ||
| 2755 | } | ||
| 2756 | |||
| 2757 | inline static PVR_ERROR ADDON_GetBackendHostname(const AddonInstance_PVR* instance, | ||
| 2758 | char* str, | ||
| 2759 | int memSize) | ||
| 2760 | { | ||
| 2761 | std::string backendHostname; | ||
| 2762 | PVR_ERROR err = static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 2763 | ->GetBackendHostname(backendHostname); | ||
| 2764 | if (err == PVR_ERROR_NO_ERROR) | ||
| 2765 | strncpy(str, backendHostname.c_str(), memSize); | ||
| 2766 | return err; | ||
| 2767 | } | ||
| 2768 | |||
| 2769 | inline static PVR_ERROR ADDON_GetConnectionString(const AddonInstance_PVR* instance, | ||
| 2770 | char* str, | ||
| 2771 | int memSize) | ||
| 2772 | { | ||
| 2773 | std::string connectionString; | ||
| 2774 | PVR_ERROR err = static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 2775 | ->GetConnectionString(connectionString); | ||
| 2776 | if (err == PVR_ERROR_NO_ERROR) | ||
| 2777 | strncpy(str, connectionString.c_str(), memSize); | ||
| 2778 | return err; | ||
| 2779 | } | ||
| 2780 | |||
| 2781 | inline static PVR_ERROR ADDON_GetDriveSpace(const AddonInstance_PVR* instance, | ||
| 2782 | uint64_t* total, | ||
| 2783 | uint64_t* used) | ||
| 2784 | { | ||
| 2785 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 2786 | ->GetDriveSpace(*total, *used); | ||
| 2787 | } | ||
| 2788 | |||
| 2789 | inline static PVR_ERROR ADDON_CallSettingsMenuHook(const AddonInstance_PVR* instance, | ||
| 2790 | const PVR_MENUHOOK* menuhook) | ||
| 2791 | { | ||
| 2792 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 2793 | ->CallSettingsMenuHook(menuhook); | ||
| 2794 | } | ||
| 2795 | |||
| 2796 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 2797 | |||
| 2798 | inline static PVR_ERROR ADDON_GetChannelsAmount(const AddonInstance_PVR* instance, int* amount) | ||
| 2799 | { | ||
| 2800 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 2801 | ->GetChannelsAmount(*amount); | ||
| 2802 | } | ||
| 2803 | |||
| 2804 | inline static PVR_ERROR ADDON_GetChannels(const AddonInstance_PVR* instance, | ||
| 2805 | ADDON_HANDLE handle, | ||
| 2806 | bool radio) | ||
| 2807 | { | ||
| 2808 | PVRChannelsResultSet result(instance, handle); | ||
| 2809 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 2810 | ->GetChannels(radio, result); | ||
| 2811 | } | ||
| 2812 | |||
| 2813 | inline static PVR_ERROR ADDON_GetChannelStreamProperties(const AddonInstance_PVR* instance, | ||
| 2814 | const PVR_CHANNEL* channel, | ||
| 2815 | PVR_NAMED_VALUE* properties, | ||
| 2816 | unsigned int* propertiesCount) | ||
| 2817 | { | ||
| 2818 | *propertiesCount = 0; | ||
| 2819 | std::vector<PVRStreamProperty> propertiesList; | ||
| 2820 | PVR_ERROR error = static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 2821 | ->GetChannelStreamProperties(channel, propertiesList); | ||
| 2822 | if (error == PVR_ERROR_NO_ERROR) | ||
| 2823 | { | ||
| 2824 | for (const auto& property : propertiesList) | ||
| 2825 | { | ||
| 2826 | strncpy(properties[*propertiesCount].strName, property.GetCStructure()->strName, | ||
| 2827 | sizeof(properties[*propertiesCount].strName) - 1); | ||
| 2828 | strncpy(properties[*propertiesCount].strValue, property.GetCStructure()->strValue, | ||
| 2829 | sizeof(properties[*propertiesCount].strValue) - 1); | ||
| 2830 | ++*propertiesCount; | ||
| 2831 | if (*propertiesCount > STREAM_MAX_PROPERTY_COUNT) | ||
| 2832 | break; | ||
| 2833 | } | ||
| 2834 | } | ||
| 2835 | return error; | ||
| 2836 | } | ||
| 2837 | |||
| 2838 | inline static PVR_ERROR ADDON_GetSignalStatus(const AddonInstance_PVR* instance, | ||
| 2839 | int channelUid, | ||
| 2840 | PVR_SIGNAL_STATUS* signalStatus) | ||
| 2841 | { | ||
| 2842 | PVRSignalStatus cppSignalStatus(signalStatus); | ||
| 2843 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 2844 | ->GetSignalStatus(channelUid, cppSignalStatus); | ||
| 2845 | } | ||
| 2846 | |||
| 2847 | inline static PVR_ERROR ADDON_GetDescrambleInfo(const AddonInstance_PVR* instance, | ||
| 2848 | int channelUid, | ||
| 2849 | PVR_DESCRAMBLE_INFO* descrambleInfo) | ||
| 2850 | { | ||
| 2851 | PVRDescrambleInfo cppDescrambleInfo(descrambleInfo); | ||
| 2852 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 2853 | ->GetDescrambleInfo(channelUid, cppDescrambleInfo); | ||
| 2854 | } | ||
| 2855 | |||
| 2856 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 2857 | |||
| 2858 | inline static PVR_ERROR ADDON_GetChannelGroupsAmount(const AddonInstance_PVR* instance, | ||
| 2859 | int* amount) | ||
| 2860 | { | ||
| 2861 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 2862 | ->GetChannelGroupsAmount(*amount); | ||
| 2863 | } | ||
| 2864 | |||
| 2865 | inline static PVR_ERROR ADDON_GetChannelGroups(const AddonInstance_PVR* instance, | ||
| 2866 | ADDON_HANDLE handle, | ||
| 2867 | bool radio) | ||
| 2868 | { | ||
| 2869 | PVRChannelGroupsResultSet result(instance, handle); | ||
| 2870 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 2871 | ->GetChannelGroups(radio, result); | ||
| 2872 | } | ||
| 2873 | |||
| 2874 | inline static PVR_ERROR ADDON_GetChannelGroupMembers(const AddonInstance_PVR* instance, | ||
| 2875 | ADDON_HANDLE handle, | ||
| 2876 | const PVR_CHANNEL_GROUP* group) | ||
| 2877 | { | ||
| 2878 | PVRChannelGroupMembersResultSet result(instance, handle); | ||
| 2879 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 2880 | ->GetChannelGroupMembers(group, result); | ||
| 2881 | } | ||
| 2882 | |||
| 2883 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 2884 | |||
| 2885 | inline static PVR_ERROR ADDON_DeleteChannel(const AddonInstance_PVR* instance, | ||
| 2886 | const PVR_CHANNEL* channel) | ||
| 2887 | { | ||
| 2888 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 2889 | ->DeleteChannel(channel); | ||
| 2890 | } | ||
| 2891 | |||
| 2892 | inline static PVR_ERROR ADDON_RenameChannel(const AddonInstance_PVR* instance, | ||
| 2893 | const PVR_CHANNEL* channel) | ||
| 2894 | { | ||
| 2895 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 2896 | ->RenameChannel(channel); | ||
| 2897 | } | ||
| 2898 | |||
| 2899 | inline static PVR_ERROR ADDON_OpenDialogChannelSettings(const AddonInstance_PVR* instance, | ||
| 2900 | const PVR_CHANNEL* channel) | ||
| 2901 | { | ||
| 2902 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 2903 | ->OpenDialogChannelSettings(channel); | ||
| 2904 | } | ||
| 2905 | |||
| 2906 | inline static PVR_ERROR ADDON_OpenDialogChannelAdd(const AddonInstance_PVR* instance, | ||
| 2907 | const PVR_CHANNEL* channel) | ||
| 2908 | { | ||
| 2909 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 2910 | ->OpenDialogChannelAdd(channel); | ||
| 2911 | } | ||
| 2912 | |||
| 2913 | inline static PVR_ERROR ADDON_OpenDialogChannelScan(const AddonInstance_PVR* instance) | ||
| 2914 | { | ||
| 2915 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 2916 | ->OpenDialogChannelScan(); | ||
| 2917 | } | ||
| 2918 | |||
| 2919 | inline static PVR_ERROR ADDON_CallChannelMenuHook(const AddonInstance_PVR* instance, | ||
| 2920 | const PVR_MENUHOOK* menuhook, | ||
| 2921 | const PVR_CHANNEL* channel) | ||
| 2922 | { | ||
| 2923 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 2924 | ->CallChannelMenuHook(menuhook, channel); | ||
| 2925 | } | ||
| 2926 | |||
| 2927 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 2928 | |||
| 2929 | inline static PVR_ERROR ADDON_GetEPGForChannel(const AddonInstance_PVR* instance, | ||
| 2930 | ADDON_HANDLE handle, | ||
| 2931 | int channelUid, | ||
| 2932 | time_t start, | ||
| 2933 | time_t end) | ||
| 2934 | { | ||
| 2935 | PVREPGTagsResultSet result(instance, handle); | ||
| 2936 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 2937 | ->GetEPGForChannel(channelUid, start, end, result); | ||
| 2938 | } | ||
| 2939 | |||
| 2940 | inline static PVR_ERROR ADDON_IsEPGTagRecordable(const AddonInstance_PVR* instance, | ||
| 2941 | const EPG_TAG* tag, | ||
| 2942 | bool* isRecordable) | ||
| 2943 | { | ||
| 2944 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 2945 | ->IsEPGTagRecordable(tag, *isRecordable); | ||
| 2946 | } | ||
| 2947 | |||
| 2948 | inline static PVR_ERROR ADDON_IsEPGTagPlayable(const AddonInstance_PVR* instance, | ||
| 2949 | const EPG_TAG* tag, | ||
| 2950 | bool* isPlayable) | ||
| 2951 | { | ||
| 2952 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 2953 | ->IsEPGTagPlayable(tag, *isPlayable); | ||
| 2954 | } | ||
| 2955 | |||
| 2956 | inline static PVR_ERROR ADDON_GetEPGTagEdl(const AddonInstance_PVR* instance, | ||
| 2957 | const EPG_TAG* tag, | ||
| 2958 | PVR_EDL_ENTRY* edl, | ||
| 2959 | int* size) | ||
| 2960 | { | ||
| 2961 | *size = 0; | ||
| 2962 | std::vector<PVREDLEntry> edlList; | ||
| 2963 | PVR_ERROR error = static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 2964 | ->GetEPGTagEdl(tag, edlList); | ||
| 2965 | if (error == PVR_ERROR_NO_ERROR) | ||
| 2966 | { | ||
| 2967 | for (const auto& edlEntry : edlList) | ||
| 2968 | { | ||
| 2969 | edl[*size] = *edlEntry; | ||
| 2970 | ++*size; | ||
| 2971 | } | ||
| 2972 | } | ||
| 2973 | return error; | ||
| 2974 | } | ||
| 2975 | |||
| 2976 | inline static PVR_ERROR ADDON_GetEPGTagStreamProperties(const AddonInstance_PVR* instance, | ||
| 2977 | const EPG_TAG* tag, | ||
| 2978 | PVR_NAMED_VALUE* properties, | ||
| 2979 | unsigned int* propertiesCount) | ||
| 2980 | { | ||
| 2981 | *propertiesCount = 0; | ||
| 2982 | std::vector<PVRStreamProperty> propertiesList; | ||
| 2983 | PVR_ERROR error = static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 2984 | ->GetEPGTagStreamProperties(tag, propertiesList); | ||
| 2985 | if (error == PVR_ERROR_NO_ERROR) | ||
| 2986 | { | ||
| 2987 | for (const auto& property : propertiesList) | ||
| 2988 | { | ||
| 2989 | strncpy(properties[*propertiesCount].strName, property.GetCStructure()->strName, | ||
| 2990 | sizeof(properties[*propertiesCount].strName) - 1); | ||
| 2991 | strncpy(properties[*propertiesCount].strValue, property.GetCStructure()->strValue, | ||
| 2992 | sizeof(properties[*propertiesCount].strValue) - 1); | ||
| 2993 | ++*propertiesCount; | ||
| 2994 | if (*propertiesCount > STREAM_MAX_PROPERTY_COUNT) | ||
| 2995 | break; | ||
| 2996 | } | ||
| 2997 | } | ||
| 2998 | return error; | ||
| 2999 | } | ||
| 3000 | |||
| 3001 | inline static PVR_ERROR ADDON_SetEPGTimeFrame(const AddonInstance_PVR* instance, int days) | ||
| 3002 | { | ||
| 3003 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3004 | ->SetEPGTimeFrame(days); | ||
| 3005 | } | ||
| 3006 | |||
| 3007 | inline static PVR_ERROR ADDON_CallEPGMenuHook(const AddonInstance_PVR* instance, | ||
| 3008 | const PVR_MENUHOOK* menuhook, | ||
| 3009 | const EPG_TAG* tag) | ||
| 3010 | { | ||
| 3011 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3012 | ->CallEPGMenuHook(menuhook, tag); | ||
| 3013 | } | ||
| 3014 | |||
| 3015 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 3016 | |||
| 3017 | inline static PVR_ERROR ADDON_GetRecordingsAmount(const AddonInstance_PVR* instance, | ||
| 3018 | bool deleted, | ||
| 3019 | int* amount) | ||
| 3020 | { | ||
| 3021 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3022 | ->GetRecordingsAmount(deleted, *amount); | ||
| 3023 | } | ||
| 3024 | |||
| 3025 | inline static PVR_ERROR ADDON_GetRecordings(const AddonInstance_PVR* instance, | ||
| 3026 | ADDON_HANDLE handle, | ||
| 3027 | bool deleted) | ||
| 3028 | { | ||
| 3029 | PVRRecordingsResultSet result(instance, handle); | ||
| 3030 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3031 | ->GetRecordings(deleted, result); | ||
| 3032 | } | ||
| 3033 | |||
| 3034 | inline static PVR_ERROR ADDON_DeleteRecording(const AddonInstance_PVR* instance, | ||
| 3035 | const PVR_RECORDING* recording) | ||
| 3036 | { | ||
| 3037 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3038 | ->DeleteRecording(recording); | ||
| 3039 | } | ||
| 3040 | |||
| 3041 | inline static PVR_ERROR ADDON_UndeleteRecording(const AddonInstance_PVR* instance, | ||
| 3042 | const PVR_RECORDING* recording) | ||
| 3043 | { | ||
| 3044 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3045 | ->UndeleteRecording(recording); | ||
| 3046 | } | ||
| 3047 | |||
| 3048 | inline static PVR_ERROR ADDON_DeleteAllRecordingsFromTrash(const AddonInstance_PVR* instance) | ||
| 3049 | { | ||
| 3050 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3051 | ->DeleteAllRecordingsFromTrash(); | ||
| 3052 | } | ||
| 3053 | |||
| 3054 | inline static PVR_ERROR ADDON_RenameRecording(const AddonInstance_PVR* instance, | ||
| 3055 | const PVR_RECORDING* recording) | ||
| 3056 | { | ||
| 3057 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3058 | ->RenameRecording(recording); | ||
| 3059 | } | ||
| 3060 | |||
| 3061 | inline static PVR_ERROR ADDON_SetRecordingLifetime(const AddonInstance_PVR* instance, | ||
| 3062 | const PVR_RECORDING* recording) | ||
| 3063 | { | ||
| 3064 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3065 | ->SetRecordingLifetime(recording); | ||
| 3066 | } | ||
| 3067 | |||
| 3068 | inline static PVR_ERROR ADDON_SetRecordingPlayCount(const AddonInstance_PVR* instance, | ||
| 3069 | const PVR_RECORDING* recording, | ||
| 3070 | int count) | ||
| 3071 | { | ||
| 3072 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3073 | ->SetRecordingPlayCount(recording, count); | ||
| 3074 | } | ||
| 3075 | |||
| 3076 | inline static PVR_ERROR ADDON_SetRecordingLastPlayedPosition(const AddonInstance_PVR* instance, | ||
| 3077 | const PVR_RECORDING* recording, | ||
| 3078 | int lastplayedposition) | ||
| 3079 | { | ||
| 3080 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3081 | ->SetRecordingLastPlayedPosition(recording, lastplayedposition); | ||
| 3082 | } | ||
| 3083 | |||
| 3084 | inline static PVR_ERROR ADDON_GetRecordingLastPlayedPosition(const AddonInstance_PVR* instance, | ||
| 3085 | const PVR_RECORDING* recording, | ||
| 3086 | int* position) | ||
| 3087 | { | ||
| 3088 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3089 | ->GetRecordingLastPlayedPosition(recording, *position); | ||
| 3090 | } | ||
| 3091 | |||
| 3092 | inline static PVR_ERROR ADDON_GetRecordingEdl(const AddonInstance_PVR* instance, | ||
| 3093 | const PVR_RECORDING* recording, | ||
| 3094 | PVR_EDL_ENTRY* edl, | ||
| 3095 | int* size) | ||
| 3096 | { | ||
| 3097 | *size = 0; | ||
| 3098 | std::vector<PVREDLEntry> edlList; | ||
| 3099 | PVR_ERROR error = static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3100 | ->GetRecordingEdl(recording, edlList); | ||
| 3101 | if (error == PVR_ERROR_NO_ERROR) | ||
| 3102 | { | ||
| 3103 | for (const auto& edlEntry : edlList) | ||
| 3104 | { | ||
| 3105 | edl[*size] = *edlEntry; | ||
| 3106 | ++*size; | ||
| 3107 | } | ||
| 3108 | } | ||
| 3109 | return error; | ||
| 3110 | } | ||
| 3111 | |||
| 3112 | inline static PVR_ERROR ADDON_GetRecordingSize(const AddonInstance_PVR* instance, | ||
| 3113 | const PVR_RECORDING* recording, | ||
| 3114 | int64_t* size) | ||
| 3115 | { | ||
| 3116 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3117 | ->GetRecordingSize(recording, *size); | ||
| 3118 | } | ||
| 3119 | |||
| 3120 | inline static PVR_ERROR ADDON_GetRecordingStreamProperties(const AddonInstance_PVR* instance, | ||
| 3121 | const PVR_RECORDING* recording, | ||
| 3122 | PVR_NAMED_VALUE* properties, | ||
| 3123 | unsigned int* propertiesCount) | ||
| 3124 | { | ||
| 3125 | *propertiesCount = 0; | ||
| 3126 | std::vector<PVRStreamProperty> propertiesList; | ||
| 3127 | PVR_ERROR error = static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3128 | ->GetRecordingStreamProperties(recording, propertiesList); | ||
| 3129 | if (error == PVR_ERROR_NO_ERROR) | ||
| 3130 | { | ||
| 3131 | for (const auto& property : propertiesList) | ||
| 3132 | { | ||
| 3133 | strncpy(properties[*propertiesCount].strName, property.GetCStructure()->strName, | ||
| 3134 | sizeof(properties[*propertiesCount].strName) - 1); | ||
| 3135 | strncpy(properties[*propertiesCount].strValue, property.GetCStructure()->strValue, | ||
| 3136 | sizeof(properties[*propertiesCount].strValue) - 1); | ||
| 3137 | ++*propertiesCount; | ||
| 3138 | if (*propertiesCount > STREAM_MAX_PROPERTY_COUNT) | ||
| 3139 | break; | ||
| 3140 | } | ||
| 3141 | } | ||
| 3142 | return error; | ||
| 3143 | } | ||
| 3144 | |||
| 3145 | inline static PVR_ERROR ADDON_CallRecordingMenuHook(const AddonInstance_PVR* instance, | ||
| 3146 | const PVR_MENUHOOK* menuhook, | ||
| 3147 | const PVR_RECORDING* recording) | ||
| 3148 | { | ||
| 3149 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3150 | ->CallRecordingMenuHook(menuhook, recording); | ||
| 3151 | } | ||
| 3152 | |||
| 3153 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 3154 | |||
| 3155 | |||
| 3156 | inline static PVR_ERROR ADDON_GetTimerTypes(const AddonInstance_PVR* instance, | ||
| 3157 | PVR_TIMER_TYPE* types, | ||
| 3158 | int* typesCount) | ||
| 3159 | { | ||
| 3160 | *typesCount = 0; | ||
| 3161 | std::vector<PVRTimerType> timerTypes; | ||
| 3162 | PVR_ERROR error = static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3163 | ->GetTimerTypes(timerTypes); | ||
| 3164 | if (error == PVR_ERROR_NO_ERROR) | ||
| 3165 | { | ||
| 3166 | for (const auto& timerType : timerTypes) | ||
| 3167 | { | ||
| 3168 | types[*typesCount] = *timerType; | ||
| 3169 | ++*typesCount; | ||
| 3170 | if (*typesCount >= PVR_ADDON_TIMERTYPE_ARRAY_SIZE) | ||
| 3171 | break; | ||
| 3172 | } | ||
| 3173 | } | ||
| 3174 | return error; | ||
| 3175 | } | ||
| 3176 | |||
| 3177 | inline static PVR_ERROR ADDON_GetTimersAmount(const AddonInstance_PVR* instance, int* amount) | ||
| 3178 | { | ||
| 3179 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3180 | ->GetTimersAmount(*amount); | ||
| 3181 | } | ||
| 3182 | |||
| 3183 | inline static PVR_ERROR ADDON_GetTimers(const AddonInstance_PVR* instance, ADDON_HANDLE handle) | ||
| 3184 | { | ||
| 3185 | PVRTimersResultSet result(instance, handle); | ||
| 3186 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->GetTimers(result); | ||
| 3187 | } | ||
| 3188 | |||
| 3189 | inline static PVR_ERROR ADDON_AddTimer(const AddonInstance_PVR* instance, const PVR_TIMER* timer) | ||
| 3190 | { | ||
| 3191 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->AddTimer(timer); | ||
| 3192 | } | ||
| 3193 | |||
| 3194 | inline static PVR_ERROR ADDON_DeleteTimer(const AddonInstance_PVR* instance, | ||
| 3195 | const PVR_TIMER* timer, | ||
| 3196 | bool forceDelete) | ||
| 3197 | { | ||
| 3198 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3199 | ->DeleteTimer(timer, forceDelete); | ||
| 3200 | } | ||
| 3201 | |||
| 3202 | inline static PVR_ERROR ADDON_UpdateTimer(const AddonInstance_PVR* instance, | ||
| 3203 | const PVR_TIMER* timer) | ||
| 3204 | { | ||
| 3205 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->UpdateTimer(timer); | ||
| 3206 | } | ||
| 3207 | |||
| 3208 | inline static PVR_ERROR ADDON_CallTimerMenuHook(const AddonInstance_PVR* instance, | ||
| 3209 | const PVR_MENUHOOK* menuhook, | ||
| 3210 | const PVR_TIMER* timer) | ||
| 3211 | { | ||
| 3212 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3213 | ->CallTimerMenuHook(menuhook, timer); | ||
| 3214 | } | ||
| 3215 | |||
| 3216 | //--==----==----==----==----==----==----==----==----==----==----==----==----== | ||
| 3217 | |||
| 3218 | inline static PVR_ERROR ADDON_OnSystemSleep(const AddonInstance_PVR* instance) | ||
| 3219 | { | ||
| 3220 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->OnSystemSleep(); | ||
| 3221 | } | ||
| 3222 | |||
| 3223 | inline static PVR_ERROR ADDON_OnSystemWake(const AddonInstance_PVR* instance) | ||
| 3224 | { | ||
| 3225 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->OnSystemWake(); | ||
| 3226 | } | ||
| 3227 | |||
| 3228 | inline static PVR_ERROR ADDON_OnPowerSavingActivated(const AddonInstance_PVR* instance) | ||
| 3229 | { | ||
| 3230 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3231 | ->OnPowerSavingActivated(); | ||
| 3232 | } | ||
| 3233 | |||
| 3234 | inline static PVR_ERROR ADDON_OnPowerSavingDeactivated(const AddonInstance_PVR* instance) | ||
| 3235 | { | ||
| 3236 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3237 | ->OnPowerSavingDeactivated(); | ||
| 3238 | } | ||
| 3239 | |||
| 3240 | // obsolete parts below | ||
| 3241 | ///@{ | ||
| 3242 | |||
| 3243 | inline static bool ADDON_OpenLiveStream(const AddonInstance_PVR* instance, | ||
| 3244 | const PVR_CHANNEL* channel) | ||
| 3245 | { | ||
| 3246 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3247 | ->OpenLiveStream(channel); | ||
| 3248 | } | ||
| 3249 | |||
| 3250 | inline static void ADDON_CloseLiveStream(const AddonInstance_PVR* instance) | ||
| 3251 | { | ||
| 3252 | static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->CloseLiveStream(); | ||
| 3253 | } | ||
| 3254 | |||
| 3255 | inline static int ADDON_ReadLiveStream(const AddonInstance_PVR* instance, | ||
| 3256 | unsigned char* buffer, | ||
| 3257 | unsigned int size) | ||
| 3258 | { | ||
| 3259 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3260 | ->ReadLiveStream(buffer, size); | ||
| 3261 | } | ||
| 3262 | |||
| 3263 | inline static int64_t ADDON_SeekLiveStream(const AddonInstance_PVR* instance, | ||
| 3264 | int64_t position, | ||
| 3265 | int whence) | ||
| 3266 | { | ||
| 3267 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3268 | ->SeekLiveStream(position, whence); | ||
| 3269 | } | ||
| 3270 | |||
| 3271 | inline static int64_t ADDON_LengthLiveStream(const AddonInstance_PVR* instance) | ||
| 3272 | { | ||
| 3273 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->LengthLiveStream(); | ||
| 3274 | } | ||
| 3275 | |||
| 3276 | inline static PVR_ERROR ADDON_GetStreamProperties(const AddonInstance_PVR* instance, | ||
| 3277 | PVR_STREAM_PROPERTIES* properties) | ||
| 3278 | { | ||
| 3279 | properties->iStreamCount = 0; | ||
| 3280 | std::vector<PVRStreamProperties> cppProperties; | ||
| 3281 | PVR_ERROR err = static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3282 | ->GetStreamProperties(cppProperties); | ||
| 3283 | if (err == PVR_ERROR_NO_ERROR) | ||
| 3284 | { | ||
| 3285 | for (unsigned int i = 0; i < cppProperties.size(); ++i) | ||
| 3286 | { | ||
| 3287 | memcpy(&properties->stream[i], | ||
| 3288 | static_cast<PVR_STREAM_PROPERTIES::PVR_STREAM*>(cppProperties[i]), | ||
| 3289 | sizeof(PVR_STREAM_PROPERTIES::PVR_STREAM)); | ||
| 3290 | ++properties->iStreamCount; | ||
| 3291 | |||
| 3292 | if (properties->iStreamCount >= PVR_STREAM_MAX_STREAMS) | ||
| 3293 | { | ||
| 3294 | kodi::Log( | ||
| 3295 | ADDON_LOG_ERROR, | ||
| 3296 | "CInstancePVRClient::%s: Addon given with '%li' more allowed streams where '%i'", | ||
| 3297 | __func__, cppProperties.size(), PVR_STREAM_MAX_STREAMS); | ||
| 3298 | break; | ||
| 3299 | } | ||
| 3300 | } | ||
| 3301 | } | ||
| 3302 | |||
| 3303 | return err; | ||
| 3304 | } | ||
| 3305 | |||
| 3306 | inline static PVR_ERROR ADDON_GetStreamReadChunkSize(const AddonInstance_PVR* instance, | ||
| 3307 | int* chunksize) | ||
| 3308 | { | ||
| 3309 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3310 | ->GetStreamReadChunkSize(*chunksize); | ||
| 3311 | } | ||
| 3312 | |||
| 3313 | inline static bool ADDON_IsRealTimeStream(const AddonInstance_PVR* instance) | ||
| 3314 | { | ||
| 3315 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->IsRealTimeStream(); | ||
| 3316 | } | ||
| 3317 | |||
| 3318 | inline static bool ADDON_OpenRecordedStream(const AddonInstance_PVR* instance, | ||
| 3319 | const PVR_RECORDING* recording) | ||
| 3320 | { | ||
| 3321 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3322 | ->OpenRecordedStream(recording); | ||
| 3323 | } | ||
| 3324 | |||
| 3325 | inline static void ADDON_CloseRecordedStream(const AddonInstance_PVR* instance) | ||
| 3326 | { | ||
| 3327 | static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->CloseRecordedStream(); | ||
| 3328 | } | ||
| 3329 | |||
| 3330 | inline static int ADDON_ReadRecordedStream(const AddonInstance_PVR* instance, | ||
| 3331 | unsigned char* buffer, | ||
| 3332 | unsigned int size) | ||
| 3333 | { | ||
| 3334 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3335 | ->ReadRecordedStream(buffer, size); | ||
| 3336 | } | ||
| 3337 | |||
| 3338 | inline static int64_t ADDON_SeekRecordedStream(const AddonInstance_PVR* instance, | ||
| 3339 | int64_t position, | ||
| 3340 | int whence) | ||
| 3341 | { | ||
| 3342 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3343 | ->SeekRecordedStream(position, whence); | ||
| 3344 | } | ||
| 3345 | |||
| 3346 | inline static int64_t ADDON_LengthRecordedStream(const AddonInstance_PVR* instance) | ||
| 3347 | { | ||
| 3348 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3349 | ->LengthRecordedStream(); | ||
| 3350 | } | ||
| 3351 | |||
| 3352 | inline static void ADDON_DemuxReset(const AddonInstance_PVR* instance) | ||
| 3353 | { | ||
| 3354 | static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->DemuxReset(); | ||
| 3355 | } | ||
| 3356 | |||
| 3357 | inline static void ADDON_DemuxAbort(const AddonInstance_PVR* instance) | ||
| 3358 | { | ||
| 3359 | static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->DemuxAbort(); | ||
| 3360 | } | ||
| 3361 | |||
| 3362 | inline static void ADDON_DemuxFlush(const AddonInstance_PVR* instance) | ||
| 3363 | { | ||
| 3364 | static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->DemuxFlush(); | ||
| 3365 | } | ||
| 3366 | |||
| 3367 | inline static DemuxPacket* ADDON_DemuxRead(const AddonInstance_PVR* instance) | ||
| 3368 | { | ||
| 3369 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->DemuxRead(); | ||
| 3370 | } | ||
| 3371 | |||
| 3372 | inline static bool ADDON_CanPauseStream(const AddonInstance_PVR* instance) | ||
| 3373 | { | ||
| 3374 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->CanPauseStream(); | ||
| 3375 | } | ||
| 3376 | |||
| 3377 | inline static bool ADDON_CanSeekStream(const AddonInstance_PVR* instance) | ||
| 3378 | { | ||
| 3379 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->CanSeekStream(); | ||
| 3380 | } | ||
| 3381 | |||
| 3382 | inline static void ADDON_PauseStream(const AddonInstance_PVR* instance, bool bPaused) | ||
| 3383 | { | ||
| 3384 | static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->PauseStream(bPaused); | ||
| 3385 | } | ||
| 3386 | |||
| 3387 | inline static bool ADDON_SeekTime(const AddonInstance_PVR* instance, | ||
| 3388 | double time, | ||
| 3389 | bool backwards, | ||
| 3390 | double* startpts) | ||
| 3391 | { | ||
| 3392 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3393 | ->SeekTime(time, backwards, *startpts); | ||
| 3394 | } | ||
| 3395 | |||
| 3396 | inline static void ADDON_SetSpeed(const AddonInstance_PVR* instance, int speed) | ||
| 3397 | { | ||
| 3398 | static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->SetSpeed(speed); | ||
| 3399 | } | ||
| 3400 | |||
| 3401 | inline static void ADDON_FillBuffer(const AddonInstance_PVR* instance, bool mode) | ||
| 3402 | { | ||
| 3403 | static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance)->FillBuffer(mode); | ||
| 3404 | } | ||
| 3405 | |||
| 3406 | inline static PVR_ERROR ADDON_GetStreamTimes(const AddonInstance_PVR* instance, | ||
| 3407 | PVR_STREAM_TIMES* times) | ||
| 3408 | { | ||
| 3409 | PVRStreamTimes cppTimes(times); | ||
| 3410 | return static_cast<CInstancePVRClient*>(instance->toAddon->addonInstance) | ||
| 3411 | ->GetStreamTimes(cppTimes); | ||
| 3412 | } | ||
| 3413 | ///@} | ||
| 3414 | |||
| 3415 | AddonInstance_PVR* m_instanceData = nullptr; | ||
| 3416 | }; | ||
| 3417 | //}}} | ||
| 3418 | //______________________________________________________________________________ | ||
| 3419 | |||
| 3420 | } /* namespace addon */ | ||
| 3421 | } /* namespace kodi */ | ||
| 3422 | |||
| 3423 | #endif /* __cplusplus */ | ||
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Peripheral.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Peripheral.h new file mode 100644 index 0000000..46060a8 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Peripheral.h | |||
| @@ -0,0 +1,907 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2014-2018 Team Kodi | ||
| 3 | * This file is part of Kodi - https://kodi.tv | ||
| 4 | * | ||
| 5 | * SPDX-License-Identifier: GPL-2.0-or-later | ||
| 6 | * See LICENSES/README.md for more information. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #pragma once | ||
| 10 | |||
| 11 | #include "../AddonBase.h" | ||
| 12 | #include "peripheral/PeripheralUtils.h" | ||
| 13 | |||
| 14 | #ifdef __cplusplus | ||
| 15 | namespace kodi | ||
| 16 | { | ||
| 17 | namespace addon | ||
| 18 | { | ||
| 19 | |||
| 20 | //############################################################################## | ||
| 21 | /// @defgroup cpp_kodi_addon_peripheral_Defs Definitions, structures and enumerators | ||
| 22 | /// @ingroup cpp_kodi_addon_peripheral | ||
| 23 | /// @brief %Peripheral add-on general variables | ||
| 24 | /// | ||
| 25 | /// Used to exchange the available options between Kodi and addon. | ||
| 26 | /// | ||
| 27 | /// | ||
| 28 | |||
| 29 | //############################################################################## | ||
| 30 | /// @defgroup cpp_kodi_addon_peripheral_Defs_General 1. General | ||
| 31 | /// @ingroup cpp_kodi_addon_peripheral_Defs | ||
| 32 | /// @brief **%Peripheral add-on general variables**\n | ||
| 33 | /// Used to exchange the available options between Kodi and addon. | ||
| 34 | /// | ||
| 35 | /// This group also includes @ref cpp_kodi_addon_peripheral_Defs_PeripheralCapabilities | ||
| 36 | /// with which Kodi an @ref kodi::addon::CInstancePeripheral::GetCapabilities() | ||
| 37 | /// queries the supported **modules** of the addon. | ||
| 38 | /// | ||
| 39 | |||
| 40 | //############################################################################## | ||
| 41 | /// @defgroup cpp_kodi_addon_peripheral_Defs_Peripheral 2. Peripheral | ||
| 42 | /// @ingroup cpp_kodi_addon_peripheral_Defs | ||
| 43 | /// @brief **%Peripheral add-on operation variables**\n | ||
| 44 | /// Used to exchange the available options between Kodi and addon. | ||
| 45 | /// | ||
| 46 | |||
| 47 | //############################################################################## | ||
| 48 | /// @defgroup cpp_kodi_addon_peripheral_Defs_Event 3. Event | ||
| 49 | /// @ingroup cpp_kodi_addon_peripheral_Defs | ||
| 50 | /// @brief **%Event add-on operation variables**\n | ||
| 51 | /// Used to exchange the available options between Kodi and addon. | ||
| 52 | /// | ||
| 53 | |||
| 54 | //############################################################################## | ||
| 55 | /// @defgroup cpp_kodi_addon_peripheral_Defs_Joystick 4. Joystick | ||
| 56 | /// @ingroup cpp_kodi_addon_peripheral_Defs | ||
| 57 | /// @brief **%Joystick add-on operation variables**\n | ||
| 58 | /// Used to exchange the available options between Kodi and addon. | ||
| 59 | /// | ||
| 60 | |||
| 61 | //============================================================================== | ||
| 62 | /// @addtogroup cpp_kodi_addon_peripheral | ||
| 63 | /// @brief \cpp_class{ kodi::addon::CInstancePeripheral } | ||
| 64 | /// **%Peripheral add-on instance** | ||
| 65 | /// | ||
| 66 | /// The peripheral add-ons provides access to many joystick and gamepad | ||
| 67 | /// interfaces across various platforms. An input addon is used to map the | ||
| 68 | /// buttons/axis on your physical input device, to the buttons/axis of your | ||
| 69 | /// virtual system. This is necessary because different retro systems usually | ||
| 70 | /// have different button layouts. A controller configuration utility is also | ||
| 71 | /// in the works. | ||
| 72 | /// | ||
| 73 | /// ---------------------------------------------------------------------------- | ||
| 74 | /// | ||
| 75 | /// Here is an example of what the <b>`addon.xml.in`</b> would look like for an | ||
| 76 | /// peripheral addon: | ||
| 77 | /// | ||
| 78 | /// ~~~~~~~~~~~~~{.xml} | ||
| 79 | /// <?xml version="1.0" encoding="UTF-8"?> | ||
| 80 | /// <addon | ||
| 81 | /// id="peripheral.myspecialnamefor" | ||
| 82 | /// version="1.0.0" | ||
| 83 | /// name="My special peripheral addon" | ||
| 84 | /// provider-name="Your Name"> | ||
| 85 | /// <requires>@ADDON_DEPENDS@</requires> | ||
| 86 | /// <extension | ||
| 87 | /// point="kodi.peripheral" | ||
| 88 | /// provides_joysticks="true" | ||
| 89 | /// provides_buttonmaps="true" | ||
| 90 | /// library_@PLATFORM@="@LIBRARY_FILENAME@"/> | ||
| 91 | /// <extension point="xbmc.addon.metadata"> | ||
| 92 | /// <summary lang="en_GB">My peripheral addon</summary> | ||
| 93 | /// <description lang="en_GB">My peripheral addon description</description> | ||
| 94 | /// <platform>@PLATFORM@</platform> | ||
| 95 | /// </extension> | ||
| 96 | /// </addon> | ||
| 97 | /// ~~~~~~~~~~~~~ | ||
| 98 | /// | ||
| 99 | /// Description to peripheral related addon.xml values: | ||
| 100 | /// | Name | Description | ||
| 101 | /// |:------------------------------|---------------------------------------- | ||
| 102 | /// | <b>`provides_joysticks`</b> | Set to "true" if addon provides joystick support. | ||
| 103 | /// | <b>`provides_buttonmaps`</b> | Set to "true" if button map is used and supported by addon. | ||
| 104 | /// | <b>`point`</b> | Addon type specification<br>At all addon types and for this kind always <b>"kodi.peripheral"</b>. | ||
| 105 | /// | <b>`library_@PLATFORM@`</b> | Sets the used library name, which is automatically set by cmake at addon build. | ||
| 106 | /// | ||
| 107 | /// @remark For more detailed description of the <b>`addon.xml`</b>, see also https://kodi.wiki/view/Addon.xml. | ||
| 108 | /// | ||
| 109 | /// | ||
| 110 | /// -------------------------------------------------------------------------- | ||
| 111 | /// | ||
| 112 | /// **Here is an example of how addon can be used as a single:** | ||
| 113 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 114 | /// #include <kodi/addon-instance/Peripheral.h> | ||
| 115 | /// | ||
| 116 | /// class CMyPeripheralAddon : public kodi::addon::CAddonBase, | ||
| 117 | /// public kodi::addon::CInstancePeripheral | ||
| 118 | /// { | ||
| 119 | /// public: | ||
| 120 | /// CMyPeripheralAddon(); | ||
| 121 | /// | ||
| 122 | /// void GetCapabilities(kodi::addon::PeripheralCapabilities& capabilities) override; | ||
| 123 | /// ... | ||
| 124 | /// }; | ||
| 125 | /// | ||
| 126 | /// CMyPeripheralAddon::CMyPeripheralAddon() | ||
| 127 | /// { | ||
| 128 | /// ... | ||
| 129 | /// } | ||
| 130 | /// | ||
| 131 | /// void CMyPeripheralAddon::GetCapabilities(kodi::addon::PeripheralCapabilities& capabilities) | ||
| 132 | /// { | ||
| 133 | /// capabilities.SetProvidesJoysticks(true); | ||
| 134 | /// capabilities.SetProvidesButtonmaps(true); | ||
| 135 | /// ... | ||
| 136 | /// } | ||
| 137 | /// | ||
| 138 | /// ADDONCREATOR(CMyPeripheralAddon) | ||
| 139 | /// ~~~~~~~~~~~~~ | ||
| 140 | /// | ||
| 141 | /// @note It is imperative to use the necessary functions of this class in the | ||
| 142 | /// addon. | ||
| 143 | /// | ||
| 144 | /// -------------------------------------------------------------------------- | ||
| 145 | /// | ||
| 146 | /// | ||
| 147 | /// **Here is another example where the peripheral is used together with | ||
| 148 | /// other instance types:** | ||
| 149 | /// | ||
| 150 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 151 | /// #include <kodi/addon-instance/Peripheral.h> | ||
| 152 | /// | ||
| 153 | /// class CMyPeripheralAddon : public kodi::addon::CInstancePeripheral | ||
| 154 | /// { | ||
| 155 | /// public: | ||
| 156 | /// CMyPeripheralAddon(KODI_HANDLE instance, const std::string& version); | ||
| 157 | /// | ||
| 158 | /// void GetCapabilities(kodi::addon::PeripheralCapabilities& capabilities) override; | ||
| 159 | /// ... | ||
| 160 | /// }; | ||
| 161 | /// | ||
| 162 | /// CMyPeripheralAddon::CMyPeripheralAddon(KODI_HANDLE instance, const std::string& version) | ||
| 163 | /// : CInstancePeripheral(instance, version) | ||
| 164 | /// { | ||
| 165 | /// ... | ||
| 166 | /// } | ||
| 167 | /// | ||
| 168 | /// void CMyPeripheralAddon::GetCapabilities(kodi::addon::PeripheralCapabilities& capabilities) | ||
| 169 | /// { | ||
| 170 | /// capabilities.SetProvidesJoysticks(true); | ||
| 171 | /// capabilities.SetProvidesButtonmaps(true); | ||
| 172 | /// ... | ||
| 173 | /// } | ||
| 174 | /// | ||
| 175 | /// //---------------------------------------------------------------------- | ||
| 176 | /// | ||
| 177 | /// class CMyAddon : public kodi::addon::CAddonBase | ||
| 178 | /// { | ||
| 179 | /// public: | ||
| 180 | /// CMyAddon() = default; | ||
| 181 | /// ADDON_STATUS CreateInstance(int instanceType, | ||
| 182 | /// const std::string& instanceID, | ||
| 183 | /// KODI_HANDLE instance, | ||
| 184 | /// const std::string& version, | ||
| 185 | /// KODI_HANDLE& addonInstance) override; | ||
| 186 | /// }; | ||
| 187 | /// | ||
| 188 | /// // If you use only one instance in your add-on, can be instanceType and | ||
| 189 | /// // instanceID ignored | ||
| 190 | /// ADDON_STATUS CMyAddon::CreateInstance(int instanceType, | ||
| 191 | /// const std::string& instanceID, | ||
| 192 | /// KODI_HANDLE instance, | ||
| 193 | /// const std::string& version, | ||
| 194 | /// KODI_HANDLE& addonInstance) | ||
| 195 | /// { | ||
| 196 | /// if (instanceType == ADDON_INSTANCE_PERIPHERAL) | ||
| 197 | /// { | ||
| 198 | /// kodi::Log(ADDON_LOG_INFO, "Creating my peripheral addon"); | ||
| 199 | /// addonInstance = new CMyPeripheralAddon(instance, version); | ||
| 200 | /// return ADDON_STATUS_OK; | ||
| 201 | /// } | ||
| 202 | /// else if (...) | ||
| 203 | /// { | ||
| 204 | /// ... | ||
| 205 | /// } | ||
| 206 | /// return ADDON_STATUS_UNKNOWN; | ||
| 207 | /// } | ||
| 208 | /// | ||
| 209 | /// ADDONCREATOR(CMyAddon) | ||
| 210 | /// ~~~~~~~~~~~~~ | ||
| 211 | /// | ||
| 212 | /// The destruction of the example class `CMyPeripheralAddon` is called from | ||
| 213 | /// Kodi's header. Manually deleting the add-on instance is not required. | ||
| 214 | /// | ||
| 215 | class ATTRIBUTE_HIDDEN CInstancePeripheral : public IAddonInstance | ||
| 216 | { | ||
| 217 | public: | ||
| 218 | //============================================================================ | ||
| 219 | /// @ingroup cpp_kodi_addon_peripheral | ||
| 220 | /// @brief %Peripheral class constructor. | ||
| 221 | /// | ||
| 222 | /// Used by an add-on that only supports peripheral. | ||
| 223 | /// | ||
| 224 | CInstancePeripheral() | ||
| 225 | : IAddonInstance(ADDON_INSTANCE_PERIPHERAL, GetKodiTypeVersion(ADDON_INSTANCE_PERIPHERAL)) | ||
| 226 | { | ||
| 227 | if (CAddonBase::m_interface->globalSingleInstance != nullptr) | ||
| 228 | throw std::logic_error("kodi::addon::CInstancePeripheral: Creation of more as one in single " | ||
| 229 | "instance way is not allowed!"); | ||
| 230 | |||
| 231 | SetAddonStruct(CAddonBase::m_interface->firstKodiInstance); | ||
| 232 | CAddonBase::m_interface->globalSingleInstance = this; | ||
| 233 | } | ||
| 234 | //---------------------------------------------------------------------------- | ||
| 235 | |||
| 236 | //============================================================================ | ||
| 237 | /// @ingroup cpp_kodi_addon_peripheral | ||
| 238 | /// @brief %Peripheral addon class constructor used to support multiple | ||
| 239 | /// instance types. | ||
| 240 | /// | ||
| 241 | /// @param[in] instance The instance value given to | ||
| 242 | /// <b>`kodi::addon::CAddonBase::CreateInstance(...)`</b>. | ||
| 243 | /// @param[in] kodiVersion [opt] Version used in Kodi for this instance, to | ||
| 244 | /// allow compatibility to older Kodi versions. | ||
| 245 | /// | ||
| 246 | /// @note Recommended to set <b>`kodiVersion`</b>. | ||
| 247 | /// | ||
| 248 | /// | ||
| 249 | /// -------------------------------------------------------------------------- | ||
| 250 | /// | ||
| 251 | //////*Here's example about the use of this:** | ||
| 252 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 253 | /// class CMyPeripheralAddon : public kodi::addon::CInstancePeripheral | ||
| 254 | /// { | ||
| 255 | /// public: | ||
| 256 | /// CMyPeripheralAddon(KODI_HANDLE instance, const std::string& kodiVersion) | ||
| 257 | /// : kodi::addon::CInstancePeripheral(instance, kodiVersion) | ||
| 258 | /// { | ||
| 259 | /// ... | ||
| 260 | /// } | ||
| 261 | /// | ||
| 262 | /// ... | ||
| 263 | /// }; | ||
| 264 | /// | ||
| 265 | /// ADDON_STATUS CMyAddon::CreateInstance(int instanceType, | ||
| 266 | /// const std::string& instanceID, | ||
| 267 | /// KODI_HANDLE instance, | ||
| 268 | /// const std::string& version, | ||
| 269 | /// KODI_HANDLE& addonInstance) | ||
| 270 | /// { | ||
| 271 | /// kodi::Log(ADDON_LOG_INFO, "Creating my peripheral"); | ||
| 272 | /// addonInstance = new CMyPeripheralAddon(instance, version); | ||
| 273 | /// return ADDON_STATUS_OK; | ||
| 274 | /// } | ||
| 275 | /// ~~~~~~~~~~~~~ | ||
| 276 | /// | ||
| 277 | explicit CInstancePeripheral(KODI_HANDLE instance, const std::string& kodiVersion = "") | ||
| 278 | : IAddonInstance(ADDON_INSTANCE_PERIPHERAL, | ||
| 279 | !kodiVersion.empty() ? kodiVersion | ||
| 280 | : GetKodiTypeVersion(ADDON_INSTANCE_PERIPHERAL)) | ||
| 281 | { | ||
| 282 | if (CAddonBase::m_interface->globalSingleInstance != nullptr) | ||
| 283 | throw std::logic_error("kodi::addon::CInstancePeripheral: Creation of multiple together with " | ||
| 284 | "single instance way is not allowed!"); | ||
| 285 | |||
| 286 | SetAddonStruct(instance); | ||
| 287 | } | ||
| 288 | //---------------------------------------------------------------------------- | ||
| 289 | |||
| 290 | //============================================================================ | ||
| 291 | /// @ingroup cpp_kodi_addon_peripheral | ||
| 292 | /// @brief Destructor. | ||
| 293 | /// | ||
| 294 | ~CInstancePeripheral() override = default; | ||
| 295 | //---------------------------------------------------------------------------- | ||
| 296 | |||
| 297 | //============================================================================ | ||
| 298 | /// @defgroup cpp_kodi_addon_peripheral_peripheralOp 1. Peripheral operations | ||
| 299 | /// @ingroup cpp_kodi_addon_peripheral | ||
| 300 | /// @brief %Peripheral operations to handle control about. | ||
| 301 | /// | ||
| 302 | ///--------------------------------------------------------------------------- | ||
| 303 | /// | ||
| 304 | /// **%Peripheral parts in interface:**\n | ||
| 305 | /// Copy this to your project and extend with your parts or leave functions | ||
| 306 | /// complete away where not used or supported. | ||
| 307 | /// | ||
| 308 | /// @copydetails cpp_kodi_addon_peripheral_peripheralOp_header_addon_auto_check | ||
| 309 | /// @copydetails cpp_kodi_addon_peripheral_peripheralOp_source_addon_auto_check | ||
| 310 | /// | ||
| 311 | ///@{ | ||
| 312 | |||
| 313 | //============================================================================ | ||
| 314 | /// @brief Get the list of features that this add-on provides. | ||
| 315 | /// | ||
| 316 | /// Called by the frontend to query the add-on's capabilities and supported | ||
| 317 | /// peripherals. All capabilities that the add-on supports should be set to true. | ||
| 318 | /// | ||
| 319 | /// @param[out] capabilities The add-on's capabilities | ||
| 320 | /// | ||
| 321 | /// @remarks Valid implementation required. | ||
| 322 | /// | ||
| 323 | /// | ||
| 324 | /// ---------------------------------------------------------------------------- | ||
| 325 | /// | ||
| 326 | /// @copydetails cpp_kodi_addon_peripheral_Defs_PeripheralCapabilities_Help | ||
| 327 | /// | ||
| 328 | /// -------------------------------------------------------------------------- | ||
| 329 | /// | ||
| 330 | /// **Example:** | ||
| 331 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 332 | /// void CMyPeripheralAddon::GetCapabilities(kodi::addon::PeripheralCapabilities& capabilities) | ||
| 333 | /// { | ||
| 334 | /// capabilities.SetProvidesJoysticks(true); | ||
| 335 | /// capabilities.SetProvidesButtonmaps(true); | ||
| 336 | /// } | ||
| 337 | /// ~~~~~~~~~~~~~ | ||
| 338 | /// | ||
| 339 | virtual void GetCapabilities(kodi::addon::PeripheralCapabilities& capabilities) {} | ||
| 340 | //---------------------------------------------------------------------------- | ||
| 341 | |||
| 342 | //============================================================================ | ||
| 343 | /// @brief Perform a scan for joysticks | ||
| 344 | /// | ||
| 345 | /// The frontend calls this when a hardware change is detected. If an add-on | ||
| 346 | /// detects a hardware change, it can trigger this function using the | ||
| 347 | /// @ref TriggerScan() callback. | ||
| 348 | /// | ||
| 349 | /// @param[in] scan_results Assigned to allocated memory | ||
| 350 | /// @return @ref PERIPHERAL_NO_ERROR if successful | ||
| 351 | /// | ||
| 352 | /// | ||
| 353 | /// -------------------------------------------------------------------------- | ||
| 354 | /// | ||
| 355 | /// @copydetails cpp_kodi_addon_peripheral_Defs_Peripheral_Peripheral_Help | ||
| 356 | /// | ||
| 357 | virtual PERIPHERAL_ERROR PerformDeviceScan( | ||
| 358 | std::vector<std::shared_ptr<kodi::addon::Peripheral>>& scan_results) | ||
| 359 | { | ||
| 360 | return PERIPHERAL_ERROR_NOT_IMPLEMENTED; | ||
| 361 | } | ||
| 362 | //---------------------------------------------------------------------------- | ||
| 363 | |||
| 364 | //============================================================================ | ||
| 365 | /// @brief Get all events that have occurred since the last call to | ||
| 366 | /// @ref GetEvents(). | ||
| 367 | /// | ||
| 368 | /// @param[out] events List of available events within addon | ||
| 369 | /// @return @ref PERIPHERAL_NO_ERROR if successful | ||
| 370 | /// | ||
| 371 | /// ---------------------------------------------------------------------------- | ||
| 372 | /// | ||
| 373 | /// @copydetails cpp_kodi_addon_peripheral_Defs_Peripheral_PeripheralEvent_Help | ||
| 374 | /// | ||
| 375 | virtual PERIPHERAL_ERROR GetEvents(std::vector<kodi::addon::PeripheralEvent>& events) | ||
| 376 | { | ||
| 377 | return PERIPHERAL_ERROR_NOT_IMPLEMENTED; | ||
| 378 | } | ||
| 379 | //---------------------------------------------------------------------------- | ||
| 380 | |||
| 381 | //============================================================================ | ||
| 382 | /// @brief Send an input event to the peripheral. | ||
| 383 | /// | ||
| 384 | /// @param[in] event The input event | ||
| 385 | /// @return true if the event was handled, false otherwise | ||
| 386 | /// | ||
| 387 | virtual bool SendEvent(const kodi::addon::PeripheralEvent& event) { return false; } | ||
| 388 | //---------------------------------------------------------------------------- | ||
| 389 | |||
| 390 | ///@} | ||
| 391 | |||
| 392 | //============================================================================ | ||
| 393 | /// @defgroup cpp_kodi_addon_peripheral_joystickOp 2. Joystick operations | ||
| 394 | /// @ingroup cpp_kodi_addon_peripheral | ||
| 395 | /// @brief %Joystick operations to handle control about. | ||
| 396 | /// | ||
| 397 | /// | ||
| 398 | ///--------------------------------------------------------------------------- | ||
| 399 | /// | ||
| 400 | /// **%Joystick parts in interface:**\n | ||
| 401 | /// Copy this to your project and extend with your parts or leave functions | ||
| 402 | /// complete away where not used or supported. | ||
| 403 | /// | ||
| 404 | /// @copydetails cpp_kodi_addon_peripheral_joystickOp_header_addon_auto_check | ||
| 405 | /// @copydetails cpp_kodi_addon_peripheral_joystickOp_source_addon_auto_check | ||
| 406 | /// | ||
| 407 | ///@{ | ||
| 408 | |||
| 409 | //============================================================================ | ||
| 410 | /// @brief Get extended info about an attached joystick. | ||
| 411 | /// | ||
| 412 | /// @param[in] index The joystick's driver index | ||
| 413 | /// @param[out] info The container for the allocated joystick info | ||
| 414 | /// @return @ref PERIPHERAL_NO_ERROR if successful | ||
| 415 | /// | ||
| 416 | /// | ||
| 417 | /// ---------------------------------------------------------------------------- | ||
| 418 | /// | ||
| 419 | /// @copydetails cpp_kodi_addon_peripheral_Defs_Joystick_Joystick_Help | ||
| 420 | /// | ||
| 421 | virtual PERIPHERAL_ERROR GetJoystickInfo(unsigned int index, kodi::addon::Joystick& info) | ||
| 422 | { | ||
| 423 | return PERIPHERAL_ERROR_NOT_IMPLEMENTED; | ||
| 424 | } | ||
| 425 | //---------------------------------------------------------------------------- | ||
| 426 | |||
| 427 | //============================================================================ | ||
| 428 | /// @brief Get the features that allow translating the joystick into the | ||
| 429 | /// controller profile. | ||
| 430 | /// | ||
| 431 | /// @param[in] joystick The device's joystick properties; unknown values may | ||
| 432 | /// be left at their default | ||
| 433 | /// @param[in] controller_id The controller profile being requested, e.g. | ||
| 434 | /// `game.controller.default` | ||
| 435 | /// @param[out] features The array of allocated features | ||
| 436 | /// @return @ref PERIPHERAL_NO_ERROR if successful | ||
| 437 | /// | ||
| 438 | virtual PERIPHERAL_ERROR GetFeatures(const kodi::addon::Joystick& joystick, | ||
| 439 | const std::string& controller_id, | ||
| 440 | std::vector<kodi::addon::JoystickFeature>& features) | ||
| 441 | { | ||
| 442 | return PERIPHERAL_ERROR_NOT_IMPLEMENTED; | ||
| 443 | } | ||
| 444 | //---------------------------------------------------------------------------- | ||
| 445 | |||
| 446 | //============================================================================ | ||
| 447 | /// @brief Add or update joystick features. | ||
| 448 | /// | ||
| 449 | /// @param[in] joystick The device's joystick properties; unknown values may be | ||
| 450 | /// left at their default | ||
| 451 | /// @param[in] controller_id The game controller profile being updated | ||
| 452 | /// @param[in] features The array of features | ||
| 453 | /// @return @ref PERIPHERAL_NO_ERROR if successful | ||
| 454 | /// | ||
| 455 | virtual PERIPHERAL_ERROR MapFeatures(const kodi::addon::Joystick& joystick, | ||
| 456 | const std::string& controller_id, | ||
| 457 | const std::vector<kodi::addon::JoystickFeature>& features) | ||
| 458 | { | ||
| 459 | return PERIPHERAL_ERROR_NOT_IMPLEMENTED; | ||
| 460 | } | ||
| 461 | //---------------------------------------------------------------------------- | ||
| 462 | |||
| 463 | //============================================================================ | ||
| 464 | /// @brief Get the driver primitives that should be ignored while mapping the | ||
| 465 | /// device. | ||
| 466 | /// | ||
| 467 | /// @param[in] joystick The device's joystick properties; unknown values may | ||
| 468 | /// be left at their default | ||
| 469 | /// @param[out] primitives The array of allocated driver primitives to be | ||
| 470 | /// ignored | ||
| 471 | /// @return @ref PERIPHERAL_NO_ERROR if successful | ||
| 472 | /// | ||
| 473 | virtual PERIPHERAL_ERROR GetIgnoredPrimitives( | ||
| 474 | const kodi::addon::Joystick& joystick, std::vector<kodi::addon::DriverPrimitive>& primitives) | ||
| 475 | { | ||
| 476 | return PERIPHERAL_ERROR_NOT_IMPLEMENTED; | ||
| 477 | } | ||
| 478 | //---------------------------------------------------------------------------- | ||
| 479 | |||
| 480 | //============================================================================ | ||
| 481 | /// @brief Set the list of driver primitives that are ignored for the device. | ||
| 482 | /// | ||
| 483 | /// @param[in] joystick The device's joystick properties; unknown values may be left at their default | ||
| 484 | /// @param[in] primitives The array of driver primitives to ignore | ||
| 485 | /// @return @ref PERIPHERAL_NO_ERROR if successful | ||
| 486 | /// | ||
| 487 | virtual PERIPHERAL_ERROR SetIgnoredPrimitives( | ||
| 488 | const kodi::addon::Joystick& joystick, | ||
| 489 | const std::vector<kodi::addon::DriverPrimitive>& primitives) | ||
| 490 | { | ||
| 491 | return PERIPHERAL_ERROR_NOT_IMPLEMENTED; | ||
| 492 | } | ||
| 493 | //---------------------------------------------------------------------------- | ||
| 494 | |||
| 495 | //============================================================================ | ||
| 496 | /// @brief Save the button map for the given joystick. | ||
| 497 | /// | ||
| 498 | /// @param[in] joystick The device's joystick properties | ||
| 499 | /// | ||
| 500 | virtual void SaveButtonMap(const kodi::addon::Joystick& joystick) {} | ||
| 501 | //---------------------------------------------------------------------------- | ||
| 502 | |||
| 503 | //============================================================================ | ||
| 504 | /// @brief Revert the button map to the last time it was loaded or committed to disk | ||
| 505 | /// @param[in] joystick The device's joystick properties | ||
| 506 | /// | ||
| 507 | virtual void RevertButtonMap(const kodi::addon::Joystick& joystick) {} | ||
| 508 | //---------------------------------------------------------------------------- | ||
| 509 | |||
| 510 | //============================================================================ | ||
| 511 | /// @brief Reset the button map for the given joystick and controller profile ID | ||
| 512 | /// @param[in] joystick The device's joystick properties | ||
| 513 | /// @param[in] controller_id The game controller profile being reset | ||
| 514 | /// | ||
| 515 | virtual void ResetButtonMap(const kodi::addon::Joystick& joystick, | ||
| 516 | const std::string& controller_id) | ||
| 517 | { | ||
| 518 | } | ||
| 519 | //---------------------------------------------------------------------------- | ||
| 520 | |||
| 521 | //============================================================================ | ||
| 522 | /// @brief Powers off the given joystick if supported | ||
| 523 | /// @param[in] index The joystick's driver index | ||
| 524 | /// | ||
| 525 | virtual void PowerOffJoystick(unsigned int index) {} | ||
| 526 | //---------------------------------------------------------------------------- | ||
| 527 | |||
| 528 | ///@} | ||
| 529 | |||
| 530 | //============================================================================ | ||
| 531 | /// @defgroup cpp_kodi_addon_peripheral_callbacks 3. Callback functions | ||
| 532 | /// @ingroup cpp_kodi_addon_peripheral | ||
| 533 | /// @brief Callback to Kodi functions. | ||
| 534 | /// | ||
| 535 | ///@{ | ||
| 536 | |||
| 537 | //============================================================================ | ||
| 538 | /// @brief Used to get the full path where the add-on is installed. | ||
| 539 | /// | ||
| 540 | /// @return The add-on installation path | ||
| 541 | /// | ||
| 542 | const std::string AddonPath() const { return m_instanceData->props->addon_path; } | ||
| 543 | //---------------------------------------------------------------------------- | ||
| 544 | |||
| 545 | //============================================================================ | ||
| 546 | /// @brief Used to get the full path to the add-on's user profile. | ||
| 547 | /// | ||
| 548 | /// @note The trailing folder (consisting of the add-on's ID) is not created | ||
| 549 | /// by default. If it is needed, you must call kodi::vfs::CreateDirectory() | ||
| 550 | /// to create the folder. | ||
| 551 | /// | ||
| 552 | /// @return Path to the user profile | ||
| 553 | /// | ||
| 554 | const std::string UserPath() const { return m_instanceData->props->user_path; } | ||
| 555 | //---------------------------------------------------------------------------- | ||
| 556 | |||
| 557 | //============================================================================ | ||
| 558 | /// @brief Trigger a scan for peripherals | ||
| 559 | /// | ||
| 560 | /// The add-on calls this if a change in hardware is detected. | ||
| 561 | /// | ||
| 562 | void TriggerScan(void) | ||
| 563 | { | ||
| 564 | return m_instanceData->toKodi->trigger_scan(m_instanceData->toKodi->kodiInstance); | ||
| 565 | } | ||
| 566 | //---------------------------------------------------------------------------- | ||
| 567 | |||
| 568 | //============================================================================ | ||
| 569 | /// @brief Notify the frontend that button maps have changed. | ||
| 570 | /// | ||
| 571 | /// @param[in] deviceName [optional] The name of the device to refresh, or | ||
| 572 | /// empty/null for all devices | ||
| 573 | /// @param[in] controllerId [optional] The controller ID to refresh, or | ||
| 574 | /// empty/null for all controllers | ||
| 575 | /// | ||
| 576 | void RefreshButtonMaps(const std::string& deviceName = "", const std::string& controllerId = "") | ||
| 577 | { | ||
| 578 | return m_instanceData->toKodi->refresh_button_maps(m_instanceData->toKodi->kodiInstance, | ||
| 579 | deviceName.c_str(), controllerId.c_str()); | ||
| 580 | } | ||
| 581 | //---------------------------------------------------------------------------- | ||
| 582 | |||
| 583 | //============================================================================ | ||
| 584 | /// @brief Return the number of features belonging to the specified | ||
| 585 | /// controller. | ||
| 586 | /// | ||
| 587 | /// @param[in] controllerId The controller ID to enumerate | ||
| 588 | /// @param[in] type [optional] Type to filter by, or @ref JOYSTICK_FEATURE_TYPE_UNKNOWN | ||
| 589 | /// for all features | ||
| 590 | /// @return The number of features matching the request parameters | ||
| 591 | /// | ||
| 592 | unsigned int FeatureCount(const std::string& controllerId, | ||
| 593 | JOYSTICK_FEATURE_TYPE type = JOYSTICK_FEATURE_TYPE_UNKNOWN) | ||
| 594 | { | ||
| 595 | return m_instanceData->toKodi->feature_count(m_instanceData->toKodi->kodiInstance, | ||
| 596 | controllerId.c_str(), type); | ||
| 597 | } | ||
| 598 | //---------------------------------------------------------------------------- | ||
| 599 | |||
| 600 | //============================================================================ | ||
| 601 | /// @brief Return the type of the feature. | ||
| 602 | /// | ||
| 603 | /// @param[in] controllerId The controller ID to check | ||
| 604 | /// @param[in] featureName The feature to check | ||
| 605 | /// @return The type of the specified feature, or @ref JOYSTICK_FEATURE_TYPE_UNKNOWN | ||
| 606 | /// if unknown | ||
| 607 | /// | ||
| 608 | JOYSTICK_FEATURE_TYPE FeatureType(const std::string& controllerId, const std::string& featureName) | ||
| 609 | { | ||
| 610 | return m_instanceData->toKodi->feature_type(m_instanceData->toKodi->kodiInstance, | ||
| 611 | controllerId.c_str(), featureName.c_str()); | ||
| 612 | } | ||
| 613 | //---------------------------------------------------------------------------- | ||
| 614 | |||
| 615 | ///@} | ||
| 616 | |||
| 617 | private: | ||
| 618 | void SetAddonStruct(KODI_HANDLE instance) | ||
| 619 | { | ||
| 620 | if (instance == nullptr) | ||
| 621 | throw std::logic_error("kodi::addon::CInstancePeripheral: Creation with empty addon " | ||
| 622 | "structure not allowed, table must be given from Kodi!"); | ||
| 623 | |||
| 624 | m_instanceData = static_cast<AddonInstance_Peripheral*>(instance); | ||
| 625 | m_instanceData->toAddon->addonInstance = this; | ||
| 626 | |||
| 627 | m_instanceData->toAddon->get_capabilities = ADDON_GetCapabilities; | ||
| 628 | m_instanceData->toAddon->perform_device_scan = ADDON_PerformDeviceScan; | ||
| 629 | m_instanceData->toAddon->free_scan_results = ADDON_FreeScanResults; | ||
| 630 | m_instanceData->toAddon->get_events = ADDON_GetEvents; | ||
| 631 | m_instanceData->toAddon->free_events = ADDON_FreeEvents; | ||
| 632 | m_instanceData->toAddon->send_event = ADDON_SendEvent; | ||
| 633 | |||
| 634 | m_instanceData->toAddon->get_joystick_info = ADDON_GetJoystickInfo; | ||
| 635 | m_instanceData->toAddon->free_joystick_info = ADDON_FreeJoystickInfo; | ||
| 636 | m_instanceData->toAddon->get_features = ADDON_GetFeatures; | ||
| 637 | m_instanceData->toAddon->free_features = ADDON_FreeFeatures; | ||
| 638 | m_instanceData->toAddon->map_features = ADDON_MapFeatures; | ||
| 639 | m_instanceData->toAddon->get_ignored_primitives = ADDON_GetIgnoredPrimitives; | ||
| 640 | m_instanceData->toAddon->free_primitives = ADDON_FreePrimitives; | ||
| 641 | m_instanceData->toAddon->set_ignored_primitives = ADDON_SetIgnoredPrimitives; | ||
| 642 | m_instanceData->toAddon->save_button_map = ADDON_SaveButtonMap; | ||
| 643 | m_instanceData->toAddon->revert_button_map = ADDON_RevertButtonMap; | ||
| 644 | m_instanceData->toAddon->reset_button_map = ADDON_ResetButtonMap; | ||
| 645 | m_instanceData->toAddon->power_off_joystick = ADDON_PowerOffJoystick; | ||
| 646 | } | ||
| 647 | |||
| 648 | inline static void ADDON_GetCapabilities(const AddonInstance_Peripheral* addonInstance, | ||
| 649 | PERIPHERAL_CAPABILITIES* capabilities) | ||
| 650 | { | ||
| 651 | if (!addonInstance || !capabilities) | ||
| 652 | return; | ||
| 653 | |||
| 654 | kodi::addon::PeripheralCapabilities peripheralCapabilities(capabilities); | ||
| 655 | static_cast<CInstancePeripheral*>(addonInstance->toAddon->addonInstance) | ||
| 656 | ->GetCapabilities(peripheralCapabilities); | ||
| 657 | } | ||
| 658 | |||
| 659 | inline static PERIPHERAL_ERROR ADDON_PerformDeviceScan( | ||
| 660 | const AddonInstance_Peripheral* addonInstance, | ||
| 661 | unsigned int* peripheral_count, | ||
| 662 | PERIPHERAL_INFO** scan_results) | ||
| 663 | { | ||
| 664 | if (!addonInstance || !peripheral_count || !scan_results) | ||
| 665 | return PERIPHERAL_ERROR_INVALID_PARAMETERS; | ||
| 666 | |||
| 667 | std::vector<std::shared_ptr<kodi::addon::Peripheral>> peripherals; | ||
| 668 | PERIPHERAL_ERROR err = static_cast<CInstancePeripheral*>(addonInstance->toAddon->addonInstance) | ||
| 669 | ->PerformDeviceScan(peripherals); | ||
| 670 | if (err == PERIPHERAL_NO_ERROR) | ||
| 671 | { | ||
| 672 | *peripheral_count = static_cast<unsigned int>(peripherals.size()); | ||
| 673 | kodi::addon::Peripherals::ToStructs(peripherals, scan_results); | ||
| 674 | } | ||
| 675 | |||
| 676 | return err; | ||
| 677 | } | ||
| 678 | |||
| 679 | inline static void ADDON_FreeScanResults(const AddonInstance_Peripheral* addonInstance, | ||
| 680 | unsigned int peripheral_count, | ||
| 681 | PERIPHERAL_INFO* scan_results) | ||
| 682 | { | ||
| 683 | if (!addonInstance) | ||
| 684 | return; | ||
| 685 | |||
| 686 | kodi::addon::Peripherals::FreeStructs(peripheral_count, scan_results); | ||
| 687 | } | ||
| 688 | |||
| 689 | inline static PERIPHERAL_ERROR ADDON_GetEvents(const AddonInstance_Peripheral* addonInstance, | ||
| 690 | unsigned int* event_count, | ||
| 691 | PERIPHERAL_EVENT** events) | ||
| 692 | { | ||
| 693 | if (!addonInstance || !event_count || !events) | ||
| 694 | return PERIPHERAL_ERROR_INVALID_PARAMETERS; | ||
| 695 | |||
| 696 | std::vector<kodi::addon::PeripheralEvent> peripheralEvents; | ||
| 697 | PERIPHERAL_ERROR err = static_cast<CInstancePeripheral*>(addonInstance->toAddon->addonInstance) | ||
| 698 | ->GetEvents(peripheralEvents); | ||
| 699 | if (err == PERIPHERAL_NO_ERROR) | ||
| 700 | { | ||
| 701 | *event_count = static_cast<unsigned int>(peripheralEvents.size()); | ||
| 702 | kodi::addon::PeripheralEvents::ToStructs(peripheralEvents, events); | ||
| 703 | } | ||
| 704 | |||
| 705 | return err; | ||
| 706 | } | ||
| 707 | |||
| 708 | inline static void ADDON_FreeEvents(const AddonInstance_Peripheral* addonInstance, | ||
| 709 | unsigned int event_count, | ||
| 710 | PERIPHERAL_EVENT* events) | ||
| 711 | { | ||
| 712 | if (!addonInstance) | ||
| 713 | return; | ||
| 714 | |||
| 715 | kodi::addon::PeripheralEvents::FreeStructs(event_count, events); | ||
| 716 | } | ||
| 717 | |||
| 718 | inline static bool ADDON_SendEvent(const AddonInstance_Peripheral* addonInstance, | ||
| 719 | const PERIPHERAL_EVENT* event) | ||
| 720 | { | ||
| 721 | if (!addonInstance || !event) | ||
| 722 | return false; | ||
| 723 | return static_cast<CInstancePeripheral*>(addonInstance->toAddon->addonInstance) | ||
| 724 | ->SendEvent(kodi::addon::PeripheralEvent(*event)); | ||
| 725 | } | ||
| 726 | |||
| 727 | |||
| 728 | inline static PERIPHERAL_ERROR ADDON_GetJoystickInfo( | ||
| 729 | const AddonInstance_Peripheral* addonInstance, unsigned int index, JOYSTICK_INFO* info) | ||
| 730 | { | ||
| 731 | if (!addonInstance || !info) | ||
| 732 | return PERIPHERAL_ERROR_INVALID_PARAMETERS; | ||
| 733 | |||
| 734 | kodi::addon::Joystick addonInfo; | ||
| 735 | PERIPHERAL_ERROR err = static_cast<CInstancePeripheral*>(addonInstance->toAddon->addonInstance) | ||
| 736 | ->GetJoystickInfo(index, addonInfo); | ||
| 737 | if (err == PERIPHERAL_NO_ERROR) | ||
| 738 | { | ||
| 739 | addonInfo.ToStruct(*info); | ||
| 740 | } | ||
| 741 | |||
| 742 | return err; | ||
| 743 | } | ||
| 744 | |||
| 745 | inline static void ADDON_FreeJoystickInfo(const AddonInstance_Peripheral* addonInstance, | ||
| 746 | JOYSTICK_INFO* info) | ||
| 747 | { | ||
| 748 | if (!addonInstance) | ||
| 749 | return; | ||
| 750 | |||
| 751 | kodi::addon::Joystick::FreeStruct(*info); | ||
| 752 | } | ||
| 753 | |||
| 754 | inline static PERIPHERAL_ERROR ADDON_GetFeatures(const AddonInstance_Peripheral* addonInstance, | ||
| 755 | const JOYSTICK_INFO* joystick, | ||
| 756 | const char* controller_id, | ||
| 757 | unsigned int* feature_count, | ||
| 758 | JOYSTICK_FEATURE** features) | ||
| 759 | { | ||
| 760 | if (!addonInstance || !joystick || !controller_id || !feature_count || !features) | ||
| 761 | return PERIPHERAL_ERROR_INVALID_PARAMETERS; | ||
| 762 | |||
| 763 | kodi::addon::Joystick addonJoystick(*joystick); | ||
| 764 | std::vector<kodi::addon::JoystickFeature> featuresVector; | ||
| 765 | |||
| 766 | PERIPHERAL_ERROR err = static_cast<CInstancePeripheral*>(addonInstance->toAddon->addonInstance) | ||
| 767 | ->GetFeatures(addonJoystick, controller_id, featuresVector); | ||
| 768 | if (err == PERIPHERAL_NO_ERROR) | ||
| 769 | { | ||
| 770 | *feature_count = static_cast<unsigned int>(featuresVector.size()); | ||
| 771 | kodi::addon::JoystickFeatures::ToStructs(featuresVector, features); | ||
| 772 | } | ||
| 773 | |||
| 774 | return err; | ||
| 775 | } | ||
| 776 | |||
| 777 | inline static void ADDON_FreeFeatures(const AddonInstance_Peripheral* addonInstance, | ||
| 778 | unsigned int feature_count, | ||
| 779 | JOYSTICK_FEATURE* features) | ||
| 780 | { | ||
| 781 | if (!addonInstance) | ||
| 782 | return; | ||
| 783 | |||
| 784 | kodi::addon::JoystickFeatures::FreeStructs(feature_count, features); | ||
| 785 | } | ||
| 786 | |||
| 787 | inline static PERIPHERAL_ERROR ADDON_MapFeatures(const AddonInstance_Peripheral* addonInstance, | ||
| 788 | const JOYSTICK_INFO* joystick, | ||
| 789 | const char* controller_id, | ||
| 790 | unsigned int feature_count, | ||
| 791 | const JOYSTICK_FEATURE* features) | ||
| 792 | { | ||
| 793 | if (!addonInstance || !joystick || !controller_id || (feature_count > 0 && !features)) | ||
| 794 | return PERIPHERAL_ERROR_INVALID_PARAMETERS; | ||
| 795 | |||
| 796 | kodi::addon::Joystick addonJoystick(*joystick); | ||
| 797 | std::vector<kodi::addon::JoystickFeature> primitiveVector; | ||
| 798 | |||
| 799 | for (unsigned int i = 0; i < feature_count; i++) | ||
| 800 | primitiveVector.emplace_back(*(features + i)); | ||
| 801 | |||
| 802 | return static_cast<CInstancePeripheral*>(addonInstance->toAddon->addonInstance) | ||
| 803 | ->MapFeatures(addonJoystick, controller_id, primitiveVector); | ||
| 804 | } | ||
| 805 | |||
| 806 | inline static PERIPHERAL_ERROR ADDON_GetIgnoredPrimitives( | ||
| 807 | const AddonInstance_Peripheral* addonInstance, | ||
| 808 | const JOYSTICK_INFO* joystick, | ||
| 809 | unsigned int* primitive_count, | ||
| 810 | JOYSTICK_DRIVER_PRIMITIVE** primitives) | ||
| 811 | { | ||
| 812 | if (!addonInstance || !joystick || !primitive_count || !primitives) | ||
| 813 | return PERIPHERAL_ERROR_INVALID_PARAMETERS; | ||
| 814 | |||
| 815 | kodi::addon::Joystick addonJoystick(*joystick); | ||
| 816 | std::vector<kodi::addon::DriverPrimitive> primitiveVector; | ||
| 817 | |||
| 818 | PERIPHERAL_ERROR err = static_cast<CInstancePeripheral*>(addonInstance->toAddon->addonInstance) | ||
| 819 | ->GetIgnoredPrimitives(addonJoystick, primitiveVector); | ||
| 820 | if (err == PERIPHERAL_NO_ERROR) | ||
| 821 | { | ||
| 822 | *primitive_count = static_cast<unsigned int>(primitiveVector.size()); | ||
| 823 | kodi::addon::DriverPrimitives::ToStructs(primitiveVector, primitives); | ||
| 824 | } | ||
| 825 | |||
| 826 | return err; | ||
| 827 | } | ||
| 828 | |||
| 829 | inline static void ADDON_FreePrimitives(const AddonInstance_Peripheral* addonInstance, | ||
| 830 | unsigned int primitive_count, | ||
| 831 | JOYSTICK_DRIVER_PRIMITIVE* primitives) | ||
| 832 | { | ||
| 833 | if (!addonInstance) | ||
| 834 | return; | ||
| 835 | |||
| 836 | kodi::addon::DriverPrimitives::FreeStructs(primitive_count, primitives); | ||
| 837 | } | ||
| 838 | |||
| 839 | inline static PERIPHERAL_ERROR ADDON_SetIgnoredPrimitives( | ||
| 840 | const AddonInstance_Peripheral* addonInstance, | ||
| 841 | const JOYSTICK_INFO* joystick, | ||
| 842 | unsigned int primitive_count, | ||
| 843 | const JOYSTICK_DRIVER_PRIMITIVE* primitives) | ||
| 844 | { | ||
| 845 | if (!addonInstance || !joystick || (primitive_count > 0 && !primitives)) | ||
| 846 | return PERIPHERAL_ERROR_INVALID_PARAMETERS; | ||
| 847 | |||
| 848 | kodi::addon::Joystick addonJoystick(*joystick); | ||
| 849 | std::vector<kodi::addon::DriverPrimitive> primitiveVector; | ||
| 850 | |||
| 851 | for (unsigned int i = 0; i < primitive_count; i++) | ||
| 852 | primitiveVector.emplace_back(*(primitives + i)); | ||
| 853 | |||
| 854 | return static_cast<CInstancePeripheral*>(addonInstance->toAddon->addonInstance) | ||
| 855 | ->SetIgnoredPrimitives(addonJoystick, primitiveVector); | ||
| 856 | } | ||
| 857 | |||
| 858 | inline static void ADDON_SaveButtonMap(const AddonInstance_Peripheral* addonInstance, | ||
| 859 | const JOYSTICK_INFO* joystick) | ||
| 860 | { | ||
| 861 | if (!addonInstance || !joystick) | ||
| 862 | return; | ||
| 863 | |||
| 864 | kodi::addon::Joystick addonJoystick(*joystick); | ||
| 865 | static_cast<CInstancePeripheral*>(addonInstance->toAddon->addonInstance) | ||
| 866 | ->SaveButtonMap(addonJoystick); | ||
| 867 | } | ||
| 868 | |||
| 869 | inline static void ADDON_RevertButtonMap(const AddonInstance_Peripheral* addonInstance, | ||
| 870 | const JOYSTICK_INFO* joystick) | ||
| 871 | { | ||
| 872 | if (!addonInstance || !joystick) | ||
| 873 | return; | ||
| 874 | |||
| 875 | kodi::addon::Joystick addonJoystick(*joystick); | ||
| 876 | static_cast<CInstancePeripheral*>(addonInstance->toAddon->addonInstance) | ||
| 877 | ->RevertButtonMap(addonJoystick); | ||
| 878 | } | ||
| 879 | |||
| 880 | inline static void ADDON_ResetButtonMap(const AddonInstance_Peripheral* addonInstance, | ||
| 881 | const JOYSTICK_INFO* joystick, | ||
| 882 | const char* controller_id) | ||
| 883 | { | ||
| 884 | if (!addonInstance || !joystick || !controller_id) | ||
| 885 | return; | ||
| 886 | |||
| 887 | kodi::addon::Joystick addonJoystick(*joystick); | ||
| 888 | static_cast<CInstancePeripheral*>(addonInstance->toAddon->addonInstance) | ||
| 889 | ->ResetButtonMap(addonJoystick, controller_id); | ||
| 890 | } | ||
| 891 | |||
| 892 | inline static void ADDON_PowerOffJoystick(const AddonInstance_Peripheral* addonInstance, | ||
| 893 | unsigned int index) | ||
| 894 | { | ||
| 895 | if (!addonInstance) | ||
| 896 | return; | ||
| 897 | |||
| 898 | static_cast<CInstancePeripheral*>(addonInstance->toAddon->addonInstance) | ||
| 899 | ->PowerOffJoystick(index); | ||
| 900 | } | ||
| 901 | |||
| 902 | AddonInstance_Peripheral* m_instanceData; | ||
| 903 | }; | ||
| 904 | |||
| 905 | } /* namespace addon */ | ||
| 906 | } /* namespace kodi */ | ||
| 907 | #endif /* __cplusplus */ | ||
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Screensaver.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Screensaver.h new file mode 100644 index 0000000..4902fcb --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Screensaver.h | |||
| @@ -0,0 +1,470 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2005-2018 Team Kodi | ||
| 3 | * This file is part of Kodi - https://kodi.tv | ||
| 4 | * | ||
| 5 | * SPDX-License-Identifier: GPL-2.0-or-later | ||
| 6 | * See LICENSES/README.md for more information. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #pragma once | ||
| 10 | |||
| 11 | #include "../AddonBase.h" | ||
| 12 | #include "../c-api/addon-instance/screensaver.h" | ||
| 13 | #include "../gui/renderHelper.h" | ||
| 14 | |||
| 15 | #ifdef __cplusplus | ||
| 16 | namespace kodi | ||
| 17 | { | ||
| 18 | namespace addon | ||
| 19 | { | ||
| 20 | |||
| 21 | //============================================================================== | ||
| 22 | /// @addtogroup cpp_kodi_addon_screensaver | ||
| 23 | /// @brief \cpp_class{ kodi::addon::CInstanceScreensaver } | ||
| 24 | /// **Screensaver add-on instance** | ||
| 25 | /// | ||
| 26 | /// A screensaver is a Kodi addon that fills the screen with moving images or | ||
| 27 | /// patterns when the computer is not in use. Initially designed to prevent | ||
| 28 | /// phosphor burn-in on CRT and plasma computer monitors (hence the name), | ||
| 29 | /// screensavers are now used primarily for entertainment, security or to | ||
| 30 | /// display system status information. | ||
| 31 | /// | ||
| 32 | /// Include the header @ref Screensaver.h "#include <kodi/addon-instance/ScreenSaver.h>" | ||
| 33 | /// to use this class. | ||
| 34 | /// | ||
| 35 | /// This interface allows the creating of screensavers for Kodi, based upon | ||
| 36 | /// **DirectX** or/and **OpenGL** rendering with `C++` code. | ||
| 37 | /// | ||
| 38 | /// The interface is small and easy usable. It has three functions: | ||
| 39 | /// | ||
| 40 | /// * <b><c>Start()</c></b> - Called on creation | ||
| 41 | /// * <b><c>Render()</c></b> - Called at render time | ||
| 42 | /// * <b><c>Stop()</c></b> - Called when the screensaver has no work | ||
| 43 | /// | ||
| 44 | /// Additionally, there are several \ref cpp_kodi_addon_screensaver_CB "other functions" | ||
| 45 | /// available in which the child class can ask about the current hardware, | ||
| 46 | /// including the device, display and several other parts. | ||
| 47 | /// | ||
| 48 | /// ---------------------------------------------------------------------------- | ||
| 49 | /// | ||
| 50 | /// Here is an example of what the <b>`addon.xml.in`</b> would look like for an | ||
| 51 | /// screensaver addon: | ||
| 52 | /// | ||
| 53 | /// ~~~~~~~~~~~~~{.xml} | ||
| 54 | /// <?xml version="1.0" encoding="UTF-8"?> | ||
| 55 | /// <addon | ||
| 56 | /// id="screensaver.myspecialnamefor" | ||
| 57 | /// version="1.0.0" | ||
| 58 | /// name="My special screensaver addon" | ||
| 59 | /// provider-name="Your Name"> | ||
| 60 | /// <requires>@ADDON_DEPENDS@</requires> | ||
| 61 | /// <extension | ||
| 62 | /// point="xbmc.ui.screensaver" | ||
| 63 | /// library_@PLATFORM@="@LIBRARY_FILENAME@"/> | ||
| 64 | /// <extension point="xbmc.addon.metadata"> | ||
| 65 | /// <summary lang="en_GB">My screensaver addon</summary> | ||
| 66 | /// <description lang="en_GB">My screensaver addon description</description> | ||
| 67 | /// <platform>@PLATFORM@</platform> | ||
| 68 | /// </extension> | ||
| 69 | /// </addon> | ||
| 70 | /// ~~~~~~~~~~~~~ | ||
| 71 | /// | ||
| 72 | /// Description to screensaver related addon.xml values: | ||
| 73 | /// | Name | Description | ||
| 74 | /// |:------------------------------|---------------------------------------- | ||
| 75 | /// | <b>`point`</b> | Addon type specification<br>At all addon types and for this kind always <b>"xbmc.ui.screensaver"</b>. | ||
| 76 | /// | <b>`library_@PLATFORM@`</b> | Sets the used library name, which is automatically set by cmake at addon build. | ||
| 77 | /// | ||
| 78 | /// @remark For more detailed description of the <b>`addon.xml`</b>, see also https://kodi.wiki/view/Addon.xml. | ||
| 79 | /// | ||
| 80 | /// | ||
| 81 | /// -------------------------------------------------------------------------- | ||
| 82 | /// | ||
| 83 | /// **Here is an example of the minimum required code to start a screensaver:** | ||
| 84 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 85 | /// #include <kodi/addon-instance/Screensaver.h> | ||
| 86 | /// | ||
| 87 | /// class CMyScreenSaver : public kodi::addon::CAddonBase, | ||
| 88 | /// public kodi::addon::CInstanceScreensaver | ||
| 89 | /// { | ||
| 90 | /// public: | ||
| 91 | /// CMyScreenSaver(); | ||
| 92 | /// | ||
| 93 | /// bool Start() override; | ||
| 94 | /// void Render() override; | ||
| 95 | /// }; | ||
| 96 | /// | ||
| 97 | /// CMyScreenSaver::CMyScreenSaver() | ||
| 98 | /// { | ||
| 99 | /// ... | ||
| 100 | /// } | ||
| 101 | /// | ||
| 102 | /// bool CMyScreenSaver::Start() | ||
| 103 | /// { | ||
| 104 | /// ... | ||
| 105 | /// return true; | ||
| 106 | /// } | ||
| 107 | /// | ||
| 108 | /// void CMyScreenSaver::Render() | ||
| 109 | /// { | ||
| 110 | /// ... | ||
| 111 | /// } | ||
| 112 | /// | ||
| 113 | /// ADDONCREATOR(CMyScreenSaver) | ||
| 114 | /// ~~~~~~~~~~~~~ | ||
| 115 | /// | ||
| 116 | /// | ||
| 117 | /// -------------------------------------------------------------------------- | ||
| 118 | /// | ||
| 119 | /// | ||
| 120 | /// **Here is another example where the screensaver is used together with | ||
| 121 | /// other instance types:** | ||
| 122 | /// | ||
| 123 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 124 | /// #include <kodi/addon-instance/Screensaver.h> | ||
| 125 | /// | ||
| 126 | /// class CMyScreenSaver : public kodi::addon::CInstanceScreensaver | ||
| 127 | /// { | ||
| 128 | /// public: | ||
| 129 | /// CMyScreenSaver(KODI_HANDLE instance, const std::string& version); | ||
| 130 | /// | ||
| 131 | /// bool Start() override; | ||
| 132 | /// void Render() override; | ||
| 133 | /// }; | ||
| 134 | /// | ||
| 135 | /// CMyScreenSaver::CMyScreenSaver(KODI_HANDLE instance, const std::string& version) | ||
| 136 | /// : CInstanceScreensaver(instance, version) | ||
| 137 | /// { | ||
| 138 | /// ... | ||
| 139 | /// } | ||
| 140 | /// | ||
| 141 | /// bool CMyScreenSaver::Start() | ||
| 142 | /// { | ||
| 143 | /// ... | ||
| 144 | /// return true; | ||
| 145 | /// } | ||
| 146 | /// | ||
| 147 | /// void CMyScreenSaver::Render() | ||
| 148 | /// { | ||
| 149 | /// ... | ||
| 150 | /// } | ||
| 151 | /// | ||
| 152 | /// | ||
| 153 | /// //---------------------------------------------------------------------- | ||
| 154 | /// | ||
| 155 | /// class CMyAddon : public kodi::addon::CAddonBase | ||
| 156 | /// { | ||
| 157 | /// public: | ||
| 158 | /// CMyAddon() = default; | ||
| 159 | /// ADDON_STATUS CreateInstance(int instanceType, | ||
| 160 | /// const std::string& instanceID, | ||
| 161 | /// KODI_HANDLE instance, | ||
| 162 | /// const std::string& version, | ||
| 163 | /// KODI_HANDLE& addonInstance) override; | ||
| 164 | /// }; | ||
| 165 | /// | ||
| 166 | /// // If you use only one instance in your add-on, can be instanceType and | ||
| 167 | /// // instanceID ignored | ||
| 168 | /// ADDON_STATUS CMyAddon::CreateInstance(int instanceType, | ||
| 169 | /// const std::string& instanceID, | ||
| 170 | /// KODI_HANDLE instance, | ||
| 171 | /// const std::string& version, | ||
| 172 | /// KODI_HANDLE& addonInstance) | ||
| 173 | /// { | ||
| 174 | /// if (instanceType == ADDON_INSTANCE_SCREENSAVER) | ||
| 175 | /// { | ||
| 176 | /// kodi::Log(ADDON_LOG_INFO, "Creating my Screensaver"); | ||
| 177 | /// addonInstance = new CMyScreenSaver(instance, version); | ||
| 178 | /// return ADDON_STATUS_OK; | ||
| 179 | /// } | ||
| 180 | /// else if (...) | ||
| 181 | /// { | ||
| 182 | /// ... | ||
| 183 | /// } | ||
| 184 | /// return ADDON_STATUS_UNKNOWN; | ||
| 185 | /// } | ||
| 186 | /// | ||
| 187 | /// ADDONCREATOR(CMyAddon) | ||
| 188 | /// ~~~~~~~~~~~~~ | ||
| 189 | /// | ||
| 190 | /// The destruction of the example class `CMyScreenSaver` is called from | ||
| 191 | /// Kodi's header. Manually deleting the add-on instance is not required. | ||
| 192 | /// | ||
| 193 | class ATTRIBUTE_HIDDEN CInstanceScreensaver : public IAddonInstance | ||
| 194 | { | ||
| 195 | public: | ||
| 196 | //============================================================================ | ||
| 197 | /// @ingroup cpp_kodi_addon_screensaver | ||
| 198 | /// @brief Screensaver class constructor. | ||
| 199 | /// | ||
| 200 | /// Used by an add-on that only supports screensavers. | ||
| 201 | /// | ||
| 202 | CInstanceScreensaver() | ||
| 203 | : IAddonInstance(ADDON_INSTANCE_SCREENSAVER, GetKodiTypeVersion(ADDON_INSTANCE_SCREENSAVER)) | ||
| 204 | { | ||
| 205 | if (CAddonBase::m_interface->globalSingleInstance != nullptr) | ||
| 206 | throw std::logic_error("kodi::addon::CInstanceScreensaver: Creation of more as one in single " | ||
| 207 | "instance way is not allowed!"); | ||
| 208 | |||
| 209 | SetAddonStruct(CAddonBase::m_interface->firstKodiInstance); | ||
| 210 | CAddonBase::m_interface->globalSingleInstance = this; | ||
| 211 | } | ||
| 212 | //---------------------------------------------------------------------------- | ||
| 213 | |||
| 214 | //============================================================================ | ||
| 215 | /// @ingroup cpp_kodi_addon_screensaver | ||
| 216 | /// @brief Screensaver class constructor used to support multiple instance | ||
| 217 | /// types. | ||
| 218 | /// | ||
| 219 | /// @param[in] instance The instance value given to | ||
| 220 | /// <b>`kodi::addon::CAddonBase::CreateInstance(...)`</b>. | ||
| 221 | /// @param[in] kodiVersion [opt] Version used in Kodi for this instance, to | ||
| 222 | /// allow compatibility to older Kodi versions. | ||
| 223 | /// | ||
| 224 | /// @note Recommended to set <b>`kodiVersion`</b>. | ||
| 225 | /// | ||
| 226 | /// | ||
| 227 | /// -------------------------------------------------------------------------- | ||
| 228 | /// | ||
| 229 | /// **Here's example about the use of this:** | ||
| 230 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 231 | /// class CMyScreenSaver : public kodi::addon::CInstanceScreensaver | ||
| 232 | /// { | ||
| 233 | /// public: | ||
| 234 | /// CMyScreenSaver(KODI_HANDLE instance, const std::string& kodiVersion) | ||
| 235 | /// : kodi::addon::CInstanceScreensaver(instance, kodiVersion) | ||
| 236 | /// { | ||
| 237 | /// ... | ||
| 238 | /// } | ||
| 239 | /// | ||
| 240 | /// ... | ||
| 241 | /// }; | ||
| 242 | /// | ||
| 243 | /// ADDON_STATUS CMyAddon::CreateInstance(int instanceType, | ||
| 244 | /// const std::string& instanceID, | ||
| 245 | /// KODI_HANDLE instance, | ||
| 246 | /// const std::string& version, | ||
| 247 | /// KODI_HANDLE& addonInstance) | ||
| 248 | /// { | ||
| 249 | /// kodi::Log(ADDON_LOG_INFO, "Creating my screensaver"); | ||
| 250 | /// addonInstance = new CMyScreenSaver(instance, version); | ||
| 251 | /// return ADDON_STATUS_OK; | ||
| 252 | /// } | ||
| 253 | /// ~~~~~~~~~~~~~ | ||
| 254 | /// | ||
| 255 | explicit CInstanceScreensaver(KODI_HANDLE instance, const std::string& kodiVersion = "") | ||
| 256 | : IAddonInstance(ADDON_INSTANCE_SCREENSAVER, | ||
| 257 | !kodiVersion.empty() ? kodiVersion | ||
| 258 | : GetKodiTypeVersion(ADDON_INSTANCE_SCREENSAVER)) | ||
| 259 | { | ||
| 260 | if (CAddonBase::m_interface->globalSingleInstance != nullptr) | ||
| 261 | throw std::logic_error("kodi::addon::CInstanceScreensaver: Creation of multiple together " | ||
| 262 | "with single instance way is not allowed!"); | ||
| 263 | |||
| 264 | SetAddonStruct(instance); | ||
| 265 | } | ||
| 266 | //---------------------------------------------------------------------------- | ||
| 267 | |||
| 268 | //============================================================================ | ||
| 269 | /// @ingroup cpp_kodi_addon_screensaver | ||
| 270 | /// @brief Destructor. | ||
| 271 | /// | ||
| 272 | ~CInstanceScreensaver() override = default; | ||
| 273 | //---------------------------------------------------------------------------- | ||
| 274 | |||
| 275 | //============================================================================ | ||
| 276 | /// @ingroup cpp_kodi_addon_screensaver | ||
| 277 | /// @brief Used to notify the screensaver that it has been started. | ||
| 278 | /// | ||
| 279 | /// @return true if the screensaver was started successfully, false otherwise | ||
| 280 | /// | ||
| 281 | virtual bool Start() { return true; } | ||
| 282 | //---------------------------------------------------------------------------- | ||
| 283 | |||
| 284 | //============================================================================ | ||
| 285 | /// @ingroup cpp_kodi_addon_screensaver | ||
| 286 | /// @brief Used to inform the screensaver that the rendering control was | ||
| 287 | /// stopped. | ||
| 288 | /// | ||
| 289 | virtual void Stop() {} | ||
| 290 | //---------------------------------------------------------------------------- | ||
| 291 | |||
| 292 | //============================================================================ | ||
| 293 | /// @ingroup cpp_kodi_addon_screensaver | ||
| 294 | /// @brief Used to indicate when the add-on should render | ||
| 295 | /// | ||
| 296 | virtual void Render() {} | ||
| 297 | //---------------------------------------------------------------------------- | ||
| 298 | |||
| 299 | //============================================================================ | ||
| 300 | /// @defgroup cpp_kodi_addon_screensaver_CB Information functions | ||
| 301 | /// @ingroup cpp_kodi_addon_screensaver | ||
| 302 | /// @brief **To get info about the device, display and several other parts** | ||
| 303 | /// | ||
| 304 | ///@{ | ||
| 305 | |||
| 306 | //============================================================================ | ||
| 307 | /// @ingroup cpp_kodi_addon_screensaver_CB | ||
| 308 | /// @brief Device that represents the display adapter. | ||
| 309 | /// | ||
| 310 | /// @return A pointer to the device | ||
| 311 | /// | ||
| 312 | /// @note This is only available on **DirectX**, It us unused (`nullptr`) on | ||
| 313 | /// **OpenGL** | ||
| 314 | /// | ||
| 315 | /// This value can also be becomed by @ref kodi::gui::GetHWContext() and is | ||
| 316 | /// recommended to use. | ||
| 317 | /// | ||
| 318 | ///------------------------------------------------------------------------- | ||
| 319 | /// | ||
| 320 | /// **Example:** | ||
| 321 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 322 | /// #include <d3d11_1.h> | ||
| 323 | /// .. | ||
| 324 | /// // Note: Device() there is used inside addon child class about | ||
| 325 | /// // kodi::addon::CInstanceVisualization | ||
| 326 | /// ID3D11DeviceContext1* context = static_cast<ID3D11DeviceContext1*>(kodi::addon::CInstanceVisualization::Device()); | ||
| 327 | /// .. | ||
| 328 | /// ~~~~~~~~~~~~~ | ||
| 329 | /// | ||
| 330 | inline kodi::HardwareContext Device() { return m_instanceData->props->device; } | ||
| 331 | //---------------------------------------------------------------------------- | ||
| 332 | |||
| 333 | //============================================================================ | ||
| 334 | /// @ingroup cpp_kodi_addon_screensaver_CB | ||
| 335 | /// @brief Returns the X position of the rendering window. | ||
| 336 | /// | ||
| 337 | /// @return The X position, in pixels | ||
| 338 | /// | ||
| 339 | inline int X() { return m_instanceData->props->x; } | ||
| 340 | //---------------------------------------------------------------------------- | ||
| 341 | |||
| 342 | //============================================================================ | ||
| 343 | /// @ingroup cpp_kodi_addon_screensaver_CB | ||
| 344 | /// @brief Returns the Y position of the rendering window. | ||
| 345 | /// | ||
| 346 | /// @return The Y position, in pixels | ||
| 347 | /// | ||
| 348 | inline int Y() { return m_instanceData->props->y; } | ||
| 349 | //---------------------------------------------------------------------------- | ||
| 350 | |||
| 351 | //============================================================================ | ||
| 352 | /// @ingroup cpp_kodi_addon_screensaver_CB | ||
| 353 | /// @brief Returns the width of the rendering window. | ||
| 354 | /// | ||
| 355 | /// @return The width, in pixels | ||
| 356 | /// | ||
| 357 | inline int Width() { return m_instanceData->props->width; } | ||
| 358 | //---------------------------------------------------------------------------- | ||
| 359 | |||
| 360 | //============================================================================ | ||
| 361 | /// @ingroup cpp_kodi_addon_screensaver_CB | ||
| 362 | /// @brief Returns the height of the rendering window. | ||
| 363 | /// | ||
| 364 | /// @return The height, in pixels | ||
| 365 | /// | ||
| 366 | inline int Height() { return m_instanceData->props->height; } | ||
| 367 | //---------------------------------------------------------------------------- | ||
| 368 | |||
| 369 | //============================================================================ | ||
| 370 | /// @ingroup cpp_kodi_addon_screensaver_CB | ||
| 371 | /// @brief Pixel aspect ratio (often abbreviated PAR) is a ratio that | ||
| 372 | /// describes how the width of a pixel compares to the height of that pixel. | ||
| 373 | /// | ||
| 374 | /// @return The pixel aspect ratio used by the display | ||
| 375 | /// | ||
| 376 | inline float PixelRatio() { return m_instanceData->props->pixelRatio; } | ||
| 377 | //---------------------------------------------------------------------------- | ||
| 378 | |||
| 379 | //============================================================================ | ||
| 380 | /// @ingroup cpp_kodi_addon_screensaver_CB | ||
| 381 | /// @brief Used to get the name of the add-on defined in `addon.xml`. | ||
| 382 | /// | ||
| 383 | /// @return The add-on name | ||
| 384 | /// | ||
| 385 | inline std::string Name() { return m_instanceData->props->name; } | ||
| 386 | //---------------------------------------------------------------------------- | ||
| 387 | |||
| 388 | //============================================================================ | ||
| 389 | /// | ||
| 390 | /// @ingroup cpp_kodi_addon_screensaver_CB | ||
| 391 | /// @brief Used to get the full path where the add-on is installed. | ||
| 392 | /// | ||
| 393 | /// @return The add-on installation path | ||
| 394 | /// | ||
| 395 | inline std::string Presets() { return m_instanceData->props->presets; } | ||
| 396 | //---------------------------------------------------------------------------- | ||
| 397 | |||
| 398 | //============================================================================ | ||
| 399 | /// @ingroup cpp_kodi_addon_screensaver_CB | ||
| 400 | /// @brief Used to get the full path to the add-on's user profile. | ||
| 401 | /// | ||
| 402 | /// @note The trailing folder (consisting of the add-on's ID) is not created | ||
| 403 | /// by default. If it is needed, you must call kodi::vfs::CreateDirectory() | ||
| 404 | /// to create the folder. | ||
| 405 | /// | ||
| 406 | /// @return Path to the user profile | ||
| 407 | /// | ||
| 408 | inline std::string Profile() { return m_instanceData->props->profile; } | ||
| 409 | //---------------------------------------------------------------------------- | ||
| 410 | |||
| 411 | ///@} | ||
| 412 | |||
| 413 | private: | ||
| 414 | void SetAddonStruct(KODI_HANDLE instance) | ||
| 415 | { | ||
| 416 | if (instance == nullptr) | ||
| 417 | throw std::logic_error("kodi::addon::CInstanceScreensaver: Creation with empty addon " | ||
| 418 | "structure not allowed, table must be given from Kodi!"); | ||
| 419 | |||
| 420 | m_instanceData = static_cast<AddonInstance_Screensaver*>(instance); | ||
| 421 | m_instanceData->toAddon->addonInstance = this; | ||
| 422 | m_instanceData->toAddon->Start = ADDON_Start; | ||
| 423 | m_instanceData->toAddon->Stop = ADDON_Stop; | ||
| 424 | m_instanceData->toAddon->Render = ADDON_Render; | ||
| 425 | } | ||
| 426 | |||
| 427 | inline static bool ADDON_Start(AddonInstance_Screensaver* instance) | ||
| 428 | { | ||
| 429 | CInstanceScreensaver* thisClass = | ||
| 430 | static_cast<CInstanceScreensaver*>(instance->toAddon->addonInstance); | ||
| 431 | thisClass->m_renderHelper = kodi::gui::GetRenderHelper(); | ||
| 432 | return thisClass->Start(); | ||
| 433 | } | ||
| 434 | |||
| 435 | inline static void ADDON_Stop(AddonInstance_Screensaver* instance) | ||
| 436 | { | ||
| 437 | CInstanceScreensaver* thisClass = | ||
| 438 | static_cast<CInstanceScreensaver*>(instance->toAddon->addonInstance); | ||
| 439 | thisClass->Stop(); | ||
| 440 | thisClass->m_renderHelper = nullptr; | ||
| 441 | } | ||
| 442 | |||
| 443 | inline static void ADDON_Render(AddonInstance_Screensaver* instance) | ||
| 444 | { | ||
| 445 | CInstanceScreensaver* thisClass = | ||
| 446 | static_cast<CInstanceScreensaver*>(instance->toAddon->addonInstance); | ||
| 447 | |||
| 448 | if (!thisClass->m_renderHelper) | ||
| 449 | return; | ||
| 450 | thisClass->m_renderHelper->Begin(); | ||
| 451 | thisClass->Render(); | ||
| 452 | thisClass->m_renderHelper->End(); | ||
| 453 | } | ||
| 454 | |||
| 455 | /* | ||
| 456 | * Background render helper holds here and in addon base. | ||
| 457 | * In addon base also to have for the others, and stored here for the worst | ||
| 458 | * case where this class is independent from base and base becomes closed | ||
| 459 | * before. | ||
| 460 | * | ||
| 461 | * This is on Kodi with GL unused and the calls to there are empty (no work) | ||
| 462 | * On Kodi with Direct X where angle is present becomes this used. | ||
| 463 | */ | ||
| 464 | std::shared_ptr<kodi::gui::IRenderHelper> m_renderHelper; | ||
| 465 | AddonInstance_Screensaver* m_instanceData; | ||
| 466 | }; | ||
| 467 | |||
| 468 | } /* namespace addon */ | ||
| 469 | } /* namespace kodi */ | ||
| 470 | #endif /* __cplusplus */ | ||
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/VFS.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/VFS.h new file mode 100644 index 0000000..177bf72 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/VFS.h | |||
| @@ -0,0 +1,1226 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2015-2018 Team Kodi | ||
| 3 | * | ||
| 4 | * SPDX-License-Identifier: GPL-2.0-or-later | ||
| 5 | * See LICENSES/README.md for more information. | ||
| 6 | */ | ||
| 7 | |||
| 8 | #pragma once | ||
| 9 | |||
| 10 | #include "../AddonBase.h" | ||
| 11 | #include "../Filesystem.h" | ||
| 12 | #include "../c-api/addon-instance/vfs.h" | ||
| 13 | |||
| 14 | #ifdef __cplusplus | ||
| 15 | |||
| 16 | namespace kodi | ||
| 17 | { | ||
| 18 | namespace addon | ||
| 19 | { | ||
| 20 | |||
| 21 | class CInstanceVFS; | ||
| 22 | |||
| 23 | //============================================================================== | ||
| 24 | /// @ingroup cpp_kodi_addon_vfs_Defs | ||
| 25 | /// @brief **VFS add-on file handle**\n | ||
| 26 | /// This used to handle opened files of addon with related memory pointer about | ||
| 27 | /// class or structure and to have on further file control functions available. | ||
| 28 | /// | ||
| 29 | /// See @ref cpp_kodi_addon_vfs_filecontrol "file editing functions" for used | ||
| 30 | /// places. | ||
| 31 | /// | ||
| 32 | ///@{ | ||
| 33 | using VFSFileHandle = VFS_FILE_HANDLE; | ||
| 34 | ///@} | ||
| 35 | //------------------------------------------------------------------------------ | ||
| 36 | |||
| 37 | //============================================================================== | ||
| 38 | /// @defgroup cpp_kodi_addon_vfs_Defs_VFSUrl class VFSUrl | ||
| 39 | /// @ingroup cpp_kodi_addon_vfs_Defs | ||
| 40 | /// @brief **VFS add-on URL data**\n | ||
| 41 | /// This class is used to inform the addon of the desired wanted connection. | ||
| 42 | /// | ||
| 43 | /// Used on mostly all addon functions to identify related target. | ||
| 44 | /// | ||
| 45 | /// ---------------------------------------------------------------------------- | ||
| 46 | /// | ||
| 47 | /// @copydetails cpp_kodi_addon_vfs_Defs_VFSUrl_Help | ||
| 48 | /// | ||
| 49 | ///@{ | ||
| 50 | class ATTRIBUTE_HIDDEN VFSUrl : public CStructHdl<VFSUrl, VFSURL> | ||
| 51 | { | ||
| 52 | /*! \cond PRIVATE */ | ||
| 53 | friend class CInstanceVFS; | ||
| 54 | /*! \endcond */ | ||
| 55 | |||
| 56 | public: | ||
| 57 | /// @defgroup cpp_kodi_addon_vfs_Defs_VFSUrl_Help Value Help | ||
| 58 | /// @ingroup cpp_kodi_addon_vfs_Defs_VFSUrl | ||
| 59 | /// | ||
| 60 | /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_vfs_Defs_VFSUrl :</b> | ||
| 61 | /// | Name | Type | Get call | ||
| 62 | /// |------|------|---------- | ||
| 63 | /// | **URL** | `std::string` | @ref VFSUrl::GetURL "GetURL" | ||
| 64 | /// | **Domain name** | `std::string` | @ref VFSUrl::GetDomain "GetDomain" | ||
| 65 | /// | **Hostname** | `std::string` | @ref VFSUrl::GetHostname "GetHostname" | ||
| 66 | /// | **Filename** | `std::string` | @ref VFSUrl::GetFilename "GetFilename" | ||
| 67 | /// | **Network port** | `unsigned int` | @ref VFSUrl::GetPort "GetPort" | ||
| 68 | /// | **Special options** | `std::string` | @ref VFSUrl::GetOptions "GetOptions" | ||
| 69 | /// | **Username** | `std::string` | @ref VFSUrl::GetUsername "GetUsername" | ||
| 70 | /// | **Password** | `std::string` | @ref VFSUrl::GetPassword "GetPassword" | ||
| 71 | /// | **Get URL with user and password hidden** | `std::string` | @ref VFSUrl::GetRedacted "GetRedacted" | ||
| 72 | /// | **Sharename** | `std::string` | @ref VFSUrl::GetSharename "GetSharename" | ||
| 73 | /// | **Network protocol** | `std::string` | @ref VFSUrl::GetProtocol "GetProtocol" | ||
| 74 | /// | ||
| 75 | |||
| 76 | /// @addtogroup cpp_kodi_addon_vfs_Defs_VFSUrl | ||
| 77 | ///@{ | ||
| 78 | |||
| 79 | /// @brief Desired URL of the file system to be edited | ||
| 80 | /// | ||
| 81 | /// This includes all available parts of the access and is structured as | ||
| 82 | /// follows: | ||
| 83 | /// - | ||
| 84 | /// <b>`<PROTOCOL>`://`<USERNAME>`:`<PASSWORD>``@``<HOSTNAME>`:`<PORT>`/`<FILENAME>`?`<OPTIONS>`</b> | ||
| 85 | std::string GetURL() const { return m_cStructure->url; } | ||
| 86 | |||
| 87 | /// @brief The associated domain name, which is optional and not available | ||
| 88 | /// in all cases. | ||
| 89 | std::string GetDomain() const { return m_cStructure->domain; } | ||
| 90 | |||
| 91 | /// @brief This includes the network address (e.g. `192.168.0.123`) or if | ||
| 92 | /// the addon refers to file packages the path to it | ||
| 93 | /// (e.g. `/home/by_me/MyPacket.rar`). | ||
| 94 | std::string GetHostname() const { return m_cStructure->hostname; } | ||
| 95 | |||
| 96 | /// @brief With this variable the desired path to a folder or file within | ||
| 97 | /// the hostname is given (e.g. `storage/videos/00001.ts`). | ||
| 98 | std::string GetFilename() const { return m_cStructure->filename; } | ||
| 99 | |||
| 100 | /// @brief [Networking port](https://en.wikipedia.org/wiki/Port_(computer_networking)) | ||
| 101 | /// to use for protocol. | ||
| 102 | unsigned int GetPort() const { return m_cStructure->port; } | ||
| 103 | |||
| 104 | /// @brief Special options on opened URL, this can e.g. on RAR packages | ||
| 105 | /// <b>`?flags=8&nextvalue=123`</b> to inform about to not cache a read. | ||
| 106 | /// | ||
| 107 | /// Available options from Kodi: | ||
| 108 | /// | Value: | Description: | ||
| 109 | /// |-----------|------------------- | ||
| 110 | /// | flags=8 | Used on RAR packages so that no data is cached from the requested source. | ||
| 111 | /// | cache=no | Used on ZIP packages so that no data from the requested source is stored in the cache. However, this is currently not available from addons! | ||
| 112 | /// | ||
| 113 | /// In addition, other addons can use the URLs given by them to give options | ||
| 114 | /// that fit the respective VFS addon and allow special operations. | ||
| 115 | /// | ||
| 116 | /// @note This procedure is not yet standardized and is currently not | ||
| 117 | /// exactly available which are handed over. | ||
| 118 | std::string GetOptions() const { return m_cStructure->options; } | ||
| 119 | |||
| 120 | /// @brief Desired username. | ||
| 121 | std::string GetUsername() const { return m_cStructure->username; } | ||
| 122 | |||
| 123 | /// @brief Desired password. | ||
| 124 | std::string GetPassword() const { return m_cStructure->password; } | ||
| 125 | |||
| 126 | /// @brief The complete URL is passed on here, but the user name and | ||
| 127 | /// password are not shown and only appear to there as `USERNAME:PASSWORD`. | ||
| 128 | /// | ||
| 129 | /// As example <b>`sftp://USERNAME:PASSWORD@192.168.178.123/storage/videos/00001.ts`</b>. | ||
| 130 | std::string GetRedacted() const { return m_cStructure->redacted; } | ||
| 131 | |||
| 132 | /// @brief The name which is taken as the basis by source and would be first | ||
| 133 | /// in folder view. | ||
| 134 | /// | ||
| 135 | /// As example on <b>`sftp://dudu:isprivate@192.168.178.123/storage/videos/00001.ts`</b> | ||
| 136 | /// becomes then <b>`storage`</b> used here. | ||
| 137 | std::string GetSharename() const { return m_cStructure->sharename; } | ||
| 138 | |||
| 139 | /// @brief Protocol name used on this stream, e.g. <b>`sftp`</b>. | ||
| 140 | std::string GetProtocol() const { return m_cStructure->protocol; } | ||
| 141 | |||
| 142 | ///@} | ||
| 143 | |||
| 144 | private: | ||
| 145 | VFSUrl() = delete; | ||
| 146 | VFSUrl(const VFSUrl& channel) = delete; | ||
| 147 | VFSUrl(const VFSURL* channel) : CStructHdl(channel) {} | ||
| 148 | VFSUrl(VFSURL* channel) : CStructHdl(channel) {} | ||
| 149 | }; | ||
| 150 | ///@} | ||
| 151 | //------------------------------------------------------------------------------ | ||
| 152 | |||
| 153 | //############################################################################## | ||
| 154 | /// @defgroup cpp_kodi_addon_vfs_Defs Definitions, structures and enumerators | ||
| 155 | /// \ingroup cpp_kodi_addon_vfs | ||
| 156 | /// @brief **VFS add-on general variables** | ||
| 157 | /// | ||
| 158 | /// Used to exchange the available options between Kodi and addon. | ||
| 159 | /// | ||
| 160 | /// | ||
| 161 | |||
| 162 | //============================================================================== | ||
| 163 | /// | ||
| 164 | /// \addtogroup cpp_kodi_addon_vfs | ||
| 165 | /// @brief \cpp_class{ kodi::addon::CInstanceVFS } | ||
| 166 | /// **Virtual Filesystem (VFS) add-on instance** | ||
| 167 | /// | ||
| 168 | /// This instance type is used to allow Kodi various additional file system | ||
| 169 | /// types. Be it a special file system, a compressed package or a system | ||
| 170 | /// available over the network, everything is possible with it. | ||
| 171 | /// | ||
| 172 | /// This usage can be requested under various conditions, for example explicitly | ||
| 173 | /// by another addon, by a Mimetype protocol defined in <b>`addon.xml`</b> or supported | ||
| 174 | /// file extensions. | ||
| 175 | /// | ||
| 176 | /// Include the header @ref VFS.h "#include <kodi/addon-instance/VFS.h>" | ||
| 177 | /// to use this class. | ||
| 178 | /// | ||
| 179 | /// ---------------------------------------------------------------------------- | ||
| 180 | /// | ||
| 181 | /// Here is an example of what the <b>`addon.xml.in`</b> would look like for an VFS addon: | ||
| 182 | /// | ||
| 183 | /// ~~~~~~~~~~~~~{.xml} | ||
| 184 | /// <?xml version="1.0" encoding="UTF-8"?> | ||
| 185 | /// <addon | ||
| 186 | /// id="vfs.myspecialnamefor" | ||
| 187 | /// version="1.0.0" | ||
| 188 | /// name="My VFS addon" | ||
| 189 | /// provider-name="Your Name"> | ||
| 190 | /// <requires>@ADDON_DEPENDS@</requires> | ||
| 191 | /// <extension | ||
| 192 | /// point="kodi.vfs" | ||
| 193 | /// protocols="myprot" | ||
| 194 | /// extensions=".abc|.def" | ||
| 195 | /// files="true" | ||
| 196 | /// filedirectories="true" | ||
| 197 | /// directories="true" | ||
| 198 | /// encodedhostname="true" | ||
| 199 | /// supportDialog="true" | ||
| 200 | /// supportPath="true" | ||
| 201 | /// supportUsername="true" | ||
| 202 | /// supportPassword="true" | ||
| 203 | /// supportPort="true" | ||
| 204 | /// supportBrowsing="true" | ||
| 205 | /// supportWrite="true" | ||
| 206 | /// defaultPort="1234" | ||
| 207 | /// label="30000" | ||
| 208 | /// zeroconf="your_special_zeroconf_allowed_identifier" | ||
| 209 | /// library_@PLATFORM@="@LIBRARY_FILENAME@"/> | ||
| 210 | /// <extension point="xbmc.addon.metadata"> | ||
| 211 | /// <summary lang="en_GB">My VFS addon summary</summary> | ||
| 212 | /// <description lang="en_GB">My VFS description</description> | ||
| 213 | /// <platform>@PLATFORM@</platform> | ||
| 214 | /// </extension> | ||
| 215 | /// </addon> | ||
| 216 | /// ~~~~~~~~~~~~~ | ||
| 217 | /// | ||
| 218 | /// @note Regarding boolean values with "false", these can also be omitted, | ||
| 219 | /// since this would be the default. | ||
| 220 | /// | ||
| 221 | /// | ||
| 222 | /// ### Standard values that can be declared for processing in `addon.xml`. | ||
| 223 | /// | ||
| 224 | /// These values are used by Kodi to identify associated streams and file | ||
| 225 | /// extensions and then to select the associated addon. | ||
| 226 | /// | ||
| 227 | /// \table_start | ||
| 228 | /// \table_h3{ Labels, Type, Description } | ||
| 229 | /// \table_row3{ <b>`point`</b>, | ||
| 230 | /// \anchor cpp_kodi_addon_vfs_point | ||
| 231 | /// string, | ||
| 232 | /// The identification of the addon instance to VFS is mandatory <b>`kodi.vfs`</b>. | ||
| 233 | /// In addition\, the instance declared in the first <b>`<extension ... />`</b> is also the main type of addon. | ||
| 234 | /// } | ||
| 235 | /// \table_row3{ <b>`defaultPort`</b>, | ||
| 236 | /// \anchor cpp_kodi_addon_vfs_defaultPort | ||
| 237 | /// integer, | ||
| 238 | /// Default [networking port](https://en.wikipedia.org/wiki/Port_(computer_networking)) | ||
| 239 | /// to use for protocol. | ||
| 240 | /// } | ||
| 241 | /// \table_row3{ <b>`directories`</b>, | ||
| 242 | /// \anchor cpp_kodi_addon_vfs_directories | ||
| 243 | /// boolean, | ||
| 244 | /// VFS entry can list directories. | ||
| 245 | /// } | ||
| 246 | /// \table_row3{ <b>`extensions`</b>, | ||
| 247 | /// \anchor cpp_kodi_addon_vfs_extensions | ||
| 248 | /// string, | ||
| 249 | /// Extensions for VFS entry.\n | ||
| 250 | /// It is possible to declare several using <b>`|`</b>\, e.g. <b>`.abc|.def|.ghi`</b>. | ||
| 251 | /// } | ||
| 252 | /// \table_row3{ <b>`encodedhostname`</b>, | ||
| 253 | /// \anchor cpp_kodi_addon_vfs_encodedhostname | ||
| 254 | /// boolean, | ||
| 255 | /// URL protocol from add-ons use encoded hostnames. | ||
| 256 | /// } | ||
| 257 | /// \table_row3{ <b>`filedirectories`</b>, | ||
| 258 | /// \anchor cpp_kodi_addon_vfs_filedirectories | ||
| 259 | /// boolean, | ||
| 260 | /// VFS entry contains file directories. | ||
| 261 | /// } | ||
| 262 | /// \table_row3{ <b>`files`</b>, | ||
| 263 | /// \anchor cpp_kodi_addon_vfs_directories | ||
| 264 | /// boolean, | ||
| 265 | /// Set to declare that VFS provides files. | ||
| 266 | /// } | ||
| 267 | /// \table_row3{ <b>`protocols`</b>, | ||
| 268 | /// \anchor cpp_kodi_addon_vfs_protocols | ||
| 269 | /// boolean, | ||
| 270 | /// Protocols for VFS entry.\n | ||
| 271 | /// It is possible to declare several using <b>`|`</b>\, e.g. <b>`myprot1|myprot2`</b>.\n | ||
| 272 | /// @note This field also used to show on GUI\, see <b>`supportBrowsing`</b> below about <b>*2:</b>. | ||
| 273 | /// When used there\, however\, only a **single** protocol is possible! | ||
| 274 | /// } | ||
| 275 | /// \table_row3{ <b>`supportWrite`</b>, | ||
| 276 | /// \anchor cpp_kodi_addon_vfs_supportWrite | ||
| 277 | /// boolean, | ||
| 278 | /// Protocol supports write operations. | ||
| 279 | /// } | ||
| 280 | /// \table_row3{ <b>`zeroconf`</b>, | ||
| 281 | /// \anchor cpp_kodi_addon_vfs_zeroconf | ||
| 282 | /// string, | ||
| 283 | /// [Zero conf](https://en.wikipedia.org/wiki/Zero-configuration_networking) announce string for VFS protocol. | ||
| 284 | /// } | ||
| 285 | /// \table_row3{ <b>`library_@PLATFORM@`</b>, | ||
| 286 | /// \anchor cpp_kodi_addon_vfs_library | ||
| 287 | /// string, | ||
| 288 | /// The runtime library used for the addon. This is usually declared by `cmake` and correctly displayed in the translated <b>`addon.xml`</b>. | ||
| 289 | /// } | ||
| 290 | /// \table_end | ||
| 291 | /// | ||
| 292 | /// | ||
| 293 | /// ### User selectable parts of the addon. | ||
| 294 | /// | ||
| 295 | /// The following table describes the values that can be defined by <b>`addon.xml`</b> | ||
| 296 | /// and which part they relate to for user input. | ||
| 297 | /// | ||
| 298 | /// \table_start | ||
| 299 | /// \table_h3{ Labels, Type, Description } | ||
| 300 | /// \table_row3{ <b>`supportBrowsing`</b>, | ||
| 301 | /// \anchor cpp_kodi_addon_vfs_protocol_supportBrowsing | ||
| 302 | /// boolean, | ||
| 303 | /// Protocol supports server browsing. Used to open related sources by users in the window.\n\n | ||
| 304 | /// | Associated places in Kodi: | | ||
| 305 | /// | :---- | | ||
| 306 | /// | \image html cpp_kodi_addon_vfs_protocol_1.png | | ||
| 307 | /// <br> | ||
| 308 | /// <b>*1:</b> The entry in the menu represented by this option corresponds to the text given with <b>`label`</b>. | ||
| 309 | /// When the button is pressed\, @ref CInstanceVFS::GetDirectory is called on the add-on to get its content.\n | ||
| 310 | /// <b>*2:</b> Protocol name of the stream defined with <b>`protocols`</b> in xml.\n | ||
| 311 | /// @remark See also <b>`supportDialog`</b> about <b>*3:</b>. | ||
| 312 | /// } | ||
| 313 | /// \table_row3{ <b>`supportDialog`</b>, | ||
| 314 | /// \anchor cpp_kodi_addon_vfs_protocol_supportDialog | ||
| 315 | /// boolean, | ||
| 316 | /// To point out that Kodi assigns a dialog to this VFS in order to compare it with other values e.g. query supportPassword in it.\n | ||
| 317 | /// This will be available when adding sources in Kodi under <b>"Add network location..."</b>.\n\n | ||
| 318 | /// | Associated places in Kodi: | | ||
| 319 | /// | :---- | | ||
| 320 | /// | \image html cpp_kodi_addon_vfs_protocol_2.png | | ||
| 321 | /// <br> | ||
| 322 | /// <b>*1:</b> Field for selecting the VFS handler\, the addon will be available if <b>`supportDialog`</b> is set to <b>`true`</b>.\n | ||
| 323 | /// <b>*2:</b> To set the associated server address. **Note:** *This field is always activated and cannot be changed by the addon.*\n | ||
| 324 | /// <b>*3:</b> If <b>`supportBrowsing`</b> is set to <b>`true`</b>\, the button for opening a file selection dialog is given here too\, as in the file window.\n | ||
| 325 | /// <b>*4:</b> This field is available if <b>`supportPath`</b> is set to <b>`true`</b>.\n | ||
| 326 | /// <b>*5:</b> To edit the connection port. This field is available if <b>`supportPort`</b> is set to <b>`true`</b>.\n | ||
| 327 | /// <b>*6:</b> This sets the required username and is available when <b>`supportUsername`</b> is set to <b>`true`</b>.\n | ||
| 328 | /// <b>*7:</b> This sets the required password and is available when <b>`supportPassword`</b> is set to <b>`true`</b>. | ||
| 329 | /// } | ||
| 330 | /// \table_row3{ <b>`supportPath`</b>, | ||
| 331 | /// \anchor cpp_kodi_addon_vfs_protocol_supportPath | ||
| 332 | /// boolean, | ||
| 333 | /// Protocol has path in addition to server name (see <b>`supportDialog`</b> about <b>*4:</b>). | ||
| 334 | /// } | ||
| 335 | /// \table_row3{ <b>`supportPort`</b>, | ||
| 336 | /// \anchor cpp_kodi_addon_vfs_protocol_supportPort | ||
| 337 | /// boolean, | ||
| 338 | /// Protocol supports port customization (see <b>`supportDialog`</b> about <b>*5:</b>). | ||
| 339 | /// } | ||
| 340 | /// \table_row3{ <b>`supportUsername`</b>, | ||
| 341 | /// \anchor cpp_kodi_addon_vfs_protocol_supportUsername | ||
| 342 | /// boolean, | ||
| 343 | /// Protocol uses logins (see <b>`supportDialog`</b> about <b>*6:</b>). | ||
| 344 | /// } | ||
| 345 | /// \table_row3{ <b>`supportPassword`</b>, | ||
| 346 | /// \anchor cpp_kodi_addon_vfs_protocol_supportPassword | ||
| 347 | /// boolean, | ||
| 348 | /// Protocol supports passwords (see <b>`supportDialog`</b> about <b>*7:</b>). | ||
| 349 | /// } | ||
| 350 | /// \table_row3{ <b>`protocols`</b>, | ||
| 351 | /// \anchor cpp_kodi_addon_vfs_protocol_protocols | ||
| 352 | /// string, | ||
| 353 | /// Protocols for VFS entry. | ||
| 354 | /// @note This field is not editable and only used on GUI to show his name\, see <b>`supportBrowsing`</b> about <b>*2:</b> | ||
| 355 | /// } | ||
| 356 | /// \table_row3{ <b>`label`</b>, | ||
| 357 | /// \anchor cpp_kodi_addon_vfs_protocol_label | ||
| 358 | /// integer, | ||
| 359 | /// The text identification number used in Kodi for display in the menu at <b>`supportDialog`</b> | ||
| 360 | /// as a selection option and at <b>`supportBrowsing`</b> (see his image reference <b>*1</b>) as a menu entry.\n | ||
| 361 | /// This can be a text identifier in Kodi or from addon.\n | ||
| 362 | /// @remark For addon within <b>30000</b>-<b>30999</b> or <b>32000</b>-<b>32999</b>. | ||
| 363 | /// } | ||
| 364 | /// \table_end | ||
| 365 | /// | ||
| 366 | /// @remark For more detailed description of the <b>`addon.xml`</b>, see also https://kodi.wiki/view/Addon.xml. | ||
| 367 | /// | ||
| 368 | /// | ||
| 369 | /// -------------------------------------------------------------------------- | ||
| 370 | /// | ||
| 371 | /// | ||
| 372 | /// **Example:** | ||
| 373 | /// | ||
| 374 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 375 | /// #include <kodi/addon-instance/VFS.h> | ||
| 376 | /// | ||
| 377 | /// class CMyVFS : public kodi::addon::CInstanceVFS | ||
| 378 | /// { | ||
| 379 | /// public: | ||
| 380 | /// CMyVFS(KODI_HANDLE instance, const std::string& kodiVersion); | ||
| 381 | /// | ||
| 382 | /// // Add all your required functions, the most CInstanceVFS functions of | ||
| 383 | /// // must be included to have addon working correctly. | ||
| 384 | /// ... | ||
| 385 | /// }; | ||
| 386 | /// | ||
| 387 | /// CMyVFS::CMyVFS(KODI_HANDLE instance, const std::string& kodiVersion) | ||
| 388 | /// : kodi::addon::CInstanceVFS(instance, kodiVersion) | ||
| 389 | /// { | ||
| 390 | /// ... | ||
| 391 | /// } | ||
| 392 | /// | ||
| 393 | /// ... | ||
| 394 | /// | ||
| 395 | /// //---------------------------------------------------------------------- | ||
| 396 | /// | ||
| 397 | /// class CMyAddon : public kodi::addon::CAddonBase | ||
| 398 | /// { | ||
| 399 | /// public: | ||
| 400 | /// CMyAddon() { } | ||
| 401 | /// ADDON_STATUS CreateInstance(int instanceType, | ||
| 402 | /// const std::string& instanceID, | ||
| 403 | /// KODI_HANDLE instance, | ||
| 404 | /// const std::string& version, | ||
| 405 | /// KODI_HANDLE& addonInstance) override; | ||
| 406 | /// }; | ||
| 407 | /// | ||
| 408 | /// // If you use only one instance in your add-on, can be instanceType and | ||
| 409 | /// // instanceID ignored | ||
| 410 | /// ADDON_STATUS CMyAddon::CreateInstance(int instanceType, | ||
| 411 | /// const std::string& instanceID, | ||
| 412 | /// KODI_HANDLE instance, | ||
| 413 | /// const std::string& version, | ||
| 414 | /// KODI_HANDLE& addonInstance) | ||
| 415 | /// { | ||
| 416 | /// if (instanceType == ADDON_INSTANCE_VFS) | ||
| 417 | /// { | ||
| 418 | /// kodi::Log(ADDON_LOG_INFO, "Creating my VFS instance"); | ||
| 419 | /// addonInstance = new CMyVFS(instance, version); | ||
| 420 | /// return ADDON_STATUS_OK; | ||
| 421 | /// } | ||
| 422 | /// else if (...) | ||
| 423 | /// { | ||
| 424 | /// ... | ||
| 425 | /// } | ||
| 426 | /// return ADDON_STATUS_UNKNOWN; | ||
| 427 | /// } | ||
| 428 | /// | ||
| 429 | /// ADDONCREATOR(CMyAddon) | ||
| 430 | /// ~~~~~~~~~~~~~ | ||
| 431 | /// | ||
| 432 | /// The destruction of the example class `CMyVFS` is called from | ||
| 433 | /// Kodi's header. Manually deleting the add-on instance is not required. | ||
| 434 | /// | ||
| 435 | //------------------------------------------------------------------------------ | ||
| 436 | class ATTRIBUTE_HIDDEN CInstanceVFS : public IAddonInstance | ||
| 437 | { | ||
| 438 | public: | ||
| 439 | //============================================================================ | ||
| 440 | /// @ingroup cpp_kodi_addon_vfs | ||
| 441 | /// @brief VFS class constructor used to support multiple instance | ||
| 442 | /// types | ||
| 443 | /// | ||
| 444 | /// @param[in] instance The instance value given to | ||
| 445 | /// <b>`kodi::addon::CAddonBase::CreateInstance(...)`</b>. | ||
| 446 | /// @param[in] kodiVersion [opt] given from Kodi by @ref CAddonBase::CreateInstance | ||
| 447 | /// to identify his instance API version | ||
| 448 | /// | ||
| 449 | /// @note Instance path as a single is not supported by this type. It must | ||
| 450 | /// ensure that it can be called up several times. | ||
| 451 | /// | ||
| 452 | /// @warning Only use `instance` from the @ref CAddonBase::CreateInstance or | ||
| 453 | /// @ref CAddonBase::CreateInstance call. | ||
| 454 | /// | ||
| 455 | explicit CInstanceVFS(KODI_HANDLE instance, const std::string& kodiVersion = "") | ||
| 456 | : IAddonInstance(ADDON_INSTANCE_VFS, | ||
| 457 | !kodiVersion.empty() ? kodiVersion : GetKodiTypeVersion(ADDON_INSTANCE_VFS)) | ||
| 458 | { | ||
| 459 | if (CAddonBase::m_interface->globalSingleInstance != nullptr) | ||
| 460 | throw std::logic_error("kodi::addon::CInstanceVFS: Creation of multiple together with single " | ||
| 461 | "instance way is not allowed!"); | ||
| 462 | |||
| 463 | SetAddonStruct(instance); | ||
| 464 | } | ||
| 465 | //---------------------------------------------------------------------------- | ||
| 466 | |||
| 467 | //============================================================================ | ||
| 468 | /// @ingroup cpp_kodi_addon_vfs | ||
| 469 | /// @brief Destructor | ||
| 470 | /// | ||
| 471 | ~CInstanceVFS() override = default; | ||
| 472 | //---------------------------------------------------------------------------- | ||
| 473 | |||
| 474 | //============================================================================ | ||
| 475 | /// @defgroup cpp_kodi_addon_vfs_general 1. General access functions | ||
| 476 | /// @ingroup cpp_kodi_addon_vfs | ||
| 477 | /// @brief **General access functions** | ||
| 478 | /// | ||
| 479 | /// This functions which are intended for getting folders, editing storage | ||
| 480 | /// locations and file system queries. | ||
| 481 | /// | ||
| 482 | |||
| 483 | //============================================================================ | ||
| 484 | /// @defgroup cpp_kodi_addon_vfs_filecontrol 2. File editing functions | ||
| 485 | /// @ingroup cpp_kodi_addon_vfs | ||
| 486 | /// @brief **File editing functions.** | ||
| 487 | /// | ||
| 488 | /// This value represents the addon-side handlers and to be able to identify | ||
| 489 | /// his own parts in the event of further access. | ||
| 490 | /// | ||
| 491 | |||
| 492 | //@{ | ||
| 493 | //============================================================================ | ||
| 494 | /// @ingroup cpp_kodi_addon_vfs_filecontrol | ||
| 495 | /// @brief Open a file for input | ||
| 496 | /// | ||
| 497 | /// @param[in] url The URL of the file | ||
| 498 | /// @return Context for the opened file | ||
| 499 | /// | ||
| 500 | /// | ||
| 501 | /// ---------------------------------------------------------------------------- | ||
| 502 | /// | ||
| 503 | /// @copydetails cpp_kodi_addon_vfs_Defs_VFSUrl_Help | ||
| 504 | /// | ||
| 505 | virtual kodi::addon::VFSFileHandle Open(const kodi::addon::VFSUrl& url) { return nullptr; } | ||
| 506 | //---------------------------------------------------------------------------- | ||
| 507 | |||
| 508 | //============================================================================ | ||
| 509 | /// @ingroup cpp_kodi_addon_vfs_filecontrol | ||
| 510 | /// @brief Open a file for output | ||
| 511 | /// | ||
| 512 | /// @param[in] url The URL of the file | ||
| 513 | /// @param[in] overWrite Whether or not to overwrite an existing file | ||
| 514 | /// @return Context for the opened file | ||
| 515 | /// | ||
| 516 | virtual kodi::addon::VFSFileHandle OpenForWrite(const kodi::addon::VFSUrl& url, bool overWrite) | ||
| 517 | { | ||
| 518 | return nullptr; | ||
| 519 | } | ||
| 520 | //---------------------------------------------------------------------------- | ||
| 521 | |||
| 522 | //============================================================================ | ||
| 523 | /// @ingroup cpp_kodi_addon_vfs_filecontrol | ||
| 524 | /// @brief Close a file | ||
| 525 | /// | ||
| 526 | /// @param[in] context The context of the file | ||
| 527 | /// @return True on success, false on failure | ||
| 528 | /// | ||
| 529 | virtual bool Close(kodi::addon::VFSFileHandle context) { return false; } | ||
| 530 | //---------------------------------------------------------------------------- | ||
| 531 | |||
| 532 | //============================================================================ | ||
| 533 | /// @ingroup cpp_kodi_addon_vfs_filecontrol | ||
| 534 | /// @brief Read from a file | ||
| 535 | /// | ||
| 536 | /// @param[in] context The context of the file | ||
| 537 | /// @param[out] buffer The buffer to read data into | ||
| 538 | /// @param[in] uiBufSize Number of bytes to read | ||
| 539 | /// @return Number of bytes read | ||
| 540 | /// | ||
| 541 | virtual ssize_t Read(kodi::addon::VFSFileHandle context, uint8_t* buffer, size_t uiBufSize) | ||
| 542 | { | ||
| 543 | return -1; | ||
| 544 | } | ||
| 545 | //---------------------------------------------------------------------------- | ||
| 546 | |||
| 547 | //============================================================================ | ||
| 548 | /// @ingroup cpp_kodi_addon_vfs_filecontrol | ||
| 549 | /// @brief Write to a file | ||
| 550 | /// | ||
| 551 | /// @param[in] context The context of the file | ||
| 552 | /// @param[in] buffer The buffer to read data from | ||
| 553 | /// @param[in] uiBufSize Number of bytes to write | ||
| 554 | /// @return Number of bytes written | ||
| 555 | /// | ||
| 556 | virtual ssize_t Write(kodi::addon::VFSFileHandle context, const uint8_t* buffer, size_t uiBufSize) | ||
| 557 | { | ||
| 558 | return -1; | ||
| 559 | } | ||
| 560 | //---------------------------------------------------------------------------- | ||
| 561 | |||
| 562 | //============================================================================ | ||
| 563 | /// @ingroup cpp_kodi_addon_vfs_filecontrol | ||
| 564 | /// @brief Seek in a file | ||
| 565 | /// | ||
| 566 | /// @param[in] context The context of the file | ||
| 567 | /// @param[in] position The position to seek to | ||
| 568 | /// @param[in] whence Position in file 'position' is relative to (SEEK_CUR, SEEK_SET, SEEK_END): | ||
| 569 | /// | Value | int | Description | | ||
| 570 | /// |:--------:|:---:|:----------------------------------------------------| | ||
| 571 | /// | SEEK_SET | 0 | position is relative to the beginning of the file. This is probably what you had in mind anyway, and is the most commonly used value for whence. | ||
| 572 | /// | SEEK_CUR | 1 | position is relative to the current file pointer position. So, in effect, you can say, "Move to my current position plus 30 bytes," or, "move to my current position minus 20 bytes." | ||
| 573 | /// | SEEK_END | 2 | position is relative to the end of the file. Just like SEEK_SET except from the other end of the file. Be sure to use negative values for offset if you want to back up from the end of the file, instead of going past the end into oblivion. | ||
| 574 | /// @return Offset in file after seek | ||
| 575 | /// | ||
| 576 | virtual int64_t Seek(kodi::addon::VFSFileHandle context, int64_t position, int whence) | ||
| 577 | { | ||
| 578 | return -1; | ||
| 579 | } | ||
| 580 | //---------------------------------------------------------------------------- | ||
| 581 | |||
| 582 | //============================================================================ | ||
| 583 | /// @ingroup cpp_kodi_addon_vfs_filecontrol | ||
| 584 | /// @brief Truncate a file | ||
| 585 | /// | ||
| 586 | /// @param[in] context The context of the file | ||
| 587 | /// @param[in] size The size to truncate the file to | ||
| 588 | /// @return 0 on success, -1 on error | ||
| 589 | /// | ||
| 590 | virtual int Truncate(kodi::addon::VFSFileHandle context, int64_t size) { return -1; } | ||
| 591 | //---------------------------------------------------------------------------- | ||
| 592 | |||
| 593 | //============================================================================ | ||
| 594 | /// @ingroup cpp_kodi_addon_vfs_filecontrol | ||
| 595 | /// @brief Get total size of a file | ||
| 596 | /// | ||
| 597 | /// @param[in] context The context of the file | ||
| 598 | /// @return Total file size | ||
| 599 | /// | ||
| 600 | virtual int64_t GetLength(kodi::addon::VFSFileHandle context) { return 0; } | ||
| 601 | //---------------------------------------------------------------------------- | ||
| 602 | |||
| 603 | //============================================================================ | ||
| 604 | /// @ingroup cpp_kodi_addon_vfs_filecontrol | ||
| 605 | /// @brief Get current position in a file | ||
| 606 | /// | ||
| 607 | /// @param[in] context The context of the file | ||
| 608 | /// @return Current position | ||
| 609 | /// | ||
| 610 | virtual int64_t GetPosition(kodi::addon::VFSFileHandle context) { return 0; } | ||
| 611 | //---------------------------------------------------------------------------- | ||
| 612 | |||
| 613 | //============================================================================ | ||
| 614 | /// @ingroup cpp_kodi_addon_vfs_filecontrol | ||
| 615 | /// @brief Get chunk size of a file | ||
| 616 | /// | ||
| 617 | /// @param[in] context The context of the file | ||
| 618 | /// @return Chunk size | ||
| 619 | /// | ||
| 620 | virtual int GetChunkSize(kodi::addon::VFSFileHandle context) { return 1; } | ||
| 621 | //---------------------------------------------------------------------------- | ||
| 622 | |||
| 623 | //============================================================================ | ||
| 624 | /// @ingroup cpp_kodi_addon_vfs_filecontrol | ||
| 625 | /// @brief To check seek possible on current stream by file. | ||
| 626 | /// | ||
| 627 | /// @return true if seek possible, false if not | ||
| 628 | /// | ||
| 629 | virtual bool IoControlGetSeekPossible(kodi::addon::VFSFileHandle context) { return false; } | ||
| 630 | //---------------------------------------------------------------------------- | ||
| 631 | |||
| 632 | //============================================================================ | ||
| 633 | /// @ingroup cpp_kodi_addon_vfs_filecontrol | ||
| 634 | /// @brief To check a running stream on file for state of his cache. | ||
| 635 | /// | ||
| 636 | /// @param[in] status Information about current cache status | ||
| 637 | /// @return true if successfull done, false otherwise | ||
| 638 | /// | ||
| 639 | /// | ||
| 640 | /// @copydetails cpp_kodi_vfs_Defs_CacheStatus_Help | ||
| 641 | /// | ||
| 642 | virtual bool IoControlGetCacheStatus(kodi::addon::VFSFileHandle context, | ||
| 643 | kodi::vfs::CacheStatus& status) | ||
| 644 | { | ||
| 645 | return false; | ||
| 646 | } | ||
| 647 | //---------------------------------------------------------------------------- | ||
| 648 | |||
| 649 | //============================================================================ | ||
| 650 | /// @ingroup cpp_kodi_addon_vfs_filecontrol | ||
| 651 | /// @brief Unsigned int with speed limit for caching in bytes per second. | ||
| 652 | /// | ||
| 653 | /// @param[in] rate Cache rate size to use | ||
| 654 | /// @return true if successfull done, false otherwise | ||
| 655 | /// | ||
| 656 | virtual bool IoControlSetCacheRate(kodi::addon::VFSFileHandle context, unsigned int rate) | ||
| 657 | { | ||
| 658 | return false; | ||
| 659 | } | ||
| 660 | //---------------------------------------------------------------------------- | ||
| 661 | |||
| 662 | //============================================================================ | ||
| 663 | /// @ingroup cpp_kodi_addon_vfs_filecontrol | ||
| 664 | /// @brief Enable/disable retry within the protocol handler (if supported). | ||
| 665 | /// | ||
| 666 | /// @param[in] retry To set the retry, true for use, false for not | ||
| 667 | /// @return true if successfull done, false otherwise | ||
| 668 | /// | ||
| 669 | virtual bool IoControlSetRetry(kodi::addon::VFSFileHandle context, bool retry) { return false; } | ||
| 670 | //---------------------------------------------------------------------------- | ||
| 671 | //@} | ||
| 672 | |||
| 673 | //@{ | ||
| 674 | //============================================================================ | ||
| 675 | /// @ingroup cpp_kodi_addon_vfs_general | ||
| 676 | /// @brief Stat a file | ||
| 677 | /// | ||
| 678 | /// @param[in] url The URL of the file | ||
| 679 | /// @param[in] buffer The buffer to store results in | ||
| 680 | /// @return -1 on error, 0 otherwise | ||
| 681 | /// | ||
| 682 | /// | ||
| 683 | /// ---------------------------------------------------------------------------- | ||
| 684 | /// | ||
| 685 | /// @copydetails cpp_kodi_addon_vfs_Defs_VFSUrl_Help | ||
| 686 | /// | ||
| 687 | virtual int Stat(const kodi::addon::VFSUrl& url, kodi::vfs::FileStatus& buffer) { return 0; } | ||
| 688 | //---------------------------------------------------------------------------- | ||
| 689 | |||
| 690 | //============================================================================ | ||
| 691 | /// @ingroup cpp_kodi_addon_vfs_general | ||
| 692 | /// @brief Check for file existence | ||
| 693 | /// | ||
| 694 | /// @param[in] url The URL of the file | ||
| 695 | /// @return True if file exists, false otherwise | ||
| 696 | /// | ||
| 697 | virtual bool Exists(const kodi::addon::VFSUrl& url) { return false; } | ||
| 698 | //---------------------------------------------------------------------------- | ||
| 699 | |||
| 700 | //============================================================================ | ||
| 701 | /// @ingroup cpp_kodi_addon_vfs_general | ||
| 702 | /// @brief Clear out any idle connections | ||
| 703 | /// | ||
| 704 | virtual void ClearOutIdle() {} | ||
| 705 | //---------------------------------------------------------------------------- | ||
| 706 | |||
| 707 | //============================================================================ | ||
| 708 | /// @ingroup cpp_kodi_addon_vfs_general | ||
| 709 | /// @brief Disconnect all connections | ||
| 710 | /// | ||
| 711 | virtual void DisconnectAll() {} | ||
| 712 | //---------------------------------------------------------------------------- | ||
| 713 | |||
| 714 | //============================================================================ | ||
| 715 | /// @ingroup cpp_kodi_addon_vfs_general | ||
| 716 | /// @brief Delete a file | ||
| 717 | /// | ||
| 718 | /// @param[in] url The URL of the file | ||
| 719 | /// @return True if deletion was successful, false otherwise | ||
| 720 | /// | ||
| 721 | virtual bool Delete(const kodi::addon::VFSUrl& url) { return false; } | ||
| 722 | //---------------------------------------------------------------------------- | ||
| 723 | |||
| 724 | //============================================================================ | ||
| 725 | /// @ingroup cpp_kodi_addon_vfs_general | ||
| 726 | /// @brief Rename a file | ||
| 727 | /// | ||
| 728 | /// @param[in] url The URL of the source file | ||
| 729 | /// @param[in] url2 The URL of the destination file | ||
| 730 | /// @return True if deletion was successful, false otherwise | ||
| 731 | /// | ||
| 732 | virtual bool Rename(const kodi::addon::VFSUrl& url, const kodi::addon::VFSUrl& url2) | ||
| 733 | { | ||
| 734 | return false; | ||
| 735 | } | ||
| 736 | //---------------------------------------------------------------------------- | ||
| 737 | |||
| 738 | //============================================================================ | ||
| 739 | /// @ingroup cpp_kodi_addon_vfs_general | ||
| 740 | /// @brief Check for directory existence | ||
| 741 | /// | ||
| 742 | /// @param[in] url The URL of the file | ||
| 743 | /// @return True if directory exists, false otherwise | ||
| 744 | /// | ||
| 745 | virtual bool DirectoryExists(const kodi::addon::VFSUrl& url) { return false; } | ||
| 746 | //---------------------------------------------------------------------------- | ||
| 747 | |||
| 748 | //============================================================================ | ||
| 749 | /// @ingroup cpp_kodi_addon_vfs_general | ||
| 750 | /// @brief Remove a directory | ||
| 751 | /// | ||
| 752 | /// @param[in] url The URL of the directory | ||
| 753 | /// @return True if removal was successful, false otherwise | ||
| 754 | /// | ||
| 755 | virtual bool RemoveDirectory(const kodi::addon::VFSUrl& url) { return false; } | ||
| 756 | //---------------------------------------------------------------------------- | ||
| 757 | |||
| 758 | //============================================================================ | ||
| 759 | /// @ingroup cpp_kodi_addon_vfs_general | ||
| 760 | /// @brief Create a directory | ||
| 761 | /// | ||
| 762 | /// @param[in] url The URL of the file | ||
| 763 | /// @return True if creation was successful, false otherwise | ||
| 764 | /// | ||
| 765 | virtual bool CreateDirectory(const kodi::addon::VFSUrl& url) { return false; } | ||
| 766 | //---------------------------------------------------------------------------- | ||
| 767 | |||
| 768 | //============================================================================ | ||
| 769 | /// @defgroup cpp_kodi_addon_vfs_general_cb_GetDirectory Callbacks GetDirectory() | ||
| 770 | /// @ingroup cpp_kodi_addon_vfs_general | ||
| 771 | /// @brief Callback functions on GetDirectory() | ||
| 772 | /// | ||
| 773 | /// This functions becomes available during call of GetDirectory() from | ||
| 774 | /// Kodi. | ||
| 775 | /// | ||
| 776 | /// If GetDirectory() returns false becomes the parts from here used on | ||
| 777 | /// next call of the function. | ||
| 778 | /// | ||
| 779 | /// **Example:** | ||
| 780 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 781 | /// | ||
| 782 | /// #include <kodi/addon-instance/VFS.h> | ||
| 783 | /// | ||
| 784 | /// ... | ||
| 785 | /// | ||
| 786 | /// bool CMyVFS::GetDirectory(const kodi::addon::VFSUrl& url, | ||
| 787 | /// std::vector<kodi::vfs::CDirEntry>& items, | ||
| 788 | /// CVFSCallbacks callbacks) | ||
| 789 | /// { | ||
| 790 | /// std::string neededString; | ||
| 791 | /// callbacks.GetKeyboardInput("Test", neededString, true); | ||
| 792 | /// if (neededString.empty()) | ||
| 793 | /// return false; | ||
| 794 | /// | ||
| 795 | /// // Do the work | ||
| 796 | /// ... | ||
| 797 | /// return true; | ||
| 798 | /// } | ||
| 799 | /// ~~~~~~~~~~~~~ | ||
| 800 | /// | ||
| 801 | class CVFSCallbacks | ||
| 802 | { | ||
| 803 | public: | ||
| 804 | /// @ingroup cpp_kodi_addon_vfs_general_cb_GetDirectory | ||
| 805 | /// @brief Require keyboard input | ||
| 806 | /// | ||
| 807 | /// Becomes called if GetDirectory() returns false and GetDirectory() | ||
| 808 | /// becomes after entry called again. | ||
| 809 | /// | ||
| 810 | /// @param[in] heading The heading of the keyboard dialog | ||
| 811 | /// @param[out] input The resulting string. Returns string after | ||
| 812 | /// second call! | ||
| 813 | /// @param[in] hiddenInput To show input only as "*" on dialog | ||
| 814 | /// @return True if input was received, false otherwise | ||
| 815 | /// | ||
| 816 | bool GetKeyboardInput(const std::string& heading, std::string& input, bool hiddenInput = false) | ||
| 817 | { | ||
| 818 | char* cInput = nullptr; | ||
| 819 | bool ret = m_cb->get_keyboard_input(m_cb->ctx, heading.c_str(), &cInput, hiddenInput); | ||
| 820 | if (cInput) | ||
| 821 | { | ||
| 822 | input = cInput; | ||
| 823 | ::kodi::addon::CAddonBase::m_interface->toKodi->free_string( | ||
| 824 | ::kodi::addon::CAddonBase::m_interface->toKodi->kodiBase, cInput); | ||
| 825 | } | ||
| 826 | return ret; | ||
| 827 | } | ||
| 828 | |||
| 829 | /// @ingroup cpp_kodi_addon_vfs_general_cb_GetDirectory | ||
| 830 | /// @brief Display an error dialog | ||
| 831 | /// | ||
| 832 | /// @param[in] heading The heading of the error dialog | ||
| 833 | /// @param[in] line1 The first line of the error dialog | ||
| 834 | /// @param[in] line2 [opt] The second line of the error dialog | ||
| 835 | /// @param[in] line3 [opt] The third line of the error dialog | ||
| 836 | /// | ||
| 837 | void SetErrorDialog(const std::string& heading, | ||
| 838 | const std::string& line1, | ||
| 839 | const std::string& line2 = "", | ||
| 840 | const std::string& line3 = "") | ||
| 841 | { | ||
| 842 | m_cb->set_error_dialog(m_cb->ctx, heading.c_str(), line1.c_str(), line2.c_str(), | ||
| 843 | line3.c_str()); | ||
| 844 | } | ||
| 845 | |||
| 846 | /// @ingroup cpp_kodi_addon_vfs_general_cb_GetDirectory | ||
| 847 | /// @brief Prompt the user for authentication of a URL | ||
| 848 | /// | ||
| 849 | /// @param[in] url The URL | ||
| 850 | void RequireAuthentication(const std::string& url) | ||
| 851 | { | ||
| 852 | m_cb->require_authentication(m_cb->ctx, url.c_str()); | ||
| 853 | } | ||
| 854 | |||
| 855 | explicit CVFSCallbacks(const VFSGetDirectoryCallbacks* cb) : m_cb(cb) {} | ||
| 856 | |||
| 857 | private: | ||
| 858 | const VFSGetDirectoryCallbacks* m_cb; | ||
| 859 | }; | ||
| 860 | //---------------------------------------------------------------------------- | ||
| 861 | |||
| 862 | //============================================================================ | ||
| 863 | /// @ingroup cpp_kodi_addon_vfs_general | ||
| 864 | /// @brief List a directory | ||
| 865 | /// | ||
| 866 | /// @param[in] url The URL of the directory | ||
| 867 | /// @param[out] entries The entries in the directory, see | ||
| 868 | /// @ref cpp_kodi_vfs_CDirEntry "kodi::vfs::CDirEntry" | ||
| 869 | /// about his content | ||
| 870 | /// @param[in] callbacks A callback structure | ||
| 871 | /// @return Context for the directory listing | ||
| 872 | /// | ||
| 873 | /// | ||
| 874 | /// -------------------------------------------------------------------------- | ||
| 875 | /// | ||
| 876 | /// ### Callbacks: | ||
| 877 | /// @copydetails cpp_kodi_addon_vfs_general_cb_GetDirectory | ||
| 878 | /// | ||
| 879 | /// **Available callback functions** | ||
| 880 | /// | Function: | Description | ||
| 881 | /// |--|-- | ||
| 882 | /// | CVFSCallbacks::GetKeyboardInput | @copybrief CVFSCallbacks::GetKeyboardInput @copydetails CVFSCallbacks::GetKeyboardInput | ||
| 883 | /// | CVFSCallbacks::SetErrorDialog | @copybrief CVFSCallbacks::SetErrorDialog @copydetails CVFSCallbacks::SetErrorDialog | ||
| 884 | /// | CVFSCallbacks::RequireAuthentication | @copybrief CVFSCallbacks::RequireAuthentication @copydetails CVFSCallbacks::RequireAuthentication | ||
| 885 | /// | ||
| 886 | virtual bool GetDirectory(const kodi::addon::VFSUrl& url, | ||
| 887 | std::vector<kodi::vfs::CDirEntry>& entries, | ||
| 888 | CVFSCallbacks callbacks) | ||
| 889 | { | ||
| 890 | return false; | ||
| 891 | } | ||
| 892 | //---------------------------------------------------------------------------- | ||
| 893 | |||
| 894 | //============================================================================ | ||
| 895 | /// @ingroup cpp_kodi_addon_vfs_general | ||
| 896 | /// @brief Check if file should be presented as a directory (multiple streams) | ||
| 897 | /// | ||
| 898 | /// @param[in] url The URL of the file | ||
| 899 | /// @param[out] entries The entries in the directory, see | ||
| 900 | /// @ref cpp_kodi_vfs_CDirEntry "kodi::vfs::CDirEntry" | ||
| 901 | /// about his content | ||
| 902 | /// @param[out] rootPath Path to root directory if multiple entries | ||
| 903 | /// @return Context for the directory listing | ||
| 904 | /// | ||
| 905 | virtual bool ContainsFiles(const kodi::addon::VFSUrl& url, | ||
| 906 | std::vector<kodi::vfs::CDirEntry>& entries, | ||
| 907 | std::string& rootPath) | ||
| 908 | { | ||
| 909 | return false; | ||
| 910 | } | ||
| 911 | //---------------------------------------------------------------------------- | ||
| 912 | //@} | ||
| 913 | |||
| 914 | private: | ||
| 915 | void SetAddonStruct(KODI_HANDLE instance) | ||
| 916 | { | ||
| 917 | if (instance == nullptr) | ||
| 918 | throw std::logic_error("kodi::addon::CInstanceVFS: Creation with empty addon structure not " | ||
| 919 | "allowed, table must be given from Kodi!"); | ||
| 920 | |||
| 921 | m_instanceData = static_cast<AddonInstance_VFSEntry*>(instance); | ||
| 922 | m_instanceData->toAddon->addonInstance = this; | ||
| 923 | m_instanceData->toAddon->open = ADDON_Open; | ||
| 924 | m_instanceData->toAddon->open_for_write = ADDON_OpenForWrite; | ||
| 925 | m_instanceData->toAddon->read = ADDON_Read; | ||
| 926 | m_instanceData->toAddon->write = ADDON_Write; | ||
| 927 | m_instanceData->toAddon->seek = ADDON_Seek; | ||
| 928 | m_instanceData->toAddon->truncate = ADDON_Truncate; | ||
| 929 | m_instanceData->toAddon->get_length = ADDON_GetLength; | ||
| 930 | m_instanceData->toAddon->get_position = ADDON_GetPosition; | ||
| 931 | m_instanceData->toAddon->get_chunk_size = ADDON_GetChunkSize; | ||
| 932 | m_instanceData->toAddon->io_control_get_seek_possible = ADDON_IoControlGetSeekPossible; | ||
| 933 | m_instanceData->toAddon->io_control_get_cache_status = ADDON_IoControlGetCacheStatus; | ||
| 934 | m_instanceData->toAddon->io_control_set_cache_rate = ADDON_IoControlSetCacheRate; | ||
| 935 | m_instanceData->toAddon->io_control_set_retry = ADDON_IoControlSetRetry; | ||
| 936 | m_instanceData->toAddon->stat = ADDON_Stat; | ||
| 937 | m_instanceData->toAddon->close = ADDON_Close; | ||
| 938 | m_instanceData->toAddon->exists = ADDON_Exists; | ||
| 939 | m_instanceData->toAddon->clear_out_idle = ADDON_ClearOutIdle; | ||
| 940 | m_instanceData->toAddon->disconnect_all = ADDON_DisconnectAll; | ||
| 941 | m_instanceData->toAddon->delete_it = ADDON_Delete; | ||
| 942 | m_instanceData->toAddon->rename = ADDON_Rename; | ||
| 943 | m_instanceData->toAddon->directory_exists = ADDON_DirectoryExists; | ||
| 944 | m_instanceData->toAddon->remove_directory = ADDON_RemoveDirectory; | ||
| 945 | m_instanceData->toAddon->create_directory = ADDON_CreateDirectory; | ||
| 946 | m_instanceData->toAddon->get_directory = ADDON_GetDirectory; | ||
| 947 | m_instanceData->toAddon->free_directory = ADDON_FreeDirectory; | ||
| 948 | m_instanceData->toAddon->contains_files = ADDON_ContainsFiles; | ||
| 949 | } | ||
| 950 | |||
| 951 | inline static VFS_FILE_HANDLE ADDON_Open(const AddonInstance_VFSEntry* instance, | ||
| 952 | const VFSURL* url) | ||
| 953 | { | ||
| 954 | return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->Open(url); | ||
| 955 | } | ||
| 956 | |||
| 957 | inline static VFS_FILE_HANDLE ADDON_OpenForWrite(const AddonInstance_VFSEntry* instance, | ||
| 958 | const VFSURL* url, | ||
| 959 | bool overWrite) | ||
| 960 | { | ||
| 961 | return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance) | ||
| 962 | ->OpenForWrite(url, overWrite); | ||
| 963 | } | ||
| 964 | |||
| 965 | inline static ssize_t ADDON_Read(const AddonInstance_VFSEntry* instance, | ||
| 966 | VFS_FILE_HANDLE context, | ||
| 967 | uint8_t* buffer, | ||
| 968 | size_t uiBufSize) | ||
| 969 | { | ||
| 970 | return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance) | ||
| 971 | ->Read(context, buffer, uiBufSize); | ||
| 972 | } | ||
| 973 | |||
| 974 | inline static ssize_t ADDON_Write(const AddonInstance_VFSEntry* instance, | ||
| 975 | VFS_FILE_HANDLE context, | ||
| 976 | const uint8_t* buffer, | ||
| 977 | size_t uiBufSize) | ||
| 978 | { | ||
| 979 | return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance) | ||
| 980 | ->Write(context, buffer, uiBufSize); | ||
| 981 | } | ||
| 982 | |||
| 983 | inline static int64_t ADDON_Seek(const AddonInstance_VFSEntry* instance, | ||
| 984 | VFS_FILE_HANDLE context, | ||
| 985 | int64_t position, | ||
| 986 | int whence) | ||
| 987 | { | ||
| 988 | return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance) | ||
| 989 | ->Seek(context, position, whence); | ||
| 990 | } | ||
| 991 | |||
| 992 | inline static int ADDON_Truncate(const AddonInstance_VFSEntry* instance, | ||
| 993 | VFS_FILE_HANDLE context, | ||
| 994 | int64_t size) | ||
| 995 | { | ||
| 996 | return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->Truncate(context, size); | ||
| 997 | } | ||
| 998 | |||
| 999 | inline static int64_t ADDON_GetLength(const AddonInstance_VFSEntry* instance, | ||
| 1000 | VFS_FILE_HANDLE context) | ||
| 1001 | { | ||
| 1002 | return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->GetLength(context); | ||
| 1003 | } | ||
| 1004 | |||
| 1005 | inline static int64_t ADDON_GetPosition(const AddonInstance_VFSEntry* instance, | ||
| 1006 | VFS_FILE_HANDLE context) | ||
| 1007 | { | ||
| 1008 | return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->GetPosition(context); | ||
| 1009 | } | ||
| 1010 | |||
| 1011 | inline static int ADDON_GetChunkSize(const AddonInstance_VFSEntry* instance, | ||
| 1012 | VFS_FILE_HANDLE context) | ||
| 1013 | { | ||
| 1014 | return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->GetChunkSize(context); | ||
| 1015 | } | ||
| 1016 | |||
| 1017 | inline static bool ADDON_IoControlGetSeekPossible(const AddonInstance_VFSEntry* instance, | ||
| 1018 | VFS_FILE_HANDLE context) | ||
| 1019 | { | ||
| 1020 | return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance) | ||
| 1021 | ->IoControlGetSeekPossible(context); | ||
| 1022 | } | ||
| 1023 | |||
| 1024 | inline static bool ADDON_IoControlGetCacheStatus(const struct AddonInstance_VFSEntry* instance, | ||
| 1025 | VFS_FILE_HANDLE context, | ||
| 1026 | VFS_CACHE_STATUS_DATA* status) | ||
| 1027 | { | ||
| 1028 | kodi::vfs::CacheStatus cppStatus(status); | ||
| 1029 | return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance) | ||
| 1030 | ->IoControlGetCacheStatus(context, cppStatus); | ||
| 1031 | } | ||
| 1032 | |||
| 1033 | inline static bool ADDON_IoControlSetCacheRate(const struct AddonInstance_VFSEntry* instance, | ||
| 1034 | VFS_FILE_HANDLE context, | ||
| 1035 | unsigned int rate) | ||
| 1036 | { | ||
| 1037 | return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance) | ||
| 1038 | ->IoControlSetCacheRate(context, rate); | ||
| 1039 | } | ||
| 1040 | |||
| 1041 | inline static bool ADDON_IoControlSetRetry(const struct AddonInstance_VFSEntry* instance, | ||
| 1042 | VFS_FILE_HANDLE context, | ||
| 1043 | bool retry) | ||
| 1044 | { | ||
| 1045 | return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance) | ||
| 1046 | ->IoControlSetRetry(context, retry); | ||
| 1047 | } | ||
| 1048 | |||
| 1049 | inline static int ADDON_Stat(const AddonInstance_VFSEntry* instance, | ||
| 1050 | const VFSURL* url, | ||
| 1051 | struct STAT_STRUCTURE* buffer) | ||
| 1052 | { | ||
| 1053 | kodi::vfs::FileStatus cppBuffer(buffer); | ||
| 1054 | return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->Stat(url, cppBuffer); | ||
| 1055 | } | ||
| 1056 | |||
| 1057 | inline static bool ADDON_Close(const AddonInstance_VFSEntry* instance, VFS_FILE_HANDLE context) | ||
| 1058 | { | ||
| 1059 | return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->Close(context); | ||
| 1060 | } | ||
| 1061 | |||
| 1062 | inline static bool ADDON_Exists(const AddonInstance_VFSEntry* instance, const VFSURL* url) | ||
| 1063 | { | ||
| 1064 | return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->Exists(url); | ||
| 1065 | } | ||
| 1066 | |||
| 1067 | inline static void ADDON_ClearOutIdle(const AddonInstance_VFSEntry* instance) | ||
| 1068 | { | ||
| 1069 | return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->ClearOutIdle(); | ||
| 1070 | } | ||
| 1071 | |||
| 1072 | inline static void ADDON_DisconnectAll(const AddonInstance_VFSEntry* instance) | ||
| 1073 | { | ||
| 1074 | return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->DisconnectAll(); | ||
| 1075 | } | ||
| 1076 | |||
| 1077 | inline static bool ADDON_Delete(const AddonInstance_VFSEntry* instance, const VFSURL* url) | ||
| 1078 | { | ||
| 1079 | return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->Delete(url); | ||
| 1080 | } | ||
| 1081 | |||
| 1082 | inline static bool ADDON_Rename(const AddonInstance_VFSEntry* instance, | ||
| 1083 | const VFSURL* url, | ||
| 1084 | const VFSURL* url2) | ||
| 1085 | { | ||
| 1086 | return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->Rename(url, url2); | ||
| 1087 | } | ||
| 1088 | |||
| 1089 | inline static bool ADDON_DirectoryExists(const AddonInstance_VFSEntry* instance, | ||
| 1090 | const VFSURL* url) | ||
| 1091 | { | ||
| 1092 | return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->DirectoryExists(url); | ||
| 1093 | } | ||
| 1094 | |||
| 1095 | inline static bool ADDON_RemoveDirectory(const AddonInstance_VFSEntry* instance, | ||
| 1096 | const VFSURL* url) | ||
| 1097 | { | ||
| 1098 | return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->RemoveDirectory(url); | ||
| 1099 | } | ||
| 1100 | |||
| 1101 | inline static bool ADDON_CreateDirectory(const AddonInstance_VFSEntry* instance, | ||
| 1102 | const VFSURL* url) | ||
| 1103 | { | ||
| 1104 | return static_cast<CInstanceVFS*>(instance->toAddon->addonInstance)->CreateDirectory(url); | ||
| 1105 | } | ||
| 1106 | |||
| 1107 | inline static bool ADDON_GetDirectory(const AddonInstance_VFSEntry* instance, | ||
| 1108 | const VFSURL* url, | ||
| 1109 | VFSDirEntry** retEntries, | ||
| 1110 | int* num_entries, | ||
| 1111 | VFSGetDirectoryCallbacks* callbacks) | ||
| 1112 | { | ||
| 1113 | std::vector<kodi::vfs::CDirEntry> addonEntries; | ||
| 1114 | bool ret = static_cast<CInstanceVFS*>(instance->toAddon->addonInstance) | ||
| 1115 | ->GetDirectory(url, addonEntries, CVFSCallbacks(callbacks)); | ||
| 1116 | if (ret) | ||
| 1117 | { | ||
| 1118 | VFSDirEntry* entries = | ||
| 1119 | static_cast<VFSDirEntry*>(malloc(sizeof(VFSDirEntry) * addonEntries.size())); | ||
| 1120 | for (unsigned int i = 0; i < addonEntries.size(); ++i) | ||
| 1121 | { | ||
| 1122 | entries[i].label = strdup(addonEntries[i].Label().c_str()); | ||
| 1123 | entries[i].title = strdup(addonEntries[i].Title().c_str()); | ||
| 1124 | entries[i].path = strdup(addonEntries[i].Path().c_str()); | ||
| 1125 | entries[i].folder = addonEntries[i].IsFolder(); | ||
| 1126 | entries[i].size = addonEntries[i].Size(); | ||
| 1127 | entries[i].date_time = addonEntries[i].DateTime(); | ||
| 1128 | |||
| 1129 | entries[i].num_props = 0; | ||
| 1130 | const std::map<std::string, std::string>& props = addonEntries[i].GetProperties(); | ||
| 1131 | if (!props.empty()) | ||
| 1132 | { | ||
| 1133 | entries[i].properties = | ||
| 1134 | static_cast<VFSProperty*>(malloc(sizeof(VFSProperty) * props.size())); | ||
| 1135 | for (const auto& prop : props) | ||
| 1136 | { | ||
| 1137 | entries[i].properties[entries[i].num_props].name = strdup(prop.first.c_str()); | ||
| 1138 | entries[i].properties[entries[i].num_props].val = strdup(prop.second.c_str()); | ||
| 1139 | ++entries[i].num_props; | ||
| 1140 | } | ||
| 1141 | } | ||
| 1142 | else | ||
| 1143 | entries[i].properties = nullptr; | ||
| 1144 | } | ||
| 1145 | *retEntries = entries; | ||
| 1146 | *num_entries = static_cast<int>(addonEntries.size()); | ||
| 1147 | } | ||
| 1148 | return ret; | ||
| 1149 | } | ||
| 1150 | |||
| 1151 | inline static void ADDON_FreeDirectory(const AddonInstance_VFSEntry* instance, | ||
| 1152 | VFSDirEntry* entries, | ||
| 1153 | int num_entries) | ||
| 1154 | { | ||
| 1155 | for (int i = 0; i < num_entries; ++i) | ||
| 1156 | { | ||
| 1157 | if (entries[i].properties) | ||
| 1158 | { | ||
| 1159 | for (unsigned int j = 0; j < entries[i].num_props; ++j) | ||
| 1160 | { | ||
| 1161 | free(entries[i].properties[j].name); | ||
| 1162 | free(entries[i].properties[j].val); | ||
| 1163 | } | ||
| 1164 | free(entries[i].properties); | ||
| 1165 | } | ||
| 1166 | free(entries[i].label); | ||
| 1167 | free(entries[i].title); | ||
| 1168 | free(entries[i].path); | ||
| 1169 | } | ||
| 1170 | free(entries); | ||
| 1171 | } | ||
| 1172 | |||
| 1173 | inline static bool ADDON_ContainsFiles(const AddonInstance_VFSEntry* instance, | ||
| 1174 | const VFSURL* url, | ||
| 1175 | VFSDirEntry** retEntries, | ||
| 1176 | int* num_entries, | ||
| 1177 | char* rootpath) | ||
| 1178 | { | ||
| 1179 | std::string cppRootPath; | ||
| 1180 | std::vector<kodi::vfs::CDirEntry> addonEntries; | ||
| 1181 | bool ret = static_cast<CInstanceVFS*>(instance->toAddon->addonInstance) | ||
| 1182 | ->ContainsFiles(url, addonEntries, cppRootPath); | ||
| 1183 | if (ret) | ||
| 1184 | { | ||
| 1185 | strncpy(rootpath, cppRootPath.c_str(), ADDON_STANDARD_STRING_LENGTH); | ||
| 1186 | |||
| 1187 | VFSDirEntry* entries = | ||
| 1188 | static_cast<VFSDirEntry*>(malloc(sizeof(VFSDirEntry) * addonEntries.size())); | ||
| 1189 | for (size_t i = 0; i < addonEntries.size(); ++i) | ||
| 1190 | { | ||
| 1191 | entries[i].label = strdup(addonEntries[i].Label().c_str()); | ||
| 1192 | entries[i].title = strdup(addonEntries[i].Title().c_str()); | ||
| 1193 | entries[i].path = strdup(addonEntries[i].Path().c_str()); | ||
| 1194 | entries[i].folder = addonEntries[i].IsFolder(); | ||
| 1195 | entries[i].size = addonEntries[i].Size(); | ||
| 1196 | entries[i].date_time = addonEntries[i].DateTime(); | ||
| 1197 | |||
| 1198 | entries[i].num_props = 0; | ||
| 1199 | const std::map<std::string, std::string>& props = addonEntries[i].GetProperties(); | ||
| 1200 | if (!props.empty()) | ||
| 1201 | { | ||
| 1202 | entries[i].properties = | ||
| 1203 | static_cast<VFSProperty*>(malloc(sizeof(VFSProperty) * props.size())); | ||
| 1204 | for (const auto& prop : props) | ||
| 1205 | { | ||
| 1206 | entries[i].properties[entries[i].num_props].name = strdup(prop.first.c_str()); | ||
| 1207 | entries[i].properties[entries[i].num_props].val = strdup(prop.second.c_str()); | ||
| 1208 | ++entries[i].num_props; | ||
| 1209 | } | ||
| 1210 | } | ||
| 1211 | else | ||
| 1212 | entries[i].properties = nullptr; | ||
| 1213 | } | ||
| 1214 | *retEntries = entries; | ||
| 1215 | *num_entries = static_cast<int>(addonEntries.size()); | ||
| 1216 | } | ||
| 1217 | return ret; | ||
| 1218 | } | ||
| 1219 | |||
| 1220 | AddonInstance_VFSEntry* m_instanceData; | ||
| 1221 | }; | ||
| 1222 | |||
| 1223 | } /* namespace addon */ | ||
| 1224 | } /* namespace kodi */ | ||
| 1225 | |||
| 1226 | #endif /* __cplusplus */ | ||
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/VideoCodec.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/VideoCodec.h new file mode 100644 index 0000000..12893db --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/VideoCodec.h | |||
| @@ -0,0 +1,249 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2017-2018 Team Kodi | ||
| 3 | * This file is part of Kodi - https://kodi.tv | ||
| 4 | * | ||
| 5 | * SPDX-License-Identifier: GPL-2.0-or-later | ||
| 6 | * See LICENSES/README.md for more information. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #pragma once | ||
| 10 | |||
| 11 | #include "../AddonBase.h" | ||
| 12 | #include "../StreamCrypto.h" | ||
| 13 | #include "../StreamCodec.h" | ||
| 14 | |||
| 15 | #ifdef BUILD_KODI_ADDON | ||
| 16 | #include "../DemuxPacket.h" | ||
| 17 | #else | ||
| 18 | #include "cores/VideoPlayer/Interface/Addon/DemuxPacket.h" | ||
| 19 | #endif | ||
| 20 | |||
| 21 | extern "C" | ||
| 22 | { | ||
| 23 | enum VIDEOCODEC_FORMAT | ||
| 24 | { | ||
| 25 | UnknownVideoFormat = 0, | ||
| 26 | VideoFormatYV12, | ||
| 27 | VideoFormatI420, | ||
| 28 | MaxVideoFormats | ||
| 29 | }; | ||
| 30 | |||
| 31 | |||
| 32 | struct VIDEOCODEC_INITDATA | ||
| 33 | { | ||
| 34 | enum Codec { | ||
| 35 | CodecUnknown = 0, | ||
| 36 | CodecVp8, | ||
| 37 | CodecH264, | ||
| 38 | CodecVp9 | ||
| 39 | } codec; | ||
| 40 | |||
| 41 | STREAMCODEC_PROFILE codecProfile; | ||
| 42 | |||
| 43 | //UnknownVideoFormat is terminator | ||
| 44 | VIDEOCODEC_FORMAT *videoFormats; | ||
| 45 | |||
| 46 | uint32_t width, height; | ||
| 47 | |||
| 48 | const uint8_t *extraData; | ||
| 49 | unsigned int extraDataSize; | ||
| 50 | |||
| 51 | CRYPTO_INFO cryptoInfo; | ||
| 52 | }; | ||
| 53 | |||
| 54 | struct VIDEOCODEC_PICTURE | ||
| 55 | { | ||
| 56 | enum VideoPlane { | ||
| 57 | YPlane = 0, | ||
| 58 | UPlane, | ||
| 59 | VPlane, | ||
| 60 | MaxPlanes = 3, | ||
| 61 | }; | ||
| 62 | |||
| 63 | enum Flags : uint32_t { | ||
| 64 | FLAG_DROP, | ||
| 65 | FLAG_DRAIN | ||
| 66 | }; | ||
| 67 | |||
| 68 | VIDEOCODEC_FORMAT videoFormat; | ||
| 69 | uint32_t flags; | ||
| 70 | |||
| 71 | uint32_t width, height; | ||
| 72 | |||
| 73 | uint8_t *decodedData; | ||
| 74 | size_t decodedDataSize; | ||
| 75 | |||
| 76 | uint32_t planeOffsets[VideoPlane::MaxPlanes]; | ||
| 77 | uint32_t stride[VideoPlane::MaxPlanes]; | ||
| 78 | |||
| 79 | int64_t pts; | ||
| 80 | |||
| 81 | KODI_HANDLE videoBufferHandle; //< will be passed in release_frame_buffer | ||
| 82 | }; | ||
| 83 | |||
| 84 | enum VIDEOCODEC_RETVAL | ||
| 85 | { | ||
| 86 | VC_NONE = 0, //< noop | ||
| 87 | VC_ERROR, //< an error occurred, no other messages will be returned | ||
| 88 | VC_BUFFER, //< the decoder needs more data | ||
| 89 | VC_PICTURE, //< the decoder got a picture | ||
| 90 | VC_EOF, //< the decoder signals EOF | ||
| 91 | }; | ||
| 92 | |||
| 93 | // this are properties given to the addon on create | ||
| 94 | // at this time we have no parameters for the addon | ||
| 95 | typedef struct AddonProps_VideoCodec | ||
| 96 | { | ||
| 97 | int dummy; | ||
| 98 | } AddonProps_VideoCodec; | ||
| 99 | |||
| 100 | struct AddonInstance_VideoCodec; | ||
| 101 | typedef struct KodiToAddonFuncTable_VideoCodec | ||
| 102 | { | ||
| 103 | KODI_HANDLE addonInstance; | ||
| 104 | |||
| 105 | //! \brief Opens a codec | ||
| 106 | bool (__cdecl* open) (const AddonInstance_VideoCodec* instance, VIDEOCODEC_INITDATA *initData); | ||
| 107 | |||
| 108 | //! \brief Reconfigures a codec | ||
| 109 | bool (__cdecl* reconfigure) (const AddonInstance_VideoCodec* instance, VIDEOCODEC_INITDATA *initData); | ||
| 110 | |||
| 111 | //! \brief Feed codec if requested from GetPicture() (return VC_BUFFER) | ||
| 112 | bool (__cdecl* add_data) (const AddonInstance_VideoCodec* instance, const DemuxPacket *packet); | ||
| 113 | |||
| 114 | //! \brief Get a decoded picture / request new data | ||
| 115 | VIDEOCODEC_RETVAL (__cdecl* get_picture) (const AddonInstance_VideoCodec* instance, VIDEOCODEC_PICTURE *picture); | ||
| 116 | |||
| 117 | //! \brief Get the name of this video decoder | ||
| 118 | const char *(__cdecl* get_name) (const AddonInstance_VideoCodec* instance); | ||
| 119 | |||
| 120 | //! \brief Reset the codec | ||
| 121 | void (__cdecl* reset)(const AddonInstance_VideoCodec* instance); | ||
| 122 | } KodiToAddonFuncTable_VideoCodec; | ||
| 123 | |||
| 124 | typedef struct AddonToKodiFuncTable_VideoCodec | ||
| 125 | { | ||
| 126 | KODI_HANDLE kodiInstance; | ||
| 127 | bool(*get_frame_buffer)(void* kodiInstance, VIDEOCODEC_PICTURE *picture); | ||
| 128 | void(*release_frame_buffer)(void* kodiInstance, void *buffer); | ||
| 129 | } AddonToKodiFuncTable_VideoCodec; | ||
| 130 | |||
| 131 | typedef struct AddonInstance_VideoCodec | ||
| 132 | { | ||
| 133 | AddonProps_VideoCodec* props; | ||
| 134 | AddonToKodiFuncTable_VideoCodec* toKodi; | ||
| 135 | KodiToAddonFuncTable_VideoCodec* toAddon; | ||
| 136 | } AddonInstance_VideoCodec; | ||
| 137 | } | ||
| 138 | |||
| 139 | namespace kodi | ||
| 140 | { | ||
| 141 | namespace addon | ||
| 142 | { | ||
| 143 | |||
| 144 | class ATTRIBUTE_HIDDEN CInstanceVideoCodec : public IAddonInstance | ||
| 145 | { | ||
| 146 | public: | ||
| 147 | explicit CInstanceVideoCodec(KODI_HANDLE instance, const std::string& kodiVersion = "") | ||
| 148 | : IAddonInstance(ADDON_INSTANCE_VIDEOCODEC, | ||
| 149 | !kodiVersion.empty() ? kodiVersion | ||
| 150 | : GetKodiTypeVersion(ADDON_INSTANCE_VIDEOCODEC)) | ||
| 151 | { | ||
| 152 | if (CAddonBase::m_interface->globalSingleInstance != nullptr) | ||
| 153 | throw std::logic_error("kodi::addon::CInstanceVideoCodec: Creation of multiple together with single instance way is not allowed!"); | ||
| 154 | |||
| 155 | SetAddonStruct(instance); | ||
| 156 | } | ||
| 157 | |||
| 158 | ~CInstanceVideoCodec() override = default; | ||
| 159 | |||
| 160 | //! \copydoc CInstanceVideoCodec::Open | ||
| 161 | virtual bool Open(VIDEOCODEC_INITDATA &initData) { return false; }; | ||
| 162 | |||
| 163 | //! \copydoc CInstanceVideoCodec::Reconfigure | ||
| 164 | virtual bool Reconfigure(VIDEOCODEC_INITDATA &initData) { return false; }; | ||
| 165 | |||
| 166 | //! \copydoc CInstanceVideoCodec::AddData | ||
| 167 | virtual bool AddData(const DemuxPacket &packet) { return false; }; | ||
| 168 | |||
| 169 | //! \copydoc CInstanceVideoCodec::GetPicture | ||
| 170 | virtual VIDEOCODEC_RETVAL GetPicture(VIDEOCODEC_PICTURE &picture) { return VC_ERROR; }; | ||
| 171 | |||
| 172 | //! \copydoc CInstanceVideoCodec::GetName | ||
| 173 | virtual const char *GetName() { return nullptr; }; | ||
| 174 | |||
| 175 | //! \copydoc CInstanceVideoCodec::Reset | ||
| 176 | virtual void Reset() {}; | ||
| 177 | |||
| 178 | /*! | ||
| 179 | * @brief AddonToKodi interface | ||
| 180 | */ | ||
| 181 | |||
| 182 | //! \copydoc CInstanceVideoCodec::GetFrameBuffer | ||
| 183 | bool GetFrameBuffer(VIDEOCODEC_PICTURE &picture) | ||
| 184 | { | ||
| 185 | return m_instanceData->toKodi->get_frame_buffer(m_instanceData->toKodi->kodiInstance, | ||
| 186 | &picture); | ||
| 187 | } | ||
| 188 | |||
| 189 | //! \copydoc CInstanceVideoCodec::ReleaseFrameBuffer | ||
| 190 | void ReleaseFrameBuffer(void *buffer) | ||
| 191 | { | ||
| 192 | return m_instanceData->toKodi->release_frame_buffer(m_instanceData->toKodi->kodiInstance, | ||
| 193 | buffer); | ||
| 194 | } | ||
| 195 | |||
| 196 | private: | ||
| 197 | void SetAddonStruct(KODI_HANDLE instance) | ||
| 198 | { | ||
| 199 | if (instance == nullptr) | ||
| 200 | throw std::logic_error("kodi::addon::CInstanceVideoCodec: Creation with empty addon structure not allowed, table must be given from Kodi!"); | ||
| 201 | |||
| 202 | m_instanceData = static_cast<AddonInstance_VideoCodec*>(instance); | ||
| 203 | |||
| 204 | m_instanceData->toAddon->addonInstance = this; | ||
| 205 | m_instanceData->toAddon->open = ADDON_Open; | ||
| 206 | m_instanceData->toAddon->reconfigure = ADDON_Reconfigure; | ||
| 207 | m_instanceData->toAddon->add_data = ADDON_AddData; | ||
| 208 | m_instanceData->toAddon->get_picture = ADDON_GetPicture; | ||
| 209 | m_instanceData->toAddon->get_name = ADDON_GetName; | ||
| 210 | m_instanceData->toAddon->reset = ADDON_Reset; | ||
| 211 | } | ||
| 212 | |||
| 213 | inline static bool ADDON_Open(const AddonInstance_VideoCodec* instance, VIDEOCODEC_INITDATA *initData) | ||
| 214 | { | ||
| 215 | return static_cast<CInstanceVideoCodec*>(instance->toAddon->addonInstance)->Open(*initData); | ||
| 216 | } | ||
| 217 | |||
| 218 | inline static bool ADDON_Reconfigure(const AddonInstance_VideoCodec* instance, VIDEOCODEC_INITDATA *initData) | ||
| 219 | { | ||
| 220 | return static_cast<CInstanceVideoCodec*>(instance->toAddon->addonInstance) | ||
| 221 | ->Reconfigure(*initData); | ||
| 222 | } | ||
| 223 | |||
| 224 | inline static bool ADDON_AddData(const AddonInstance_VideoCodec* instance, const DemuxPacket *packet) | ||
| 225 | { | ||
| 226 | return static_cast<CInstanceVideoCodec*>(instance->toAddon->addonInstance) | ||
| 227 | ->AddData(*packet); | ||
| 228 | } | ||
| 229 | |||
| 230 | inline static VIDEOCODEC_RETVAL ADDON_GetPicture(const AddonInstance_VideoCodec* instance, VIDEOCODEC_PICTURE *picture) | ||
| 231 | { | ||
| 232 | return static_cast<CInstanceVideoCodec*>(instance->toAddon->addonInstance) | ||
| 233 | ->GetPicture(*picture); | ||
| 234 | } | ||
| 235 | |||
| 236 | inline static const char *ADDON_GetName(const AddonInstance_VideoCodec* instance) | ||
| 237 | { | ||
| 238 | return static_cast<CInstanceVideoCodec*>(instance->toAddon->addonInstance)->GetName(); | ||
| 239 | } | ||
| 240 | |||
| 241 | inline static void ADDON_Reset(const AddonInstance_VideoCodec* instance) | ||
| 242 | { | ||
| 243 | return static_cast<CInstanceVideoCodec*>(instance->toAddon->addonInstance)->Reset(); | ||
| 244 | } | ||
| 245 | |||
| 246 | AddonInstance_VideoCodec* m_instanceData; | ||
| 247 | }; | ||
| 248 | } // namespace addon | ||
| 249 | } // namespace kodi | ||
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Visualization.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Visualization.h new file mode 100644 index 0000000..7b1db65 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Visualization.h | |||
| @@ -0,0 +1,992 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2005-2018 Team Kodi | ||
| 3 | * This file is part of Kodi - https://kodi.tv | ||
| 4 | * | ||
| 5 | * SPDX-License-Identifier: GPL-2.0-or-later | ||
| 6 | * See LICENSES/README.md for more information. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #pragma once | ||
| 10 | |||
| 11 | #include "../AddonBase.h" | ||
| 12 | #include "../c-api/addon-instance/visualization.h" | ||
| 13 | #include "../gui/renderHelper.h" | ||
| 14 | |||
| 15 | #ifdef __cplusplus | ||
| 16 | namespace kodi | ||
| 17 | { | ||
| 18 | namespace addon | ||
| 19 | { | ||
| 20 | |||
| 21 | |||
| 22 | //============================================================================== | ||
| 23 | /// @defgroup cpp_kodi_addon_visualization_Defs_VisualizationTrack class VisualizationTrack | ||
| 24 | /// @ingroup cpp_kodi_addon_visualization_Defs | ||
| 25 | /// @brief **Info tag data structure**\n | ||
| 26 | /// Representation of available information of processed audio file. | ||
| 27 | /// | ||
| 28 | /// This is used to store all the necessary data of audio stream and to have on | ||
| 29 | /// e.g. GUI for information. | ||
| 30 | /// | ||
| 31 | /// Called from @ref kodi::addon::CInstanceVisualization::UpdateTrack() with the | ||
| 32 | /// information of the currently-playing song. | ||
| 33 | /// | ||
| 34 | /// ---------------------------------------------------------------------------- | ||
| 35 | /// | ||
| 36 | /// @copydetails cpp_kodi_addon_visualization_Defs_VisualizationTrack_Help | ||
| 37 | /// | ||
| 38 | ///@{ | ||
| 39 | class VisualizationTrack | ||
| 40 | { | ||
| 41 | /*! \cond PRIVATE */ | ||
| 42 | friend class CInstanceVisualization; | ||
| 43 | /*! \endcond */ | ||
| 44 | |||
| 45 | public: | ||
| 46 | /*! \cond PRIVATE */ | ||
| 47 | VisualizationTrack() = default; | ||
| 48 | VisualizationTrack(const VisualizationTrack& tag) | ||
| 49 | { | ||
| 50 | *this = tag; | ||
| 51 | } | ||
| 52 | |||
| 53 | VisualizationTrack& operator=(const VisualizationTrack& right) | ||
| 54 | { | ||
| 55 | if (&right == this) | ||
| 56 | return *this; | ||
| 57 | |||
| 58 | m_title = right.m_title; | ||
| 59 | m_artist = right.m_artist; | ||
| 60 | m_album = right.m_album; | ||
| 61 | m_albumArtist = right.m_albumArtist; | ||
| 62 | m_genre = right.m_genre; | ||
| 63 | m_comment = right.m_comment; | ||
| 64 | m_lyrics = right.m_lyrics; | ||
| 65 | |||
| 66 | m_trackNumber = right.m_trackNumber; | ||
| 67 | m_discNumber = right.m_discNumber; | ||
| 68 | m_duration = right.m_duration; | ||
| 69 | m_year = right.m_year; | ||
| 70 | m_rating = right.m_rating; | ||
| 71 | return *this; | ||
| 72 | } | ||
| 73 | /*! \endcond */ | ||
| 74 | |||
| 75 | /// @defgroup cpp_kodi_addon_visualization_Defs_VisualizationTrack_Help Value Help | ||
| 76 | /// @ingroup cpp_kodi_addon_visualization_Defs_VisualizationTrack | ||
| 77 | /// | ||
| 78 | /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_visualization_Defs_VisualizationTrack :</b> | ||
| 79 | /// | Name | Type | Set call | Get call | ||
| 80 | /// |------|------|----------|---------- | ||
| 81 | /// | **Title of the current song.** | `std::string` | @ref VisualizationTrack::SetTitle "SetTitle" | @ref VisualizationTrack::GetTitle "GetTitle" | ||
| 82 | /// | **Artist names, as a single string** | `std::string` | @ref VisualizationTrack::SetArtist "SetArtist" | @ref VisualizationTrack::GetArtist "GetArtist" | ||
| 83 | /// | **Album that the current song is from.** | `std::string` | @ref VisualizationTrack::SetAlbum "SetAlbum" | @ref VisualizationTrack::GetAlbum "GetAlbum" | ||
| 84 | /// | **Album artist names, as a single string** | `std::string` | @ref VisualizationTrack::SetAlbumArtist "SetAlbumArtist" | @ref VisualizationTrack::GetAlbumArtist "GetAlbumArtist" | ||
| 85 | /// | **The genre name from the music tag, if present** | `std::string` | @ref VisualizationTrack::SetGenre "SetGenre" | @ref VisualizationTrack::GetGenre "GetGenre" | ||
| 86 | /// | **Duration of the current song, in seconds** | `int` | @ref VisualizationTrack::SetDuration "SetDuration" | @ref VisualizationTrack::GetDuration "GetDuration" | ||
| 87 | /// | **Track number of the current song** | `int` | @ref VisualizationTrack::SetTrack "SetTrack" | @ref VisualizationTrack::GetTrack "GetTrack" | ||
| 88 | /// | **Disc number of the current song stored in the ID tag info** | `int` | @ref VisualizationTrack::SetDisc "SetDisc" | @ref VisualizationTrack::GetDisc "GetDisc" | ||
| 89 | /// | **Year that the current song was released** | `int` | @ref VisualizationTrack::SetYear "SetYear" | @ref VisualizationTrack::GetYear "GetYear" | ||
| 90 | /// | **Lyrics of the current song, if available** | `std::string` | @ref VisualizationTrack::SetLyrics "SetLyrics" | @ref VisualizationTrack::GetLyrics "GetLyrics" | ||
| 91 | /// | **The user-defined rating of the current song** | `int` | @ref VisualizationTrack::SetRating "SetRating" | @ref VisualizationTrack::GetRating "GetRating" | ||
| 92 | /// | **Comment of the current song stored in the ID tag info** | `std::string` | @ref VisualizationTrack::SetComment "SetComment" | @ref VisualizationTrack::GetComment "GetComment" | ||
| 93 | /// | ||
| 94 | |||
| 95 | /// @addtogroup cpp_kodi_addon_visualization_Defs_VisualizationTrack | ||
| 96 | ///@{ | ||
| 97 | |||
| 98 | /// @brief Set title of the current song. | ||
| 99 | void SetTitle(const std::string& title) { m_title = title; } | ||
| 100 | |||
| 101 | /// @brief Get title of the current song. | ||
| 102 | const std::string& GetTitle() const { return m_title; } | ||
| 103 | |||
| 104 | /// @brief Set artist names, as a single string- | ||
| 105 | void SetArtist(const std::string& artist) { m_artist = artist; } | ||
| 106 | |||
| 107 | /// @brief Get artist names, as a single string- | ||
| 108 | const std::string& GetArtist() const { return m_artist; } | ||
| 109 | |||
| 110 | /// @brief Set Album that the current song is from. | ||
| 111 | void SetAlbum(const std::string& album) { m_album = album; } | ||
| 112 | |||
| 113 | /// @brief Get Album that the current song is from. | ||
| 114 | const std::string& GetAlbum() const { return m_album; } | ||
| 115 | |||
| 116 | /// @brief Set album artist names, as a single stringalbum artist name | ||
| 117 | void SetAlbumArtist(const std::string& albumArtist) { m_albumArtist = albumArtist; } | ||
| 118 | |||
| 119 | /// @brief Get album artist names, as a single string- | ||
| 120 | const std::string& GetAlbumArtist() const { return m_albumArtist; } | ||
| 121 | |||
| 122 | /// @brief Set genre name from music as string if present. | ||
| 123 | void SetGenre(const std::string& genre) { m_genre = genre; } | ||
| 124 | |||
| 125 | /// @brief Get genre name from music as string if present. | ||
| 126 | const std::string& GetGenre() const { return m_genre; } | ||
| 127 | |||
| 128 | /// @brief Set the duration of music as integer from info. | ||
| 129 | void SetDuration(int duration) { m_duration = duration; } | ||
| 130 | |||
| 131 | /// @brief Get the duration of music as integer from info. | ||
| 132 | int GetDuration() const { return m_duration; } | ||
| 133 | |||
| 134 | /// @brief Set track number (if present) from music info as integer. | ||
| 135 | void SetTrack(int trackNumber) { m_trackNumber = trackNumber; } | ||
| 136 | |||
| 137 | /// @brief Get track number (if present). | ||
| 138 | int GetTrack() const { return m_trackNumber; } | ||
| 139 | |||
| 140 | /// @brief Set disk number (if present) from music info as integer. | ||
| 141 | void SetDisc(int discNumber) { m_discNumber = discNumber; } | ||
| 142 | |||
| 143 | /// @brief Get disk number (if present) | ||
| 144 | int GetDisc() const { return m_discNumber; } | ||
| 145 | |||
| 146 | /// @brief Set year that the current song was released. | ||
| 147 | void SetYear(int year) { m_year = year; } | ||
| 148 | |||
| 149 | /// @brief Get year that the current song was released. | ||
| 150 | int GetYear() const { return m_year; } | ||
| 151 | |||
| 152 | /// @brief Set string from lyrics. | ||
| 153 | void SetLyrics(const std::string& lyrics) { m_lyrics = lyrics; } | ||
| 154 | |||
| 155 | /// @brief Get string from lyrics. | ||
| 156 | const std::string& GetLyrics() const { return m_lyrics; } | ||
| 157 | |||
| 158 | /// @brief Set the user-defined rating of the current song. | ||
| 159 | void SetRating(int rating) { m_rating = rating; } | ||
| 160 | |||
| 161 | /// @brief Get the user-defined rating of the current song. | ||
| 162 | int GetRating() const { return m_rating; } | ||
| 163 | |||
| 164 | /// @brief Set additional information comment (if present). | ||
| 165 | void SetComment(const std::string& comment) { m_comment = comment; } | ||
| 166 | |||
| 167 | /// @brief Get additional information comment (if present). | ||
| 168 | const std::string& GetComment() const { return m_comment; } | ||
| 169 | |||
| 170 | ///@} | ||
| 171 | |||
| 172 | private: | ||
| 173 | VisualizationTrack(const VIS_TRACK* tag) | ||
| 174 | { | ||
| 175 | if (!tag) | ||
| 176 | return; | ||
| 177 | |||
| 178 | m_title = tag->title ? tag->title : ""; | ||
| 179 | m_artist = tag->artist ? tag->artist : ""; | ||
| 180 | m_album = tag->album ? tag->album : ""; | ||
| 181 | m_albumArtist = tag->albumArtist ? tag->albumArtist : ""; | ||
| 182 | m_genre = tag->genre ? tag->genre : ""; | ||
| 183 | m_comment = tag->comment ? tag->comment : ""; | ||
| 184 | m_lyrics = tag->lyrics ? tag->lyrics : ""; | ||
| 185 | |||
| 186 | m_trackNumber = tag->trackNumber; | ||
| 187 | m_discNumber = tag->discNumber; | ||
| 188 | m_duration = tag->duration; | ||
| 189 | m_year = tag->year; | ||
| 190 | m_rating = tag->rating; | ||
| 191 | } | ||
| 192 | |||
| 193 | std::string m_title; | ||
| 194 | std::string m_artist; | ||
| 195 | std::string m_album; | ||
| 196 | std::string m_albumArtist; | ||
| 197 | std::string m_genre; | ||
| 198 | std::string m_comment; | ||
| 199 | std::string m_lyrics; | ||
| 200 | |||
| 201 | int m_trackNumber = 0; | ||
| 202 | int m_discNumber = 0; | ||
| 203 | int m_duration = 0; | ||
| 204 | int m_year = 0; | ||
| 205 | int m_rating = 0; | ||
| 206 | }; | ||
| 207 | ///@} | ||
| 208 | //------------------------------------------------------------------------------ | ||
| 209 | |||
| 210 | //============================================================================== | ||
| 211 | /// @defgroup cpp_kodi_addon_visualization_Defs Definitions, structures and enumerators | ||
| 212 | /// @ingroup cpp_kodi_addon_visualization | ||
| 213 | /// @brief **Visualization add-on instance definition values**\n | ||
| 214 | /// All visualization functions associated data structures. | ||
| 215 | /// | ||
| 216 | /// Used to exchange the available options between Kodi and addon. | ||
| 217 | /// | ||
| 218 | |||
| 219 | //============================================================================== | ||
| 220 | /// @addtogroup cpp_kodi_addon_visualization | ||
| 221 | /// @brief \cpp_class{ kodi::addon::CInstanceVisualization } | ||
| 222 | /// **Visualization add-on instance**\n | ||
| 223 | /// [Music visualization](https://en.wikipedia.org/wiki/Music_visualization), | ||
| 224 | /// or music visualisation, is a feature in Kodi that generates animated | ||
| 225 | /// imagery based on a piece of music. The imagery is usually generated and | ||
| 226 | /// rendered in real time synchronized to the music. | ||
| 227 | /// | ||
| 228 | /// Visualization techniques range from simple ones (e.g., a simulation of an | ||
| 229 | /// oscilloscope display) to elaborate ones, which often include a plurality | ||
| 230 | /// of composited effects. The changes in the music's loudness and frequency | ||
| 231 | /// spectrum are among the properties used as input to the visualization. | ||
| 232 | /// | ||
| 233 | /// Include the header @ref Visualization.h "#include <kodi/addon-instance/Visualization.h>" | ||
| 234 | /// to use this class. | ||
| 235 | /// | ||
| 236 | /// This interface allows the creation of visualizations for Kodi, based upon | ||
| 237 | /// **DirectX** or/and **OpenGL** rendering with `C++` code. | ||
| 238 | /// | ||
| 239 | /// Additionally, there are several @ref cpp_kodi_addon_visualization_CB "other functions" | ||
| 240 | /// available in which the child class can ask about the current hardware, | ||
| 241 | /// including the device, display and several other parts. | ||
| 242 | /// | ||
| 243 | /// ---------------------------------------------------------------------------- | ||
| 244 | /// | ||
| 245 | /// **Here's an example on addon.xml:** | ||
| 246 | /// ~~~~~~~~~~~~~{.xml} | ||
| 247 | /// <?xml version="1.0" encoding="UTF-8"?> | ||
| 248 | /// <addon | ||
| 249 | /// id="visualization.myspecialnamefor" | ||
| 250 | /// version="1.0.0" | ||
| 251 | /// name="My special visualization addon" | ||
| 252 | /// provider-name="Your Name"> | ||
| 253 | /// <requires>@ADDON_DEPENDS@</requires> | ||
| 254 | /// <extension | ||
| 255 | /// point="xbmc.player.musicviz" | ||
| 256 | /// library_@PLATFORM@="@LIBRARY_FILENAME@"/> | ||
| 257 | /// <extension point="xbmc.addon.metadata"> | ||
| 258 | /// <summary lang="en_GB">My visualization addon addon</summary> | ||
| 259 | /// <description lang="en_GB">My visualization addon description</description> | ||
| 260 | /// <platform>@PLATFORM@</platform> | ||
| 261 | /// </extension> | ||
| 262 | /// </addon> | ||
| 263 | /// ~~~~~~~~~~~~~ | ||
| 264 | /// | ||
| 265 | /// Description to visualization related addon.xml values: | ||
| 266 | /// | Name | Description | ||
| 267 | /// |:------------------------------|---------------------------------------- | ||
| 268 | /// | <b>`point`</b> | Addon type specification<br>At all addon types and for this kind always <b>"xbmc.player.musicviz"</b>. | ||
| 269 | /// | <b>`library_@PLATFORM@`</b> | Sets the used library name, which is automatically set by cmake at addon build. | ||
| 270 | /// | ||
| 271 | /// -------------------------------------------------------------------------- | ||
| 272 | /// | ||
| 273 | /// **Here is an example of the minimum required code to start a visualization:** | ||
| 274 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 275 | /// #include <kodi/addon-instance/Visualization.h> | ||
| 276 | /// | ||
| 277 | /// class CMyVisualization : public kodi::addon::CAddonBase, | ||
| 278 | /// public kodi::addon::CInstanceVisualization | ||
| 279 | /// { | ||
| 280 | /// public: | ||
| 281 | /// CMyVisualization(); | ||
| 282 | /// | ||
| 283 | /// bool Start(int channels, int samplesPerSec, int bitsPerSample, std::string songName) override; | ||
| 284 | /// void AudioData(const float* audioData, int audioDataLength, float* freqData, int freqDataLength) override; | ||
| 285 | /// void Render() override; | ||
| 286 | /// }; | ||
| 287 | /// | ||
| 288 | /// CMyVisualization::CMyVisualization() | ||
| 289 | /// { | ||
| 290 | /// ... | ||
| 291 | /// } | ||
| 292 | /// | ||
| 293 | /// bool CMyVisualization::Start(int channels, int samplesPerSec, int bitsPerSample, std::string songName) | ||
| 294 | /// { | ||
| 295 | /// ... | ||
| 296 | /// return true; | ||
| 297 | /// } | ||
| 298 | /// | ||
| 299 | /// void CMyVisualization::AudioData(const float* audioData, int audioDataLength, float* freqData, int freqDataLength) | ||
| 300 | /// { | ||
| 301 | /// ... | ||
| 302 | /// } | ||
| 303 | /// | ||
| 304 | /// void CMyVisualization::Render() | ||
| 305 | /// { | ||
| 306 | /// ... | ||
| 307 | /// } | ||
| 308 | /// | ||
| 309 | /// ADDONCREATOR(CMyVisualization) | ||
| 310 | /// ~~~~~~~~~~~~~ | ||
| 311 | /// | ||
| 312 | /// | ||
| 313 | /// -------------------------------------------------------------------------- | ||
| 314 | /// | ||
| 315 | /// | ||
| 316 | /// **Here is another example where the visualization is used together with | ||
| 317 | /// other instance types:** | ||
| 318 | /// | ||
| 319 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 320 | /// #include <kodi/addon-instance/Visualization.h> | ||
| 321 | /// | ||
| 322 | /// class CMyVisualization : public kodi::addon::CInstanceVisualization | ||
| 323 | /// { | ||
| 324 | /// public: | ||
| 325 | /// CMyVisualization(KODI_HANDLE instance, const std::string& version); | ||
| 326 | /// | ||
| 327 | /// bool Start(int channels, int samplesPerSec, int bitsPerSample, std::string songName) override; | ||
| 328 | /// void AudioData(const float* audioData, int audioDataLength, float* freqData, int freqDataLength) override; | ||
| 329 | /// void Render() override; | ||
| 330 | /// }; | ||
| 331 | /// | ||
| 332 | /// CMyVisualization::CMyVisualization(KODI_HANDLE instance, const std::string& version) | ||
| 333 | /// : kodi::addon::CInstanceAudioDecoder(instance, version) | ||
| 334 | /// { | ||
| 335 | /// ... | ||
| 336 | /// } | ||
| 337 | /// | ||
| 338 | /// bool CMyVisualization::Start(int channels, int samplesPerSec, int bitsPerSample, std::string songName) | ||
| 339 | /// { | ||
| 340 | /// ... | ||
| 341 | /// return true; | ||
| 342 | /// } | ||
| 343 | /// | ||
| 344 | /// void CMyVisualization::AudioData(const float* audioData, int audioDataLength, float* freqData, int freqDataLength) | ||
| 345 | /// { | ||
| 346 | /// ... | ||
| 347 | /// } | ||
| 348 | /// | ||
| 349 | /// void CMyVisualization::Render() | ||
| 350 | /// { | ||
| 351 | /// ... | ||
| 352 | /// } | ||
| 353 | /// | ||
| 354 | /// | ||
| 355 | /// //---------------------------------------------------------------------- | ||
| 356 | /// | ||
| 357 | /// class CMyAddon : public kodi::addon::CAddonBase | ||
| 358 | /// { | ||
| 359 | /// public: | ||
| 360 | /// CMyAddon() { } | ||
| 361 | /// ADDON_STATUS CreateInstance(int instanceType, | ||
| 362 | /// const std::string& instanceID, | ||
| 363 | /// KODI_HANDLE instance, | ||
| 364 | /// const std::string& version, | ||
| 365 | /// KODI_HANDLE& addonInstance) override; | ||
| 366 | /// }; | ||
| 367 | /// | ||
| 368 | /// // If you use only one instance in your add-on, can be instanceType and | ||
| 369 | /// // instanceID ignored | ||
| 370 | /// ADDON_STATUS CMyAddon::CreateInstance(int instanceType, | ||
| 371 | /// const std::string& instanceID, | ||
| 372 | /// KODI_HANDLE instance, | ||
| 373 | /// const std::string& version, | ||
| 374 | /// KODI_HANDLE& addonInstance) | ||
| 375 | /// { | ||
| 376 | /// if (instanceType == ADDON_INSTANCE_VISUALIZATION) | ||
| 377 | /// { | ||
| 378 | /// kodi::Log(ADDON_LOG_INFO, "Creating my visualization"); | ||
| 379 | /// addonInstance = new CMyVisualization(instance, version); | ||
| 380 | /// return ADDON_STATUS_OK; | ||
| 381 | /// } | ||
| 382 | /// else if (...) | ||
| 383 | /// { | ||
| 384 | /// ... | ||
| 385 | /// } | ||
| 386 | /// return ADDON_STATUS_UNKNOWN; | ||
| 387 | /// } | ||
| 388 | /// | ||
| 389 | /// ADDONCREATOR(CMyAddon) | ||
| 390 | /// ~~~~~~~~~~~~~ | ||
| 391 | /// | ||
| 392 | /// The destruction of the example class `CMyVisualization` is called from | ||
| 393 | /// Kodi's header. Manually deleting the add-on instance is not required. | ||
| 394 | /// | ||
| 395 | class ATTRIBUTE_HIDDEN CInstanceVisualization : public IAddonInstance | ||
| 396 | { | ||
| 397 | public: | ||
| 398 | //============================================================================ | ||
| 399 | /// | ||
| 400 | /// @ingroup cpp_kodi_addon_visualization | ||
| 401 | /// @brief Visualization class constructor | ||
| 402 | /// | ||
| 403 | /// Used by an add-on that only supports visualizations. | ||
| 404 | /// | ||
| 405 | CInstanceVisualization() | ||
| 406 | : IAddonInstance(ADDON_INSTANCE_VISUALIZATION, GetKodiTypeVersion(ADDON_INSTANCE_VISUALIZATION)) | ||
| 407 | { | ||
| 408 | if (CAddonBase::m_interface->globalSingleInstance != nullptr) | ||
| 409 | throw std::logic_error( | ||
| 410 | "kodi::addon::CInstanceVisualization: Cannot create multiple instances of add-on."); | ||
| 411 | |||
| 412 | SetAddonStruct(CAddonBase::m_interface->firstKodiInstance); | ||
| 413 | CAddonBase::m_interface->globalSingleInstance = this; | ||
| 414 | } | ||
| 415 | //---------------------------------------------------------------------------- | ||
| 416 | |||
| 417 | //========================================================================== | ||
| 418 | /// @ingroup cpp_kodi_addon_visualization | ||
| 419 | /// @brief Visualization class constructor used to support multiple instance | ||
| 420 | /// types. | ||
| 421 | /// | ||
| 422 | /// @param[in] instance The instance value given to | ||
| 423 | /// <b>`kodi::addon::CAddonBase::CreateInstance(...)`</b>. | ||
| 424 | /// @param[in] kodiVersion [opt] Version used in Kodi for this instance, to | ||
| 425 | /// allow compatibility to older Kodi versions. | ||
| 426 | /// | ||
| 427 | /// @note Recommended to set <b>`kodiVersion`</b>. | ||
| 428 | /// | ||
| 429 | /// | ||
| 430 | /// -------------------------------------------------------------------------- | ||
| 431 | /// | ||
| 432 | /// **Here's example about the use of this:** | ||
| 433 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 434 | /// class CMyVisualization : public kodi::addon::CInstanceAudioDecoder | ||
| 435 | /// { | ||
| 436 | /// public: | ||
| 437 | /// CMyVisualization(KODI_HANDLE instance, const std::string& kodiVersion) | ||
| 438 | /// : kodi::addon::CInstanceAudioDecoder(instance, kodiVersion) | ||
| 439 | /// { | ||
| 440 | /// ... | ||
| 441 | /// } | ||
| 442 | /// | ||
| 443 | /// ... | ||
| 444 | /// }; | ||
| 445 | /// | ||
| 446 | /// ADDON_STATUS CMyAddon::CreateInstance(int instanceType, | ||
| 447 | /// const std::string& instanceID, | ||
| 448 | /// KODI_HANDLE instance, | ||
| 449 | /// const std::string& version, | ||
| 450 | /// KODI_HANDLE& addonInstance) | ||
| 451 | /// { | ||
| 452 | /// kodi::Log(ADDON_LOG_INFO, "Creating my visualization"); | ||
| 453 | /// addonInstance = new CMyVisualization(instance, version); | ||
| 454 | /// return ADDON_STATUS_OK; | ||
| 455 | /// } | ||
| 456 | /// ~~~~~~~~~~~~~ | ||
| 457 | /// | ||
| 458 | explicit CInstanceVisualization(KODI_HANDLE instance, const std::string& kodiVersion = "") | ||
| 459 | : IAddonInstance(ADDON_INSTANCE_VISUALIZATION, | ||
| 460 | !kodiVersion.empty() ? kodiVersion | ||
| 461 | : GetKodiTypeVersion(ADDON_INSTANCE_VISUALIZATION)) | ||
| 462 | { | ||
| 463 | if (CAddonBase::m_interface->globalSingleInstance != nullptr) | ||
| 464 | throw std::logic_error("kodi::addon::CInstanceVisualization: Creation of multiple together " | ||
| 465 | "with single instance way is not allowed!"); | ||
| 466 | |||
| 467 | SetAddonStruct(instance); | ||
| 468 | } | ||
| 469 | //---------------------------------------------------------------------------- | ||
| 470 | |||
| 471 | //============================================================================ | ||
| 472 | /// @ingroup cpp_kodi_addon_visualization | ||
| 473 | /// @brief Destructor. | ||
| 474 | /// | ||
| 475 | ~CInstanceVisualization() override = default; | ||
| 476 | //---------------------------------------------------------------------------- | ||
| 477 | |||
| 478 | //============================================================================ | ||
| 479 | /// @ingroup cpp_kodi_addon_visualization | ||
| 480 | /// @brief Used to notify the visualization that a new song has been started. | ||
| 481 | /// | ||
| 482 | /// @param[in] channels Number of channels in the stream | ||
| 483 | /// @param[in] samplesPerSec Samples per second of stream | ||
| 484 | /// @param[in] bitsPerSample Number of bits in one sample | ||
| 485 | /// @param[in] songName The name of the currently-playing song | ||
| 486 | /// @return true if start successful done | ||
| 487 | /// | ||
| 488 | virtual bool Start(int channels, int samplesPerSec, int bitsPerSample, std::string songName) | ||
| 489 | { | ||
| 490 | return true; | ||
| 491 | } | ||
| 492 | //---------------------------------------------------------------------------- | ||
| 493 | |||
| 494 | //============================================================================ | ||
| 495 | /// @ingroup cpp_kodi_addon_visualization | ||
| 496 | /// @brief Used to inform the visualization that the rendering control was | ||
| 497 | /// stopped. | ||
| 498 | /// | ||
| 499 | virtual void Stop() {} | ||
| 500 | //---------------------------------------------------------------------------- | ||
| 501 | |||
| 502 | //============================================================================ | ||
| 503 | /// @ingroup cpp_kodi_addon_visualization | ||
| 504 | /// @brief Pass audio data to the visualization. | ||
| 505 | /// | ||
| 506 | /// @param[in] audioData The raw audio data | ||
| 507 | /// @param[in] audioDataLength Length of the audioData array | ||
| 508 | /// @param[in] freqData The [FFT](https://en.wikipedia.org/wiki/Fast_Fourier_transform) | ||
| 509 | /// of the audio data | ||
| 510 | /// @param[in] freqDataLength Length of frequency data array | ||
| 511 | /// | ||
| 512 | /// Values **freqData** and **freqDataLength** are used if GetInfo() returns | ||
| 513 | /// true for the `wantsFreq` parameter. Otherwise, **freqData** is set to | ||
| 514 | /// `nullptr` and **freqDataLength** is `0`. | ||
| 515 | /// | ||
| 516 | virtual void AudioData(const float* audioData, | ||
| 517 | int audioDataLength, | ||
| 518 | float* freqData, | ||
| 519 | int freqDataLength) | ||
| 520 | { | ||
| 521 | } | ||
| 522 | //---------------------------------------------------------------------------- | ||
| 523 | |||
| 524 | //============================================================================ | ||
| 525 | /// @ingroup cpp_kodi_addon_visualization | ||
| 526 | /// @brief Used to inform Kodi that the rendered region is dirty and need an | ||
| 527 | /// update. | ||
| 528 | /// | ||
| 529 | /// @return True if dirty | ||
| 530 | /// | ||
| 531 | virtual bool IsDirty() { return true; } | ||
| 532 | //---------------------------------------------------------------------------- | ||
| 533 | |||
| 534 | //============================================================================ | ||
| 535 | /// @ingroup cpp_kodi_addon_visualization | ||
| 536 | /// @brief Used to indicate when the add-on should render. | ||
| 537 | /// | ||
| 538 | virtual void Render() {} | ||
| 539 | //---------------------------------------------------------------------------- | ||
| 540 | |||
| 541 | //============================================================================ | ||
| 542 | /// @ingroup cpp_kodi_addon_visualization | ||
| 543 | /// @brief Used to get the number of buffers from the current visualization. | ||
| 544 | /// | ||
| 545 | /// @param[out] wantsFreq Indicates whether the add-on wants FFT data. If set | ||
| 546 | /// to true, the **freqData** and **freqDataLength** | ||
| 547 | /// parameters of @ref AudioData() are used | ||
| 548 | /// @param[out] syncDelay The number of buffers to delay before calling | ||
| 549 | /// @ref AudioData() | ||
| 550 | /// | ||
| 551 | /// @note If this function is not implemented, it will default to | ||
| 552 | /// `wantsFreq` = false and `syncDelay` = 0. | ||
| 553 | /// | ||
| 554 | virtual void GetInfo(bool& wantsFreq, int& syncDelay) | ||
| 555 | { | ||
| 556 | wantsFreq = false; | ||
| 557 | syncDelay = 0; | ||
| 558 | } | ||
| 559 | //---------------------------------------------------------------------------- | ||
| 560 | |||
| 561 | //============================================================================ | ||
| 562 | /// @ingroup cpp_kodi_addon_visualization | ||
| 563 | /// @brief Used to get a list of visualization presets the user can select. | ||
| 564 | /// from | ||
| 565 | /// | ||
| 566 | /// @param[out] presets The vector list containing the names of presets that | ||
| 567 | /// the user can select | ||
| 568 | /// @return Return true if successful, or false if there are no presets to | ||
| 569 | /// choose from | ||
| 570 | /// | ||
| 571 | virtual bool GetPresets(std::vector<std::string>& presets) { return false; } | ||
| 572 | //---------------------------------------------------------------------------- | ||
| 573 | |||
| 574 | //============================================================================ | ||
| 575 | /// @ingroup cpp_kodi_addon_visualization | ||
| 576 | /// @brief Get the index of the current preset. | ||
| 577 | /// | ||
| 578 | /// @return Index number of the current preset | ||
| 579 | /// | ||
| 580 | virtual int GetActivePreset() { return -1; } | ||
| 581 | //---------------------------------------------------------------------------- | ||
| 582 | |||
| 583 | //============================================================================ | ||
| 584 | /// @ingroup cpp_kodi_addon_visualization | ||
| 585 | /// @brief Check if the add-on is locked to the current preset. | ||
| 586 | /// | ||
| 587 | /// @return True if locked to the current preset | ||
| 588 | /// | ||
| 589 | virtual bool IsLocked() { return false; } | ||
| 590 | //---------------------------------------------------------------------------- | ||
| 591 | |||
| 592 | //============================================================================ | ||
| 593 | /// @ingroup cpp_kodi_addon_visualization | ||
| 594 | /// @brief Load the previous visualization preset. | ||
| 595 | /// | ||
| 596 | /// @return Return true if the previous preset was loaded | ||
| 597 | /// | ||
| 598 | virtual bool PrevPreset() { return false; } | ||
| 599 | //---------------------------------------------------------------------------- | ||
| 600 | |||
| 601 | //============================================================================ | ||
| 602 | /// @ingroup cpp_kodi_addon_visualization | ||
| 603 | /// @brief Load the next visualization preset. | ||
| 604 | /// | ||
| 605 | /// @return Return true if the next preset was loaded | ||
| 606 | /// | ||
| 607 | virtual bool NextPreset() { return false; } | ||
| 608 | //---------------------------------------------------------------------------- | ||
| 609 | |||
| 610 | //============================================================================ | ||
| 611 | /// @ingroup cpp_kodi_addon_visualization | ||
| 612 | /// @brief Load a visualization preset. | ||
| 613 | /// | ||
| 614 | /// This function is called after a new preset is selected. | ||
| 615 | /// | ||
| 616 | /// @param[in] select Preset index to use | ||
| 617 | /// @return Return true if the preset is loaded | ||
| 618 | /// | ||
| 619 | virtual bool LoadPreset(int select) { return false; } | ||
| 620 | //---------------------------------------------------------------------------- | ||
| 621 | |||
| 622 | //============================================================================ | ||
| 623 | /// @ingroup cpp_kodi_addon_visualization | ||
| 624 | /// @brief Switch to a new random preset. | ||
| 625 | /// | ||
| 626 | /// @return Return true if a random preset was loaded | ||
| 627 | /// | ||
| 628 | virtual bool RandomPreset() { return false; } | ||
| 629 | //---------------------------------------------------------------------------- | ||
| 630 | |||
| 631 | //============================================================================ | ||
| 632 | /// @ingroup cpp_kodi_addon_visualization | ||
| 633 | /// @brief Lock the current visualization preset, preventing it from changing. | ||
| 634 | /// | ||
| 635 | /// @param[in] lockUnlock If set to true, the preset should be locked | ||
| 636 | /// @return Return true if the current preset is locked | ||
| 637 | /// | ||
| 638 | virtual bool LockPreset(bool lockUnlock) { return false; } | ||
| 639 | //---------------------------------------------------------------------------- | ||
| 640 | |||
| 641 | //============================================================================ | ||
| 642 | /// @ingroup cpp_kodi_addon_visualization | ||
| 643 | /// @brief Used to increase/decrease the visualization preset rating. | ||
| 644 | /// | ||
| 645 | /// @param[in] plusMinus If set to true the rating is increased, otherwise | ||
| 646 | /// decreased | ||
| 647 | /// @return Return true if the rating is modified | ||
| 648 | /// | ||
| 649 | virtual bool RatePreset(bool plusMinus) { return false; } | ||
| 650 | //---------------------------------------------------------------------------- | ||
| 651 | |||
| 652 | //============================================================================ | ||
| 653 | /// @ingroup cpp_kodi_addon_visualization | ||
| 654 | /// @brief Inform the visualization of the current album art image. | ||
| 655 | /// | ||
| 656 | /// @param[in] albumart Path to the current album art image | ||
| 657 | /// @return Return true if the image is used | ||
| 658 | /// | ||
| 659 | virtual bool UpdateAlbumart(std::string albumart) { return false; } | ||
| 660 | //---------------------------------------------------------------------------- | ||
| 661 | |||
| 662 | //============================================================================ | ||
| 663 | /// @ingroup cpp_kodi_addon_visualization | ||
| 664 | /// @brief Inform the visualization of the current track's tag information. | ||
| 665 | /// | ||
| 666 | /// @param[in] track Visualization track information structure | ||
| 667 | /// @return Return true if the track information is used | ||
| 668 | /// | ||
| 669 | /// -------------------------------------------------------------------------- | ||
| 670 | /// | ||
| 671 | /// @copydetails cpp_kodi_addon_visualization_Defs_VisualizationTrack_Help | ||
| 672 | /// | ||
| 673 | ///------------------------------------------------------------------------- | ||
| 674 | /// | ||
| 675 | /// **Example:** | ||
| 676 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 677 | /// | ||
| 678 | /// #include <kodi/addon-instance/Visualization.h> | ||
| 679 | /// | ||
| 680 | /// class CMyVisualization : public kodi::addon::CInstanceVisualization | ||
| 681 | /// { | ||
| 682 | /// public: | ||
| 683 | /// CMyVisualization(KODI_HANDLE instance, const std::string& version); | ||
| 684 | /// | ||
| 685 | /// ... | ||
| 686 | /// | ||
| 687 | /// private: | ||
| 688 | /// kodi::addon::VisualizationTrack m_runningTrack; | ||
| 689 | /// }; | ||
| 690 | /// | ||
| 691 | /// bool CMyVisualization::UpdateTrack(const kodi::addon::VisualizationTrack& track) | ||
| 692 | /// { | ||
| 693 | /// m_runningTrack = track; | ||
| 694 | /// return true; | ||
| 695 | /// } | ||
| 696 | /// | ||
| 697 | /// ~~~~~~~~~~~~~ | ||
| 698 | /// | ||
| 699 | virtual bool UpdateTrack(const kodi::addon::VisualizationTrack& track) { return false; } | ||
| 700 | //---------------------------------------------------------------------------- | ||
| 701 | |||
| 702 | //============================================================================ | ||
| 703 | /// @defgroup cpp_kodi_addon_visualization_CB Information functions | ||
| 704 | /// @ingroup cpp_kodi_addon_visualization | ||
| 705 | /// @brief **To get info about the device, display and several other parts**\n | ||
| 706 | /// These are functions to query any values or to transfer them to Kodi. | ||
| 707 | /// | ||
| 708 | ///@{ | ||
| 709 | |||
| 710 | //============================================================================ | ||
| 711 | /// @ingroup cpp_kodi_addon_visualization_CB | ||
| 712 | /// @brief To transfer available presets on addon. | ||
| 713 | /// | ||
| 714 | /// Used if @ref GetPresets not possible to use, e.g. where available presets | ||
| 715 | /// are only known during @ref Start call. | ||
| 716 | /// | ||
| 717 | /// @param[in] presets List to store available presets. | ||
| 718 | /// | ||
| 719 | /// @note The function should only be called once, if possible | ||
| 720 | /// | ||
| 721 | inline void TransferPresets(const std::vector<std::string>& presets) | ||
| 722 | { | ||
| 723 | m_instanceData->toKodi->clear_presets(m_instanceData->toKodi->kodiInstance); | ||
| 724 | for (auto it : presets) | ||
| 725 | m_instanceData->toKodi->transfer_preset(m_instanceData->toKodi->kodiInstance, it.c_str()); | ||
| 726 | } | ||
| 727 | //---------------------------------------------------------------------------- | ||
| 728 | |||
| 729 | //============================================================================ | ||
| 730 | /// @ingroup cpp_kodi_addon_visualization_CB | ||
| 731 | /// @brief Device that represents the display adapter. | ||
| 732 | /// | ||
| 733 | /// @return A pointer to the used device with @ref cpp_kodi_Defs_HardwareContext "HardwareContext" | ||
| 734 | /// | ||
| 735 | /// @note This is only available on **DirectX**, It us unused (`nullptr`) on | ||
| 736 | /// **OpenGL** | ||
| 737 | /// | ||
| 738 | ///------------------------------------------------------------------------- | ||
| 739 | /// | ||
| 740 | /// **Example:** | ||
| 741 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 742 | /// #include <d3d11_1.h> | ||
| 743 | /// .. | ||
| 744 | /// // Note: Device() there is used inside addon child class about | ||
| 745 | /// // kodi::addon::CInstanceVisualization | ||
| 746 | /// ID3D11DeviceContext1* context = static_cast<ID3D11DeviceContext1*>(kodi::addon::CInstanceVisualization::Device()); | ||
| 747 | /// .. | ||
| 748 | /// ~~~~~~~~~~~~~ | ||
| 749 | /// | ||
| 750 | inline kodi::HardwareContext Device() { return m_instanceData->props->device; } | ||
| 751 | //---------------------------------------------------------------------------- | ||
| 752 | |||
| 753 | //============================================================================ | ||
| 754 | /// @ingroup cpp_kodi_addon_visualization_CB | ||
| 755 | /// @brief Returns the X position of the rendering window. | ||
| 756 | /// | ||
| 757 | /// @return The X position, in pixels | ||
| 758 | /// | ||
| 759 | inline int X() { return m_instanceData->props->x; } | ||
| 760 | //---------------------------------------------------------------------------- | ||
| 761 | |||
| 762 | //============================================================================ | ||
| 763 | /// @ingroup cpp_kodi_addon_visualization_CB | ||
| 764 | /// @brief Returns the Y position of the rendering window. | ||
| 765 | /// | ||
| 766 | /// @return The Y position, in pixels | ||
| 767 | /// | ||
| 768 | inline int Y() { return m_instanceData->props->y; } | ||
| 769 | //---------------------------------------------------------------------------- | ||
| 770 | |||
| 771 | //============================================================================ | ||
| 772 | /// @ingroup cpp_kodi_addon_visualization_CB | ||
| 773 | /// @brief Returns the width of the rendering window. | ||
| 774 | /// | ||
| 775 | /// @return The width, in pixels | ||
| 776 | /// | ||
| 777 | inline int Width() { return m_instanceData->props->width; } | ||
| 778 | //---------------------------------------------------------------------------- | ||
| 779 | |||
| 780 | //============================================================================ | ||
| 781 | /// @ingroup cpp_kodi_addon_visualization_CB | ||
| 782 | /// @brief Returns the height of the rendering window. | ||
| 783 | /// | ||
| 784 | /// @return The height, in pixels | ||
| 785 | /// | ||
| 786 | inline int Height() { return m_instanceData->props->height; } | ||
| 787 | //---------------------------------------------------------------------------- | ||
| 788 | |||
| 789 | //============================================================================ | ||
| 790 | /// @ingroup cpp_kodi_addon_visualization_CB | ||
| 791 | /// @brief Pixel aspect ratio (often abbreviated PAR) is a ratio that | ||
| 792 | /// describes how the width of a pixel compares to the height of that pixel. | ||
| 793 | /// | ||
| 794 | /// @return The pixel aspect ratio used by the display | ||
| 795 | /// | ||
| 796 | inline float PixelRatio() { return m_instanceData->props->pixelRatio; } | ||
| 797 | //---------------------------------------------------------------------------- | ||
| 798 | |||
| 799 | //============================================================================ | ||
| 800 | /// @ingroup cpp_kodi_addon_visualization_CB | ||
| 801 | /// @brief Used to get the name of the add-on defined in `addon.xml`. | ||
| 802 | /// | ||
| 803 | /// @return The add-on name | ||
| 804 | /// | ||
| 805 | inline std::string Name() { return m_instanceData->props->name; } | ||
| 806 | //---------------------------------------------------------------------------- | ||
| 807 | |||
| 808 | //============================================================================ | ||
| 809 | /// @ingroup cpp_kodi_addon_visualization_CB | ||
| 810 | /// @brief Used to get the full path where the add-on is installed. | ||
| 811 | /// | ||
| 812 | /// @return The add-on installation path | ||
| 813 | /// | ||
| 814 | inline std::string Presets() { return m_instanceData->props->presets; } | ||
| 815 | //---------------------------------------------------------------------------- | ||
| 816 | |||
| 817 | //============================================================================ | ||
| 818 | /// @ingroup cpp_kodi_addon_visualization_CB | ||
| 819 | /// @brief Used to get the full path to the add-on's user profile. | ||
| 820 | /// | ||
| 821 | /// @note The trailing folder (consisting of the add-on's ID) is not created | ||
| 822 | /// by default. If it is needed, you must call kodi::vfs::CreateDirectory() | ||
| 823 | /// to create the folder. | ||
| 824 | /// | ||
| 825 | /// @return Path to the user profile | ||
| 826 | /// | ||
| 827 | inline std::string Profile() { return m_instanceData->props->profile; } | ||
| 828 | //---------------------------------------------------------------------------- | ||
| 829 | |||
| 830 | ///@} | ||
| 831 | |||
| 832 | private: | ||
| 833 | void SetAddonStruct(KODI_HANDLE instance) | ||
| 834 | { | ||
| 835 | if (instance == nullptr) | ||
| 836 | throw std::logic_error("kodi::addon::CInstanceVisualization: Null pointer instance passed."); | ||
| 837 | |||
| 838 | m_instanceData = static_cast<AddonInstance_Visualization*>(instance); | ||
| 839 | m_instanceData->toAddon->addonInstance = this; | ||
| 840 | m_instanceData->toAddon->start = ADDON_Start; | ||
| 841 | m_instanceData->toAddon->stop = ADDON_Stop; | ||
| 842 | m_instanceData->toAddon->audio_data = ADDON_AudioData; | ||
| 843 | m_instanceData->toAddon->is_dirty = ADDON_IsDirty; | ||
| 844 | m_instanceData->toAddon->render = ADDON_Render; | ||
| 845 | m_instanceData->toAddon->get_info = ADDON_GetInfo; | ||
| 846 | m_instanceData->toAddon->prev_preset = ADDON_PrevPreset; | ||
| 847 | m_instanceData->toAddon->next_preset = ADDON_NextPreset; | ||
| 848 | m_instanceData->toAddon->load_preset = ADDON_LoadPreset; | ||
| 849 | m_instanceData->toAddon->random_preset = ADDON_RandomPreset; | ||
| 850 | m_instanceData->toAddon->lock_preset = ADDON_LockPreset; | ||
| 851 | m_instanceData->toAddon->rate_preset = ADDON_RatePreset; | ||
| 852 | m_instanceData->toAddon->update_albumart = ADDON_UpdateAlbumart; | ||
| 853 | m_instanceData->toAddon->update_track = ADDON_UpdateTrack; | ||
| 854 | m_instanceData->toAddon->get_presets = ADDON_GetPresets; | ||
| 855 | m_instanceData->toAddon->get_active_preset = ADDON_GetActivePreset; | ||
| 856 | m_instanceData->toAddon->is_locked = ADDON_IsLocked; | ||
| 857 | } | ||
| 858 | |||
| 859 | inline static bool ADDON_Start(const AddonInstance_Visualization* addon, | ||
| 860 | int channels, | ||
| 861 | int samplesPerSec, | ||
| 862 | int bitsPerSample, | ||
| 863 | const char* songName) | ||
| 864 | { | ||
| 865 | CInstanceVisualization* thisClass = | ||
| 866 | static_cast<CInstanceVisualization*>(addon->toAddon->addonInstance); | ||
| 867 | thisClass->m_renderHelper = kodi::gui::GetRenderHelper(); | ||
| 868 | return thisClass->Start(channels, samplesPerSec, bitsPerSample, songName); | ||
| 869 | } | ||
| 870 | |||
| 871 | inline static void ADDON_Stop(const AddonInstance_Visualization* addon) | ||
| 872 | { | ||
| 873 | CInstanceVisualization* thisClass = | ||
| 874 | static_cast<CInstanceVisualization*>(addon->toAddon->addonInstance); | ||
| 875 | thisClass->Stop(); | ||
| 876 | thisClass->m_renderHelper = nullptr; | ||
| 877 | } | ||
| 878 | |||
| 879 | inline static void ADDON_AudioData(const AddonInstance_Visualization* addon, | ||
| 880 | const float* audioData, | ||
| 881 | int audioDataLength, | ||
| 882 | float* freqData, | ||
| 883 | int freqDataLength) | ||
| 884 | { | ||
| 885 | static_cast<CInstanceVisualization*>(addon->toAddon->addonInstance) | ||
| 886 | ->AudioData(audioData, audioDataLength, freqData, freqDataLength); | ||
| 887 | } | ||
| 888 | |||
| 889 | inline static bool ADDON_IsDirty(const AddonInstance_Visualization* addon) | ||
| 890 | { | ||
| 891 | return static_cast<CInstanceVisualization*>(addon->toAddon->addonInstance)->IsDirty(); | ||
| 892 | } | ||
| 893 | |||
| 894 | inline static void ADDON_Render(const AddonInstance_Visualization* addon) | ||
| 895 | { | ||
| 896 | CInstanceVisualization* thisClass = | ||
| 897 | static_cast<CInstanceVisualization*>(addon->toAddon->addonInstance); | ||
| 898 | if (!thisClass->m_renderHelper) | ||
| 899 | return; | ||
| 900 | thisClass->m_renderHelper->Begin(); | ||
| 901 | thisClass->Render(); | ||
| 902 | thisClass->m_renderHelper->End(); | ||
| 903 | } | ||
| 904 | |||
| 905 | inline static void ADDON_GetInfo(const AddonInstance_Visualization* addon, VIS_INFO* info) | ||
| 906 | { | ||
| 907 | static_cast<CInstanceVisualization*>(addon->toAddon->addonInstance) | ||
| 908 | ->GetInfo(info->bWantsFreq, info->iSyncDelay); | ||
| 909 | } | ||
| 910 | |||
| 911 | inline static unsigned int ADDON_GetPresets(const AddonInstance_Visualization* addon) | ||
| 912 | { | ||
| 913 | CInstanceVisualization* thisClass = | ||
| 914 | static_cast<CInstanceVisualization*>(addon->toAddon->addonInstance); | ||
| 915 | std::vector<std::string> presets; | ||
| 916 | if (thisClass->GetPresets(presets)) | ||
| 917 | { | ||
| 918 | for (auto it : presets) | ||
| 919 | thisClass->m_instanceData->toKodi->transfer_preset(addon->toKodi->kodiInstance, it.c_str()); | ||
| 920 | } | ||
| 921 | |||
| 922 | return static_cast<unsigned int>(presets.size()); | ||
| 923 | } | ||
| 924 | |||
| 925 | inline static int ADDON_GetActivePreset(const AddonInstance_Visualization* addon) | ||
| 926 | { | ||
| 927 | return static_cast<CInstanceVisualization*>(addon->toAddon->addonInstance)->GetActivePreset(); | ||
| 928 | } | ||
| 929 | |||
| 930 | inline static bool ADDON_PrevPreset(const AddonInstance_Visualization* addon) | ||
| 931 | { | ||
| 932 | return static_cast<CInstanceVisualization*>(addon->toAddon->addonInstance)->PrevPreset(); | ||
| 933 | } | ||
| 934 | |||
| 935 | inline static bool ADDON_NextPreset(const AddonInstance_Visualization* addon) | ||
| 936 | { | ||
| 937 | return static_cast<CInstanceVisualization*>(addon->toAddon->addonInstance)->NextPreset(); | ||
| 938 | } | ||
| 939 | |||
| 940 | inline static bool ADDON_LoadPreset(const AddonInstance_Visualization* addon, int select) | ||
| 941 | |||
| 942 | { | ||
| 943 | return static_cast<CInstanceVisualization*>(addon->toAddon->addonInstance)->LoadPreset(select); | ||
| 944 | } | ||
| 945 | |||
| 946 | inline static bool ADDON_RandomPreset(const AddonInstance_Visualization* addon) | ||
| 947 | { | ||
| 948 | return static_cast<CInstanceVisualization*>(addon->toAddon->addonInstance)->RandomPreset(); | ||
| 949 | } | ||
| 950 | |||
| 951 | inline static bool ADDON_LockPreset(const AddonInstance_Visualization* addon) | ||
| 952 | { | ||
| 953 | CInstanceVisualization* thisClass = | ||
| 954 | static_cast<CInstanceVisualization*>(addon->toAddon->addonInstance); | ||
| 955 | thisClass->m_presetLockedByUser = !thisClass->m_presetLockedByUser; | ||
| 956 | return thisClass->LockPreset(thisClass->m_presetLockedByUser); | ||
| 957 | } | ||
| 958 | |||
| 959 | inline static bool ADDON_RatePreset(const AddonInstance_Visualization* addon, bool plus_minus) | ||
| 960 | { | ||
| 961 | return static_cast<CInstanceVisualization*>(addon->toAddon->addonInstance) | ||
| 962 | ->RatePreset(plus_minus); | ||
| 963 | } | ||
| 964 | |||
| 965 | inline static bool ADDON_IsLocked(const AddonInstance_Visualization* addon) | ||
| 966 | { | ||
| 967 | return static_cast<CInstanceVisualization*>(addon->toAddon->addonInstance)->IsLocked(); | ||
| 968 | } | ||
| 969 | |||
| 970 | inline static bool ADDON_UpdateAlbumart(const AddonInstance_Visualization* addon, | ||
| 971 | const char* albumart) | ||
| 972 | { | ||
| 973 | return static_cast<CInstanceVisualization*>(addon->toAddon->addonInstance) | ||
| 974 | ->UpdateAlbumart(albumart); | ||
| 975 | } | ||
| 976 | |||
| 977 | inline static bool ADDON_UpdateTrack(const AddonInstance_Visualization* addon, | ||
| 978 | const VIS_TRACK* track) | ||
| 979 | { | ||
| 980 | VisualizationTrack cppTrack(track); | ||
| 981 | return static_cast<CInstanceVisualization*>(addon->toAddon->addonInstance) | ||
| 982 | ->UpdateTrack(cppTrack); | ||
| 983 | } | ||
| 984 | |||
| 985 | std::shared_ptr<kodi::gui::IRenderHelper> m_renderHelper; | ||
| 986 | bool m_presetLockedByUser = false; | ||
| 987 | AddonInstance_Visualization* m_instanceData; | ||
| 988 | }; | ||
| 989 | |||
| 990 | } /* namespace addon */ | ||
| 991 | } /* namespace kodi */ | ||
| 992 | #endif /* __cplusplus */ | ||
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/peripheral/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/peripheral/CMakeLists.txt new file mode 100644 index 0000000..d6fba69 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/peripheral/CMakeLists.txt | |||
| @@ -0,0 +1,5 @@ | |||
| 1 | set(HEADERS PeripheralUtils.h) | ||
| 2 | |||
| 3 | if(NOT ENABLE_STATIC_LIBS) | ||
| 4 | core_add_library(addons_kodi-dev-kit_include_kodi_addon-instance_peripheral) | ||
| 5 | endif() | ||
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/peripheral/PeripheralUtils.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/peripheral/PeripheralUtils.h new file mode 100644 index 0000000..febaeb9 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/peripheral/PeripheralUtils.h | |||
| @@ -0,0 +1,1277 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2014-2018 Team Kodi | ||
| 3 | * This file is part of Kodi - https://kodi.tv | ||
| 4 | * | ||
| 5 | * SPDX-License-Identifier: GPL-2.0-or-later | ||
| 6 | * See LICENSES/README.md for more information. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #pragma once | ||
| 10 | |||
| 11 | #include "../../AddonBase.h" | ||
| 12 | #include "../../c-api/addon-instance/peripheral.h" | ||
| 13 | |||
| 14 | #ifdef __cplusplus | ||
| 15 | |||
| 16 | #include <array> // Requires c++11 | ||
| 17 | #include <cstring> | ||
| 18 | #include <memory> | ||
| 19 | #include <string> | ||
| 20 | #include <utility> | ||
| 21 | #include <vector> | ||
| 22 | |||
| 23 | #define PERIPHERAL_SAFE_DELETE(x) \ | ||
| 24 | do \ | ||
| 25 | { \ | ||
| 26 | delete (x); \ | ||
| 27 | (x) = NULL; \ | ||
| 28 | } while (0) | ||
| 29 | #define PERIPHERAL_SAFE_DELETE_ARRAY(x) \ | ||
| 30 | do \ | ||
| 31 | { \ | ||
| 32 | delete[](x); \ | ||
| 33 | (x) = NULL; \ | ||
| 34 | } while (0) | ||
| 35 | |||
| 36 | namespace kodi | ||
| 37 | { | ||
| 38 | namespace addon | ||
| 39 | { | ||
| 40 | |||
| 41 | class CInstancePeripheral; | ||
| 42 | |||
| 43 | /*! | ||
| 44 | * Utility class to manipulate arrays of peripheral types. | ||
| 45 | */ | ||
| 46 | template<class THE_CLASS, typename THE_STRUCT> | ||
| 47 | class PeripheralVector | ||
| 48 | { | ||
| 49 | public: | ||
| 50 | static void ToStructs(const std::vector<THE_CLASS>& vecObjects, THE_STRUCT** pStructs) | ||
| 51 | { | ||
| 52 | if (!pStructs) | ||
| 53 | return; | ||
| 54 | |||
| 55 | if (vecObjects.empty()) | ||
| 56 | { | ||
| 57 | *pStructs = NULL; | ||
| 58 | } | ||
| 59 | else | ||
| 60 | { | ||
| 61 | (*pStructs) = new THE_STRUCT[vecObjects.size()]; | ||
| 62 | for (unsigned int i = 0; i < vecObjects.size(); i++) | ||
| 63 | vecObjects.at(i).ToStruct((*pStructs)[i]); | ||
| 64 | } | ||
| 65 | } | ||
| 66 | |||
| 67 | static void ToStructs(const std::vector<THE_CLASS*>& vecObjects, THE_STRUCT** pStructs) | ||
| 68 | { | ||
| 69 | if (!pStructs) | ||
| 70 | return; | ||
| 71 | |||
| 72 | if (vecObjects.empty()) | ||
| 73 | { | ||
| 74 | *pStructs = NULL; | ||
| 75 | } | ||
| 76 | else | ||
| 77 | { | ||
| 78 | *pStructs = new THE_STRUCT[vecObjects.size()]; | ||
| 79 | for (unsigned int i = 0; i < vecObjects.size(); i++) | ||
| 80 | vecObjects.at(i)->ToStruct((*pStructs)[i]); | ||
| 81 | } | ||
| 82 | } | ||
| 83 | |||
| 84 | static void ToStructs(const std::vector<std::shared_ptr<THE_CLASS>>& vecObjects, | ||
| 85 | THE_STRUCT** pStructs) | ||
| 86 | { | ||
| 87 | if (!pStructs) | ||
| 88 | return; | ||
| 89 | |||
| 90 | if (vecObjects.empty()) | ||
| 91 | { | ||
| 92 | *pStructs = NULL; | ||
| 93 | } | ||
| 94 | else | ||
| 95 | { | ||
| 96 | *pStructs = new THE_STRUCT[vecObjects.size()]; | ||
| 97 | for (unsigned int i = 0; i < vecObjects.size(); i++) | ||
| 98 | vecObjects.at(i)->ToStruct((*pStructs)[i]); | ||
| 99 | } | ||
| 100 | } | ||
| 101 | |||
| 102 | static void FreeStructs(unsigned int structCount, THE_STRUCT* structs) | ||
| 103 | { | ||
| 104 | if (structs) | ||
| 105 | { | ||
| 106 | for (unsigned int i = 0; i < structCount; i++) | ||
| 107 | THE_CLASS::FreeStruct(structs[i]); | ||
| 108 | } | ||
| 109 | PERIPHERAL_SAFE_DELETE_ARRAY(structs); | ||
| 110 | } | ||
| 111 | }; | ||
| 112 | |||
| 113 | //============================================================================== | ||
| 114 | /// @defgroup cpp_kodi_addon_peripheral_Defs_PeripheralCapabilities class PeripheralCapabilities | ||
| 115 | /// @ingroup cpp_kodi_addon_peripheral_Defs_General | ||
| 116 | /// @brief **%Peripheral add-on capabilities**\n | ||
| 117 | /// This class is needed to tell Kodi which options are supported on the addon. | ||
| 118 | /// | ||
| 119 | /// If a capability is set to **true**, then the corresponding methods from | ||
| 120 | /// @ref cpp_kodi_addon_peripheral "kodi::addon::CInstancePeripheral" need to be | ||
| 121 | /// implemented. | ||
| 122 | /// | ||
| 123 | /// As default them all set to **false**. | ||
| 124 | /// | ||
| 125 | /// Used on @ref kodi::addon::CInstancePeripheral::GetCapabilities(). | ||
| 126 | /// | ||
| 127 | /// ---------------------------------------------------------------------------- | ||
| 128 | /// | ||
| 129 | /// @copydetails cpp_kodi_addon_peripheral_Defs_PeripheralCapabilities_Help | ||
| 130 | /// | ||
| 131 | ///@{ | ||
| 132 | class PeripheralCapabilities : public CStructHdl<PeripheralCapabilities, PERIPHERAL_CAPABILITIES> | ||
| 133 | { | ||
| 134 | /*! \cond PRIVATE */ | ||
| 135 | friend class CInstancePeripheral; | ||
| 136 | /*! \endcond */ | ||
| 137 | |||
| 138 | public: | ||
| 139 | /*! \cond PRIVATE */ | ||
| 140 | PeripheralCapabilities() | ||
| 141 | { | ||
| 142 | m_cStructure->provides_joysticks = false; | ||
| 143 | m_cStructure->provides_joystick_rumble = false; | ||
| 144 | m_cStructure->provides_joystick_power_off = false; | ||
| 145 | m_cStructure->provides_buttonmaps = false; | ||
| 146 | } | ||
| 147 | |||
| 148 | PeripheralCapabilities(const PeripheralCapabilities& data) : CStructHdl(data) {} | ||
| 149 | /*! \endcond */ | ||
| 150 | |||
| 151 | /// @defgroup cpp_kodi_addon_peripheral_Defs_PeripheralCapabilities_Help Value Help | ||
| 152 | /// @ingroup cpp_kodi_addon_peripheral_Defs_PeripheralCapabilities | ||
| 153 | /// ---------------------------------------------------------------------------- | ||
| 154 | /// | ||
| 155 | /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_peripheral_Defs_PeripheralCapabilities :</b> | ||
| 156 | /// | Name | Type | Set call | Get call | ||
| 157 | /// |------|------|----------|---------- | ||
| 158 | /// | **Provides joysticks** | `boolean` | @ref PeripheralCapabilities::SetProvidesJoysticks "SetProvidesJoysticks" | @ref PeripheralCapabilities::GetProvidesJoysticks "GetProvidesJoysticks" | ||
| 159 | /// | **Provides joystick rumble** | `boolean` | @ref PeripheralCapabilities::SetProvidesJoystickRumble "SetProvidesJoystickRumble" | @ref PeripheralCapabilities::GetProvidesJoystickRumble "GetProvidesJoystickRumble" | ||
| 160 | /// | **Provides joystick power off** | `boolean` | @ref PeripheralCapabilities::SetProvidesJoystickPowerOff "SetProvidesJoystickPowerOff" | @ref PeripheralCapabilities::GetProvidesJoystickPowerOff "GetProvidesJoystickPowerOff" | ||
| 161 | /// | **Provides button maps** | `boolean` | @ref PeripheralCapabilities::SetProvidesButtonmaps "SetProvidesButtonmaps" | @ref PeripheralCapabilities::GetProvidesButtonmaps "GetProvidesButtonmaps" | ||
| 162 | |||
| 163 | /// @addtogroup cpp_kodi_addon_peripheral_Defs_PeripheralCapabilities | ||
| 164 | ///@{ | ||
| 165 | |||
| 166 | /// @brief Set true if the add-on provides joysticks. | ||
| 167 | void SetProvidesJoysticks(bool providesJoysticks) | ||
| 168 | { | ||
| 169 | m_cStructure->provides_joysticks = providesJoysticks; | ||
| 170 | } | ||
| 171 | |||
| 172 | /// @brief To get with @ref SetProvidesJoysticks changed values. | ||
| 173 | bool GetProvidesJoysticks() const { return m_cStructure->provides_joysticks; } | ||
| 174 | |||
| 175 | /// @brief Set true if the add-on provides joystick rumble. | ||
| 176 | void SetProvidesJoystickRumble(bool providesJoystickRumble) | ||
| 177 | { | ||
| 178 | m_cStructure->provides_joystick_rumble = providesJoystickRumble; | ||
| 179 | } | ||
| 180 | |||
| 181 | /// @brief To get with @ref SetProvidesJoystickRumble changed values. | ||
| 182 | bool GetProvidesJoystickRumble() const { return m_cStructure->provides_joystick_rumble; } | ||
| 183 | |||
| 184 | /// @brief Set true if the add-on provides power off about joystick. | ||
| 185 | void SetProvidesJoystickPowerOff(bool providesJoystickPowerOff) | ||
| 186 | { | ||
| 187 | m_cStructure->provides_joystick_power_off = providesJoystickPowerOff; | ||
| 188 | } | ||
| 189 | |||
| 190 | /// @brief To get with @ref SetProvidesJoystickPowerOff changed values. | ||
| 191 | bool GetProvidesJoystickPowerOff() const { return m_cStructure->provides_joystick_power_off; } | ||
| 192 | |||
| 193 | /// @brief Set true if the add-on provides button maps. | ||
| 194 | void SetProvidesButtonmaps(bool providesButtonmaps) | ||
| 195 | { | ||
| 196 | m_cStructure->provides_buttonmaps = providesButtonmaps; | ||
| 197 | } | ||
| 198 | |||
| 199 | /// @brief To get with @ref SetProvidesButtonmaps changed values. | ||
| 200 | bool GetProvidesButtonmaps() const { return m_cStructure->provides_buttonmaps; } | ||
| 201 | |||
| 202 | ///@} | ||
| 203 | |||
| 204 | private: | ||
| 205 | PeripheralCapabilities(const PERIPHERAL_CAPABILITIES* data) : CStructHdl(data) {} | ||
| 206 | PeripheralCapabilities(PERIPHERAL_CAPABILITIES* data) : CStructHdl(data) {} | ||
| 207 | }; | ||
| 208 | ///@} | ||
| 209 | //------------------------------------------------------------------------------ | ||
| 210 | |||
| 211 | //============================================================================== | ||
| 212 | /// @defgroup cpp_kodi_addon_peripheral_Defs_Peripheral_Peripheral class Peripheral | ||
| 213 | /// @ingroup cpp_kodi_addon_peripheral_Defs_Peripheral | ||
| 214 | /// @brief **Wrapper class providing peripheral information**\n | ||
| 215 | /// Classes can extend %Peripheral to inherit peripheral properties. | ||
| 216 | /// | ||
| 217 | /// Used on @ref kodi::addon::CInstancePeripheral::PerformDeviceScan(). | ||
| 218 | /// | ||
| 219 | /// ---------------------------------------------------------------------------- | ||
| 220 | /// | ||
| 221 | /// @copydetails cpp_kodi_addon_peripheral_Defs_Peripheral_Peripheral_Help | ||
| 222 | /// | ||
| 223 | ///@{ | ||
| 224 | class Peripheral | ||
| 225 | { | ||
| 226 | public: | ||
| 227 | /// @defgroup cpp_kodi_addon_peripheral_Defs_Peripheral_Peripheral_Help Value Help | ||
| 228 | /// @ingroup cpp_kodi_addon_peripheral_Defs_Peripheral_Peripheral | ||
| 229 | /// ---------------------------------------------------------------------------- | ||
| 230 | /// | ||
| 231 | /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_peripheral_Defs_Peripheral_Peripheral :</b> | ||
| 232 | /// | Name | Type | Set call | Get call | ||
| 233 | /// |------|------|----------|---------- | ||
| 234 | /// | **%Peripheral type** | @ref PERIPHERAL_TYPE | @ref Peripheral::SetType "SetType" | @ref Peripheral::Type "Type" | ||
| 235 | /// | **%Peripheral name** | `const std::string&` | @ref Peripheral::SetName "SetName" | @ref Peripheral::Name "Name" | ||
| 236 | /// | **%Peripheral vendor id** | `uint16_t` | @ref Peripheral::SetVendorID "SetVendorID" | @ref Peripheral::VendorID "VendorID" | ||
| 237 | /// | **%Peripheral product id** | `uint16_t` | @ref Peripheral::SetProductID "SetProductID" | @ref Peripheral::ProductID "ProductID" | ||
| 238 | /// | **%Peripheral index** | `unsigned int` | @ref Peripheral::SetIndex "SetIndex" | @ref Peripheral::Index "Index" | ||
| 239 | /// | ||
| 240 | /// Further are following included: | ||
| 241 | /// - @ref Peripheral::Peripheral "Peripheral(PERIPHERAL_TYPE type = PERIPHERAL_TYPE_UNKNOWN, const std::string& strName = \"\")": Class constructor. | ||
| 242 | /// - @ref Peripheral::IsVidPidKnown "IsVidPidKnown()": To check VID and PID are known. | ||
| 243 | /// | ||
| 244 | |||
| 245 | /// @addtogroup cpp_kodi_addon_peripheral_Defs_Peripheral_Peripheral | ||
| 246 | ///@{ | ||
| 247 | |||
| 248 | /// @brief Constructor. | ||
| 249 | /// | ||
| 250 | /// @param[in] type [optional] Peripheral type, or @ref PERIPHERAL_TYPE_UNKNOWN | ||
| 251 | /// as default | ||
| 252 | /// @param[in] strName [optional] Name of related peripheral | ||
| 253 | Peripheral(PERIPHERAL_TYPE type = PERIPHERAL_TYPE_UNKNOWN, const std::string& strName = "") | ||
| 254 | : m_type(type), m_strName(strName) | ||
| 255 | { | ||
| 256 | } | ||
| 257 | |||
| 258 | /// @brief Destructor. | ||
| 259 | virtual ~Peripheral(void) = default; | ||
| 260 | |||
| 261 | /// @brief Get peripheral type. | ||
| 262 | /// | ||
| 263 | /// @return Type defined with @ref PERIPHERAL_TYPE | ||
| 264 | PERIPHERAL_TYPE Type(void) const { return m_type; } | ||
| 265 | |||
| 266 | /// @brief Get peripheral name. | ||
| 267 | /// | ||
| 268 | /// @return Name string of peripheral | ||
| 269 | const std::string& Name(void) const { return m_strName; } | ||
| 270 | |||
| 271 | /// @brief Get peripheral vendor id. | ||
| 272 | /// | ||
| 273 | /// @return Vendor id | ||
| 274 | uint16_t VendorID(void) const { return m_vendorId; } | ||
| 275 | |||
| 276 | /// @brief Get peripheral product id. | ||
| 277 | /// | ||
| 278 | /// @return Product id | ||
| 279 | uint16_t ProductID(void) const { return m_productId; } | ||
| 280 | |||
| 281 | /// @brief Get peripheral index identifier. | ||
| 282 | /// | ||
| 283 | /// @return Index number | ||
| 284 | unsigned int Index(void) const { return m_index; } | ||
| 285 | |||
| 286 | /// @brief Check VID and PID are known. | ||
| 287 | /// | ||
| 288 | /// @return true if VID and PID are not 0 | ||
| 289 | /// | ||
| 290 | /// @note Derived property: VID and PID are `0x0000` if unknown | ||
| 291 | bool IsVidPidKnown(void) const { return m_vendorId != 0 || m_productId != 0; } | ||
| 292 | |||
| 293 | /// @brief Set peripheral type. | ||
| 294 | /// | ||
| 295 | /// @param[in] type Type to set | ||
| 296 | void SetType(PERIPHERAL_TYPE type) { m_type = type; } | ||
| 297 | |||
| 298 | /// @brief Set peripheral name. | ||
| 299 | /// | ||
| 300 | /// @param[in] strName Name to set | ||
| 301 | void SetName(const std::string& strName) { m_strName = strName; } | ||
| 302 | |||
| 303 | /// @brief Set peripheral vendor id. | ||
| 304 | /// | ||
| 305 | /// @param[in] vendorId Type to set | ||
| 306 | void SetVendorID(uint16_t vendorId) { m_vendorId = vendorId; } | ||
| 307 | |||
| 308 | /// @brief Set peripheral product identifier. | ||
| 309 | /// | ||
| 310 | /// @param[in] productId Type to set | ||
| 311 | void SetProductID(uint16_t productId) { m_productId = productId; } | ||
| 312 | |||
| 313 | /// @brief Set peripheral index. | ||
| 314 | /// | ||
| 315 | /// @param[in] index Type to set | ||
| 316 | void SetIndex(unsigned int index) { m_index = index; } | ||
| 317 | |||
| 318 | ///@} | ||
| 319 | |||
| 320 | explicit Peripheral(const PERIPHERAL_INFO& info) | ||
| 321 | : m_type(info.type), | ||
| 322 | m_strName(info.name ? info.name : ""), | ||
| 323 | m_vendorId(info.vendor_id), | ||
| 324 | m_productId(info.product_id), | ||
| 325 | m_index(info.index) | ||
| 326 | { | ||
| 327 | } | ||
| 328 | |||
| 329 | void ToStruct(PERIPHERAL_INFO& info) const | ||
| 330 | { | ||
| 331 | info.type = m_type; | ||
| 332 | info.name = new char[m_strName.size() + 1]; | ||
| 333 | info.vendor_id = m_vendorId; | ||
| 334 | info.product_id = m_productId; | ||
| 335 | info.index = m_index; | ||
| 336 | |||
| 337 | std::strcpy(info.name, m_strName.c_str()); | ||
| 338 | } | ||
| 339 | |||
| 340 | static void FreeStruct(PERIPHERAL_INFO& info) { PERIPHERAL_SAFE_DELETE_ARRAY(info.name); } | ||
| 341 | |||
| 342 | private: | ||
| 343 | PERIPHERAL_TYPE m_type; | ||
| 344 | std::string m_strName; | ||
| 345 | uint16_t m_vendorId = 0; | ||
| 346 | uint16_t m_productId = 0; | ||
| 347 | unsigned int m_index = 0; | ||
| 348 | }; | ||
| 349 | ///@} | ||
| 350 | //------------------------------------------------------------------------------ | ||
| 351 | |||
| 352 | typedef PeripheralVector<Peripheral, PERIPHERAL_INFO> Peripherals; | ||
| 353 | |||
| 354 | //============================================================================== | ||
| 355 | /// @defgroup cpp_kodi_addon_peripheral_Defs_Peripheral_PeripheralEvent class PeripheralEvent | ||
| 356 | /// @ingroup cpp_kodi_addon_peripheral_Defs_Peripheral | ||
| 357 | /// @brief **Wrapper class for %peripheral events**\n | ||
| 358 | /// To handle data of change events between add-on and Kodi. | ||
| 359 | /// | ||
| 360 | /// Used on @ref kodi::addon::CInstancePeripheral::GetEvents() and | ||
| 361 | /// @ref kodi::addon::CInstancePeripheral::SendEvent(). | ||
| 362 | /// | ||
| 363 | /// ---------------------------------------------------------------------------- | ||
| 364 | /// | ||
| 365 | /// @copydetails cpp_kodi_addon_peripheral_Defs_Peripheral_PeripheralEvent_Help | ||
| 366 | /// | ||
| 367 | ///@{ | ||
| 368 | class PeripheralEvent | ||
| 369 | { | ||
| 370 | public: | ||
| 371 | /// @defgroup cpp_kodi_addon_peripheral_Defs_Peripheral_PeripheralEvent_Help Value Help | ||
| 372 | /// @ingroup cpp_kodi_addon_peripheral_Defs_Peripheral_PeripheralEvent | ||
| 373 | /// ---------------------------------------------------------------------------- | ||
| 374 | /// | ||
| 375 | /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_peripheral_Defs_Peripheral_PeripheralEvent :</b> | ||
| 376 | /// | Name | Type | Set call | Get call | ||
| 377 | /// |------|------|----------|---------- | ||
| 378 | /// | **%Peripheral event type** | @ref PERIPHERAL_EVENT_TYPE | @ref PeripheralEvent::SetType "SetType" | @ref PeripheralEvent::Type "Type" | ||
| 379 | /// | **%Peripheral index** | `unsigned int` | @ref PeripheralEvent::SetPeripheralIndex "SetPeripheralIndex" | @ref PeripheralEvent::PeripheralIndex "PeripheralIndex" | ||
| 380 | /// | **%Peripheral event driver index** | `unsigned int` | @ref PeripheralEvent::SetDriverIndex "SetDriverIndex" | @ref PeripheralEvent::DriverIndex "DriverIndex" | ||
| 381 | /// | **%Peripheral event button state** | @ref JOYSTICK_STATE_BUTTON | @ref PeripheralEvent::SetButtonState "SetButtonState" | @ref PeripheralEvent::ButtonState "ButtonState" | ||
| 382 | /// | **%Peripheral event hat state** | @ref JOYSTICK_STATE_HAT | @ref PeripheralEvent::SetHatState "SetHatState" | @ref PeripheralEvent::HatState "HatState" | ||
| 383 | /// | **%Peripheral event axis state** | @ref JOYSTICK_STATE_AXIS (`float`) | @ref PeripheralEvent::SetAxisState "SetAxisState" | @ref PeripheralEvent::AxisState "AxisState" | ||
| 384 | /// | **%Peripheral event motor state** | @ref JOYSTICK_STATE_MOTOR (`float`) | @ref PeripheralEvent::SetMotorState "SetMotorState" | @ref PeripheralEvent::MotorState "MotorState" | ||
| 385 | /// | ||
| 386 | /// Further are several class constructors with values included. | ||
| 387 | |||
| 388 | /// @addtogroup cpp_kodi_addon_peripheral_Defs_Peripheral_PeripheralEvent | ||
| 389 | ///@{ | ||
| 390 | |||
| 391 | /// @brief Constructor. | ||
| 392 | PeripheralEvent() = default; | ||
| 393 | |||
| 394 | /// @brief Constructor. | ||
| 395 | /// | ||
| 396 | /// @param[in] peripheralIndex %Peripheral index | ||
| 397 | /// @param[in] buttonIndex Button index | ||
| 398 | /// @param[in] state Joystick state button | ||
| 399 | PeripheralEvent(unsigned int peripheralIndex, | ||
| 400 | unsigned int buttonIndex, | ||
| 401 | JOYSTICK_STATE_BUTTON state) | ||
| 402 | : m_type(PERIPHERAL_EVENT_TYPE_DRIVER_BUTTON), | ||
| 403 | m_peripheralIndex(peripheralIndex), | ||
| 404 | m_driverIndex(buttonIndex), | ||
| 405 | m_buttonState(state) | ||
| 406 | { | ||
| 407 | } | ||
| 408 | |||
| 409 | /// @brief Constructor. | ||
| 410 | /// | ||
| 411 | /// @param[in] peripheralIndex %Peripheral index | ||
| 412 | /// @param[in] hatIndex Hat index | ||
| 413 | /// @param[in] state Joystick state hat | ||
| 414 | PeripheralEvent(unsigned int peripheralIndex, unsigned int hatIndex, JOYSTICK_STATE_HAT state) | ||
| 415 | : m_type(PERIPHERAL_EVENT_TYPE_DRIVER_HAT), | ||
| 416 | m_peripheralIndex(peripheralIndex), | ||
| 417 | m_driverIndex(hatIndex), | ||
| 418 | m_hatState(state) | ||
| 419 | { | ||
| 420 | } | ||
| 421 | |||
| 422 | /// @brief Constructor. | ||
| 423 | /// | ||
| 424 | /// @param[in] peripheralIndex %Peripheral index | ||
| 425 | /// @param[in] axisIndex Axis index | ||
| 426 | /// @param[in] state Joystick state axis | ||
| 427 | PeripheralEvent(unsigned int peripheralIndex, unsigned int axisIndex, JOYSTICK_STATE_AXIS state) | ||
| 428 | : m_type(PERIPHERAL_EVENT_TYPE_DRIVER_AXIS), | ||
| 429 | m_peripheralIndex(peripheralIndex), | ||
| 430 | m_driverIndex(axisIndex), | ||
| 431 | m_axisState(state) | ||
| 432 | { | ||
| 433 | } | ||
| 434 | |||
| 435 | /// @brief Get type of event. | ||
| 436 | /// | ||
| 437 | /// @return Type defined with @ref PERIPHERAL_EVENT_TYPE | ||
| 438 | PERIPHERAL_EVENT_TYPE Type(void) const { return m_type; } | ||
| 439 | |||
| 440 | /// @brief Get peripheral index. | ||
| 441 | /// | ||
| 442 | /// @return %Peripheral index number | ||
| 443 | unsigned int PeripheralIndex(void) const { return m_peripheralIndex; } | ||
| 444 | |||
| 445 | /// @brief Get driver index. | ||
| 446 | /// | ||
| 447 | /// @return Driver index number | ||
| 448 | unsigned int DriverIndex(void) const { return m_driverIndex; } | ||
| 449 | |||
| 450 | /// @brief Get button state. | ||
| 451 | /// | ||
| 452 | /// @return Button state as @ref JOYSTICK_STATE_BUTTON | ||
| 453 | JOYSTICK_STATE_BUTTON ButtonState(void) const { return m_buttonState; } | ||
| 454 | |||
| 455 | /// @brief Get hat state. | ||
| 456 | /// | ||
| 457 | /// @return Hat state | ||
| 458 | JOYSTICK_STATE_HAT HatState(void) const { return m_hatState; } | ||
| 459 | |||
| 460 | /// @brief Get axis state. | ||
| 461 | /// | ||
| 462 | /// @return Axis state | ||
| 463 | JOYSTICK_STATE_AXIS AxisState(void) const { return m_axisState; } | ||
| 464 | |||
| 465 | /// @brief Get motor state. | ||
| 466 | /// | ||
| 467 | /// @return Motor state | ||
| 468 | JOYSTICK_STATE_MOTOR MotorState(void) const { return m_motorState; } | ||
| 469 | |||
| 470 | /// @brief Set type of event. | ||
| 471 | /// | ||
| 472 | /// @param[in] type Type defined with @ref PERIPHERAL_EVENT_TYPE | ||
| 473 | void SetType(PERIPHERAL_EVENT_TYPE type) { m_type = type; } | ||
| 474 | |||
| 475 | /// @brief Set peripheral index. | ||
| 476 | /// | ||
| 477 | /// @param[in] index %Peripheral index number | ||
| 478 | void SetPeripheralIndex(unsigned int index) { m_peripheralIndex = index; } | ||
| 479 | |||
| 480 | /// @brief Set driver index. | ||
| 481 | /// | ||
| 482 | /// @param[in] index Driver index number | ||
| 483 | void SetDriverIndex(unsigned int index) { m_driverIndex = index; } | ||
| 484 | |||
| 485 | /// @brief Set button state. | ||
| 486 | /// | ||
| 487 | /// @param[in] state Button state as @ref JOYSTICK_STATE_BUTTON | ||
| 488 | void SetButtonState(JOYSTICK_STATE_BUTTON state) { m_buttonState = state; } | ||
| 489 | |||
| 490 | /// @brief Set hat state. | ||
| 491 | /// | ||
| 492 | /// @param[in] state Hat state as @ref JOYSTICK_STATE_HAT (float) | ||
| 493 | void SetHatState(JOYSTICK_STATE_HAT state) { m_hatState = state; } | ||
| 494 | |||
| 495 | /// @brief Set axis state. | ||
| 496 | /// | ||
| 497 | /// @param[in] state Axis state as @ref JOYSTICK_STATE_AXIS (float) | ||
| 498 | void SetAxisState(JOYSTICK_STATE_AXIS state) { m_axisState = state; } | ||
| 499 | |||
| 500 | /// @brief Set motor state. | ||
| 501 | /// | ||
| 502 | /// @param[in] state Motor state as @ref JOYSTICK_STATE_MOTOR (float) | ||
| 503 | void SetMotorState(JOYSTICK_STATE_MOTOR state) { m_motorState = state; } | ||
| 504 | |||
| 505 | ///@} | ||
| 506 | |||
| 507 | explicit PeripheralEvent(const PERIPHERAL_EVENT& event) | ||
| 508 | : m_type(event.type), | ||
| 509 | m_peripheralIndex(event.peripheral_index), | ||
| 510 | m_driverIndex(event.driver_index), | ||
| 511 | m_buttonState(event.driver_button_state), | ||
| 512 | m_hatState(event.driver_hat_state), | ||
| 513 | m_axisState(event.driver_axis_state), | ||
| 514 | m_motorState(event.motor_state) | ||
| 515 | { | ||
| 516 | } | ||
| 517 | |||
| 518 | void ToStruct(PERIPHERAL_EVENT& event) const | ||
| 519 | { | ||
| 520 | event.type = m_type; | ||
| 521 | event.peripheral_index = m_peripheralIndex; | ||
| 522 | event.driver_index = m_driverIndex; | ||
| 523 | event.driver_button_state = m_buttonState; | ||
| 524 | event.driver_hat_state = m_hatState; | ||
| 525 | event.driver_axis_state = m_axisState; | ||
| 526 | event.motor_state = m_motorState; | ||
| 527 | } | ||
| 528 | |||
| 529 | static void FreeStruct(PERIPHERAL_EVENT& event) { (void)event; } | ||
| 530 | |||
| 531 | private: | ||
| 532 | PERIPHERAL_EVENT_TYPE m_type = PERIPHERAL_EVENT_TYPE_NONE; | ||
| 533 | unsigned int m_peripheralIndex = 0; | ||
| 534 | unsigned int m_driverIndex = 0; | ||
| 535 | JOYSTICK_STATE_BUTTON m_buttonState = JOYSTICK_STATE_BUTTON_UNPRESSED; | ||
| 536 | JOYSTICK_STATE_HAT m_hatState = JOYSTICK_STATE_HAT_UNPRESSED; | ||
| 537 | JOYSTICK_STATE_AXIS m_axisState = 0.0f; | ||
| 538 | JOYSTICK_STATE_MOTOR m_motorState = 0.0f; | ||
| 539 | }; | ||
| 540 | ///@} | ||
| 541 | //------------------------------------------------------------------------------ | ||
| 542 | |||
| 543 | typedef PeripheralVector<PeripheralEvent, PERIPHERAL_EVENT> PeripheralEvents; | ||
| 544 | |||
| 545 | //============================================================================== | ||
| 546 | /// @defgroup cpp_kodi_addon_peripheral_Defs_Joystick_Joystick class Joystick | ||
| 547 | /// @ingroup cpp_kodi_addon_peripheral_Defs_Joystick | ||
| 548 | /// @brief **Wrapper class providing additional joystick information**\n | ||
| 549 | /// This is a child class to expand another class with necessary joystick data. | ||
| 550 | /// | ||
| 551 | /// For data not provided by @ref cpp_kodi_addon_peripheral_Defs_Peripheral_Peripheral. | ||
| 552 | /// | ||
| 553 | /// Used on: | ||
| 554 | /// - @ref kodi::addon::CInstancePeripheral::GetJoystickInfo() | ||
| 555 | /// - @ref kodi::addon::CInstancePeripheral::GetFeatures(). | ||
| 556 | /// - @ref kodi::addon::CInstancePeripheral::MapFeatures(). | ||
| 557 | /// - @ref kodi::addon::CInstancePeripheral::GetIgnoredPrimitives(). | ||
| 558 | /// - @ref kodi::addon::CInstancePeripheral::SetIgnoredPrimitives(). | ||
| 559 | /// - @ref kodi::addon::CInstancePeripheral::SaveButtonMap(). | ||
| 560 | /// - @ref kodi::addon::CInstancePeripheral::RevertButtonMap(). | ||
| 561 | /// - @ref kodi::addon::CInstancePeripheral::ResetButtonMap(). | ||
| 562 | /// | ||
| 563 | /// ---------------------------------------------------------------------------- | ||
| 564 | /// | ||
| 565 | /// @copydetails cpp_kodi_addon_peripheral_Defs_Joystick_Joystick_Help | ||
| 566 | /// | ||
| 567 | ///@{ | ||
| 568 | class Joystick : public Peripheral | ||
| 569 | { | ||
| 570 | public: | ||
| 571 | /// @defgroup cpp_kodi_addon_peripheral_Defs_Joystick_Joystick_Help Value Help | ||
| 572 | /// @ingroup cpp_kodi_addon_peripheral_Defs_Joystick_Joystick | ||
| 573 | /// ---------------------------------------------------------------------------- | ||
| 574 | /// | ||
| 575 | /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_peripheral_Defs_Joystick_Joystick :</b> | ||
| 576 | /// | Name | Type | Class | Set call | Get call | ||
| 577 | /// |------|------|-------|----------|---------- | ||
| 578 | /// | **%Joystick provider** | `const std::string&` | @ref Joystick | @ref Joystick::SetProvider "SetProvider" | @ref Joystick::Provider "Provider" | ||
| 579 | /// | **%Joystick requested port** | `int` | @ref Joystick | @ref Joystick::SetRequestedPort "SetRequestedPort" | @ref Joystick::RequestedPort "RequestedPort" | ||
| 580 | /// | **%Joystick button count** | `unsigned int` | @ref Joystick | @ref Joystick::SetButtonCount "SetButtonCount" | @ref Joystick::ButtonCount "ButtonCount" | ||
| 581 | /// | **%Joystick hat count** | `unsigned int` | @ref Joystick | @ref Joystick::SetHatCount "SetHatCount" | @ref Joystick::HatCount "HatCount" | ||
| 582 | /// | **%Joystick axis count** | `unsigned int` | @ref Joystick | @ref Joystick::SetAxisCount "SetAxisCount" | @ref Joystick::AxisCount "AxisCount" | ||
| 583 | /// | **%Joystick motor count** | `unsigned int` | @ref Joystick | @ref Joystick::SetMotorCount "SetMotorCount" | @ref Joystick::MotorCount "MotorCount" | ||
| 584 | /// | **%Joystick support power off** | `bool` | @ref Joystick | @ref Joystick::SetSupportsPowerOff "SetSupportsPowerOff" | @ref Joystick::SupportsPowerOff "SupportsPowerOff" | ||
| 585 | /// | **%Peripheral type** | @ref PERIPHERAL_TYPE | @ref Peripheral | @ref Peripheral::SetType "SetType" | @ref Peripheral::Type "Type" | ||
| 586 | /// | **%Peripheral name** | `const std::string&` | @ref Peripheral | @ref Peripheral::SetName "SetName" | @ref Peripheral::Name "Name" | ||
| 587 | /// | **%Peripheral vendor id** | `uint16_t` | @ref Peripheral | @ref Peripheral::SetVendorID "SetVendorID" | @ref Peripheral::VendorID "VendorID" | ||
| 588 | /// | **%Peripheral product id** | `uint16_t` | @ref Peripheral | @ref Peripheral::SetProductID "SetProductID" | @ref Peripheral::ProductID "ProductID" | ||
| 589 | /// | **%Peripheral index** | `unsigned int` | @ref Peripheral | @ref Peripheral::SetIndex "SetIndex" | @ref Peripheral::Index "Index" | ||
| 590 | /// | ||
| 591 | /// Further are following included: | ||
| 592 | /// - @ref Joystick::Joystick "Joystick(const std::string& provider = \"\", const std::string& strName = \"\")" | ||
| 593 | /// - @ref Joystick::operator= "Joystick& operator=(const Joystick& rhs)" | ||
| 594 | /// - @ref Peripheral::IsVidPidKnown "IsVidPidKnown()": To check VID and PID are known. | ||
| 595 | /// | ||
| 596 | |||
| 597 | /// @addtogroup cpp_kodi_addon_peripheral_Defs_Joystick_Joystick | ||
| 598 | ///@{ | ||
| 599 | |||
| 600 | /// @brief Constructor. | ||
| 601 | /// | ||
| 602 | /// @param[in] provider [optional] Provide name | ||
| 603 | /// @param[in] strName [optional] Name of related joystick | ||
| 604 | Joystick(const std::string& provider = "", const std::string& strName = "") | ||
| 605 | : Peripheral(PERIPHERAL_TYPE_JOYSTICK, strName), | ||
| 606 | m_provider(provider), | ||
| 607 | m_requestedPort(NO_PORT_REQUESTED) | ||
| 608 | { | ||
| 609 | } | ||
| 610 | |||
| 611 | /// @brief Class copy constructor. | ||
| 612 | /// | ||
| 613 | /// @param[in] other Other class to copy on construct here | ||
| 614 | Joystick(const Joystick& other) { *this = other; } | ||
| 615 | |||
| 616 | /// @brief Destructor. | ||
| 617 | /// | ||
| 618 | ~Joystick(void) override = default; | ||
| 619 | |||
| 620 | /// @brief Copy data from another @ref Joystick class to here. | ||
| 621 | /// | ||
| 622 | /// @param[in] other Other class to copy here | ||
| 623 | Joystick& operator=(const Joystick& rhs) | ||
| 624 | { | ||
| 625 | if (this != &rhs) | ||
| 626 | { | ||
| 627 | Peripheral::operator=(rhs); | ||
| 628 | |||
| 629 | m_provider = rhs.m_provider; | ||
| 630 | m_requestedPort = rhs.m_requestedPort; | ||
| 631 | m_buttonCount = rhs.m_buttonCount; | ||
| 632 | m_hatCount = rhs.m_hatCount; | ||
| 633 | m_axisCount = rhs.m_axisCount; | ||
| 634 | m_motorCount = rhs.m_motorCount; | ||
| 635 | m_supportsPowerOff = rhs.m_supportsPowerOff; | ||
| 636 | } | ||
| 637 | return *this; | ||
| 638 | } | ||
| 639 | |||
| 640 | /// @brief Get provider name. | ||
| 641 | /// | ||
| 642 | /// @return Name of provider | ||
| 643 | const std::string& Provider(void) const { return m_provider; } | ||
| 644 | |||
| 645 | /// @brief Get requested port number. | ||
| 646 | /// | ||
| 647 | /// @return Port | ||
| 648 | int RequestedPort(void) const { return m_requestedPort; } | ||
| 649 | |||
| 650 | /// @brief Get button count. | ||
| 651 | /// | ||
| 652 | /// @return Button count | ||
| 653 | unsigned int ButtonCount(void) const { return m_buttonCount; } | ||
| 654 | |||
| 655 | /// @brief Get hat count. | ||
| 656 | /// | ||
| 657 | /// @return Hat count | ||
| 658 | unsigned int HatCount(void) const { return m_hatCount; } | ||
| 659 | |||
| 660 | /// @brief Get axis count. | ||
| 661 | /// | ||
| 662 | /// @return Axis count | ||
| 663 | unsigned int AxisCount(void) const { return m_axisCount; } | ||
| 664 | |||
| 665 | /// @brief Get motor count. | ||
| 666 | /// | ||
| 667 | /// @return Motor count | ||
| 668 | unsigned int MotorCount(void) const { return m_motorCount; } | ||
| 669 | |||
| 670 | /// @brief Get supports power off. | ||
| 671 | /// | ||
| 672 | /// @return True if power off is supported, false otherwise | ||
| 673 | bool SupportsPowerOff(void) const { return m_supportsPowerOff; } | ||
| 674 | |||
| 675 | /// @brief Set provider name. | ||
| 676 | /// | ||
| 677 | /// @param[in] provider Name of provider | ||
| 678 | void SetProvider(const std::string& provider) { m_provider = provider; } | ||
| 679 | |||
| 680 | /// @brief Get requested port number. | ||
| 681 | /// | ||
| 682 | /// @param[in] requestedPort Port | ||
| 683 | void SetRequestedPort(int requestedPort) { m_requestedPort = requestedPort; } | ||
| 684 | |||
| 685 | /// @brief Get button count. | ||
| 686 | /// | ||
| 687 | /// @param[in] buttonCount Button count | ||
| 688 | void SetButtonCount(unsigned int buttonCount) { m_buttonCount = buttonCount; } | ||
| 689 | |||
| 690 | /// @brief Get hat count. | ||
| 691 | /// | ||
| 692 | /// @param[in] hatCount Hat count | ||
| 693 | void SetHatCount(unsigned int hatCount) { m_hatCount = hatCount; } | ||
| 694 | |||
| 695 | /// @brief Get axis count. | ||
| 696 | /// | ||
| 697 | /// @param[in] axisCount Axis count | ||
| 698 | void SetAxisCount(unsigned int axisCount) { m_axisCount = axisCount; } | ||
| 699 | |||
| 700 | /// @brief Get motor count. | ||
| 701 | /// | ||
| 702 | /// @param[in] motorCount Motor count | ||
| 703 | void SetMotorCount(unsigned int motorCount) { m_motorCount = motorCount; } | ||
| 704 | |||
| 705 | /// @brief Get supports power off. | ||
| 706 | /// | ||
| 707 | /// @param[in] supportsPowerOff True if power off is supported, false otherwise | ||
| 708 | void SetSupportsPowerOff(bool supportsPowerOff) { m_supportsPowerOff = supportsPowerOff; } | ||
| 709 | |||
| 710 | ///@} | ||
| 711 | |||
| 712 | explicit Joystick(const JOYSTICK_INFO& info) | ||
| 713 | : Peripheral(info.peripheral), | ||
| 714 | m_provider(info.provider ? info.provider : ""), | ||
| 715 | m_requestedPort(info.requested_port), | ||
| 716 | m_buttonCount(info.button_count), | ||
| 717 | m_hatCount(info.hat_count), | ||
| 718 | m_axisCount(info.axis_count), | ||
| 719 | m_motorCount(info.motor_count), | ||
| 720 | m_supportsPowerOff(info.supports_poweroff) | ||
| 721 | { | ||
| 722 | } | ||
| 723 | |||
| 724 | void ToStruct(JOYSTICK_INFO& info) const | ||
| 725 | { | ||
| 726 | Peripheral::ToStruct(info.peripheral); | ||
| 727 | |||
| 728 | info.provider = new char[m_provider.size() + 1]; | ||
| 729 | info.requested_port = m_requestedPort; | ||
| 730 | info.button_count = m_buttonCount; | ||
| 731 | info.hat_count = m_hatCount; | ||
| 732 | info.axis_count = m_axisCount; | ||
| 733 | info.motor_count = m_motorCount; | ||
| 734 | info.supports_poweroff = m_supportsPowerOff; | ||
| 735 | |||
| 736 | std::strcpy(info.provider, m_provider.c_str()); | ||
| 737 | } | ||
| 738 | |||
| 739 | static void FreeStruct(JOYSTICK_INFO& info) | ||
| 740 | { | ||
| 741 | Peripheral::FreeStruct(info.peripheral); | ||
| 742 | |||
| 743 | PERIPHERAL_SAFE_DELETE_ARRAY(info.provider); | ||
| 744 | } | ||
| 745 | |||
| 746 | private: | ||
| 747 | std::string m_provider; | ||
| 748 | int m_requestedPort; | ||
| 749 | unsigned int m_buttonCount = 0; | ||
| 750 | unsigned int m_hatCount = 0; | ||
| 751 | unsigned int m_axisCount = 0; | ||
| 752 | unsigned int m_motorCount = 0; | ||
| 753 | bool m_supportsPowerOff = false; | ||
| 754 | }; | ||
| 755 | ///@} | ||
| 756 | //------------------------------------------------------------------------------ | ||
| 757 | |||
| 758 | typedef PeripheralVector<Joystick, JOYSTICK_INFO> Joysticks; | ||
| 759 | |||
| 760 | class JoystickFeature; | ||
| 761 | |||
| 762 | //============================================================================== | ||
| 763 | /// @defgroup cpp_kodi_addon_peripheral_Defs_Joystick_DriverPrimitive class DriverPrimitive | ||
| 764 | /// @ingroup cpp_kodi_addon_peripheral_Defs_Joystick | ||
| 765 | /// @brief **Base class for joystick driver primitives** | ||
| 766 | /// | ||
| 767 | /// A driver primitive can be: | ||
| 768 | /// | ||
| 769 | /// 1. a button | ||
| 770 | /// 2. a hat direction | ||
| 771 | /// 3. a semiaxis (either the positive or negative half of an axis) | ||
| 772 | /// 4. a motor | ||
| 773 | /// 5. a keyboard key | ||
| 774 | /// 6. a mouse button | ||
| 775 | /// 7. a relative pointer direction | ||
| 776 | /// | ||
| 777 | /// The type determines the fields in use: | ||
| 778 | /// | ||
| 779 | /// Button: | ||
| 780 | /// - driver index | ||
| 781 | /// | ||
| 782 | /// Hat direction: | ||
| 783 | /// - driver index | ||
| 784 | /// - hat direction | ||
| 785 | /// | ||
| 786 | /// Semiaxis: | ||
| 787 | /// - driver index | ||
| 788 | /// - center | ||
| 789 | /// - semiaxis direction | ||
| 790 | /// - range | ||
| 791 | /// | ||
| 792 | /// Motor: | ||
| 793 | /// - driver index | ||
| 794 | /// | ||
| 795 | /// Key: | ||
| 796 | /// - key code | ||
| 797 | /// | ||
| 798 | /// Mouse button: | ||
| 799 | /// - driver index | ||
| 800 | /// | ||
| 801 | /// Relative pointer direction: | ||
| 802 | /// - relative pointer direction | ||
| 803 | /// | ||
| 804 | ///@{ | ||
| 805 | struct DriverPrimitive | ||
| 806 | { | ||
| 807 | protected: | ||
| 808 | /*! | ||
| 809 | * \brief Construct a driver primitive of the specified type | ||
| 810 | */ | ||
| 811 | DriverPrimitive(JOYSTICK_DRIVER_PRIMITIVE_TYPE type, unsigned int driverIndex) | ||
| 812 | : m_type(type), m_driverIndex(driverIndex) | ||
| 813 | { | ||
| 814 | } | ||
| 815 | |||
| 816 | public: | ||
| 817 | /// @addtogroup cpp_kodi_addon_peripheral_Defs_Joystick_DriverPrimitive | ||
| 818 | ///@{ | ||
| 819 | |||
| 820 | /// @brief Construct an invalid driver primitive. | ||
| 821 | DriverPrimitive(void) = default; | ||
| 822 | |||
| 823 | /// @brief Construct a driver primitive representing a joystick button. | ||
| 824 | /// | ||
| 825 | /// @param[in] buttonIndex Index | ||
| 826 | /// @return Created class | ||
| 827 | static DriverPrimitive CreateButton(unsigned int buttonIndex) | ||
| 828 | { | ||
| 829 | return DriverPrimitive(JOYSTICK_DRIVER_PRIMITIVE_TYPE_BUTTON, buttonIndex); | ||
| 830 | } | ||
| 831 | |||
| 832 | /// @brief Construct a driver primitive representing one of the four direction | ||
| 833 | /// arrows on a dpad. | ||
| 834 | /// | ||
| 835 | /// @param[in] hatIndex Hat index | ||
| 836 | /// @param[in] direction With @ref JOYSTICK_DRIVER_HAT_DIRECTION defined direction | ||
| 837 | DriverPrimitive(unsigned int hatIndex, JOYSTICK_DRIVER_HAT_DIRECTION direction) | ||
| 838 | : m_type(JOYSTICK_DRIVER_PRIMITIVE_TYPE_HAT_DIRECTION), | ||
| 839 | m_driverIndex(hatIndex), | ||
| 840 | m_hatDirection(direction) | ||
| 841 | { | ||
| 842 | } | ||
| 843 | |||
| 844 | /// @brief Construct a driver primitive representing the positive or negative | ||
| 845 | /// half of an axis. | ||
| 846 | /// | ||
| 847 | /// @param[in] axisIndex Axis index | ||
| 848 | /// @param[in] center Center | ||
| 849 | /// @param[in] direction With @ref JOYSTICK_DRIVER_HAT_DIRECTION defined direction | ||
| 850 | /// @param[in] range Range | ||
| 851 | DriverPrimitive(unsigned int axisIndex, | ||
| 852 | int center, | ||
| 853 | JOYSTICK_DRIVER_SEMIAXIS_DIRECTION direction, | ||
| 854 | unsigned int range) | ||
| 855 | : m_type(JOYSTICK_DRIVER_PRIMITIVE_TYPE_SEMIAXIS), | ||
| 856 | m_driverIndex(axisIndex), | ||
| 857 | m_center(center), | ||
| 858 | m_semiAxisDirection(direction), | ||
| 859 | m_range(range) | ||
| 860 | { | ||
| 861 | } | ||
| 862 | |||
| 863 | /// @brief Construct a driver primitive representing a motor. | ||
| 864 | /// | ||
| 865 | /// @param[in] motorIndex Motor index number | ||
| 866 | /// @return Constructed driver primitive representing a motor | ||
| 867 | static DriverPrimitive CreateMotor(unsigned int motorIndex) | ||
| 868 | { | ||
| 869 | return DriverPrimitive(JOYSTICK_DRIVER_PRIMITIVE_TYPE_MOTOR, motorIndex); | ||
| 870 | } | ||
| 871 | |||
| 872 | /// @brief Construct a driver primitive representing a key on a keyboard. | ||
| 873 | /// | ||
| 874 | /// @param[in] keycode Keycode to use | ||
| 875 | DriverPrimitive(std::string keycode) | ||
| 876 | : m_type(JOYSTICK_DRIVER_PRIMITIVE_TYPE_KEY), m_keycode(std::move(keycode)) | ||
| 877 | { | ||
| 878 | } | ||
| 879 | |||
| 880 | /// @brief Construct a driver primitive representing a mouse button. | ||
| 881 | /// | ||
| 882 | /// @param[in] buttonIndex Index | ||
| 883 | /// @return Constructed driver primitive representing a mouse button | ||
| 884 | static DriverPrimitive CreateMouseButton(JOYSTICK_DRIVER_MOUSE_INDEX buttonIndex) | ||
| 885 | { | ||
| 886 | return DriverPrimitive(JOYSTICK_DRIVER_PRIMITIVE_TYPE_MOUSE_BUTTON, | ||
| 887 | static_cast<unsigned int>(buttonIndex)); | ||
| 888 | } | ||
| 889 | |||
| 890 | /// @brief Construct a driver primitive representing one of the four | ||
| 891 | /// direction in which a relative pointer can move | ||
| 892 | /// | ||
| 893 | /// @param[in] direction With @ref JOYSTICK_DRIVER_RELPOINTER_DIRECTION defined direction | ||
| 894 | DriverPrimitive(JOYSTICK_DRIVER_RELPOINTER_DIRECTION direction) | ||
| 895 | : m_type(JOYSTICK_DRIVER_PRIMITIVE_TYPE_RELPOINTER_DIRECTION), m_relPointerDirection(direction) | ||
| 896 | { | ||
| 897 | } | ||
| 898 | |||
| 899 | /// @brief Get type of primitive. | ||
| 900 | /// | ||
| 901 | /// @return The with @ref JOYSTICK_DRIVER_PRIMITIVE_TYPE defined type | ||
| 902 | JOYSTICK_DRIVER_PRIMITIVE_TYPE Type(void) const { return m_type; } | ||
| 903 | |||
| 904 | /// @brief Get driver index. | ||
| 905 | /// | ||
| 906 | /// @return Index number | ||
| 907 | unsigned int DriverIndex(void) const { return m_driverIndex; } | ||
| 908 | |||
| 909 | /// @brief Get hat direction | ||
| 910 | /// | ||
| 911 | /// @return The with @ref JOYSTICK_DRIVER_HAT_DIRECTION defined direction | ||
| 912 | JOYSTICK_DRIVER_HAT_DIRECTION HatDirection(void) const { return m_hatDirection; } | ||
| 913 | |||
| 914 | /// @brief Get center | ||
| 915 | /// | ||
| 916 | /// @return Center | ||
| 917 | int Center(void) const { return m_center; } | ||
| 918 | |||
| 919 | /// @brief Get semi axis direction | ||
| 920 | /// | ||
| 921 | /// @return With @ref JOYSTICK_DRIVER_SEMIAXIS_DIRECTION defined direction | ||
| 922 | JOYSTICK_DRIVER_SEMIAXIS_DIRECTION SemiAxisDirection(void) const { return m_semiAxisDirection; } | ||
| 923 | |||
| 924 | /// @brief Get range. | ||
| 925 | /// | ||
| 926 | /// @return Range | ||
| 927 | unsigned int Range(void) const { return m_range; } | ||
| 928 | |||
| 929 | /// @brief Get key code as string. | ||
| 930 | /// | ||
| 931 | /// @return Key code | ||
| 932 | const std::string& Keycode(void) const { return m_keycode; } | ||
| 933 | |||
| 934 | /// @brief Get mouse index | ||
| 935 | /// | ||
| 936 | /// @return With @ref JOYSTICK_DRIVER_MOUSE_INDEX defined mouse index | ||
| 937 | JOYSTICK_DRIVER_MOUSE_INDEX MouseIndex(void) const | ||
| 938 | { | ||
| 939 | return static_cast<JOYSTICK_DRIVER_MOUSE_INDEX>(m_driverIndex); | ||
| 940 | } | ||
| 941 | |||
| 942 | /// @brief Get relative pointer direction. | ||
| 943 | /// | ||
| 944 | /// @return With @ref JOYSTICK_DRIVER_RELPOINTER_DIRECTION defined direction | ||
| 945 | JOYSTICK_DRIVER_RELPOINTER_DIRECTION RelPointerDirection(void) const | ||
| 946 | { | ||
| 947 | return m_relPointerDirection; | ||
| 948 | } | ||
| 949 | |||
| 950 | /// @brief Compare this with another class of this type. | ||
| 951 | /// | ||
| 952 | /// @param[in] other Other class to compare | ||
| 953 | /// @return True if they are equal, false otherwise | ||
| 954 | bool operator==(const DriverPrimitive& other) const | ||
| 955 | { | ||
| 956 | if (m_type == other.m_type) | ||
| 957 | { | ||
| 958 | switch (m_type) | ||
| 959 | { | ||
| 960 | case JOYSTICK_DRIVER_PRIMITIVE_TYPE_BUTTON: | ||
| 961 | { | ||
| 962 | return m_driverIndex == other.m_driverIndex; | ||
| 963 | } | ||
| 964 | case JOYSTICK_DRIVER_PRIMITIVE_TYPE_HAT_DIRECTION: | ||
| 965 | { | ||
| 966 | return m_driverIndex == other.m_driverIndex && m_hatDirection == other.m_hatDirection; | ||
| 967 | } | ||
| 968 | case JOYSTICK_DRIVER_PRIMITIVE_TYPE_SEMIAXIS: | ||
| 969 | { | ||
| 970 | return m_driverIndex == other.m_driverIndex && m_center == other.m_center && | ||
| 971 | m_semiAxisDirection == other.m_semiAxisDirection && m_range == other.m_range; | ||
| 972 | } | ||
| 973 | case JOYSTICK_DRIVER_PRIMITIVE_TYPE_KEY: | ||
| 974 | { | ||
| 975 | return m_keycode == other.m_keycode; | ||
| 976 | } | ||
| 977 | case JOYSTICK_DRIVER_PRIMITIVE_TYPE_MOTOR: | ||
| 978 | { | ||
| 979 | return m_driverIndex == other.m_driverIndex; | ||
| 980 | } | ||
| 981 | case JOYSTICK_DRIVER_PRIMITIVE_TYPE_MOUSE_BUTTON: | ||
| 982 | { | ||
| 983 | return m_driverIndex == other.m_driverIndex; | ||
| 984 | } | ||
| 985 | case JOYSTICK_DRIVER_PRIMITIVE_TYPE_RELPOINTER_DIRECTION: | ||
| 986 | { | ||
| 987 | return m_relPointerDirection == other.m_relPointerDirection; | ||
| 988 | } | ||
| 989 | default: | ||
| 990 | break; | ||
| 991 | } | ||
| 992 | } | ||
| 993 | return false; | ||
| 994 | } | ||
| 995 | |||
| 996 | ///@} | ||
| 997 | |||
| 998 | explicit DriverPrimitive(const JOYSTICK_DRIVER_PRIMITIVE& primitive) : m_type(primitive.type) | ||
| 999 | { | ||
| 1000 | switch (m_type) | ||
| 1001 | { | ||
| 1002 | case JOYSTICK_DRIVER_PRIMITIVE_TYPE_BUTTON: | ||
| 1003 | { | ||
| 1004 | m_driverIndex = primitive.button.index; | ||
| 1005 | break; | ||
| 1006 | } | ||
| 1007 | case JOYSTICK_DRIVER_PRIMITIVE_TYPE_HAT_DIRECTION: | ||
| 1008 | { | ||
| 1009 | m_driverIndex = primitive.hat.index; | ||
| 1010 | m_hatDirection = primitive.hat.direction; | ||
| 1011 | break; | ||
| 1012 | } | ||
| 1013 | case JOYSTICK_DRIVER_PRIMITIVE_TYPE_SEMIAXIS: | ||
| 1014 | { | ||
| 1015 | m_driverIndex = primitive.semiaxis.index; | ||
| 1016 | m_center = primitive.semiaxis.center; | ||
| 1017 | m_semiAxisDirection = primitive.semiaxis.direction; | ||
| 1018 | m_range = primitive.semiaxis.range; | ||
| 1019 | break; | ||
| 1020 | } | ||
| 1021 | case JOYSTICK_DRIVER_PRIMITIVE_TYPE_MOTOR: | ||
| 1022 | { | ||
| 1023 | m_driverIndex = primitive.motor.index; | ||
| 1024 | break; | ||
| 1025 | } | ||
| 1026 | case JOYSTICK_DRIVER_PRIMITIVE_TYPE_KEY: | ||
| 1027 | { | ||
| 1028 | m_keycode = primitive.key.keycode; | ||
| 1029 | break; | ||
| 1030 | } | ||
| 1031 | case JOYSTICK_DRIVER_PRIMITIVE_TYPE_MOUSE_BUTTON: | ||
| 1032 | { | ||
| 1033 | m_driverIndex = primitive.mouse.button; | ||
| 1034 | break; | ||
| 1035 | } | ||
| 1036 | case JOYSTICK_DRIVER_PRIMITIVE_TYPE_RELPOINTER_DIRECTION: | ||
| 1037 | { | ||
| 1038 | m_relPointerDirection = primitive.relpointer.direction; | ||
| 1039 | break; | ||
| 1040 | } | ||
| 1041 | default: | ||
| 1042 | break; | ||
| 1043 | } | ||
| 1044 | } | ||
| 1045 | |||
| 1046 | void ToStruct(JOYSTICK_DRIVER_PRIMITIVE& driver_primitive) const | ||
| 1047 | { | ||
| 1048 | driver_primitive.type = m_type; | ||
| 1049 | switch (m_type) | ||
| 1050 | { | ||
| 1051 | case JOYSTICK_DRIVER_PRIMITIVE_TYPE_BUTTON: | ||
| 1052 | { | ||
| 1053 | driver_primitive.button.index = m_driverIndex; | ||
| 1054 | break; | ||
| 1055 | } | ||
| 1056 | case JOYSTICK_DRIVER_PRIMITIVE_TYPE_HAT_DIRECTION: | ||
| 1057 | { | ||
| 1058 | driver_primitive.hat.index = m_driverIndex; | ||
| 1059 | driver_primitive.hat.direction = m_hatDirection; | ||
| 1060 | break; | ||
| 1061 | } | ||
| 1062 | case JOYSTICK_DRIVER_PRIMITIVE_TYPE_SEMIAXIS: | ||
| 1063 | { | ||
| 1064 | driver_primitive.semiaxis.index = m_driverIndex; | ||
| 1065 | driver_primitive.semiaxis.center = m_center; | ||
| 1066 | driver_primitive.semiaxis.direction = m_semiAxisDirection; | ||
| 1067 | driver_primitive.semiaxis.range = m_range; | ||
| 1068 | break; | ||
| 1069 | } | ||
| 1070 | case JOYSTICK_DRIVER_PRIMITIVE_TYPE_MOTOR: | ||
| 1071 | { | ||
| 1072 | driver_primitive.motor.index = m_driverIndex; | ||
| 1073 | break; | ||
| 1074 | } | ||
| 1075 | case JOYSTICK_DRIVER_PRIMITIVE_TYPE_KEY: | ||
| 1076 | { | ||
| 1077 | const size_t size = sizeof(driver_primitive.key.keycode); | ||
| 1078 | std::strncpy(driver_primitive.key.keycode, m_keycode.c_str(), size - 1); | ||
| 1079 | driver_primitive.key.keycode[size - 1] = '\0'; | ||
| 1080 | break; | ||
| 1081 | } | ||
| 1082 | case JOYSTICK_DRIVER_PRIMITIVE_TYPE_MOUSE_BUTTON: | ||
| 1083 | { | ||
| 1084 | driver_primitive.mouse.button = static_cast<JOYSTICK_DRIVER_MOUSE_INDEX>(m_driverIndex); | ||
| 1085 | break; | ||
| 1086 | } | ||
| 1087 | case JOYSTICK_DRIVER_PRIMITIVE_TYPE_RELPOINTER_DIRECTION: | ||
| 1088 | { | ||
| 1089 | driver_primitive.relpointer.direction = m_relPointerDirection; | ||
| 1090 | break; | ||
| 1091 | } | ||
| 1092 | default: | ||
| 1093 | break; | ||
| 1094 | } | ||
| 1095 | } | ||
| 1096 | |||
| 1097 | static void FreeStruct(JOYSTICK_DRIVER_PRIMITIVE& primitive) { (void)primitive; } | ||
| 1098 | |||
| 1099 | private: | ||
| 1100 | JOYSTICK_DRIVER_PRIMITIVE_TYPE m_type = JOYSTICK_DRIVER_PRIMITIVE_TYPE_UNKNOWN; | ||
| 1101 | unsigned int m_driverIndex = 0; | ||
| 1102 | JOYSTICK_DRIVER_HAT_DIRECTION m_hatDirection = JOYSTICK_DRIVER_HAT_UNKNOWN; | ||
| 1103 | int m_center = 0; | ||
| 1104 | JOYSTICK_DRIVER_SEMIAXIS_DIRECTION m_semiAxisDirection = JOYSTICK_DRIVER_SEMIAXIS_UNKNOWN; | ||
| 1105 | unsigned int m_range = 1; | ||
| 1106 | std::string m_keycode; | ||
| 1107 | JOYSTICK_DRIVER_RELPOINTER_DIRECTION m_relPointerDirection = JOYSTICK_DRIVER_RELPOINTER_UNKNOWN; | ||
| 1108 | }; | ||
| 1109 | ///@} | ||
| 1110 | //------------------------------------------------------------------------------ | ||
| 1111 | |||
| 1112 | typedef PeripheralVector<DriverPrimitive, JOYSTICK_DRIVER_PRIMITIVE> DriverPrimitives; | ||
| 1113 | |||
| 1114 | //============================================================================== | ||
| 1115 | /// @defgroup cpp_kodi_addon_peripheral_Defs_Joystick_JoystickFeature class JoystickFeature | ||
| 1116 | /// @ingroup cpp_kodi_addon_peripheral_Defs_Joystick | ||
| 1117 | /// @brief **Base class for joystick feature primitives** | ||
| 1118 | /// | ||
| 1119 | /// Class for joystick features. A feature can be: | ||
| 1120 | /// | ||
| 1121 | /// 1. scalar *[1]* | ||
| 1122 | /// 2. analog stick | ||
| 1123 | /// 3. accelerometer | ||
| 1124 | /// 4. motor | ||
| 1125 | /// 5. relative pointer *[2]* | ||
| 1126 | /// 6. absolute pointer | ||
| 1127 | /// 7. wheel | ||
| 1128 | /// 8. throttle | ||
| 1129 | /// 9. keyboard key | ||
| 1130 | /// | ||
| 1131 | /// *[1]* All three driver primitives (buttons, hats and axes) have a state that | ||
| 1132 | /// can be represented using a single scalar value. For this reason, | ||
| 1133 | /// features that map to a single primitive are called "scalar features". | ||
| 1134 | /// | ||
| 1135 | /// *[2]* Relative pointers are similar to analog sticks, but they use | ||
| 1136 | /// relative distances instead of positions. | ||
| 1137 | /// | ||
| 1138 | ///@{ | ||
| 1139 | class JoystickFeature | ||
| 1140 | { | ||
| 1141 | public: | ||
| 1142 | /// @addtogroup cpp_kodi_addon_peripheral_Defs_Joystick_JoystickFeature | ||
| 1143 | ///@{ | ||
| 1144 | |||
| 1145 | /// @brief Class constructor. | ||
| 1146 | /// | ||
| 1147 | /// @param[in] name [optional] Name of the feature | ||
| 1148 | /// @param[in] type [optional] Type of the feature, @ref JOYSTICK_FEATURE_TYPE_UNKNOWN | ||
| 1149 | /// as default | ||
| 1150 | JoystickFeature(const std::string& name = "", | ||
| 1151 | JOYSTICK_FEATURE_TYPE type = JOYSTICK_FEATURE_TYPE_UNKNOWN) | ||
| 1152 | : m_name(name), m_type(type), m_primitives{} | ||
| 1153 | { | ||
| 1154 | } | ||
| 1155 | |||
| 1156 | /// @brief Class copy constructor. | ||
| 1157 | /// | ||
| 1158 | /// @param[in] other Other class to copy on construct here | ||
| 1159 | JoystickFeature(const JoystickFeature& other) { *this = other; } | ||
| 1160 | |||
| 1161 | /// @brief Copy data from another @ref JoystickFeature class to here. | ||
| 1162 | /// | ||
| 1163 | /// @param[in] other Other class to copy here | ||
| 1164 | JoystickFeature& operator=(const JoystickFeature& rhs) | ||
| 1165 | { | ||
| 1166 | if (this != &rhs) | ||
| 1167 | { | ||
| 1168 | m_name = rhs.m_name; | ||
| 1169 | m_type = rhs.m_type; | ||
| 1170 | m_primitives = rhs.m_primitives; | ||
| 1171 | } | ||
| 1172 | return *this; | ||
| 1173 | } | ||
| 1174 | |||
| 1175 | /// @brief Compare this with another class of this type. | ||
| 1176 | /// | ||
| 1177 | /// @param[in] other Other class to compare | ||
| 1178 | /// @return True if they are equal, false otherwise | ||
| 1179 | bool operator==(const JoystickFeature& other) const | ||
| 1180 | { | ||
| 1181 | return m_name == other.m_name && m_type == other.m_type && m_primitives == other.m_primitives; | ||
| 1182 | } | ||
| 1183 | |||
| 1184 | /// @brief Get name of feature. | ||
| 1185 | /// | ||
| 1186 | /// @return Name of feature | ||
| 1187 | const std::string& Name(void) const { return m_name; } | ||
| 1188 | |||
| 1189 | /// @brief Get name of feature. | ||
| 1190 | /// | ||
| 1191 | /// @return Type of feature defined with @ref JOYSTICK_FEATURE_TYPE | ||
| 1192 | JOYSTICK_FEATURE_TYPE Type(void) const { return m_type; } | ||
| 1193 | |||
| 1194 | /// @brief Check this feature is valid. | ||
| 1195 | /// | ||
| 1196 | /// @return True if valid (type != JOYSTICK_FEATURE_TYPE_UNKNOWN), false otherwise | ||
| 1197 | bool IsValid() const { return m_type != JOYSTICK_FEATURE_TYPE_UNKNOWN; } | ||
| 1198 | |||
| 1199 | /// @brief Set name of feature. | ||
| 1200 | /// | ||
| 1201 | /// @param[in] name Name of feature | ||
| 1202 | void SetName(const std::string& name) { m_name = name; } | ||
| 1203 | |||
| 1204 | /// @brief Set type of feature. | ||
| 1205 | /// | ||
| 1206 | /// @param[in] type Type of feature | ||
| 1207 | void SetType(JOYSTICK_FEATURE_TYPE type) { m_type = type; } | ||
| 1208 | |||
| 1209 | /// @brief Set type as invalid. | ||
| 1210 | void SetInvalid(void) { m_type = JOYSTICK_FEATURE_TYPE_UNKNOWN; } | ||
| 1211 | |||
| 1212 | /// @brief Get primitive of feature by wanted type. | ||
| 1213 | /// | ||
| 1214 | /// @param[in] which Type of feature, defined with @ref JOYSTICK_FEATURE_PRIMITIVE | ||
| 1215 | /// @return Primitive of asked type | ||
| 1216 | const DriverPrimitive& Primitive(JOYSTICK_FEATURE_PRIMITIVE which) const | ||
| 1217 | { | ||
| 1218 | return m_primitives[which]; | ||
| 1219 | } | ||
| 1220 | |||
| 1221 | /// @brief Set primitive for feature by wanted type. | ||
| 1222 | /// | ||
| 1223 | /// @param[in] which Type of feature, defined with @ref JOYSTICK_FEATURE_PRIMITIVE | ||
| 1224 | /// @param[in] primitive The with @ref DriverPrimitive defined primitive to set | ||
| 1225 | void SetPrimitive(JOYSTICK_FEATURE_PRIMITIVE which, const DriverPrimitive& primitive) | ||
| 1226 | { | ||
| 1227 | m_primitives[which] = primitive; | ||
| 1228 | } | ||
| 1229 | |||
| 1230 | /// @brief Get all primitives on this class. | ||
| 1231 | /// | ||
| 1232 | /// @return Array list of primitives | ||
| 1233 | std::array<DriverPrimitive, JOYSTICK_PRIMITIVE_MAX>& Primitives() { return m_primitives; } | ||
| 1234 | |||
| 1235 | /// @brief Get all primitives on this class (as constant). | ||
| 1236 | /// | ||
| 1237 | /// @return Constant a´rray list of primitives | ||
| 1238 | const std::array<DriverPrimitive, JOYSTICK_PRIMITIVE_MAX>& Primitives() const | ||
| 1239 | { | ||
| 1240 | return m_primitives; | ||
| 1241 | } | ||
| 1242 | |||
| 1243 | ///@} | ||
| 1244 | |||
| 1245 | explicit JoystickFeature(const JOYSTICK_FEATURE& feature) | ||
| 1246 | : m_name(feature.name ? feature.name : ""), m_type(feature.type) | ||
| 1247 | { | ||
| 1248 | for (unsigned int i = 0; i < JOYSTICK_PRIMITIVE_MAX; i++) | ||
| 1249 | m_primitives[i] = DriverPrimitive(feature.primitives[i]); | ||
| 1250 | } | ||
| 1251 | |||
| 1252 | void ToStruct(JOYSTICK_FEATURE& feature) const | ||
| 1253 | { | ||
| 1254 | feature.name = new char[m_name.length() + 1]; | ||
| 1255 | feature.type = m_type; | ||
| 1256 | for (unsigned int i = 0; i < JOYSTICK_PRIMITIVE_MAX; i++) | ||
| 1257 | m_primitives[i].ToStruct(feature.primitives[i]); | ||
| 1258 | |||
| 1259 | std::strcpy(feature.name, m_name.c_str()); | ||
| 1260 | } | ||
| 1261 | |||
| 1262 | static void FreeStruct(JOYSTICK_FEATURE& feature) { PERIPHERAL_SAFE_DELETE_ARRAY(feature.name); } | ||
| 1263 | |||
| 1264 | private: | ||
| 1265 | std::string m_name; | ||
| 1266 | JOYSTICK_FEATURE_TYPE m_type; | ||
| 1267 | std::array<DriverPrimitive, JOYSTICK_PRIMITIVE_MAX> m_primitives; | ||
| 1268 | }; | ||
| 1269 | ///@} | ||
| 1270 | //------------------------------------------------------------------------------ | ||
| 1271 | |||
| 1272 | typedef PeripheralVector<JoystickFeature, JOYSTICK_FEATURE> JoystickFeatures; | ||
| 1273 | |||
| 1274 | } /* namespace addon */ | ||
| 1275 | } /* namespace kodi */ | ||
| 1276 | |||
| 1277 | #endif /* __cplusplus */ | ||
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/CMakeLists.txt new file mode 100644 index 0000000..3443b1e --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/CMakeLists.txt | |||
| @@ -0,0 +1,13 @@ | |||
| 1 | set(HEADERS ChannelGroups.h | ||
| 2 | Channels.h | ||
| 3 | EDL.h | ||
| 4 | EPG.h | ||
| 5 | General.h | ||
| 6 | MenuHook.h | ||
| 7 | Recordings.h | ||
| 8 | Stream.h | ||
| 9 | Timers.h) | ||
| 10 | |||
| 11 | if(NOT ENABLE_STATIC_LIBS) | ||
| 12 | core_add_library(addons_kodi-dev-kit_include_kodi_addon-instance_pvr) | ||
| 13 | endif() | ||
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/ChannelGroups.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/ChannelGroups.h new file mode 100644 index 0000000..17995bb --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/ChannelGroups.h | |||
| @@ -0,0 +1,271 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2005-2018 Team Kodi | ||
| 3 | * This file is part of Kodi - https://kodi.tv | ||
| 4 | * | ||
| 5 | * SPDX-License-Identifier: GPL-2.0-or-later | ||
| 6 | * See LICENSES/README.md for more information. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #pragma once | ||
| 10 | |||
| 11 | #include "../../AddonBase.h" | ||
| 12 | #include "../../c-api/addon-instance/pvr.h" | ||
| 13 | |||
| 14 | //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ | ||
| 15 | // "C++" Definitions group 3 - PVR channel group | ||
| 16 | #ifdef __cplusplus | ||
| 17 | |||
| 18 | namespace kodi | ||
| 19 | { | ||
| 20 | namespace addon | ||
| 21 | { | ||
| 22 | |||
| 23 | //============================================================================== | ||
| 24 | /// @defgroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroup class PVRChannelGroup | ||
| 25 | /// @ingroup cpp_kodi_addon_pvr_Defs_ChannelGroup | ||
| 26 | /// @brief **PVR add-on channel group**\n | ||
| 27 | /// To define a group for channels, this becomes be asked from | ||
| 28 | /// @ref kodi::addon::CInstancePVRClient::GetChannelGroups() and used on | ||
| 29 | /// @ref kodi::addon::CInstancePVRClient::GetChannelGroupMembers() to get his | ||
| 30 | /// content with @ref cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember "PVRChannelGroupMember". | ||
| 31 | /// | ||
| 32 | /// ---------------------------------------------------------------------------- | ||
| 33 | /// | ||
| 34 | /// @copydetails cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroup_Help | ||
| 35 | /// | ||
| 36 | ///@{ | ||
| 37 | class PVRChannelGroup : public CStructHdl<PVRChannelGroup, PVR_CHANNEL_GROUP> | ||
| 38 | { | ||
| 39 | friend class CInstancePVRClient; | ||
| 40 | |||
| 41 | public: | ||
| 42 | /*! \cond PRIVATE */ | ||
| 43 | PVRChannelGroup() { memset(m_cStructure, 0, sizeof(PVR_CHANNEL_GROUP)); } | ||
| 44 | PVRChannelGroup(const PVRChannelGroup& channel) : CStructHdl(channel) {} | ||
| 45 | /*! \endcond */ | ||
| 46 | |||
| 47 | /// @defgroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroup_Help Value Help | ||
| 48 | /// @ingroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroup | ||
| 49 | /// | ||
| 50 | /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroup :</b> | ||
| 51 | /// | Name | Type | Set call | Get call | Usage | ||
| 52 | /// |------|------|----------|----------|----------- | ||
| 53 | /// | **Group name** | `std::string` | @ref PVRChannelGroup::SetGroupName "SetGroupName" | @ref PVRChannelGroup::GetGroupName "GetGroupName" | *required to set* | ||
| 54 | /// | **Is radio** | `bool` | @ref PVRChannelGroup::SetIsRadio "SetIsRadio" | @ref PVRChannelGroup::GetIsRadio "GetIsRadio" | *required to set* | ||
| 55 | /// | **Position** | `unsigned int` | @ref PVRChannelGroup::SetPosition "SetPosition" | @ref PVRChannelGroup::GetPosition "GetPosition" | *optional* | ||
| 56 | /// | ||
| 57 | |||
| 58 | /// @ingroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroup | ||
| 59 | ///@{ | ||
| 60 | |||
| 61 | /// @brief **required**\n | ||
| 62 | /// Name of this channel group. | ||
| 63 | void SetGroupName(const std::string& groupName) | ||
| 64 | { | ||
| 65 | strncpy(m_cStructure->strGroupName, groupName.c_str(), sizeof(m_cStructure->strGroupName) - 1); | ||
| 66 | } | ||
| 67 | |||
| 68 | /// @brief To get with @ref SetGroupName changed values. | ||
| 69 | std::string GetGroupName() const { return m_cStructure->strGroupName; } | ||
| 70 | |||
| 71 | /// @brief **required**\n | ||
| 72 | /// **true** If this is a radio channel group, **false** otherwise. | ||
| 73 | void SetIsRadio(bool isRadio) { m_cStructure->bIsRadio = isRadio; } | ||
| 74 | |||
| 75 | /// @brief To get with @ref SetIsRadio changed values. | ||
| 76 | bool GetIsRadio() const { return m_cStructure->bIsRadio; } | ||
| 77 | |||
| 78 | /// @brief **optional**\n | ||
| 79 | /// Sort position of the group (<b>`0`</b> indicates that the backend doesn't | ||
| 80 | /// support sorting of groups). | ||
| 81 | void SetPosition(unsigned int position) { m_cStructure->iPosition = position; } | ||
| 82 | |||
| 83 | /// @brief To get with @ref SetPosition changed values. | ||
| 84 | unsigned int GetPosition() const { return m_cStructure->iPosition; } | ||
| 85 | |||
| 86 | ///@} | ||
| 87 | |||
| 88 | private: | ||
| 89 | PVRChannelGroup(const PVR_CHANNEL_GROUP* channel) : CStructHdl(channel) {} | ||
| 90 | PVRChannelGroup(PVR_CHANNEL_GROUP* channel) : CStructHdl(channel) {} | ||
| 91 | }; | ||
| 92 | ///@} | ||
| 93 | //------------------------------------------------------------------------------ | ||
| 94 | |||
| 95 | //============================================================================== | ||
| 96 | /// @defgroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupsResultSet class PVRChannelGroupsResultSet | ||
| 97 | /// @ingroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroup | ||
| 98 | /// @brief **PVR add-on channel group member transfer class**\n | ||
| 99 | /// To transfer the content of @ref kodi::addon::CInstancePVRClient::GetChannelGroups(). | ||
| 100 | /// | ||
| 101 | ///@{ | ||
| 102 | class PVRChannelGroupsResultSet | ||
| 103 | { | ||
| 104 | public: | ||
| 105 | /*! \cond PRIVATE */ | ||
| 106 | PVRChannelGroupsResultSet() = delete; | ||
| 107 | PVRChannelGroupsResultSet(const AddonInstance_PVR* instance, ADDON_HANDLE handle) | ||
| 108 | : m_instance(instance), m_handle(handle) | ||
| 109 | { | ||
| 110 | } | ||
| 111 | /*! \endcond */ | ||
| 112 | |||
| 113 | |||
| 114 | /// @addtogroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupsResultSet | ||
| 115 | ///@{ | ||
| 116 | |||
| 117 | /// @brief To add and give content from addon to Kodi on related call. | ||
| 118 | /// | ||
| 119 | /// @param[in] tag The to transferred data. | ||
| 120 | void Add(const kodi::addon::PVRChannelGroup& tag) | ||
| 121 | { | ||
| 122 | m_instance->toKodi->TransferChannelGroup(m_instance->toKodi->kodiInstance, m_handle, tag); | ||
| 123 | } | ||
| 124 | |||
| 125 | ///@} | ||
| 126 | |||
| 127 | private: | ||
| 128 | const AddonInstance_PVR* m_instance = nullptr; | ||
| 129 | const ADDON_HANDLE m_handle; | ||
| 130 | }; | ||
| 131 | ///@} | ||
| 132 | //------------------------------------------------------------------------------ | ||
| 133 | |||
| 134 | //============================================================================== | ||
| 135 | /// @defgroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember class PVRChannelGroupMember | ||
| 136 | /// @ingroup cpp_kodi_addon_pvr_Defs_ChannelGroup | ||
| 137 | /// @brief **PVR add-on channel group member**\n | ||
| 138 | /// To define the content of @ref kodi::addon::CInstancePVRClient::GetChannelGroups() | ||
| 139 | /// given groups. | ||
| 140 | /// | ||
| 141 | /// This content becomes then requested with @ref kodi::addon::CInstancePVRClient::GetChannelGroupMembers(). | ||
| 142 | /// | ||
| 143 | /// ---------------------------------------------------------------------------- | ||
| 144 | /// | ||
| 145 | /// @copydetails cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember_Help | ||
| 146 | /// | ||
| 147 | ///@{ | ||
| 148 | class PVRChannelGroupMember : public CStructHdl<PVRChannelGroupMember, PVR_CHANNEL_GROUP_MEMBER> | ||
| 149 | { | ||
| 150 | friend class CInstancePVRClient; | ||
| 151 | |||
| 152 | public: | ||
| 153 | /*! \cond PRIVATE */ | ||
| 154 | PVRChannelGroupMember() { memset(m_cStructure, 0, sizeof(PVR_CHANNEL_GROUP_MEMBER)); } | ||
| 155 | PVRChannelGroupMember(const PVRChannelGroupMember& channel) : CStructHdl(channel) {} | ||
| 156 | /*! \endcond */ | ||
| 157 | |||
| 158 | /// @defgroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember_Help Value Help | ||
| 159 | /// @ingroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember | ||
| 160 | /// | ||
| 161 | /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember :</b> | ||
| 162 | /// | Name | Type | Set call | Get call | Usage | ||
| 163 | /// |-------|-------|-----------|----------|----------- | ||
| 164 | /// | **Group name** | `std::string` | @ref PVRChannelGroupMember::SetGroupName "SetGroupName" | @ref PVRChannelGroupMember::GetGroupName "GetGroupName" | *required to set* | ||
| 165 | /// | **Channel unique id** | `unsigned int` | @ref PVRChannelGroupMember::SetChannelUniqueId "SetChannelUniqueId" | @ref PVRChannelGroupMember::GetChannelUniqueId "GetChannelUniqueId" | *required to set* | ||
| 166 | /// | **Channel Number** | `unsigned int` | @ref PVRChannelGroupMember::SetChannelNumber "SetChannelNumber" | @ref PVRChannelGroupMember::GetChannelNumber "GetChannelNumber" | *optional* | ||
| 167 | /// | **Sub channel number** | `unsigned int` | @ref PVRChannelGroupMember::SetSubChannelNumber "SetSubChannelNumber"| @ref PVRChannelGroupMember::GetSubChannelNumber "GetSubChannelNumber" | *optional* | ||
| 168 | /// | **Order** | `int` | @ref PVRChannel::SetOrder "SetOrder" | @ref PVRChannel::GetOrder "GetOrder" | *optional* | ||
| 169 | /// | ||
| 170 | |||
| 171 | /// @addtogroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember | ||
| 172 | ///@{ | ||
| 173 | |||
| 174 | /// @brief **required**\n | ||
| 175 | /// Name of the channel group to add the channel to. | ||
| 176 | void SetGroupName(const std::string& groupName) | ||
| 177 | { | ||
| 178 | strncpy(m_cStructure->strGroupName, groupName.c_str(), sizeof(m_cStructure->strGroupName) - 1); | ||
| 179 | } | ||
| 180 | |||
| 181 | /// @brief To get with @ref SetGroupName changed values. | ||
| 182 | std::string GetGroupName() const { return m_cStructure->strGroupName; } | ||
| 183 | |||
| 184 | /// @brief **required**\n | ||
| 185 | /// Unique id of the member. | ||
| 186 | void SetChannelUniqueId(unsigned int channelUniqueId) | ||
| 187 | { | ||
| 188 | m_cStructure->iChannelUniqueId = channelUniqueId; | ||
| 189 | } | ||
| 190 | |||
| 191 | /// @brief To get with @ref SetChannelUniqueId changed values. | ||
| 192 | unsigned int GetChannelUniqueId() const { return m_cStructure->iChannelUniqueId; } | ||
| 193 | |||
| 194 | /// @brief **optional**\n | ||
| 195 | /// Channel number within the group. | ||
| 196 | void SetChannelNumber(unsigned int channelNumber) | ||
| 197 | { | ||
| 198 | m_cStructure->iChannelNumber = channelNumber; | ||
| 199 | } | ||
| 200 | |||
| 201 | /// @brief To get with @ref SetChannelNumber changed values. | ||
| 202 | unsigned int GetChannelNumber() const { return m_cStructure->iChannelNumber; } | ||
| 203 | |||
| 204 | /// @brief **optional**\n | ||
| 205 | /// Sub channel number within the group (ATSC). | ||
| 206 | void SetSubChannelNumber(unsigned int subChannelNumber) | ||
| 207 | { | ||
| 208 | m_cStructure->iSubChannelNumber = subChannelNumber; | ||
| 209 | } | ||
| 210 | |||
| 211 | /// @brief To get with @ref SetSubChannelNumber changed values. | ||
| 212 | unsigned int GetSubChannelNumber() const { return m_cStructure->iSubChannelNumber; } | ||
| 213 | |||
| 214 | /// @brief **optional**\n | ||
| 215 | /// The value denoting the order of this channel in the <b>'All channels'</b> group. | ||
| 216 | void SetOrder(bool order) { m_cStructure->iOrder = order; } | ||
| 217 | |||
| 218 | /// @brief To get with @ref SetOrder changed values. | ||
| 219 | bool GetOrder() const { return m_cStructure->iOrder; } | ||
| 220 | |||
| 221 | ///@} | ||
| 222 | |||
| 223 | private: | ||
| 224 | PVRChannelGroupMember(const PVR_CHANNEL_GROUP_MEMBER* channel) : CStructHdl(channel) {} | ||
| 225 | PVRChannelGroupMember(PVR_CHANNEL_GROUP_MEMBER* channel) : CStructHdl(channel) {} | ||
| 226 | }; | ||
| 227 | ///@} | ||
| 228 | //------------------------------------------------------------------------------ | ||
| 229 | |||
| 230 | //============================================================================== | ||
| 231 | /// @defgroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMembersResultSet class PVRChannelGroupMembersResultSet | ||
| 232 | /// @ingroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMember | ||
| 233 | /// @brief **PVR add-on channel group member transfer class**\n | ||
| 234 | /// To transfer the content of @ref kodi::addon::CInstancePVRClient::GetChannelGroupMembers(). | ||
| 235 | /// | ||
| 236 | ///@{ | ||
| 237 | class PVRChannelGroupMembersResultSet | ||
| 238 | { | ||
| 239 | public: | ||
| 240 | /*! \cond PRIVATE */ | ||
| 241 | PVRChannelGroupMembersResultSet() = delete; | ||
| 242 | PVRChannelGroupMembersResultSet(const AddonInstance_PVR* instance, ADDON_HANDLE handle) | ||
| 243 | : m_instance(instance), m_handle(handle) | ||
| 244 | { | ||
| 245 | } | ||
| 246 | /*! \endcond */ | ||
| 247 | |||
| 248 | /// @addtogroup cpp_kodi_addon_pvr_Defs_ChannelGroup_PVRChannelGroupMembersResultSet | ||
| 249 | ///@{ | ||
| 250 | |||
| 251 | /// @brief To add and give content from addon to Kodi on related call. | ||
| 252 | /// | ||
| 253 | /// @param[in] tag The to transferred data. | ||
| 254 | void Add(const kodi::addon::PVRChannelGroupMember& tag) | ||
| 255 | { | ||
| 256 | m_instance->toKodi->TransferChannelGroupMember(m_instance->toKodi->kodiInstance, m_handle, tag); | ||
| 257 | } | ||
| 258 | |||
| 259 | ///@} | ||
| 260 | |||
| 261 | private: | ||
| 262 | const AddonInstance_PVR* m_instance = nullptr; | ||
| 263 | const ADDON_HANDLE m_handle; | ||
| 264 | }; | ||
| 265 | ///@} | ||
| 266 | //------------------------------------------------------------------------------ | ||
| 267 | |||
| 268 | } /* namespace addon */ | ||
| 269 | } /* namespace kodi */ | ||
| 270 | |||
| 271 | #endif /* __cplusplus */ | ||
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Channels.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Channels.h new file mode 100644 index 0000000..9c2f5d2 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Channels.h | |||
| @@ -0,0 +1,518 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2005-2018 Team Kodi | ||
| 3 | * This file is part of Kodi - https://kodi.tv | ||
| 4 | * | ||
| 5 | * SPDX-License-Identifier: GPL-2.0-or-later | ||
| 6 | * See LICENSES/README.md for more information. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #pragma once | ||
| 10 | |||
| 11 | #include "../../AddonBase.h" | ||
| 12 | #include "../../c-api/addon-instance/pvr.h" | ||
| 13 | |||
| 14 | //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ | ||
| 15 | // "C++" Definitions group 2 - PVR channel | ||
| 16 | #ifdef __cplusplus | ||
| 17 | |||
| 18 | namespace kodi | ||
| 19 | { | ||
| 20 | namespace addon | ||
| 21 | { | ||
| 22 | |||
| 23 | //============================================================================== | ||
| 24 | /// @defgroup cpp_kodi_addon_pvr_Defs_Channel_PVRChannel class PVRChannel | ||
| 25 | /// @ingroup cpp_kodi_addon_pvr_Defs_Channel | ||
| 26 | /// @brief **Channel data structure**\n | ||
| 27 | /// Representation of a TV or radio channel. | ||
| 28 | /// | ||
| 29 | /// This is used to store all the necessary TV or radio channel data and can | ||
| 30 | /// either provide the necessary data from / to Kodi for the associated | ||
| 31 | /// functions or can also be used in the addon to store its data. | ||
| 32 | /// | ||
| 33 | /// ---------------------------------------------------------------------------- | ||
| 34 | /// | ||
| 35 | /// @copydetails cpp_kodi_addon_pvr_Defs_Channel_PVRChannel_Help | ||
| 36 | /// | ||
| 37 | ///@{ | ||
| 38 | class PVRChannel : public CStructHdl<PVRChannel, PVR_CHANNEL> | ||
| 39 | { | ||
| 40 | friend class CInstancePVRClient; | ||
| 41 | |||
| 42 | public: | ||
| 43 | /*! \cond PRIVATE */ | ||
| 44 | PVRChannel() { memset(m_cStructure, 0, sizeof(PVR_CHANNEL)); } | ||
| 45 | PVRChannel(const PVRChannel& channel) : CStructHdl(channel) {} | ||
| 46 | /*! \endcond */ | ||
| 47 | |||
| 48 | /// @defgroup cpp_kodi_addon_pvr_Defs_Channel_PVRChannel_Help Value Help | ||
| 49 | /// @ingroup cpp_kodi_addon_pvr_Defs_Channel_PVRChannel | ||
| 50 | /// | ||
| 51 | /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Channel_PVRChannel :</b> | ||
| 52 | /// | Name | Type | Set call | Get call | Usage | ||
| 53 | /// |------|------|----------|----------|----------- | ||
| 54 | /// | **Unique id** | `unsigned int` | @ref PVRChannel::SetUniqueId "SetUniqueId" | @ref PVRChannel::GetUniqueId "GetUniqueId" | *required to set* | ||
| 55 | /// | **Is radio** | `bool` | @ref PVRChannel::SetIsRadio "SetIsRadio" | @ref PVRChannel::GetIsRadio "GetIsRadio" | *required to set* | ||
| 56 | /// | **Channel number** | `unsigned int` | @ref PVRChannel::SetChannelNumber "SetChannelNumber" | @ref PVRChannel::GetChannelNumber "GetChannelNumber" | *optional* | ||
| 57 | /// | **Sub channel number** | `unsigned int` | @ref PVRChannel::SetSubChannelNumber "SetSubChannelNumber" | @ref PVRChannel::GetSubChannelNumber "GetSubChannelNumber" | *optional* | ||
| 58 | /// | **Channel name** | `std::string` | @ref PVRChannel::SetChannelName "SetChannelName" | @ref PVRChannel::GetChannelName "GetChannelName" | *optional* | ||
| 59 | /// | **Mime type** | `std::string` | @ref PVRChannel::SetMimeType "SetMimeType" | @ref PVRChannel::GetMimeType "GetMimeType" | *optional* | ||
| 60 | /// | **Encryption system** | `unsigned int` | @ref PVRChannel::SetEncryptionSystem "SetEncryptionSystem" | @ref PVRChannel::GetEncryptionSystem "GetEncryptionSystem" | *optional* | ||
| 61 | /// | **Icon path** | `std::string` | @ref PVRChannel::SetIconPath "SetIconPath" | @ref PVRChannel::GetIconPath "GetIconPath" | *optional* | ||
| 62 | /// | **Is hidden** | `bool` | @ref PVRChannel::SetIsHidden "SetIsHidden" | @ref PVRChannel::GetIsHidden "GetIsHidden" | *optional* | ||
| 63 | /// | **Has archive** | `bool` | @ref PVRChannel::SetHasArchive "SetHasArchive" | @ref PVRChannel::GetHasArchive "GetHasArchive" | *optional* | ||
| 64 | /// | **Order** | `int` | @ref PVRChannel::SetOrder "SetOrder" | @ref PVRChannel::GetOrder "GetOrder" | *optional* | ||
| 65 | /// | ||
| 66 | |||
| 67 | /// @addtogroup cpp_kodi_addon_pvr_Defs_Channel_PVRChannel | ||
| 68 | ///@{ | ||
| 69 | |||
| 70 | /// @brief **required**\n | ||
| 71 | /// Unique identifier for this channel. | ||
| 72 | void SetUniqueId(unsigned int uniqueId) { m_cStructure->iUniqueId = uniqueId; } | ||
| 73 | |||
| 74 | /// @brief To get with @ref SetUniqueId changed values. | ||
| 75 | unsigned int GetUniqueId() const { return m_cStructure->iUniqueId; } | ||
| 76 | |||
| 77 | /// @brief **required**\n | ||
| 78 | /// **true** if this is a radio channel, **false** if it's a TV channel. | ||
| 79 | void SetIsRadio(bool isRadio) { m_cStructure->bIsRadio = isRadio; } | ||
| 80 | |||
| 81 | /// @brief To get with @ref SetIsRadio changed values. | ||
| 82 | bool GetIsRadio() const { return m_cStructure->bIsRadio; } | ||
| 83 | |||
| 84 | /// @brief **optional**\n | ||
| 85 | /// Channel number of this channel on the backend. | ||
| 86 | void SetChannelNumber(unsigned int channelNumber) | ||
| 87 | { | ||
| 88 | m_cStructure->iChannelNumber = channelNumber; | ||
| 89 | } | ||
| 90 | |||
| 91 | /// @brief To get with @ref SetChannelNumber changed values. | ||
| 92 | unsigned int GetChannelNumber() const { return m_cStructure->iChannelNumber; } | ||
| 93 | |||
| 94 | /// @brief **optional**\n | ||
| 95 | /// Sub channel number of this channel on the backend (ATSC). | ||
| 96 | void SetSubChannelNumber(unsigned int subChannelNumber) | ||
| 97 | { | ||
| 98 | m_cStructure->iSubChannelNumber = subChannelNumber; | ||
| 99 | } | ||
| 100 | |||
| 101 | /// @brief To get with @ref SetSubChannelNumber changed values. | ||
| 102 | unsigned int GetSubChannelNumber() const { return m_cStructure->iSubChannelNumber; } | ||
| 103 | |||
| 104 | /// @brief **optional**\n | ||
| 105 | /// Channel name given to this channel. | ||
| 106 | void SetChannelName(const std::string& channelName) | ||
| 107 | { | ||
| 108 | strncpy(m_cStructure->strChannelName, channelName.c_str(), | ||
| 109 | sizeof(m_cStructure->strChannelName) - 1); | ||
| 110 | } | ||
| 111 | |||
| 112 | /// @brief To get with @ref SetChannelName changed values. | ||
| 113 | std::string GetChannelName() const { return m_cStructure->strChannelName; } | ||
| 114 | |||
| 115 | /// @brief **optional**\n | ||
| 116 | /// Input format mime type. | ||
| 117 | /// | ||
| 118 | /// Available types can be found in https://www.iana.org/assignments/media-types/media-types.xhtml | ||
| 119 | /// on "application" and "video" or leave empty if unknown. | ||
| 120 | /// | ||
| 121 | void SetMimeType(const std::string& inputFormat) | ||
| 122 | { | ||
| 123 | strncpy(m_cStructure->strMimeType, inputFormat.c_str(), sizeof(m_cStructure->strMimeType) - 1); | ||
| 124 | } | ||
| 125 | |||
| 126 | /// @brief To get with @ref SetMimeType changed values. | ||
| 127 | std::string GetMimeType() const { return m_cStructure->strMimeType; } | ||
| 128 | |||
| 129 | /// @brief **optional**\n | ||
| 130 | /// The encryption ID or CaID of this channel (Conditional access systems). | ||
| 131 | /// | ||
| 132 | /// Lists about available ID's: | ||
| 133 | /// - http://www.dvb.org/index.php?id=174 | ||
| 134 | /// - http://en.wikipedia.org/wiki/Conditional_access_system | ||
| 135 | /// | ||
| 136 | void SetEncryptionSystem(unsigned int encryptionSystem) | ||
| 137 | { | ||
| 138 | m_cStructure->iEncryptionSystem = encryptionSystem; | ||
| 139 | } | ||
| 140 | |||
| 141 | /// @brief To get with @ref SetEncryptionSystem changed values. | ||
| 142 | unsigned int GetEncryptionSystem() const { return m_cStructure->iEncryptionSystem; } | ||
| 143 | |||
| 144 | /// @brief **optional**\n | ||
| 145 | /// Path to the channel icon (if present). | ||
| 146 | void SetIconPath(const std::string& iconPath) | ||
| 147 | { | ||
| 148 | strncpy(m_cStructure->strIconPath, iconPath.c_str(), sizeof(m_cStructure->strIconPath) - 1); | ||
| 149 | } | ||
| 150 | |||
| 151 | /// @brief To get with @ref SetIconPath changed values. | ||
| 152 | std::string GetIconPath() const { return m_cStructure->strIconPath; } | ||
| 153 | |||
| 154 | /// @brief **optional**\n | ||
| 155 | /// **true** if this channel is marked as hidden. | ||
| 156 | void SetIsHidden(bool isHidden) { m_cStructure->bIsHidden = isHidden; } | ||
| 157 | |||
| 158 | /// @brief To get with @ref GetIsRadio changed values. | ||
| 159 | bool GetIsHidden() const { return m_cStructure->bIsHidden; } | ||
| 160 | |||
| 161 | /// @brief **optional**\n | ||
| 162 | /// **true** if this channel has a server-side back buffer. | ||
| 163 | void SetHasArchive(bool hasArchive) { m_cStructure->bHasArchive = hasArchive; } | ||
| 164 | |||
| 165 | /// @brief To get with @ref GetIsRadio changed values. | ||
| 166 | bool GetHasArchive() const { return m_cStructure->bHasArchive; } | ||
| 167 | |||
| 168 | /// @brief **optional**\n | ||
| 169 | /// The value denoting the order of this channel in the 'All channels' group. | ||
| 170 | void SetOrder(bool order) { m_cStructure->iOrder = order; } | ||
| 171 | |||
| 172 | /// @brief To get with @ref SetOrder changed values. | ||
| 173 | bool GetOrder() const { return m_cStructure->iOrder; } | ||
| 174 | ///@} | ||
| 175 | |||
| 176 | private: | ||
| 177 | PVRChannel(const PVR_CHANNEL* channel) : CStructHdl(channel) {} | ||
| 178 | PVRChannel(PVR_CHANNEL* channel) : CStructHdl(channel) {} | ||
| 179 | }; | ||
| 180 | ///@} | ||
| 181 | //------------------------------------------------------------------------------ | ||
| 182 | |||
| 183 | //============================================================================== | ||
| 184 | /// @defgroup cpp_kodi_addon_pvr_Defs_Channel_PVRChannelsResultSet class PVRChannelsResultSet | ||
| 185 | /// @ingroup cpp_kodi_addon_pvr_Defs_Channel_PVRChannel | ||
| 186 | /// @brief **PVR add-on channel transfer class**\n | ||
| 187 | /// To transfer the content of @ref kodi::addon::CInstancePVRClient::GetChannels(). | ||
| 188 | /// | ||
| 189 | ///@{ | ||
| 190 | class PVRChannelsResultSet | ||
| 191 | { | ||
| 192 | public: | ||
| 193 | /*! \cond PRIVATE */ | ||
| 194 | PVRChannelsResultSet() = delete; | ||
| 195 | PVRChannelsResultSet(const AddonInstance_PVR* instance, ADDON_HANDLE handle) | ||
| 196 | : m_instance(instance), m_handle(handle) | ||
| 197 | { | ||
| 198 | } | ||
| 199 | /*! \endcond */ | ||
| 200 | |||
| 201 | /// @addtogroup cpp_kodi_addon_pvr_Defs_Channel_PVRChannelsResultSet | ||
| 202 | ///@{ | ||
| 203 | |||
| 204 | /// @brief To add and give content from addon to Kodi on related call. | ||
| 205 | /// | ||
| 206 | /// @param[in] tag The to transferred data. | ||
| 207 | void Add(const kodi::addon::PVRChannel& tag) | ||
| 208 | { | ||
| 209 | m_instance->toKodi->TransferChannelEntry(m_instance->toKodi->kodiInstance, m_handle, tag); | ||
| 210 | } | ||
| 211 | |||
| 212 | ///@} | ||
| 213 | |||
| 214 | private: | ||
| 215 | const AddonInstance_PVR* m_instance = nullptr; | ||
| 216 | const ADDON_HANDLE m_handle; | ||
| 217 | }; | ||
| 218 | ///@} | ||
| 219 | //------------------------------------------------------------------------------ | ||
| 220 | |||
| 221 | //============================================================================== | ||
| 222 | /// @defgroup cpp_kodi_addon_pvr_Defs_Channel_PVRSignalStatus class PVRSignalStatus | ||
| 223 | /// @ingroup cpp_kodi_addon_pvr_Defs_Channel | ||
| 224 | /// @brief **PVR Signal status information**\n | ||
| 225 | /// This class gives current status information from stream to Kodi. | ||
| 226 | /// | ||
| 227 | /// Used to get information for user by call of @ref kodi::addon::CInstancePVRClient::GetSignalStatus() | ||
| 228 | /// to see current quality and source. | ||
| 229 | /// | ||
| 230 | /// ---------------------------------------------------------------------------- | ||
| 231 | /// | ||
| 232 | /// @copydetails cpp_kodi_addon_pvr_Defs_Channel_PVRSignalStatus_Help | ||
| 233 | /// | ||
| 234 | ///@{ | ||
| 235 | class PVRSignalStatus : public CStructHdl<PVRSignalStatus, PVR_SIGNAL_STATUS> | ||
| 236 | { | ||
| 237 | friend class CInstancePVRClient; | ||
| 238 | |||
| 239 | public: | ||
| 240 | /*! \cond PRIVATE */ | ||
| 241 | PVRSignalStatus() = default; | ||
| 242 | PVRSignalStatus(const PVRSignalStatus& type) : CStructHdl(type) {} | ||
| 243 | /*! \endcond */ | ||
| 244 | |||
| 245 | |||
| 246 | /// @defgroup cpp_kodi_addon_pvr_Defs_Channel_PVRSignalStatus_Help Value Help | ||
| 247 | /// @ingroup cpp_kodi_addon_pvr_Defs_Channel_PVRSignalStatus | ||
| 248 | /// | ||
| 249 | /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Channel_PVRSignalStatus :</b> | ||
| 250 | /// | Name | Type | Set call | Get call | Usage | ||
| 251 | /// |------|------|----------|----------|----------- | ||
| 252 | /// | **Adapter name** | `std::string` | @ref PVRSignalStatus::SetAdapterName "SetAdapterName" | @ref PVRSignalStatus::GetAdapterName "GetAdapterName" | *optional* | ||
| 253 | /// | **Adapter status** | `std::string` | @ref PVRSignalStatus::SetAdapterStatus "SetAdapterStatus" | @ref PVRSignalStatus::GetAdapterStatus "GetAdapterStatus" | *optional* | ||
| 254 | /// | **Service name** | `std::string` | @ref PVRSignalStatus::SetServiceName "SetServiceName" | @ref PVRSignalStatus::GetServiceName "GetServiceName" | *optional* | ||
| 255 | /// | **Provider name** | `std::string` | @ref PVRSignalStatus::SetProviderName "SetProviderName" | @ref PVRSignalStatus::GetProviderName "GetProviderName" | *optional* | ||
| 256 | /// | **Mux name** | `std::string` | @ref PVRSignalStatus::SetMuxName "SetMuxName" | @ref PVRSignalStatus::GetMuxName "GetMuxName" | *optional* | ||
| 257 | /// | **Signal/noise ratio** | `int` | @ref PVRSignalStatus::SetSNR "SetSNR" | @ref PVRSignalStatus::GetSNR "GetSNR" | *optional* | ||
| 258 | /// | **Signal strength** | `int` | @ref PVRSignalStatus::SetSignal "SetSignal" | @ref PVRSignalStatus::GetSignal "GetSignal" | *optional* | ||
| 259 | /// | **Bit error rate** | `long` | @ref PVRSignalStatus::SetBER "SetBER" | @ref PVRSignalStatus::GetBER "GetBER" | *optional* | ||
| 260 | /// | **Uncorrected blocks** | `long` | @ref PVRSignalStatus::SetUNC "SetUNC" | @ref PVRSignalStatus::GetUNC "GetUNC" | *optional* | ||
| 261 | /// | ||
| 262 | |||
| 263 | /// @addtogroup cpp_kodi_addon_pvr_Defs_Channel_PVRSignalStatus | ||
| 264 | ///@{ | ||
| 265 | |||
| 266 | /// @brief **optional**\n | ||
| 267 | /// Name of the adapter that's being used. | ||
| 268 | void SetAdapterName(const std::string& adapterName) | ||
| 269 | { | ||
| 270 | strncpy(m_cStructure->strAdapterName, adapterName.c_str(), | ||
| 271 | sizeof(m_cStructure->strAdapterName) - 1); | ||
| 272 | } | ||
| 273 | |||
| 274 | /// @brief To get with @ref SetAdapterName changed values. | ||
| 275 | std::string GetAdapterName() const { return m_cStructure->strAdapterName; } | ||
| 276 | |||
| 277 | /// @brief **optional**\n | ||
| 278 | /// Status of the adapter that's being used. | ||
| 279 | void SetAdapterStatus(const std::string& adapterStatus) | ||
| 280 | { | ||
| 281 | strncpy(m_cStructure->strAdapterStatus, adapterStatus.c_str(), | ||
| 282 | sizeof(m_cStructure->strAdapterStatus) - 1); | ||
| 283 | } | ||
| 284 | |||
| 285 | /// @brief To get with @ref SetAdapterStatus changed values. | ||
| 286 | std::string GetAdapterStatus() const { return m_cStructure->strAdapterStatus; } | ||
| 287 | |||
| 288 | /// @brief **optional**\n | ||
| 289 | /// Name of the current service. | ||
| 290 | void SetServiceName(const std::string& serviceName) | ||
| 291 | { | ||
| 292 | strncpy(m_cStructure->strServiceName, serviceName.c_str(), | ||
| 293 | sizeof(m_cStructure->strServiceName) - 1); | ||
| 294 | } | ||
| 295 | |||
| 296 | /// @brief To get with @ref SetServiceName changed values. | ||
| 297 | std::string GetServiceName() const { return m_cStructure->strServiceName; } | ||
| 298 | |||
| 299 | /// @brief **optional**\n | ||
| 300 | /// Name of the current service's provider. | ||
| 301 | void SetProviderName(const std::string& providerName) | ||
| 302 | { | ||
| 303 | strncpy(m_cStructure->strProviderName, providerName.c_str(), | ||
| 304 | sizeof(m_cStructure->strProviderName) - 1); | ||
| 305 | } | ||
| 306 | |||
| 307 | /// @brief To get with @ref SetProviderName changed values. | ||
| 308 | std::string GetProviderName() const { return m_cStructure->strProviderName; } | ||
| 309 | |||
| 310 | /// @brief **optional**\n | ||
| 311 | /// Name of the current mux. | ||
| 312 | void SetMuxName(const std::string& muxName) | ||
| 313 | { | ||
| 314 | strncpy(m_cStructure->strMuxName, muxName.c_str(), sizeof(m_cStructure->strMuxName) - 1); | ||
| 315 | } | ||
| 316 | |||
| 317 | /// @brief To get with @ref SetMuxName changed values. | ||
| 318 | std::string GetMuxName() const { return m_cStructure->strMuxName; } | ||
| 319 | |||
| 320 | /// @brief **optional**\n | ||
| 321 | /// Signal/noise ratio. | ||
| 322 | /// | ||
| 323 | /// @note 100% is 0xFFFF 65535 | ||
| 324 | void SetSNR(int snr) { m_cStructure->iSNR = snr; } | ||
| 325 | |||
| 326 | /// @brief To get with @ref SetSNR changed values. | ||
| 327 | int GetSNR() const { return m_cStructure->iSNR; } | ||
| 328 | |||
| 329 | /// @brief **optional**\n | ||
| 330 | /// Signal strength. | ||
| 331 | /// | ||
| 332 | /// @note 100% is 0xFFFF 65535 | ||
| 333 | void SetSignal(int signal) { m_cStructure->iSignal = signal; } | ||
| 334 | |||
| 335 | /// @brief To get with @ref SetSignal changed values. | ||
| 336 | int GetSignal() const { return m_cStructure->iSignal; } | ||
| 337 | |||
| 338 | /// @brief **optional**\n | ||
| 339 | /// Bit error rate. | ||
| 340 | void SetBER(long ber) { m_cStructure->iBER = ber; } | ||
| 341 | |||
| 342 | /// @brief To get with @ref SetBER changed values. | ||
| 343 | long GetBER() const { return m_cStructure->iBER; } | ||
| 344 | |||
| 345 | /// @brief **optional**\n | ||
| 346 | /// Uncorrected blocks: | ||
| 347 | void SetUNC(long unc) { m_cStructure->iUNC = unc; } | ||
| 348 | |||
| 349 | /// @brief To get with @ref SetBER changed values. | ||
| 350 | long GetUNC() const { return m_cStructure->iUNC; } | ||
| 351 | ///@} | ||
| 352 | |||
| 353 | private: | ||
| 354 | PVRSignalStatus(const PVR_SIGNAL_STATUS* type) : CStructHdl(type) {} | ||
| 355 | PVRSignalStatus(PVR_SIGNAL_STATUS* type) : CStructHdl(type) {} | ||
| 356 | }; | ||
| 357 | ///@} | ||
| 358 | //------------------------------------------------------------------------------ | ||
| 359 | |||
| 360 | //============================================================================== | ||
| 361 | /// @defgroup cpp_kodi_addon_pvr_Defs_Channel_PVRDescrambleInfo class PVRDescrambleInfo | ||
| 362 | /// @ingroup cpp_kodi_addon_pvr_Defs_Channel | ||
| 363 | /// @brief **Data structure for descrample info**\n | ||
| 364 | /// Information data to give via this to Kodi. | ||
| 365 | /// | ||
| 366 | /// As description see also here https://en.wikipedia.org/wiki/Conditional_access. | ||
| 367 | /// | ||
| 368 | /// Used on @ref kodi::addon::CInstancePVRClient::GetDescrambleInfo(). | ||
| 369 | /// | ||
| 370 | /// ---------------------------------------------------------------------------- | ||
| 371 | /// | ||
| 372 | /// @copydetails cpp_kodi_addon_pvr_Defs_Channel_PVRDescrambleInfo_Help | ||
| 373 | /// | ||
| 374 | ///@{ | ||
| 375 | class PVRDescrambleInfo : public CStructHdl<PVRDescrambleInfo, PVR_DESCRAMBLE_INFO> | ||
| 376 | { | ||
| 377 | friend class CInstancePVRClient; | ||
| 378 | |||
| 379 | public: | ||
| 380 | /*! \cond PRIVATE */ | ||
| 381 | PVRDescrambleInfo() | ||
| 382 | { | ||
| 383 | m_cStructure->iPid = PVR_DESCRAMBLE_INFO_NOT_AVAILABLE; | ||
| 384 | m_cStructure->iCaid = PVR_DESCRAMBLE_INFO_NOT_AVAILABLE; | ||
| 385 | m_cStructure->iProvid = PVR_DESCRAMBLE_INFO_NOT_AVAILABLE; | ||
| 386 | m_cStructure->iEcmTime = PVR_DESCRAMBLE_INFO_NOT_AVAILABLE; | ||
| 387 | m_cStructure->iHops = PVR_DESCRAMBLE_INFO_NOT_AVAILABLE; | ||
| 388 | } | ||
| 389 | PVRDescrambleInfo(const PVRDescrambleInfo& type) : CStructHdl(type) {} | ||
| 390 | /*! \endcond */ | ||
| 391 | |||
| 392 | /// @defgroup cpp_kodi_addon_pvr_Defs_Channel_PVRDescrambleInfo_Help Value Help | ||
| 393 | /// @ingroup cpp_kodi_addon_pvr_Defs_Channel_PVRDescrambleInfo | ||
| 394 | /// | ||
| 395 | /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Channel_PVRDescrambleInfo :</b> | ||
| 396 | /// | Name | Type | Set call | Get call | Usage | ||
| 397 | /// |------|------|----------|----------|----------- | ||
| 398 | /// | **Packet identifier** | `int` | @ref PVRDescrambleInfo::SetPID "SetPID" | @ref PVRDescrambleInfo::GetPID "GetPID" | *optional* | ||
| 399 | /// | **Conditional access identifier** | `int` | @ref PVRDescrambleInfo::SetCAID "SetCAID" | @ref PVRDescrambleInfo::GetCAID "GetCAID" | *optional* | ||
| 400 | /// | **Provider-ID** | `int` | @ref PVRDescrambleInfo::SetProviderID "SetProviderID" | @ref PVRDescrambleInfo::GetProviderID "GetProviderID" | *optional* | ||
| 401 | /// | **ECM time** | `int` | @ref PVRDescrambleInfo::SetECMTime "SetECMTime" | @ref PVRDescrambleInfo::GetECMTime "GetECMTime" | *optional* | ||
| 402 | /// | **Hops** | `int` | @ref PVRDescrambleInfo::SetHops "SetHops" | @ref PVRDescrambleInfo::GetHops "GetHops" | *optional* | ||
| 403 | /// | **Descramble card system** | `std::string` | @ref PVRDescrambleInfo::SetHops "SetHops" | @ref PVRDescrambleInfo::GetHops "GetHops" | *optional* | ||
| 404 | /// | **Reader** | `std::string` | @ref PVRDescrambleInfo::SetReader "SetReader" | @ref PVRDescrambleInfo::GetReader "GetReader" | *optional* | ||
| 405 | /// | **From** | `std::string` | @ref PVRDescrambleInfo::SetFrom "SetFrom" | @ref PVRDescrambleInfo::GetFrom "GetFrom" | *optional* | ||
| 406 | /// | **Protocol** | `std::string` | @ref PVRDescrambleInfo::SetProtocol "SetProtocol" | @ref PVRDescrambleInfo::GetProtocol "GetProtocol" | *optional* | ||
| 407 | /// | ||
| 408 | |||
| 409 | /// @addtogroup cpp_kodi_addon_pvr_Defs_Channel_PVRDescrambleInfo | ||
| 410 | ///@{ | ||
| 411 | |||
| 412 | /// @brief **optional**\n | ||
| 413 | /// Packet identifier. | ||
| 414 | /// | ||
| 415 | /// Each table or elementary stream in a transport stream is identified by | ||
| 416 | /// a 13-bit packet identifier (PID). | ||
| 417 | /// | ||
| 418 | /// Is @ref PVR_DESCRAMBLE_INFO_NOT_AVAILABLE as default, if not available | ||
| 419 | void SetPID(int pid) { m_cStructure->iPid = pid; } | ||
| 420 | |||
| 421 | /// @brief To get with @ref SetPID changed values | ||
| 422 | int GetPID() const { return m_cStructure->iPid; } | ||
| 423 | |||
| 424 | /// @brief **optional**\n | ||
| 425 | /// Conditional access identifier. | ||
| 426 | /// | ||
| 427 | /// Conditional access (abbreviated CA) or conditional access system (abbreviated CAS) | ||
| 428 | /// is the protection of content by requiring certain criteria to be met before granting | ||
| 429 | /// access to the content. | ||
| 430 | /// | ||
| 431 | /// Available CA system ID's listed here https://www.dvbservices.com/identifiers/ca_system_id. | ||
| 432 | /// | ||
| 433 | /// @ref PVR_DESCRAMBLE_INFO_NOT_AVAILABLE if not available. | ||
| 434 | void SetCAID(int iCaid) { m_cStructure->iCaid = iCaid; } | ||
| 435 | |||
| 436 | /// @brief To get with @ref SetCAID changed values. | ||
| 437 | int GetCAID() const { return m_cStructure->iCaid; } | ||
| 438 | |||
| 439 | /// @brief **optional**\n | ||
| 440 | /// Provider-ID. | ||
| 441 | /// | ||
| 442 | /// Is @ref PVR_DESCRAMBLE_INFO_NOT_AVAILABLE as default, if not available. | ||
| 443 | void SetProviderID(int provid) { m_cStructure->iProvid = provid; } | ||
| 444 | |||
| 445 | /// @brief To get with @ref SetProviderID changed values | ||
| 446 | int GetProviderID() const { return m_cStructure->iProvid; } | ||
| 447 | |||
| 448 | /// @brief **optional**\n | ||
| 449 | /// ECM time. | ||
| 450 | /// | ||
| 451 | /// Is @ref PVR_DESCRAMBLE_INFO_NOT_AVAILABLE as default, if not available. | ||
| 452 | void SetECMTime(int ecmTime) { m_cStructure->iEcmTime = ecmTime; } | ||
| 453 | |||
| 454 | /// @brief To get with @ref SetECMTime changed values. | ||
| 455 | int GetECMTime() const { return m_cStructure->iEcmTime; } | ||
| 456 | |||
| 457 | /// @brief **optional**\n | ||
| 458 | /// Hops. | ||
| 459 | /// | ||
| 460 | /// Is @ref PVR_DESCRAMBLE_INFO_NOT_AVAILABLE as default, if not available. | ||
| 461 | void SetHops(int hops) { m_cStructure->iHops = hops; } | ||
| 462 | |||
| 463 | /// @brief To get with @ref SetHops changed values. | ||
| 464 | int GetHops() const { return m_cStructure->iHops; } | ||
| 465 | |||
| 466 | /// @brief **optional**\n | ||
| 467 | /// Empty string if not available. | ||
| 468 | void SetCardSystem(const std::string& cardSystem) | ||
| 469 | { | ||
| 470 | strncpy(m_cStructure->strCardSystem, cardSystem.c_str(), | ||
| 471 | sizeof(m_cStructure->strCardSystem) - 1); | ||
| 472 | } | ||
| 473 | |||
| 474 | /// @brief To get with @ref SetCardSystem changed values. | ||
| 475 | std::string GetCardSystem() const { return m_cStructure->strCardSystem; } | ||
| 476 | |||
| 477 | /// @brief **optional**\n | ||
| 478 | /// Empty string if not available. | ||
| 479 | void SetReader(const std::string& reader) | ||
| 480 | { | ||
| 481 | strncpy(m_cStructure->strReader, reader.c_str(), sizeof(m_cStructure->strReader) - 1); | ||
| 482 | } | ||
| 483 | |||
| 484 | /// @brief To get with @ref SetReader changed values. | ||
| 485 | std::string GetReader() const { return m_cStructure->strReader; } | ||
| 486 | |||
| 487 | /// @brief **optional**\n | ||
| 488 | /// Empty string if not available. | ||
| 489 | void SetFrom(const std::string& from) | ||
| 490 | { | ||
| 491 | strncpy(m_cStructure->strFrom, from.c_str(), sizeof(m_cStructure->strFrom) - 1); | ||
| 492 | } | ||
| 493 | |||
| 494 | /// @brief To get with @ref SetFrom changed values. | ||
| 495 | std::string GetFrom() const { return m_cStructure->strFrom; } | ||
| 496 | |||
| 497 | /// @brief **optional**\n | ||
| 498 | /// Empty string if not available. | ||
| 499 | void SetProtocol(const std::string& protocol) | ||
| 500 | { | ||
| 501 | strncpy(m_cStructure->strProtocol, protocol.c_str(), sizeof(m_cStructure->strProtocol) - 1); | ||
| 502 | } | ||
| 503 | |||
| 504 | /// @brief To get with @ref SetProtocol changed values. | ||
| 505 | std::string GetProtocol() const { return m_cStructure->strProtocol; } | ||
| 506 | ///@} | ||
| 507 | |||
| 508 | private: | ||
| 509 | PVRDescrambleInfo(const PVR_DESCRAMBLE_INFO* type) : CStructHdl(type) {} | ||
| 510 | PVRDescrambleInfo(PVR_DESCRAMBLE_INFO* type) : CStructHdl(type) {} | ||
| 511 | }; | ||
| 512 | ///@} | ||
| 513 | //------------------------------------------------------------------------------ | ||
| 514 | |||
| 515 | } /* namespace addon */ | ||
| 516 | } /* namespace kodi */ | ||
| 517 | |||
| 518 | #endif /* __cplusplus */ | ||
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/EDL.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/EDL.h new file mode 100644 index 0000000..34c7c41 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/EDL.h | |||
| @@ -0,0 +1,90 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2005-2018 Team Kodi | ||
| 3 | * This file is part of Kodi - https://kodi.tv | ||
| 4 | * | ||
| 5 | * SPDX-License-Identifier: GPL-2.0-or-later | ||
| 6 | * See LICENSES/README.md for more information. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #pragma once | ||
| 10 | |||
| 11 | #include "../../AddonBase.h" | ||
| 12 | #include "../../c-api/addon-instance/pvr/pvr_edl.h" | ||
| 13 | |||
| 14 | //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ | ||
| 15 | // "C++" Definitions group 8 - PVR Edit definition list (EDL) | ||
| 16 | #ifdef __cplusplus | ||
| 17 | |||
| 18 | namespace kodi | ||
| 19 | { | ||
| 20 | namespace addon | ||
| 21 | { | ||
| 22 | |||
| 23 | //============================================================================== | ||
| 24 | /// @defgroup cpp_kodi_addon_pvr_Defs_EDLEntry_PVREDLEntry class PVREDLEntry | ||
| 25 | /// @ingroup cpp_kodi_addon_pvr_Defs_EDLEntry | ||
| 26 | /// @brief **Edit definition list (EDL) entry**\n | ||
| 27 | /// Time places and type of related fields. | ||
| 28 | /// | ||
| 29 | /// This used within @ref cpp_kodi_addon_pvr_EPGTag "EPG" and | ||
| 30 | /// @ref cpp_kodi_addon_pvr_Recordings "recordings". | ||
| 31 | /// | ||
| 32 | /// ---------------------------------------------------------------------------- | ||
| 33 | /// | ||
| 34 | /// @copydetails cpp_kodi_addon_pvr_Defs_EDLEntry_PVREDLEntry_Help | ||
| 35 | /// | ||
| 36 | ///@{ | ||
| 37 | class PVREDLEntry : public CStructHdl<PVREDLEntry, PVR_EDL_ENTRY> | ||
| 38 | { | ||
| 39 | friend class CInstancePVRClient; | ||
| 40 | |||
| 41 | public: | ||
| 42 | /*! \cond PRIVATE */ | ||
| 43 | PVREDLEntry() { memset(m_cStructure, 0, sizeof(PVR_EDL_ENTRY)); } | ||
| 44 | PVREDLEntry(const PVREDLEntry& type) : CStructHdl(type) {} | ||
| 45 | /*! \endcond */ | ||
| 46 | |||
| 47 | /// @defgroup cpp_kodi_addon_pvr_Defs_EDLEntry_PVREDLEntry_Help Value Help | ||
| 48 | /// @ingroup cpp_kodi_addon_pvr_Defs_EDLEntry_PVREDLEntry | ||
| 49 | /// | ||
| 50 | /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_EDLEntry_PVREDLEntry :</b> | ||
| 51 | /// | Name | Type | Set call | Get call | Usage | ||
| 52 | /// |------|------|----------|----------|----------- | ||
| 53 | /// | **Start time** | `int64_t` | @ref PVREDLEntry::SetStart "SetStart" | @ref PVREDLEntry::GetStart "GetStart" | *required to set* | ||
| 54 | /// | **End time** | `int64_t` | @ref PVREDLEntry::SetEnd "SetEnd" | @ref PVREDLEntry::GetEnd "GetEnd" | *required to set* | ||
| 55 | /// | **Type** | @ref PVR_EDL_TYPE | @ref PVREDLEntry::SetType "SetType" | @ref PVREDLEntry::GetType "GetType" | *required to set* | ||
| 56 | /// | ||
| 57 | |||
| 58 | /// @addtogroup cpp_kodi_addon_pvr_Defs_EDLEntry_PVREDLEntry | ||
| 59 | ///@{ | ||
| 60 | |||
| 61 | /// @brief Start time in milliseconds. | ||
| 62 | void SetStart(int64_t start) { m_cStructure->start = start; } | ||
| 63 | |||
| 64 | /// @brief To get with @ref SetStart() changed values. | ||
| 65 | int64_t GetStart() const { return m_cStructure->start; } | ||
| 66 | |||
| 67 | /// @brief End time in milliseconds. | ||
| 68 | void SetEnd(int64_t end) { m_cStructure->end = end; } | ||
| 69 | |||
| 70 | /// @brief To get with @ref SetEnd() changed values. | ||
| 71 | int64_t GetEnd() const { return m_cStructure->end; } | ||
| 72 | |||
| 73 | /// @brief The with @ref PVR_EDL_TYPE used definition list type. | ||
| 74 | void SetType(PVR_EDL_TYPE type) { m_cStructure->type = type; } | ||
| 75 | |||
| 76 | /// @brief To get with @ref SetType() changed values. | ||
| 77 | PVR_EDL_TYPE GetType() const { return m_cStructure->type; } | ||
| 78 | ///@} | ||
| 79 | |||
| 80 | private: | ||
| 81 | PVREDLEntry(const PVR_EDL_ENTRY* type) : CStructHdl(type) {} | ||
| 82 | PVREDLEntry(PVR_EDL_ENTRY* type) : CStructHdl(type) {} | ||
| 83 | }; | ||
| 84 | ///@} | ||
| 85 | //------------------------------------------------------------------------------ | ||
| 86 | |||
| 87 | } /* namespace addon */ | ||
| 88 | } /* namespace kodi */ | ||
| 89 | |||
| 90 | #endif /* __cplusplus */ | ||
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/EPG.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/EPG.h new file mode 100644 index 0000000..e1fc04f --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/EPG.h | |||
| @@ -0,0 +1,500 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2005-2018 Team Kodi | ||
| 3 | * This file is part of Kodi - https://kodi.tv | ||
| 4 | * | ||
| 5 | * SPDX-License-Identifier: GPL-2.0-or-later | ||
| 6 | * See LICENSES/README.md for more information. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #pragma once | ||
| 10 | |||
| 11 | #include "../../AddonBase.h" | ||
| 12 | #include "../../c-api/addon-instance/pvr.h" | ||
| 13 | |||
| 14 | //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ | ||
| 15 | // "C++" Definitions group 4 - PVR EPG | ||
| 16 | #ifdef __cplusplus | ||
| 17 | |||
| 18 | namespace kodi | ||
| 19 | { | ||
| 20 | namespace addon | ||
| 21 | { | ||
| 22 | |||
| 23 | //============================================================================== | ||
| 24 | /// @defgroup cpp_kodi_addon_pvr_Defs_epg_PVREPGTag class PVREPGTag | ||
| 25 | /// @ingroup cpp_kodi_addon_pvr_Defs_epg | ||
| 26 | /// @brief **PVR add-on EPG data tag**\n | ||
| 27 | /// Representation of an EPG event. | ||
| 28 | /// | ||
| 29 | /// Herewith all EPG related data are saved in one class whereby the data can | ||
| 30 | /// be exchanged with Kodi, or can also be used on the addon to save there. | ||
| 31 | /// | ||
| 32 | /// See @ref cpp_kodi_addon_pvr_EPGTag "EPG methods" about usage. | ||
| 33 | /// | ||
| 34 | /// ---------------------------------------------------------------------------- | ||
| 35 | /// | ||
| 36 | /// @copydetails cpp_kodi_addon_pvr_Defs_epg_PVREPGTag_Help | ||
| 37 | /// | ||
| 38 | ///@{ | ||
| 39 | class PVREPGTag : public CStructHdl<PVREPGTag, EPG_TAG> | ||
| 40 | { | ||
| 41 | friend class CInstancePVRClient; | ||
| 42 | |||
| 43 | public: | ||
| 44 | /*! \cond PRIVATE */ | ||
| 45 | PVREPGTag() | ||
| 46 | { | ||
| 47 | memset(m_cStructure, 0, sizeof(EPG_TAG)); | ||
| 48 | m_cStructure->iSeriesNumber = EPG_TAG_INVALID_SERIES_EPISODE; | ||
| 49 | m_cStructure->iEpisodeNumber = EPG_TAG_INVALID_SERIES_EPISODE; | ||
| 50 | m_cStructure->iEpisodePartNumber = EPG_TAG_INVALID_SERIES_EPISODE; | ||
| 51 | } | ||
| 52 | PVREPGTag(const PVREPGTag& epg) : CStructHdl(epg) | ||
| 53 | { | ||
| 54 | m_title = epg.m_title; | ||
| 55 | m_plotOutline = epg.m_plotOutline; | ||
| 56 | m_plot = epg.m_plot; | ||
| 57 | m_originalTitle = epg.m_originalTitle; | ||
| 58 | m_cast = epg.m_cast; | ||
| 59 | m_director = epg.m_director; | ||
| 60 | m_writer = epg.m_writer; | ||
| 61 | m_IMDBNumber = epg.m_IMDBNumber; | ||
| 62 | m_iconPath = epg.m_iconPath; | ||
| 63 | m_genreDescription = epg.m_genreDescription; | ||
| 64 | m_episodeName = epg.m_episodeName; | ||
| 65 | m_seriesLink = epg.m_seriesLink; | ||
| 66 | m_firstAired = epg.m_firstAired; | ||
| 67 | } | ||
| 68 | /*! \endcond */ | ||
| 69 | |||
| 70 | |||
| 71 | /// @defgroup cpp_kodi_addon_pvr_Defs_epg_PVREPGTag_Help Value Help | ||
| 72 | /// @ingroup cpp_kodi_addon_pvr_Defs_epg_PVREPGTag | ||
| 73 | /// | ||
| 74 | /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_epg_PVREPGTag :</b> | ||
| 75 | /// | Name | Type | Set call | Get call | Usage | ||
| 76 | /// |------|------|----------|----------|--------- | ||
| 77 | /// | **Unique broadcast id** | `unsigned int` | @ref PVREPGTag::SetUniqueBroadcastId "SetUniqueBroadcastId" | @ref PVREPGTag::GetUniqueBroadcastId "GetUniqueBroadcastId" | *required to set* | ||
| 78 | /// | **Unique channel id** | `unsigned int` | @ref PVREPGTag::SetUniqueChannelId "SetUniqueChannelId" | @ref PVREPGTag::GetUniqueChannelId "GetUniqueChannelId" | *required to set* | ||
| 79 | /// | **Title** | `std::string` | @ref PVREPGTag::SetTitle "SetTitle" | @ref PVREPGTag::GetTitle "GetTitle" | *required to set* | ||
| 80 | /// | **Start time** | `time_t` | @ref PVREPGTag::SetStartTime "SetStartTime" | @ref PVREPGTag::GetStartTime "GetStartTime" | *required to set* | ||
| 81 | /// | **End time** | `time_t` | @ref PVREPGTag::SetEndTime "SetEndTime" | @ref PVREPGTag::GetEndTime "GetEndTime" | *required to set* | ||
| 82 | /// | **Plot outline** | `std::string` | @ref PVREPGTag::SetPlotOutline "SetPlotOutline" | @ref PVREPGTag::GetPlotOutline "GetPlotOutline" | *optional* | ||
| 83 | /// | **Plot** | `std::string` | @ref PVREPGTag::SetPlot "SetPlot" | @ref PVREPGTag::GetPlot "GetPlot" | *optional* | ||
| 84 | /// | **Original title** | `std::string` | @ref PVREPGTag::SetOriginalTitle "SetOriginalTitle" | @ref PVREPGTag::GetOriginalTitle "GetOriginalTitle" | *optional* | ||
| 85 | /// | **Cast** | `std::string` | @ref PVREPGTag::SetCast "SetCast" | @ref PVREPGTag::GetCast "GetCast" | *optional* | ||
| 86 | /// | **Director** | `std::string` | @ref PVREPGTag::SetDirector "SetDirector" | @ref PVREPGTag::GetDirector "GetDirector" | *optional* | ||
| 87 | /// | **Writer** | `std::string` | @ref PVREPGTag::SetWriter "SetWriter" | @ref PVREPGTag::GetWriter "GetWriter" | *optional* | ||
| 88 | /// | **Year** | `int` | @ref PVREPGTag::SetYear "SetYear" | @ref PVREPGTag::GetYear "GetYear" | *optional* | ||
| 89 | /// | **IMDB number** | `std::string` | @ref PVREPGTag::SetIMDBNumber "SetIMDBNumber" | @ref PVREPGTag::GetIMDBNumber "GetIMDBNumber" | *optional* | ||
| 90 | /// | **Icon path** | `std::string` | @ref PVREPGTag::SetIconPath "SetIconPath" | @ref PVREPGTag::GetIconPath "GetIconPath" | *optional* | ||
| 91 | /// | **Genre type** | `int` | @ref PVREPGTag::SetGenreType "SetGenreType" | @ref PVREPGTag::GetGenreType "GetGenreType" | *optional* | ||
| 92 | /// | **Genre sub type** | `int` | @ref PVREPGTag::SetGenreSubType "SetGenreSubType" | @ref PVREPGTag::GetGenreSubType "GetGenreSubType" | *optional* | ||
| 93 | /// | **Genre description** | `std::string` | @ref PVREPGTag::SetGenreDescription "SetGenreDescription" | @ref PVREPGTag::GetGenreDescription "GetGenreDescription" | *optional* | ||
| 94 | /// | **First aired** | `time_t` | @ref PVREPGTag::SetFirstAired "SetFirstAired" | @ref PVREPGTag::GetFirstAired "GetFirstAired" | *optional* | ||
| 95 | /// | **Parental rating** | `int` | @ref PVREPGTag::SetParentalRating "SetParentalRating" | @ref PVREPGTag::GetParentalRating "GetParentalRating" | *optional* | ||
| 96 | /// | **Star rating** | `int` | @ref PVREPGTag::SetStarRating "SetStarRating" | @ref PVREPGTag::GetStarRating "GetStarRating" | *optional* | ||
| 97 | /// | **Series number** | `int` | @ref PVREPGTag::SetSeriesNumber "SetSeriesNumber" | @ref PVREPGTag::GetSeriesNumber "GetSeriesNumber" | *optional* | ||
| 98 | /// | **Episode number** | `int` | @ref PVREPGTag::SetEpisodeNumber "SetEpisodeNumber" | @ref PVREPGTag::GetEpisodeNumber "GetEpisodeNumber" | *optional* | ||
| 99 | /// | **Episode part number** | `int` | @ref PVREPGTag::SetEpisodePartNumber "SetEpisodePartNumber" | @ref PVREPGTag::GetEpisodePartNumber "GetEpisodePartNumber" | *optional* | ||
| 100 | /// | **Episode name** | `std::string` | @ref PVREPGTag::SetEpisodeName "SetEpisodeName" | @ref PVREPGTag::GetEpisodeName "GetEpisodeName" | *optional* | ||
| 101 | /// | **Flags** | `unsigned int` | @ref PVREPGTag::SetFlags "SetFlags" | @ref PVREPGTag::GetFlags "GetFlags" | *optional* | ||
| 102 | /// | **Series link** | `std::string` | @ref PVREPGTag::SetSeriesLink "SetSeriesLink" | @ref PVREPGTag::GetSeriesLink "GetSeriesLink" | *optional* | ||
| 103 | /// | ||
| 104 | |||
| 105 | /// @addtogroup cpp_kodi_addon_pvr_Defs_epg_PVREPGTag | ||
| 106 | ///@{ | ||
| 107 | |||
| 108 | /// @brief **required**\n | ||
| 109 | /// Identifier for this event. Event uids must be unique for a channel. Valid uids must be greater than @ref EPG_TAG_INVALID_UID. | ||
| 110 | void SetUniqueBroadcastId(unsigned int uniqueBroadcastId) | ||
| 111 | { | ||
| 112 | m_cStructure->iUniqueBroadcastId = uniqueBroadcastId; | ||
| 113 | } | ||
| 114 | |||
| 115 | /// @brief To get with @ref SetUniqueBroadcastId changed values. | ||
| 116 | unsigned int GetUniqueBroadcastId() const { return m_cStructure->iUniqueBroadcastId; } | ||
| 117 | |||
| 118 | /// @brief **required**\n | ||
| 119 | /// Unique identifier of the channel this event belongs to. | ||
| 120 | void SetUniqueChannelId(unsigned int uniqueChannelId) | ||
| 121 | { | ||
| 122 | m_cStructure->iUniqueChannelId = uniqueChannelId; | ||
| 123 | } | ||
| 124 | |||
| 125 | /// @brief To get with @ref SetUniqueChannelId changed values | ||
| 126 | unsigned int GetUniqueChannelId() const { return m_cStructure->iUniqueChannelId; } | ||
| 127 | |||
| 128 | /// @brief **required**\n | ||
| 129 | /// This event's title. | ||
| 130 | void SetTitle(const std::string& title) { m_title = title; } | ||
| 131 | |||
| 132 | /// @brief To get with @ref SetTitle changed values. | ||
| 133 | std::string GetTitle() const { return m_title; } | ||
| 134 | |||
| 135 | /// @brief **required**\n | ||
| 136 | /// Start time in UTC. | ||
| 137 | /// | ||
| 138 | /// Seconds elapsed since 00:00 hours, Jan 1, 1970 UTC. | ||
| 139 | void SetStartTime(time_t startTime) { m_cStructure->startTime = startTime; } | ||
| 140 | |||
| 141 | /// @brief To get with @ref SetStartTime changed values. | ||
| 142 | time_t GetStartTime() const { return m_cStructure->startTime; } | ||
| 143 | |||
| 144 | /// @brief **required**\n | ||
| 145 | /// End time in UTC. | ||
| 146 | /// | ||
| 147 | /// Seconds elapsed since 00:00 hours, Jan 1, 1970 UTC. | ||
| 148 | void SetEndTime(time_t endTime) { m_cStructure->endTime = endTime; } | ||
| 149 | |||
| 150 | /// @brief To get with @ref SetEndTime changed values. | ||
| 151 | time_t GetEndTime() const { return m_cStructure->endTime; } | ||
| 152 | |||
| 153 | /// @brief **optional**\n | ||
| 154 | /// Plot outline name. | ||
| 155 | void SetPlotOutline(const std::string& plotOutline) { m_plotOutline = plotOutline; } | ||
| 156 | |||
| 157 | /// @brief To get with @ref SetPlotOutline changed values. | ||
| 158 | std::string GetPlotOutline() const { return m_plotOutline; } | ||
| 159 | |||
| 160 | /// @brief **optional**\n | ||
| 161 | /// Plot name. | ||
| 162 | void SetPlot(const std::string& plot) { m_plot = plot; } | ||
| 163 | |||
| 164 | /// @brief To get with @ref GetPlot changed values. | ||
| 165 | std::string GetPlot() const { return m_plot; } | ||
| 166 | |||
| 167 | /// @brief **optional**\n | ||
| 168 | /// Original title. | ||
| 169 | void SetOriginalTitle(const std::string& originalTitle) { m_originalTitle = originalTitle; } | ||
| 170 | |||
| 171 | /// @brief To get with @ref SetOriginalTitle changed values | ||
| 172 | std::string GetOriginalTitle() const { return m_originalTitle; } | ||
| 173 | |||
| 174 | /// @brief **optional**\n | ||
| 175 | /// Cast name(s). | ||
| 176 | /// | ||
| 177 | /// @note Use @ref EPG_STRING_TOKEN_SEPARATOR to separate different persons. | ||
| 178 | void SetCast(const std::string& cast) { m_cast = cast; } | ||
| 179 | |||
| 180 | /// @brief To get with @ref SetCast changed values | ||
| 181 | std::string GetCast() const { return m_cast; } | ||
| 182 | |||
| 183 | /// @brief **optional**\n | ||
| 184 | /// Director name(s). | ||
| 185 | /// | ||
| 186 | /// @note Use @ref EPG_STRING_TOKEN_SEPARATOR to separate different persons. | ||
| 187 | void SetDirector(const std::string& director) { m_director = director; } | ||
| 188 | |||
| 189 | /// @brief To get with @ref SetDirector changed values. | ||
| 190 | std::string GetDirector() const { return m_director; } | ||
| 191 | |||
| 192 | /// @brief **optional**\n | ||
| 193 | /// Writer name(s). | ||
| 194 | /// | ||
| 195 | /// @note Use @ref EPG_STRING_TOKEN_SEPARATOR to separate different persons. | ||
| 196 | void SetWriter(const std::string& writer) { m_writer = writer; } | ||
| 197 | |||
| 198 | /// @brief To get with @ref SetDirector changed values | ||
| 199 | std::string GetWriter() const { return m_writer; } | ||
| 200 | |||
| 201 | /// @brief **optional**\n | ||
| 202 | /// Year. | ||
| 203 | void SetYear(int year) { m_cStructure->iYear = year; } | ||
| 204 | |||
| 205 | /// @brief To get with @ref SetYear changed values. | ||
| 206 | int GetYear() const { return m_cStructure->iYear; } | ||
| 207 | |||
| 208 | /// @brief **optional**\n | ||
| 209 | /// [IMDB](https://en.wikipedia.org/wiki/IMDb) identification number. | ||
| 210 | void SetIMDBNumber(const std::string& IMDBNumber) { m_IMDBNumber = IMDBNumber; } | ||
| 211 | |||
| 212 | /// @brief To get with @ref SetIMDBNumber changed values. | ||
| 213 | std::string GetIMDBNumber() const { return m_IMDBNumber; } | ||
| 214 | |||
| 215 | /// @brief **optional**\n | ||
| 216 | /// Icon path. | ||
| 217 | void SetIconPath(const std::string& iconPath) { m_iconPath = iconPath; } | ||
| 218 | |||
| 219 | /// @brief To get with @ref SetIconPath changed values. | ||
| 220 | std::string GetIconPath() const { return m_iconPath; } | ||
| 221 | |||
| 222 | /// @brief **optional**\n | ||
| 223 | /// Genre type. | ||
| 224 | /// | ||
| 225 | /// -------------------------------------------------------------------------- | ||
| 226 | /// | ||
| 227 | /// @copydetails EPG_EVENT_CONTENTMASK | ||
| 228 | /// | ||
| 229 | /// Use @ref EPG_GENRE_USE_STRING if type becomes given by @ref SetGenreDescription. | ||
| 230 | /// | ||
| 231 | /// @note If confirmed that backend brings the types in [ETSI EN 300 468](https://www.etsi.org/deliver/etsi_en/300400_300499/300468/01.14.01_60/en_300468v011401p.pdf) | ||
| 232 | /// conform values, can be @ref EPG_EVENT_CONTENTMASK ignored and to set here | ||
| 233 | /// with backend value. | ||
| 234 | /// | ||
| 235 | /// | ||
| 236 | /// -------------------------------------------------------------------------- | ||
| 237 | /// | ||
| 238 | /// **Example 1:** | ||
| 239 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 240 | /// kodi::addon::PVREPGTag tag; | ||
| 241 | /// tag.SetGenreType(EPG_EVENT_CONTENTMASK_MOVIEDRAMA); | ||
| 242 | /// ~~~~~~~~~~~~~ | ||
| 243 | /// | ||
| 244 | /// -------------------------------------------------------------------------- | ||
| 245 | /// | ||
| 246 | /// **Example 2** (in case of other, not ETSI EN 300 468 conform genre types): | ||
| 247 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 248 | /// kodi::addon::PVREPGTag tag; | ||
| 249 | /// tag.SetGenreType(EPG_GENRE_USE_STRING); | ||
| 250 | /// tag.SetGenreDescription("My special genre name"); // Should use (if possible) kodi::GetLocalizedString(...) to have match user language. | ||
| 251 | /// ~~~~~~~~~~~~~ | ||
| 252 | /// | ||
| 253 | void SetGenreType(int genreType) { m_cStructure->iGenreType = genreType; } | ||
| 254 | |||
| 255 | /// @brief To get with @ref SetGenreType changed values | ||
| 256 | int GetGenreType() const { return m_cStructure->iGenreType; } | ||
| 257 | |||
| 258 | /// @brief **optional**\n | ||
| 259 | /// Genre sub type. | ||
| 260 | /// | ||
| 261 | /// @copydetails EPG_EVENT_CONTENTMASK | ||
| 262 | /// | ||
| 263 | /// Subtypes groups related to set by @ref SetGenreType: | ||
| 264 | /// | Main genre type | List with available sub genre types | ||
| 265 | /// |-----------------|----------------------------------------- | ||
| 266 | /// | @ref EPG_EVENT_CONTENTMASK_UNDEFINED | Nothing, should be 0 | ||
| 267 | /// | @ref EPG_EVENT_CONTENTMASK_MOVIEDRAMA | @ref EPG_EVENT_CONTENTSUBMASK_MOVIEDRAMA | ||
| 268 | /// | @ref EPG_EVENT_CONTENTMASK_NEWSCURRENTAFFAIRS | @ref EPG_EVENT_CONTENTSUBMASK_NEWSCURRENTAFFAIRS | ||
| 269 | /// | @ref EPG_EVENT_CONTENTMASK_SHOW | @ref EPG_EVENT_CONTENTSUBMASK_SHOW | ||
| 270 | /// | @ref EPG_EVENT_CONTENTMASK_SPORTS | @ref EPG_EVENT_CONTENTSUBMASK_SPORTS | ||
| 271 | /// | @ref EPG_EVENT_CONTENTMASK_CHILDRENYOUTH | @ref EPG_EVENT_CONTENTSUBMASK_CHILDRENYOUTH | ||
| 272 | /// | @ref EPG_EVENT_CONTENTMASK_MUSICBALLETDANCE | @ref EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE | ||
| 273 | /// | @ref EPG_EVENT_CONTENTMASK_ARTSCULTURE | @ref EPG_EVENT_CONTENTSUBMASK_ARTSCULTURE | ||
| 274 | /// | @ref EPG_EVENT_CONTENTMASK_SOCIALPOLITICALECONOMICS | @ref EPG_EVENT_CONTENTSUBMASK_SOCIALPOLITICALECONOMICS | ||
| 275 | /// | @ref EPG_EVENT_CONTENTMASK_EDUCATIONALSCIENCE | @ref EPG_EVENT_CONTENTSUBMASK_EDUCATIONALSCIENCE | ||
| 276 | /// | @ref EPG_EVENT_CONTENTMASK_LEISUREHOBBIES | @ref EPG_EVENT_CONTENTSUBMASK_LEISUREHOBBIES | ||
| 277 | /// | @ref EPG_EVENT_CONTENTMASK_SPECIAL | @ref EPG_EVENT_CONTENTSUBMASK_SPECIAL | ||
| 278 | /// | @ref EPG_EVENT_CONTENTMASK_USERDEFINED | Can be defined by you | ||
| 279 | /// | @ref EPG_GENRE_USE_STRING | **Kodi's own value**, which declares that the type with @ref SetGenreDescription is given. | ||
| 280 | /// | ||
| 281 | /// -------------------------------------------------------------------------- | ||
| 282 | /// | ||
| 283 | /// **Example:** | ||
| 284 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 285 | /// kodi::addon::PVREPGTag tag; | ||
| 286 | /// tag.SetGenreType(EPG_EVENT_CONTENTMASK_MUSICBALLETDANCE); | ||
| 287 | /// tag.SetGenreSubType(EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE_JAZZ); | ||
| 288 | /// ~~~~~~~~~~~~~ | ||
| 289 | /// | ||
| 290 | void SetGenreSubType(int genreSubType) { m_cStructure->iGenreSubType = genreSubType; } | ||
| 291 | |||
| 292 | /// @brief To get with @ref SetGenreSubType changed values. | ||
| 293 | int GetGenreSubType() const { return m_cStructure->iGenreSubType; } | ||
| 294 | |||
| 295 | /// @brief **optional**\n genre. Will be used only when genreType == @ref EPG_GENRE_USE_STRING | ||
| 296 | /// or genreSubType == @ref EPG_GENRE_USE_STRING. | ||
| 297 | /// | ||
| 298 | /// Use @ref EPG_STRING_TOKEN_SEPARATOR to separate different genres. | ||
| 299 | /// | ||
| 300 | /// In case of other, not [ETSI EN 300 468](https://www.etsi.org/deliver/etsi_en/300400_300499/300468/01.14.01_60/en_300468v011401p.pdf) | ||
| 301 | /// conform genre types or something special. | ||
| 302 | /// | ||
| 303 | /// -------------------------------------------------------------------------- | ||
| 304 | /// | ||
| 305 | /// **Example:** | ||
| 306 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 307 | /// kodi::addon::PVREPGTag tag; | ||
| 308 | /// tag.SetGenreType(EPG_GENRE_USE_STRING); | ||
| 309 | /// tag.SetGenreDescription("Action" + EPG_STRING_TOKEN_SEPARATOR + "Thriller"); | ||
| 310 | /// ~~~~~~~~~~~~~ | ||
| 311 | /// | ||
| 312 | void SetGenreDescription(const std::string& genreDescription) | ||
| 313 | { | ||
| 314 | m_genreDescription = genreDescription; | ||
| 315 | } | ||
| 316 | |||
| 317 | /// @brief To get with @ref SetGenreDescription changed values. | ||
| 318 | std::string GetGenreDescription() const { return m_genreDescription; } | ||
| 319 | |||
| 320 | /// @brief **optional**\n | ||
| 321 | /// First aired in UTC. | ||
| 322 | void SetFirstAired(const std::string& firstAired) { m_firstAired = firstAired; } | ||
| 323 | |||
| 324 | /// @brief To get with @ref SetFirstAired changed values. | ||
| 325 | std::string GetFirstAired() const { return m_firstAired; } | ||
| 326 | |||
| 327 | /// @brief **optional**\n | ||
| 328 | /// Parental rating. | ||
| 329 | void SetParentalRating(int parentalRating) { m_cStructure->iParentalRating = parentalRating; } | ||
| 330 | |||
| 331 | /// @brief To get with @ref SetParentalRatinge changed values. | ||
| 332 | int GetParentalRating() const { return m_cStructure->iParentalRating; } | ||
| 333 | |||
| 334 | /// @brief **optional**\n | ||
| 335 | /// Star rating. | ||
| 336 | void SetStarRating(int starRating) { m_cStructure->iStarRating = starRating; } | ||
| 337 | |||
| 338 | /// @brief To get with @ref SetStarRating changed values. | ||
| 339 | int GetStarRating() const { return m_cStructure->iStarRating; } | ||
| 340 | |||
| 341 | /// @brief **optional**\n | ||
| 342 | /// Series number. | ||
| 343 | void SetSeriesNumber(int seriesNumber) { m_cStructure->iSeriesNumber = seriesNumber; } | ||
| 344 | |||
| 345 | /// @brief To get with @ref SetSeriesNumber changed values. | ||
| 346 | int GetSeriesNumber() const { return m_cStructure->iSeriesNumber; } | ||
| 347 | |||
| 348 | /// @brief **optional**\n | ||
| 349 | /// Episode number. | ||
| 350 | void SetEpisodeNumber(int episodeNumber) { m_cStructure->iEpisodeNumber = episodeNumber; } | ||
| 351 | |||
| 352 | /// @brief To get with @ref SetEpisodeNumber changed values. | ||
| 353 | int GetEpisodeNumber() const { return m_cStructure->iEpisodeNumber; } | ||
| 354 | |||
| 355 | /// @brief **optional**\n | ||
| 356 | /// Episode part number. | ||
| 357 | void SetEpisodePartNumber(int episodePartNumber) | ||
| 358 | { | ||
| 359 | m_cStructure->iEpisodePartNumber = episodePartNumber; | ||
| 360 | } | ||
| 361 | |||
| 362 | /// @brief To get with @ref SetEpisodePartNumber changed values. | ||
| 363 | int GetEpisodePartNumber() const { return m_cStructure->iEpisodePartNumber; } | ||
| 364 | |||
| 365 | /// @brief **optional**\n | ||
| 366 | /// Episode name. | ||
| 367 | void SetEpisodeName(const std::string& episodeName) { m_episodeName = episodeName; } | ||
| 368 | |||
| 369 | /// @brief To get with @ref SetEpisodeName changed values. | ||
| 370 | std::string GetEpisodeName() const { return m_episodeName; } | ||
| 371 | |||
| 372 | /// @brief **optional**\n | ||
| 373 | /// Bit field of independent flags associated with the EPG entry. | ||
| 374 | /// | ||
| 375 | /// See @ref cpp_kodi_addon_pvr_Defs_epg_EPG_TAG_FLAG for available bit flags. | ||
| 376 | /// | ||
| 377 | /// -------------------------------------------------------------------------- | ||
| 378 | /// | ||
| 379 | /// @copydetails cpp_kodi_addon_pvr_Defs_epg_EPG_TAG_FLAG | ||
| 380 | /// | ||
| 381 | void SetFlags(unsigned int flags) { m_cStructure->iFlags = flags; } | ||
| 382 | |||
| 383 | /// @brief To get with @ref SetFlags changed values. | ||
| 384 | unsigned int GetFlags() const { return m_cStructure->iFlags; } | ||
| 385 | |||
| 386 | /// @brief **optional**\n | ||
| 387 | /// Series link for this event. | ||
| 388 | void SetSeriesLink(const std::string& seriesLink) { m_seriesLink = seriesLink; } | ||
| 389 | |||
| 390 | /// @brief To get with @ref SetSeriesLink changed values. | ||
| 391 | std::string GetSeriesLink() const { return m_seriesLink; } | ||
| 392 | |||
| 393 | ///@} | ||
| 394 | |||
| 395 | // Internal used, as this have own memory for strings and to translate them to "C" | ||
| 396 | EPG_TAG* GetTag() const | ||
| 397 | { | ||
| 398 | m_cStructure->strTitle = m_title.c_str(); | ||
| 399 | m_cStructure->strPlotOutline = m_plotOutline.c_str(); | ||
| 400 | m_cStructure->strPlot = m_plot.c_str(); | ||
| 401 | m_cStructure->strOriginalTitle = m_originalTitle.c_str(); | ||
| 402 | m_cStructure->strCast = m_cast.c_str(); | ||
| 403 | m_cStructure->strDirector = m_director.c_str(); | ||
| 404 | m_cStructure->strWriter = m_writer.c_str(); | ||
| 405 | m_cStructure->strIMDBNumber = m_IMDBNumber.c_str(); | ||
| 406 | m_cStructure->strIconPath = m_iconPath.c_str(); | ||
| 407 | m_cStructure->strGenreDescription = m_genreDescription.c_str(); | ||
| 408 | m_cStructure->strEpisodeName = m_episodeName.c_str(); | ||
| 409 | m_cStructure->strSeriesLink = m_seriesLink.c_str(); | ||
| 410 | m_cStructure->strFirstAired = m_firstAired.c_str(); | ||
| 411 | |||
| 412 | return m_cStructure; | ||
| 413 | } | ||
| 414 | |||
| 415 | private: | ||
| 416 | PVREPGTag(const EPG_TAG* epg) : CStructHdl(epg) { SetData(epg); } | ||
| 417 | PVREPGTag(EPG_TAG* epg) : CStructHdl(epg) { SetData(epg); } | ||
| 418 | |||
| 419 | const PVREPGTag& operator=(const PVREPGTag& right); | ||
| 420 | const PVREPGTag& operator=(const EPG_TAG& right); | ||
| 421 | operator EPG_TAG*(); | ||
| 422 | |||
| 423 | std::string m_title; | ||
| 424 | std::string m_plotOutline; | ||
| 425 | std::string m_plot; | ||
| 426 | std::string m_originalTitle; | ||
| 427 | std::string m_cast; | ||
| 428 | std::string m_director; | ||
| 429 | std::string m_writer; | ||
| 430 | std::string m_IMDBNumber; | ||
| 431 | std::string m_episodeName; | ||
| 432 | std::string m_iconPath; | ||
| 433 | std::string m_seriesLink; | ||
| 434 | std::string m_genreDescription; | ||
| 435 | std::string m_firstAired; | ||
| 436 | |||
| 437 | void SetData(const EPG_TAG* tag) | ||
| 438 | { | ||
| 439 | m_title = tag->strTitle == nullptr ? "" : tag->strTitle; | ||
| 440 | m_plotOutline = tag->strPlotOutline == nullptr ? "" : tag->strPlotOutline; | ||
| 441 | m_plot = tag->strPlot == nullptr ? "" : tag->strPlot; | ||
| 442 | m_originalTitle = tag->strOriginalTitle == nullptr ? "" : tag->strOriginalTitle; | ||
| 443 | m_cast = tag->strCast == nullptr ? "" : tag->strCast; | ||
| 444 | m_director = tag->strDirector == nullptr ? "" : tag->strDirector; | ||
| 445 | m_writer = tag->strWriter == nullptr ? "" : tag->strWriter; | ||
| 446 | m_IMDBNumber = tag->strIMDBNumber == nullptr ? "" : tag->strIMDBNumber; | ||
| 447 | m_iconPath = tag->strIconPath == nullptr ? "" : tag->strIconPath; | ||
| 448 | m_genreDescription = tag->strGenreDescription == nullptr ? "" : tag->strGenreDescription; | ||
| 449 | m_episodeName = tag->strEpisodeName == nullptr ? "" : tag->strEpisodeName; | ||
| 450 | m_seriesLink = tag->strSeriesLink == nullptr ? "" : tag->strSeriesLink; | ||
| 451 | m_firstAired = tag->strFirstAired == nullptr ? "" : tag->strFirstAired; | ||
| 452 | } | ||
| 453 | }; | ||
| 454 | ///@} | ||
| 455 | //------------------------------------------------------------------------------ | ||
| 456 | |||
| 457 | //============================================================================== | ||
| 458 | /// @defgroup cpp_kodi_addon_pvr_Defs_epg_PVREPGTagsResultSet class PVREPGTagsResultSet | ||
| 459 | /// @ingroup cpp_kodi_addon_pvr_Defs_epg_PVREPGTag | ||
| 460 | /// @brief **PVR add-on EPG entry transfer class**\n | ||
| 461 | /// To transfer the content of @ref kodi::addon::CInstancePVRClient::GetEPGForChannel(). | ||
| 462 | /// | ||
| 463 | /// @note This becomes only be used on addon call above, not usable outside on | ||
| 464 | /// addon itself. | ||
| 465 | ///@{ | ||
| 466 | class PVREPGTagsResultSet | ||
| 467 | { | ||
| 468 | public: | ||
| 469 | /*! \cond PRIVATE */ | ||
| 470 | PVREPGTagsResultSet() = delete; | ||
| 471 | PVREPGTagsResultSet(const AddonInstance_PVR* instance, ADDON_HANDLE handle) | ||
| 472 | : m_instance(instance), m_handle(handle) | ||
| 473 | { | ||
| 474 | } | ||
| 475 | /*! \endcond */ | ||
| 476 | |||
| 477 | /// @addtogroup cpp_kodi_addon_pvr_Defs_epg_PVREPGTagsResultSet | ||
| 478 | ///@{ | ||
| 479 | |||
| 480 | /// @brief To add and give content from addon to Kodi on related call. | ||
| 481 | /// | ||
| 482 | /// @param[in] tag The to transferred data. | ||
| 483 | void Add(const kodi::addon::PVREPGTag& tag) | ||
| 484 | { | ||
| 485 | m_instance->toKodi->TransferEpgEntry(m_instance->toKodi->kodiInstance, m_handle, tag.GetTag()); | ||
| 486 | } | ||
| 487 | |||
| 488 | ///@} | ||
| 489 | |||
| 490 | private: | ||
| 491 | const AddonInstance_PVR* m_instance = nullptr; | ||
| 492 | const ADDON_HANDLE m_handle; | ||
| 493 | }; | ||
| 494 | ///@} | ||
| 495 | //------------------------------------------------------------------------------ | ||
| 496 | |||
| 497 | } /* namespace addon */ | ||
| 498 | } /* namespace kodi */ | ||
| 499 | |||
| 500 | #endif /* __cplusplus */ | ||
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/General.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/General.h new file mode 100644 index 0000000..c7977c2 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/General.h | |||
| @@ -0,0 +1,511 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2005-2018 Team Kodi | ||
| 3 | * This file is part of Kodi - https://kodi.tv | ||
| 4 | * | ||
| 5 | * SPDX-License-Identifier: GPL-2.0-or-later | ||
| 6 | * See LICENSES/README.md for more information. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #pragma once | ||
| 10 | |||
| 11 | #include "../../AddonBase.h" | ||
| 12 | #include "../../c-api/addon-instance/pvr/pvr_general.h" | ||
| 13 | |||
| 14 | //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ | ||
| 15 | // "C++" Definitions group 1 - General PVR | ||
| 16 | #ifdef __cplusplus | ||
| 17 | |||
| 18 | namespace kodi | ||
| 19 | { | ||
| 20 | namespace addon | ||
| 21 | { | ||
| 22 | |||
| 23 | //============================================================================== | ||
| 24 | /// @defgroup cpp_kodi_addon_pvr_Defs_PVRTypeIntValue class PVRTypeIntValue | ||
| 25 | /// @ingroup cpp_kodi_addon_pvr_Defs_General | ||
| 26 | /// @brief **PVR add-on type value**\n | ||
| 27 | /// Representation of a <b>`<int, std::string>`</b> event related value. | ||
| 28 | /// | ||
| 29 | /// ---------------------------------------------------------------------------- | ||
| 30 | /// | ||
| 31 | /// @copydetails cpp_kodi_addon_pvr_Defs_PVRTypeIntValue_Help | ||
| 32 | /// | ||
| 33 | ///@{ | ||
| 34 | class PVRTypeIntValue : public CStructHdl<PVRTypeIntValue, PVR_ATTRIBUTE_INT_VALUE> | ||
| 35 | { | ||
| 36 | friend class CInstancePVRClient; | ||
| 37 | |||
| 38 | public: | ||
| 39 | /*! \cond PRIVATE */ | ||
| 40 | PVRTypeIntValue(const PVRTypeIntValue& data) : CStructHdl(data) {} | ||
| 41 | /*! \endcond */ | ||
| 42 | |||
| 43 | /// @defgroup cpp_kodi_addon_pvr_Defs_PVRTypeIntValue_Help Value Help | ||
| 44 | /// @ingroup cpp_kodi_addon_pvr_Defs_PVRTypeIntValue | ||
| 45 | /// | ||
| 46 | /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_PVRTypeIntValue :</b> | ||
| 47 | /// | Name | Type | Set call | Get call | ||
| 48 | /// |------|------|----------|---------- | ||
| 49 | /// | **Value** | `int` | @ref PVRTypeIntValue::SetValue "SetValue" | @ref PVRTypeIntValue::GetValue "GetValue" | ||
| 50 | /// | **Description** | `std::string` | @ref PVRTypeIntValue::SetDescription "SetDescription" | @ref PVRTypeIntValue::GetDescription "GetDescription" | ||
| 51 | /// | ||
| 52 | /// @remark Further can there be used his class constructor to set values. | ||
| 53 | |||
| 54 | /// @addtogroup cpp_kodi_addon_pvr_Defs_PVRTypeIntValue | ||
| 55 | ///@{ | ||
| 56 | |||
| 57 | /// @brief Default class constructor. | ||
| 58 | /// | ||
| 59 | /// @note Values must be set afterwards. | ||
| 60 | PVRTypeIntValue() = default; | ||
| 61 | |||
| 62 | /// @brief Class constructor with integrated value set. | ||
| 63 | /// | ||
| 64 | /// @param[in] value Type identification value | ||
| 65 | /// @param[in] description Type description text | ||
| 66 | PVRTypeIntValue(int value, const std::string& description) | ||
| 67 | { | ||
| 68 | SetValue(value); | ||
| 69 | SetDescription(description); | ||
| 70 | } | ||
| 71 | |||
| 72 | /// @brief To set with the identification value. | ||
| 73 | void SetValue(int value) { m_cStructure->iValue = value; } | ||
| 74 | |||
| 75 | /// @brief To get with the identification value. | ||
| 76 | int GetValue() const { return m_cStructure->iValue; } | ||
| 77 | |||
| 78 | /// @brief To set with the description text of the value. | ||
| 79 | void SetDescription(const std::string& description) | ||
| 80 | { | ||
| 81 | strncpy(m_cStructure->strDescription, description.c_str(), | ||
| 82 | sizeof(m_cStructure->strDescription) - 1); | ||
| 83 | } | ||
| 84 | |||
| 85 | /// @brief To get with the description text of the value. | ||
| 86 | std::string GetDescription() const { return m_cStructure->strDescription; } | ||
| 87 | ///@} | ||
| 88 | |||
| 89 | private: | ||
| 90 | PVRTypeIntValue(const PVR_ATTRIBUTE_INT_VALUE* data) : CStructHdl(data) {} | ||
| 91 | PVRTypeIntValue(PVR_ATTRIBUTE_INT_VALUE* data) : CStructHdl(data) {} | ||
| 92 | }; | ||
| 93 | ///@} | ||
| 94 | //------------------------------------------------------------------------------ | ||
| 95 | |||
| 96 | //============================================================================== | ||
| 97 | /// @defgroup cpp_kodi_addon_pvr_Defs_PVRCapabilities class PVRCapabilities | ||
| 98 | /// @ingroup cpp_kodi_addon_pvr_Defs_General | ||
| 99 | /// @brief **PVR add-on capabilities**\n | ||
| 100 | /// This class is needed to tell Kodi which options are supported on the addon. | ||
| 101 | /// | ||
| 102 | /// If a capability is set to **true**, then the corresponding methods from | ||
| 103 | /// @ref cpp_kodi_addon_pvr "kodi::addon::CInstancePVRClient" need to be | ||
| 104 | /// implemented. | ||
| 105 | /// | ||
| 106 | /// As default them all set to **false**. | ||
| 107 | /// | ||
| 108 | /// Used on @ref kodi::addon::CInstancePVRClient::GetCapabilities(). | ||
| 109 | /// | ||
| 110 | /// ---------------------------------------------------------------------------- | ||
| 111 | /// | ||
| 112 | /// @copydetails cpp_kodi_addon_pvr_Defs_PVRCapabilities_Help | ||
| 113 | /// | ||
| 114 | ///@{ | ||
| 115 | class PVRCapabilities | ||
| 116 | { | ||
| 117 | friend class CInstancePVRClient; | ||
| 118 | |||
| 119 | public: | ||
| 120 | /*! \cond PRIVATE */ | ||
| 121 | explicit PVRCapabilities() = delete; | ||
| 122 | /*! \endcond */ | ||
| 123 | |||
| 124 | /// @defgroup cpp_kodi_addon_pvr_Defs_PVRCapabilities_Help Value Help | ||
| 125 | /// @ingroup cpp_kodi_addon_pvr_Defs_PVRCapabilities | ||
| 126 | /// ---------------------------------------------------------------------------- | ||
| 127 | /// | ||
| 128 | /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_PVRCapabilities :</b> | ||
| 129 | /// | Name | Type | Set call | Get call | ||
| 130 | /// |------|------|----------|---------- | ||
| 131 | /// | **Supports EPG** | `boolean` | @ref PVRCapabilities::SetSupportsEPG "SetSupportsEPG" | @ref PVRCapabilities::GetSupportsEPG "GetSupportsEPG" | ||
| 132 | /// | **Supports EPG EDL** | `boolean` | @ref PVRCapabilities::SetSupportsEPGEdl "SetSupportsEPGEdl" | @ref PVRCapabilities::GetSupportsEPGEdl "GetSupportsEPGEdl" | ||
| 133 | /// | **Supports TV** | `boolean` | @ref PVRCapabilities::SetSupportsTV "SetSupportsTV" | @ref PVRCapabilities::GetSupportsTV "GetSupportsTV" | ||
| 134 | /// | **Supports radio** | `boolean` | @ref PVRCapabilities::SetSupportsRadio "SetSupportsRadio" | @ref PVRCapabilities::GetSupportsRadio "GetSupportsRadio" | ||
| 135 | /// | **Supports recordings** | `boolean` | @ref PVRCapabilities::SetSupportsRecordings "SetSupportsRecordings" | @ref PVRCapabilities::GetSupportsRecordings "GetSupportsRecordings" | ||
| 136 | /// | **Supports recordings undelete** | `boolean` | @ref PVRCapabilities::SetSupportsRecordingsUndelete "SetSupportsRecordingsUndelete" | @ref PVRCapabilities::GetSupportsRecordingsUndelete "SetSupportsRecordingsUndelete" | ||
| 137 | /// | **Supports timers** | `boolean` | @ref PVRCapabilities::SetSupportsTimers "SetSupportsTimers" | @ref PVRCapabilities::GetSupportsTimers "GetSupportsTimers" | ||
| 138 | /// | **Supports channel groups** | `boolean` | @ref PVRCapabilities::SetSupportsChannelGroups "SetSupportsChannelGroups" | @ref PVRCapabilities::GetSupportsChannelGroups "GetSupportsChannelGroups" | ||
| 139 | /// | **Supports channel scan** | `boolean` | @ref PVRCapabilities::SetSupportsChannelScan "SetSupportsChannelScan" | @ref PVRCapabilities::GetSupportsChannelScan "GetSupportsChannelScan" | ||
| 140 | /// | **Supports channel settings** | `boolean` | @ref PVRCapabilities::SetSupportsChannelSettings "SetSupportsChannelSettings" | @ref PVRCapabilities::GetSupportsChannelSettings "GetSupportsChannelSettings" | ||
| 141 | /// | **Handles input stream** | `boolean` | @ref PVRCapabilities::SetHandlesInputStream "SetHandlesInputStream" | @ref PVRCapabilities::GetHandlesInputStream "GetHandlesInputStream" | ||
| 142 | /// | **Handles demuxing** | `boolean` | @ref PVRCapabilities::SetHandlesDemuxing "SetHandlesDemuxing" | @ref PVRCapabilities::GetHandlesDemuxing "GetHandlesDemuxing" | ||
| 143 | /// | **Supports recording play count** | `boolean` | @ref PVRCapabilities::SetSupportsRecordingPlayCount "SetSupportsRecordingPlayCount" | @ref PVRCapabilities::GetSupportsRecordingPlayCount "GetSupportsRecordingPlayCount" | ||
| 144 | /// | **Supports last played position** | `boolean` | @ref PVRCapabilities::SetSupportsLastPlayedPosition "SetSupportsLastPlayedPosition" | @ref PVRCapabilities::GetSupportsLastPlayedPosition "GetSupportsLastPlayedPosition" | ||
| 145 | /// | **Supports recording EDL** | `boolean` | @ref PVRCapabilities::SetSupportsRecordingEdl "SetSupportsRecordingEdl" | @ref PVRCapabilities::GetSupportsRecordingEdl "GetSupportsRecordingEdl" | ||
| 146 | /// | **Supports recordings rename** | `boolean` | @ref PVRCapabilities::SetSupportsRecordingsRename "SetSupportsRecordingsRename" | @ref PVRCapabilities::GetSupportsRecordingsRename "GetSupportsRecordingsRename" | ||
| 147 | /// | **Supports recordings lifetime change** | `boolean` | @ref PVRCapabilities::SetSupportsRecordingsLifetimeChange "SetSupportsRecordingsLifetimeChange" | @ref PVRCapabilities::GetSupportsRecordingsLifetimeChange "GetSupportsRecordingsLifetimeChange" | ||
| 148 | /// | **Supports descramble info** | `boolean` | @ref PVRCapabilities::SetSupportsDescrambleInfo "SetSupportsDescrambleInfo" | @ref PVRCapabilities::GetSupportsDescrambleInfo "GetSupportsDescrambleInfo" | ||
| 149 | /// | **Supports async EPG transfer** | `boolean` | @ref PVRCapabilities::SetSupportsAsyncEPGTransfer "SetSupportsAsyncEPGTransfer" | @ref PVRCapabilities::GetSupportsAsyncEPGTransfer "GetSupportsAsyncEPGTransfer" | ||
| 150 | /// | **Supports recording size** | `boolean` | @ref PVRCapabilities::SetSupportsRecordingSize "SetSupportsRecordingSize" | @ref PVRCapabilities::GetSupportsRecordingSize "GetSupportsRecordingSize" | ||
| 151 | /// | **Recordings lifetime values** | @ref cpp_kodi_addon_pvr_Defs_PVRTypeIntValue "PVRTypeIntValue" | @ref PVRCapabilities::SetRecordingsLifetimeValues "SetRecordingsLifetimeValues" | @ref PVRCapabilities::GetRecordingsLifetimeValues "GetRecordingsLifetimeValues" | ||
| 152 | /// | ||
| 153 | /// @warning This class can not be used outside of @ref kodi::addon::CInstancePVRClient::GetCapabilities() | ||
| 154 | /// | ||
| 155 | |||
| 156 | /// @addtogroup cpp_kodi_addon_pvr_Defs_PVRCapabilities | ||
| 157 | ///@{ | ||
| 158 | |||
| 159 | /// @brief Set **true** if the add-on provides EPG information. | ||
| 160 | void SetSupportsEPG(bool supportsEPG) { m_capabilities->bSupportsEPG = supportsEPG; } | ||
| 161 | |||
| 162 | /// @brief To get with @ref SetSupportsEPG changed values. | ||
| 163 | bool GetSupportsEPG() const { return m_capabilities->bSupportsEPG; } | ||
| 164 | |||
| 165 | /// @brief Set **true** if the backend supports retrieving an edit decision | ||
| 166 | /// list for an EPG tag. | ||
| 167 | void SetSupportsEPGEdl(bool supportsEPGEdl) { m_capabilities->bSupportsEPGEdl = supportsEPGEdl; } | ||
| 168 | |||
| 169 | /// @brief To get with @ref SetSupportsEPGEdl changed values. | ||
| 170 | bool GetSupportsEPGEdl() const { return m_capabilities->bSupportsEPGEdl; } | ||
| 171 | |||
| 172 | /// @brief Set **true** if this add-on provides TV channels. | ||
| 173 | void SetSupportsTV(bool supportsTV) { m_capabilities->bSupportsTV = supportsTV; } | ||
| 174 | |||
| 175 | /// @brief To get with @ref SetSupportsTV changed values. | ||
| 176 | bool GetSupportsTV() const { return m_capabilities->bSupportsTV; } | ||
| 177 | |||
| 178 | /// @brief Set **true** if this add-on provides TV channels. | ||
| 179 | void SetSupportsRadio(bool supportsRadio) { m_capabilities->bSupportsRadio = supportsRadio; } | ||
| 180 | |||
| 181 | /// @brief To get with @ref SetSupportsRadio changed values. | ||
| 182 | bool GetSupportsRadio() const { return m_capabilities->bSupportsRadio; } | ||
| 183 | |||
| 184 | /// @brief **true** if this add-on supports playback of recordings stored on | ||
| 185 | /// the backend. | ||
| 186 | void SetSupportsRecordings(bool supportsRecordings) | ||
| 187 | { | ||
| 188 | m_capabilities->bSupportsRecordings = supportsRecordings; | ||
| 189 | } | ||
| 190 | |||
| 191 | /// @brief To get with @ref SetSupportsRecordings changed values. | ||
| 192 | bool GetSupportsRecordings() const { return m_capabilities->bSupportsRecordings; } | ||
| 193 | |||
| 194 | /// @brief Set **true** if this add-on supports undelete of recordings stored | ||
| 195 | /// on the backend. | ||
| 196 | void SetSupportsRecordingsUndelete(bool supportsRecordingsUndelete) | ||
| 197 | { | ||
| 198 | m_capabilities->bSupportsRecordingsUndelete = supportsRecordingsUndelete; | ||
| 199 | } | ||
| 200 | |||
| 201 | /// @brief To get with @ref SetSupportsRecordings changed values. | ||
| 202 | bool GetSupportsRecordingsUndelete() const { return m_capabilities->bSupportsRecordingsUndelete; } | ||
| 203 | |||
| 204 | /// @brief Set **true** if this add-on supports the creation and editing of | ||
| 205 | /// timers. | ||
| 206 | void SetSupportsTimers(bool supportsTimers) { m_capabilities->bSupportsTimers = supportsTimers; } | ||
| 207 | |||
| 208 | /// @brief To get with @ref SetSupportsTimers changed values. | ||
| 209 | bool GetSupportsTimers() const { return m_capabilities->bSupportsTimers; } | ||
| 210 | |||
| 211 | /// @brief Set **true** if this add-on supports channel groups. | ||
| 212 | /// | ||
| 213 | /// It use the following functions: | ||
| 214 | /// - @ref kodi::addon::CInstancePVRClient::GetChannelGroupsAmount() | ||
| 215 | /// - @ref kodi::addon::CInstancePVRClient::GetChannelGroups() | ||
| 216 | /// - @ref kodi::addon::CInstancePVRClient::GetChannelGroupMembers() | ||
| 217 | void SetSupportsChannelGroups(bool supportsChannelGroups) | ||
| 218 | { | ||
| 219 | m_capabilities->bSupportsChannelGroups = supportsChannelGroups; | ||
| 220 | } | ||
| 221 | |||
| 222 | /// @brief To get with @ref SetSupportsChannelGroups changed values. | ||
| 223 | bool GetSupportsChannelGroups() const { return m_capabilities->bSupportsChannelGroups; } | ||
| 224 | |||
| 225 | /// @brief Set **true** if this add-on support scanning for new channels on | ||
| 226 | /// the backend. | ||
| 227 | /// | ||
| 228 | /// It use the following function: | ||
| 229 | /// - @ref kodi::addon::CInstancePVRClient::OpenDialogChannelScan() | ||
| 230 | void SetSupportsChannelScan(bool supportsChannelScan) | ||
| 231 | { | ||
| 232 | m_capabilities->bSupportsChannelScan = supportsChannelScan; | ||
| 233 | } | ||
| 234 | |||
| 235 | /// @brief To get with @ref SetSupportsChannelScan changed values. | ||
| 236 | bool GetSupportsChannelScan() const { return m_capabilities->bSupportsChannelScan; } | ||
| 237 | |||
| 238 | /// @brief Set **true** if this add-on supports channel edit. | ||
| 239 | /// | ||
| 240 | /// It use the following functions: | ||
| 241 | /// - @ref kodi::addon::CInstancePVRClient::DeleteChannel() | ||
| 242 | /// - @ref kodi::addon::CInstancePVRClient::RenameChannel() | ||
| 243 | /// - @ref kodi::addon::CInstancePVRClient::OpenDialogChannelSettings() | ||
| 244 | /// - @ref kodi::addon::CInstancePVRClient::OpenDialogChannelAdd() | ||
| 245 | void SetSupportsChannelSettings(bool supportsChannelSettings) | ||
| 246 | { | ||
| 247 | m_capabilities->bSupportsChannelSettings = supportsChannelSettings; | ||
| 248 | } | ||
| 249 | |||
| 250 | /// @brief To get with @ref SetSupportsChannelSettings changed values. | ||
| 251 | bool GetSupportsChannelSettings() const { return m_capabilities->bSupportsChannelSettings; } | ||
| 252 | |||
| 253 | /// @brief Set **true** if this add-on provides an input stream. false if Kodi | ||
| 254 | /// handles the stream. | ||
| 255 | void SetHandlesInputStream(bool handlesInputStream) | ||
| 256 | { | ||
| 257 | m_capabilities->bHandlesInputStream = handlesInputStream; | ||
| 258 | } | ||
| 259 | |||
| 260 | /// @brief To get with @ref SetHandlesInputStream changed values. | ||
| 261 | bool GetHandlesInputStream() const { return m_capabilities->bHandlesInputStream; } | ||
| 262 | |||
| 263 | /// @brief Set **true** if this add-on demultiplexes packets. | ||
| 264 | void SetHandlesDemuxing(bool handlesDemuxing) | ||
| 265 | { | ||
| 266 | m_capabilities->bHandlesDemuxing = handlesDemuxing; | ||
| 267 | } | ||
| 268 | |||
| 269 | /// @brief To get with @ref SetHandlesDemuxing changed values. | ||
| 270 | bool GetHandlesDemuxing() const { return m_capabilities->bHandlesDemuxing; } | ||
| 271 | |||
| 272 | /// @brief Set **true** if the backend supports play count for recordings. | ||
| 273 | void SetSupportsRecordingPlayCount(bool supportsRecordingPlayCount) | ||
| 274 | { | ||
| 275 | m_capabilities->bSupportsRecordingPlayCount = supportsRecordingPlayCount; | ||
| 276 | } | ||
| 277 | |||
| 278 | /// @brief To get with @ref SetSupportsRecordingPlayCount changed values. | ||
| 279 | bool GetSupportsRecordingPlayCount() const { return m_capabilities->bSupportsRecordingPlayCount; } | ||
| 280 | |||
| 281 | /// @brief Set **true** if the backend supports store/retrieve of last played | ||
| 282 | /// position for recordings. | ||
| 283 | void SetSupportsLastPlayedPosition(bool supportsLastPlayedPosition) | ||
| 284 | { | ||
| 285 | m_capabilities->bSupportsLastPlayedPosition = supportsLastPlayedPosition; | ||
| 286 | } | ||
| 287 | |||
| 288 | /// @brief To get with @ref SetSupportsLastPlayedPosition changed values. | ||
| 289 | bool GetSupportsLastPlayedPosition() const { return m_capabilities->bSupportsLastPlayedPosition; } | ||
| 290 | |||
| 291 | /// @brief Set **true** if the backend supports retrieving an edit decision | ||
| 292 | /// list for recordings. | ||
| 293 | void SetSupportsRecordingEdl(bool supportsRecordingEdl) | ||
| 294 | { | ||
| 295 | m_capabilities->bSupportsRecordingEdl = supportsRecordingEdl; | ||
| 296 | } | ||
| 297 | |||
| 298 | /// @brief To get with @ref SetSupportsRecordingEdl changed values. | ||
| 299 | bool GetSupportsRecordingEdl() const { return m_capabilities->bSupportsRecordingEdl; } | ||
| 300 | |||
| 301 | /// @brief Set **true** if the backend supports renaming recordings. | ||
| 302 | void SetSupportsRecordingsRename(bool supportsRecordingsRename) | ||
| 303 | { | ||
| 304 | m_capabilities->bSupportsRecordingsRename = supportsRecordingsRename; | ||
| 305 | } | ||
| 306 | |||
| 307 | /// @brief To get with @ref SetSupportsRecordingsRename changed values. | ||
| 308 | bool GetSupportsRecordingsRename() const { return m_capabilities->bSupportsRecordingsRename; } | ||
| 309 | |||
| 310 | /// @brief Set **true** if the backend supports changing lifetime for | ||
| 311 | /// recordings. | ||
| 312 | void SetSupportsRecordingsLifetimeChange(bool supportsRecordingsLifetimeChange) | ||
| 313 | { | ||
| 314 | m_capabilities->bSupportsRecordingsLifetimeChange = supportsRecordingsLifetimeChange; | ||
| 315 | } | ||
| 316 | |||
| 317 | /// @brief To get with @ref SetSupportsRecordingsLifetimeChange changed | ||
| 318 | /// values. | ||
| 319 | bool GetSupportsRecordingsLifetimeChange() const | ||
| 320 | { | ||
| 321 | return m_capabilities->bSupportsRecordingsLifetimeChange; | ||
| 322 | } | ||
| 323 | |||
| 324 | /// @brief Set **true** if the backend supports descramble information for | ||
| 325 | /// playing channels. | ||
| 326 | void SetSupportsDescrambleInfo(bool supportsDescrambleInfo) | ||
| 327 | { | ||
| 328 | m_capabilities->bSupportsDescrambleInfo = supportsDescrambleInfo; | ||
| 329 | } | ||
| 330 | |||
| 331 | /// @brief To get with @ref SetSupportsDescrambleInfo changed values. | ||
| 332 | bool GetSupportsDescrambleInfo() const { return m_capabilities->bSupportsDescrambleInfo; } | ||
| 333 | |||
| 334 | /// @brief Set **true** if this addon-on supports asynchronous transfer of epg | ||
| 335 | /// events to Kodi using the callback function | ||
| 336 | /// @ref kodi::addon::CInstancePVRClient::EpgEventStateChange(). | ||
| 337 | void SetSupportsAsyncEPGTransfer(bool supportsAsyncEPGTransfer) | ||
| 338 | { | ||
| 339 | m_capabilities->bSupportsAsyncEPGTransfer = supportsAsyncEPGTransfer; | ||
| 340 | } | ||
| 341 | |||
| 342 | /// @brief To get with @ref SetSupportsAsyncEPGTransfer changed values. | ||
| 343 | bool GetSupportsAsyncEPGTransfer() const { return m_capabilities->bSupportsAsyncEPGTransfer; } | ||
| 344 | |||
| 345 | /// @brief Set **true** if this addon-on supports retrieving size of recordings. | ||
| 346 | void SetSupportsRecordingSize(bool supportsRecordingSize) | ||
| 347 | { | ||
| 348 | m_capabilities->bSupportsRecordingSize = supportsRecordingSize; | ||
| 349 | } | ||
| 350 | |||
| 351 | /// @brief To get with @ref SetSupportsRecordingSize changed values. | ||
| 352 | bool GetSupportsRecordingSize() const { return m_capabilities->bSupportsRecordingSize; } | ||
| 353 | |||
| 354 | /// @brief **optional**\n | ||
| 355 | /// Set array containing the possible values for @ref PVRRecording::SetLifetime(). | ||
| 356 | /// | ||
| 357 | /// -------------------------------------------------------------------------- | ||
| 358 | /// | ||
| 359 | /// @copydetails cpp_kodi_addon_pvr_Defs_PVRTypeIntValue_Help | ||
| 360 | void SetRecordingsLifetimeValues( | ||
| 361 | const std::vector<PVRTypeIntValue>& recordingsLifetimeValues) | ||
| 362 | { | ||
| 363 | m_capabilities->iRecordingsLifetimesSize = 0; | ||
| 364 | for (unsigned int i = 0; i < recordingsLifetimeValues.size() && | ||
| 365 | i < sizeof(m_capabilities->recordingsLifetimeValues); | ||
| 366 | ++i) | ||
| 367 | { | ||
| 368 | m_capabilities->recordingsLifetimeValues[i].iValue = | ||
| 369 | recordingsLifetimeValues[i].GetCStructure()->iValue; | ||
| 370 | strncpy(m_capabilities->recordingsLifetimeValues[i].strDescription, | ||
| 371 | recordingsLifetimeValues[i].GetCStructure()->strDescription, | ||
| 372 | sizeof(m_capabilities->recordingsLifetimeValues[i].strDescription) - 1); | ||
| 373 | ++m_capabilities->iRecordingsLifetimesSize; | ||
| 374 | } | ||
| 375 | } | ||
| 376 | |||
| 377 | /// @brief To get with @ref SetRecordingsLifetimeValues changed values. | ||
| 378 | std::vector<PVRTypeIntValue> GetRecordingsLifetimeValues() const | ||
| 379 | { | ||
| 380 | std::vector<PVRTypeIntValue> recordingsLifetimeValues; | ||
| 381 | for (unsigned int i = 0; i < m_capabilities->iRecordingsLifetimesSize; ++i) | ||
| 382 | recordingsLifetimeValues.emplace_back( | ||
| 383 | m_capabilities->recordingsLifetimeValues[i].iValue, | ||
| 384 | m_capabilities->recordingsLifetimeValues[i].strDescription); | ||
| 385 | return recordingsLifetimeValues; | ||
| 386 | } | ||
| 387 | ///@} | ||
| 388 | |||
| 389 | private: | ||
| 390 | PVRCapabilities(PVR_ADDON_CAPABILITIES* capabilities) : m_capabilities(capabilities) {} | ||
| 391 | |||
| 392 | PVR_ADDON_CAPABILITIES* m_capabilities; | ||
| 393 | }; | ||
| 394 | ///@} | ||
| 395 | //------------------------------------------------------------------------------ | ||
| 396 | |||
| 397 | //============================================================================== | ||
| 398 | /// @defgroup cpp_kodi_addon_pvr_Defs_General_Inputstream_PVRStreamProperty class PVRStreamProperty | ||
| 399 | /// @ingroup cpp_kodi_addon_pvr_Defs_General_Inputstream | ||
| 400 | /// @brief **PVR stream property value handler**\n | ||
| 401 | /// To set for Kodi wanted stream properties. | ||
| 402 | /// | ||
| 403 | /// ---------------------------------------------------------------------------- | ||
| 404 | /// | ||
| 405 | /// @copydetails cpp_kodi_addon_pvr_Defs_General_Inputstream_PVRStreamProperty_Help | ||
| 406 | /// | ||
| 407 | ///--------------------------------------------------------------------------- | ||
| 408 | /// | ||
| 409 | /// **Example:** | ||
| 410 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 411 | /// ... | ||
| 412 | /// | ||
| 413 | /// PVR_ERROR CMyPVRInstance::GetChannelStreamProperties(const kodi::addon::PVRChannel& channel, | ||
| 414 | /// std::vector<kodi::addon::PVRStreamProperty>& properties) | ||
| 415 | /// { | ||
| 416 | /// ... | ||
| 417 | /// properties.emplace_back(PVR_STREAM_PROPERTY_INPUTSTREAM, "inputstream.adaptive"); | ||
| 418 | /// return PVR_ERROR_NO_ERROR; | ||
| 419 | /// } | ||
| 420 | /// | ||
| 421 | /// ... | ||
| 422 | /// ~~~~~~~~~~~~~ | ||
| 423 | /// | ||
| 424 | /// | ||
| 425 | /// **Example 2:** | ||
| 426 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 427 | /// ... | ||
| 428 | /// | ||
| 429 | /// PVR_ERROR CMyPVRInstance::GetChannelStreamProperties(const kodi::addon::PVRChannel& channel, | ||
| 430 | /// std::vector<kodi::addon::PVRStreamProperty>& properties) | ||
| 431 | /// { | ||
| 432 | /// ... | ||
| 433 | /// kodi::addon::PVRStreamProperty property; | ||
| 434 | /// property.SetName(PVR_STREAM_PROPERTY_INPUTSTREAM); | ||
| 435 | /// property.SetValue("inputstream.adaptive"); | ||
| 436 | /// properties.emplace_back(property); | ||
| 437 | /// return PVR_ERROR_NO_ERROR; | ||
| 438 | /// } | ||
| 439 | /// | ||
| 440 | /// ... | ||
| 441 | /// ~~~~~~~~~~~~~ | ||
| 442 | /// | ||
| 443 | ///@{ | ||
| 444 | class PVRStreamProperty : public CStructHdl<PVRStreamProperty, PVR_NAMED_VALUE> | ||
| 445 | { | ||
| 446 | friend class CInstancePVRClient; | ||
| 447 | |||
| 448 | public: | ||
| 449 | /*! \cond PRIVATE */ | ||
| 450 | PVRStreamProperty(const PVRStreamProperty& data) : CStructHdl(data) {} | ||
| 451 | /*! \endcond */ | ||
| 452 | |||
| 453 | /// @defgroup cpp_kodi_addon_pvr_Defs_General_Inputstream_PVRStreamProperty_Help Value Help | ||
| 454 | /// @ingroup cpp_kodi_addon_pvr_Defs_General_Inputstream_PVRStreamProperty | ||
| 455 | /// | ||
| 456 | /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_General_Inputstream_PVRStreamProperty :</b> | ||
| 457 | /// | Name | Type | Set call | Get call | ||
| 458 | /// |------|------|----------|---------- | ||
| 459 | /// | **Name** | `int` | @ref PVRStreamProperty::SetValue "SetName" | @ref PVRStreamProperty::GetName "GetName" | ||
| 460 | /// | **Value** | `std::string` | @ref PVRStreamProperty::SetValue "SetValue" | @ref PVRStreamProperty::GetValue "GetValue" | ||
| 461 | /// | ||
| 462 | /// @remark Further can there be used his class constructor to set values. | ||
| 463 | |||
| 464 | /// @addtogroup cpp_kodi_addon_pvr_Defs_General_Inputstream_PVRStreamProperty | ||
| 465 | ///@{ | ||
| 466 | |||
| 467 | /// @brief Default class constructor. | ||
| 468 | /// | ||
| 469 | /// @note Values must be set afterwards. | ||
| 470 | PVRStreamProperty() = default; | ||
| 471 | |||
| 472 | /// @brief Class constructor with integrated value set. | ||
| 473 | /// | ||
| 474 | /// @param[in] name Type identification | ||
| 475 | /// @param[in] value Type used property value | ||
| 476 | PVRStreamProperty(const std::string& name, const std::string& value) | ||
| 477 | { | ||
| 478 | SetName(name); | ||
| 479 | SetValue(value); | ||
| 480 | } | ||
| 481 | |||
| 482 | /// @brief To set with the identification name. | ||
| 483 | void SetName(const std::string& name) | ||
| 484 | { | ||
| 485 | strncpy(m_cStructure->strName, name.c_str(), sizeof(m_cStructure->strName) - 1); | ||
| 486 | } | ||
| 487 | |||
| 488 | /// @brief To get with the identification name. | ||
| 489 | std::string GetName() const { return m_cStructure->strName; } | ||
| 490 | |||
| 491 | /// @brief To set with the used property value. | ||
| 492 | void SetValue(const std::string& value) | ||
| 493 | { | ||
| 494 | strncpy(m_cStructure->strValue, value.c_str(), sizeof(m_cStructure->strValue) - 1); | ||
| 495 | } | ||
| 496 | |||
| 497 | /// @brief To get with the used property value. | ||
| 498 | std::string GetValue() const { return m_cStructure->strValue; } | ||
| 499 | ///@} | ||
| 500 | |||
| 501 | private: | ||
| 502 | PVRStreamProperty(const PVR_NAMED_VALUE* data) : CStructHdl(data) {} | ||
| 503 | PVRStreamProperty(PVR_NAMED_VALUE* data) : CStructHdl(data) {} | ||
| 504 | }; | ||
| 505 | ///@} | ||
| 506 | //------------------------------------------------------------------------------ | ||
| 507 | |||
| 508 | } /* namespace addon */ | ||
| 509 | } /* namespace kodi */ | ||
| 510 | |||
| 511 | #endif /* __cplusplus */ | ||
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/MenuHook.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/MenuHook.h new file mode 100644 index 0000000..053a4d5 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/MenuHook.h | |||
| @@ -0,0 +1,130 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2005-2018 Team Kodi | ||
| 3 | * This file is part of Kodi - https://kodi.tv | ||
| 4 | * | ||
| 5 | * SPDX-License-Identifier: GPL-2.0-or-later | ||
| 6 | * See LICENSES/README.md for more information. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #pragma once | ||
| 10 | |||
| 11 | #include "../../AddonBase.h" | ||
| 12 | #include "../../c-api/addon-instance/pvr/pvr_menu_hook.h" | ||
| 13 | |||
| 14 | //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ | ||
| 15 | // "C++" Definitions group 7 - Menu hook | ||
| 16 | #ifdef __cplusplus | ||
| 17 | |||
| 18 | namespace kodi | ||
| 19 | { | ||
| 20 | namespace addon | ||
| 21 | { | ||
| 22 | |||
| 23 | //============================================================================== | ||
| 24 | /// @defgroup cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook class PVRMenuhook | ||
| 25 | /// @ingroup cpp_kodi_addon_pvr_Defs_Menuhook | ||
| 26 | /// @brief **Context menu hook**\n | ||
| 27 | /// Menu hooks that are available in the context menus while playing a stream via this add-on. | ||
| 28 | /// And in the Live TV settings dialog. | ||
| 29 | /// | ||
| 30 | /// Possible menu's given to Kodi. | ||
| 31 | /// | ||
| 32 | /// This can be becomes used on this, if @ref kodi::addon::CInstancePVRClient::AddMenuHook() | ||
| 33 | /// was set to related type: | ||
| 34 | /// - @ref kodi::addon::CInstancePVRClient::CallSettingsMenuHook() | ||
| 35 | /// - @ref kodi::addon::CInstancePVRClient::CallChannelMenuHook() | ||
| 36 | /// - @ref kodi::addon::CInstancePVRClient::CallEPGMenuHook() | ||
| 37 | /// - @ref kodi::addon::CInstancePVRClient::CallRecordingMenuHook() | ||
| 38 | /// - @ref kodi::addon::CInstancePVRClient::CallTimerMenuHook() | ||
| 39 | /// | ||
| 40 | /// ---------------------------------------------------------------------------- | ||
| 41 | /// | ||
| 42 | /// @copydetails cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook_Help | ||
| 43 | /// | ||
| 44 | ///@{ | ||
| 45 | class PVRMenuhook : public CStructHdl<PVRMenuhook, PVR_MENUHOOK> | ||
| 46 | { | ||
| 47 | friend class CInstancePVRClient; | ||
| 48 | |||
| 49 | public: | ||
| 50 | /// @addtogroup cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook | ||
| 51 | /// @brief Optional class constructor with value set. | ||
| 52 | /// | ||
| 53 | /// @param[in] hookId This hook's identifier | ||
| 54 | /// @param[in] localizedStringId Localized string identifier | ||
| 55 | /// @param[in] category Category of menu hook, defined with @ref PVR_MENUHOOK_CAT | ||
| 56 | /// | ||
| 57 | /// | ||
| 58 | /// -------------------------------------------------------------------------- | ||
| 59 | /// | ||
| 60 | /// Example: | ||
| 61 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 62 | /// AddMenuHook(kodi::addon::PVRMenuhook(1, 30001, PVR_MENUHOOK_CHANNEL)); | ||
| 63 | /// ~~~~~~~~~~~~~ | ||
| 64 | /// | ||
| 65 | PVRMenuhook(unsigned int hookId, unsigned int localizedStringId, PVR_MENUHOOK_CAT category) | ||
| 66 | { | ||
| 67 | m_cStructure->iHookId = hookId; | ||
| 68 | m_cStructure->iLocalizedStringId = localizedStringId; | ||
| 69 | m_cStructure->category = category; | ||
| 70 | } | ||
| 71 | |||
| 72 | /*! \cond PRIVATE */ | ||
| 73 | PVRMenuhook() | ||
| 74 | { | ||
| 75 | m_cStructure->iHookId = 0; | ||
| 76 | m_cStructure->iLocalizedStringId = 0; | ||
| 77 | m_cStructure->category = PVR_MENUHOOK_UNKNOWN; | ||
| 78 | } | ||
| 79 | PVRMenuhook(const PVRMenuhook& data) : CStructHdl(data) {} | ||
| 80 | /*! \endcond */ | ||
| 81 | |||
| 82 | /// @defgroup cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook_Help Value Help | ||
| 83 | /// @ingroup cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook | ||
| 84 | /// | ||
| 85 | /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook :</b> | ||
| 86 | /// | Name | Type | Set call | Get call | Usage | ||
| 87 | /// |------|------|----------|----------|----------- | ||
| 88 | /// | **This hook's identifier** | `unsigned int` | @ref PVRMenuhook::SetHookId "SetHookId" | @ref PVRMenuhook::GetHookId "GetHookId" | *required to set* | ||
| 89 | /// | **Localized string Identifier** | `unsigned int` | @ref PVRMenuhook::SetLocalizedStringId "SetLocalizedStringId" | @ref PVRMenuhook::GetLocalizedStringId "GetLocalizedStringId" | *required to set* | ||
| 90 | /// | **Category of menu hook** | @ref PVR_MENUHOOK_CAT | @ref PVRMenuhook::SetCategory "SetCategory" | @ref PVRMenuhook::GetCategory "GetCategory" | *required to set* | ||
| 91 | |||
| 92 | /// @addtogroup cpp_kodi_addon_pvr_Defs_Menuhook_PVRMenuhook | ||
| 93 | ///@{ | ||
| 94 | |||
| 95 | /// @brief **required**\n | ||
| 96 | /// This hook's identifier. | ||
| 97 | void SetHookId(unsigned int hookId) { m_cStructure->iHookId = hookId; } | ||
| 98 | |||
| 99 | /// @brief To get with @ref SetHookId() changed values. | ||
| 100 | unsigned int GetHookId() const { return m_cStructure->iHookId; } | ||
| 101 | |||
| 102 | /// @brief **required**\n | ||
| 103 | /// The id of the label for this hook in @ref kodi::GetLocalizedString(). | ||
| 104 | void SetLocalizedStringId(unsigned int localizedStringId) | ||
| 105 | { | ||
| 106 | m_cStructure->iLocalizedStringId = localizedStringId; | ||
| 107 | } | ||
| 108 | |||
| 109 | /// @brief To get with @ref SetLocalizedStringId() changed values. | ||
| 110 | unsigned int GetLocalizedStringId() const { return m_cStructure->iLocalizedStringId; } | ||
| 111 | |||
| 112 | /// @brief **required**\n | ||
| 113 | /// Category of menu hook. | ||
| 114 | void SetCategory(PVR_MENUHOOK_CAT category) { m_cStructure->category = category; } | ||
| 115 | |||
| 116 | /// @brief To get with @ref SetCategory() changed values. | ||
| 117 | PVR_MENUHOOK_CAT GetCategory() const { return m_cStructure->category; } | ||
| 118 | ///@} | ||
| 119 | |||
| 120 | private: | ||
| 121 | PVRMenuhook(const PVR_MENUHOOK* data) : CStructHdl(data) {} | ||
| 122 | PVRMenuhook(PVR_MENUHOOK* data) : CStructHdl(data) {} | ||
| 123 | }; | ||
| 124 | ///@} | ||
| 125 | //------------------------------------------------------------------------------ | ||
| 126 | |||
| 127 | } /* namespace addon */ | ||
| 128 | } /* namespace kodi */ | ||
| 129 | |||
| 130 | #endif /* __cplusplus */ | ||
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Recordings.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Recordings.h new file mode 100644 index 0000000..24ecf11 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Recordings.h | |||
| @@ -0,0 +1,520 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2005-2018 Team Kodi | ||
| 3 | * This file is part of Kodi - https://kodi.tv | ||
| 4 | * | ||
| 5 | * SPDX-License-Identifier: GPL-2.0-or-later | ||
| 6 | * See LICENSES/README.md for more information. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #pragma once | ||
| 10 | |||
| 11 | #include "../../AddonBase.h" | ||
| 12 | #include "../../c-api/addon-instance/pvr.h" | ||
| 13 | |||
| 14 | //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ | ||
| 15 | // "C++" Definitions group 5 - PVR recordings | ||
| 16 | #ifdef __cplusplus | ||
| 17 | |||
| 18 | namespace kodi | ||
| 19 | { | ||
| 20 | namespace addon | ||
| 21 | { | ||
| 22 | |||
| 23 | //============================================================================== | ||
| 24 | /// @defgroup cpp_kodi_addon_pvr_Defs_Recording_PVRRecording class PVRRecording | ||
| 25 | /// @ingroup cpp_kodi_addon_pvr_Defs_Recording | ||
| 26 | /// @brief **Data structure with available recordings data**\n | ||
| 27 | /// With this, recordings related data are transferred between addon and Kodi | ||
| 28 | /// and can also be used by the addon itself. | ||
| 29 | /// | ||
| 30 | /// The related values here are automatically initiated to defaults and need | ||
| 31 | /// only be set if supported and used. | ||
| 32 | /// | ||
| 33 | /// ---------------------------------------------------------------------------- | ||
| 34 | /// | ||
| 35 | /// @copydetails cpp_kodi_addon_pvr_Defs_Recording_PVRRecording_Help | ||
| 36 | /// | ||
| 37 | ///@{ | ||
| 38 | class PVRRecording : public CStructHdl<PVRRecording, PVR_RECORDING> | ||
| 39 | { | ||
| 40 | friend class CInstancePVRClient; | ||
| 41 | |||
| 42 | public: | ||
| 43 | /*! \cond PRIVATE */ | ||
| 44 | PVRRecording() | ||
| 45 | { | ||
| 46 | m_cStructure->iSeriesNumber = PVR_RECORDING_INVALID_SERIES_EPISODE; | ||
| 47 | m_cStructure->iEpisodeNumber = PVR_RECORDING_INVALID_SERIES_EPISODE; | ||
| 48 | m_cStructure->recordingTime = 0; | ||
| 49 | m_cStructure->iDuration = PVR_RECORDING_VALUE_NOT_AVAILABLE; | ||
| 50 | m_cStructure->iPriority = PVR_RECORDING_VALUE_NOT_AVAILABLE; | ||
| 51 | m_cStructure->iLifetime = PVR_RECORDING_VALUE_NOT_AVAILABLE; | ||
| 52 | m_cStructure->iGenreType = PVR_RECORDING_VALUE_NOT_AVAILABLE; | ||
| 53 | m_cStructure->iGenreSubType = PVR_RECORDING_VALUE_NOT_AVAILABLE; | ||
| 54 | m_cStructure->iPlayCount = PVR_RECORDING_VALUE_NOT_AVAILABLE; | ||
| 55 | m_cStructure->iLastPlayedPosition = PVR_RECORDING_VALUE_NOT_AVAILABLE; | ||
| 56 | m_cStructure->bIsDeleted = false; | ||
| 57 | m_cStructure->iEpgEventId = 0; | ||
| 58 | m_cStructure->iChannelUid = PVR_RECORDING_VALUE_NOT_AVAILABLE; | ||
| 59 | m_cStructure->channelType = PVR_RECORDING_CHANNEL_TYPE_UNKNOWN; | ||
| 60 | m_cStructure->iFlags = 0; | ||
| 61 | m_cStructure->sizeInBytes = PVR_RECORDING_VALUE_NOT_AVAILABLE; | ||
| 62 | } | ||
| 63 | PVRRecording(const PVRRecording& recording) : CStructHdl(recording) {} | ||
| 64 | /*! \endcond */ | ||
| 65 | |||
| 66 | /// @defgroup cpp_kodi_addon_pvr_Defs_Recording_PVRRecording_Help Value Help | ||
| 67 | /// @ingroup cpp_kodi_addon_pvr_Defs_Recording_PVRRecording | ||
| 68 | /// | ||
| 69 | /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Recording_PVRRecording :</b> | ||
| 70 | /// | Name | Type | Set call | Get call | Usage | ||
| 71 | /// |------|------|----------|----------|----------- | ||
| 72 | /// | **Recording id** | `std::string` | @ref PVRRecording::SetRecordingId "SetRecordingId" | @ref PVRRecording::GetRecordingId "GetRecordingId" | *required to set* | ||
| 73 | /// | **Title** | `std::string` | @ref PVRRecording::SetTitle "SetTitle" | @ref PVRRecording::GetTitle "GetTitle" | *required to set* | ||
| 74 | /// | **Episode name** | `std::string` | @ref PVRRecording::SetEpisodeName "SetEpisodeName" | @ref PVRRecording::GetEpisodeName "GetEpisodeName" | *optional* | ||
| 75 | /// | **Series number** | `int` | @ref PVRRecording::SetSeriesNumber "SetSeriesNumber" | @ref PVRRecording::GetSeriesNumber "GetSeriesNumber" | *optional* | ||
| 76 | /// | **Episode number** | `int` | @ref PVRRecording::SetEpisodeNumber "SetEpisodeNumber" | @ref PVRRecording::GetEpisodeNumber "GetEpisodeNumber" | *optional* | ||
| 77 | /// | **Year** | `int` | @ref PVRRecording::SetYear "SetYear" | @ref PVRRecording::GetYear "GetYear" | *optional* | ||
| 78 | /// | **Directory** | `std::string` | @ref PVRRecording::SetDirectory "SetDirectory" | @ref PVRRecording::GetDirectory "GetDirectory" | *optional* | ||
| 79 | /// | **Plot outline** | `std::string` | @ref PVRRecording::SetPlotOutline "SetPlotOutline" | @ref PVRRecording::GetPlotOutline "GetPlotOutline" | *optional* | ||
| 80 | /// | **Plot** | `std::string` | @ref PVRRecording::SetPlot "SetPlot" | @ref PVRRecording::GetPlot "GetPlot" | *optional* | ||
| 81 | /// | **Genre description** | `std::string` | @ref PVRRecording::SetGenreDescription "SetGenreDescription" | @ref PVRRecording::GetGenreDescription "GetGenreDescription" | *optional* | ||
| 82 | /// | **Channel name** | `std::string` | @ref PVRRecording::SetChannelName "SetChannelName" | @ref PVRRecording::GetChannelName "GetChannelName" | *optional* | ||
| 83 | /// | **Icon path** | `std::string` | @ref PVRRecording::SetIconPath "SetIconPath" | @ref PVRRecording::GetIconPath "GetIconPath" | *optional* | ||
| 84 | /// | **Thumbnail path** | `std::string` | @ref PVRRecording::SetThumbnailPath "SetThumbnailPath" | @ref PVRRecording::GetThumbnailPath "GetThumbnailPath" | *optional* | ||
| 85 | /// | **Fanart path** | `std::string` | @ref PVRRecording::SetFanartPath "SetFanartPath" | @ref PVRRecording::GetFanartPath "GetFanartPath" | *optional* | ||
| 86 | /// | **Recording time** | `time_t` | @ref PVRRecording::SetRecordingTime "SetRecordingTime" | @ref PVRRecording::GetRecordingTime "GetRecordingTime" | *optional* | ||
| 87 | /// | **Duration** | `int` | @ref PVRRecording::SetDuration "SetDuration" | @ref PVRRecording::GetDuration "GetDuration" | *optional* | ||
| 88 | /// | **Priority** | `int` | @ref PVRRecording::SetPriority "SetPriority" | @ref PVRRecording::GetPriority "GetPriority" | *optional* | ||
| 89 | /// | **Lifetime** | `int` | @ref PVRRecording::SetLifetime "SetLifetime" | @ref PVRRecording::GetLifetime "GetLifetime" | *optional* | ||
| 90 | /// | **Genre type** | `int` | @ref PVRRecording::SetGenreType "SetGenreType" | @ref PVRRecording::GetGenreType "GetGenreType" | *optional* | ||
| 91 | /// | **Genre sub type** | `int` | @ref PVRRecording::SetGenreSubType "SetGenreSubType" | @ref PVRRecording::GetGenreSubType "GetGenreSubType" | *optional* | ||
| 92 | /// | **Play count** | `int` | @ref PVRRecording::SetPlayCount "SetPlayCount" | @ref PVRRecording::GetPlayCount "GetPlayCount" | *optional* | ||
| 93 | /// | **Last played position** | `int` | @ref PVRRecording::SetLastPlayedPosition "SetLastPlayedPosition" | @ref PVRRecording::GetLastPlayedPosition "GetLastPlayedPosition" | *optional* | ||
| 94 | /// | **Is deleted** | `bool` | @ref PVRRecording::SetIsDeleted "SetIsDeleted" | @ref PVRRecording::GetIsDeleted "GetIsDeleted" | *optional* | ||
| 95 | /// | **EPG event id** | `unsigned int` | @ref PVRRecording::SetEPGEventId "SetEPGEventId" | @ref PVRRecording::GetEPGEventId "GetEPGEventId" | *optional* | ||
| 96 | /// | **Channel unique id** | `int` | @ref PVRRecording::SetChannelUid "SetChannelUid" | @ref PVRRecording::GetChannelUid "GetChannelUid" | *optional* | ||
| 97 | /// | **Channel type** | @ref PVR_RECORDING_CHANNEL_TYPE | @ref PVRRecording::SetChannelType "SetChannelType" | @ref PVRRecording::GetChannelType "GetChannelType" | *optional* | ||
| 98 | /// | **First aired** | `std::string` | @ref PVRRecording::SetFirstAired "SetFirstAired" | @ref PVRRecording::GetFirstAired "GetFirstAired" | *optional* | ||
| 99 | /// | **Flags** | `std::string` | @ref PVRRecording::SetFlags "SetFlags" | @ref PVRRecording::GetFlags "GetFlags" | *optional* | ||
| 100 | /// | **Size in bytes** | `std::string` | @ref PVRRecording::SetSizeInBytes "SetSizeInBytes" | @ref PVRRecording::GetSizeInBytes "GetSizeInBytes" | *optional* | ||
| 101 | |||
| 102 | /// @addtogroup cpp_kodi_addon_pvr_Defs_Recording_PVRRecording | ||
| 103 | ///@{ | ||
| 104 | |||
| 105 | /// @brief **required**\n | ||
| 106 | /// Unique identifier of the recording on the client. | ||
| 107 | void SetRecordingId(const std::string& recordingId) | ||
| 108 | { | ||
| 109 | strncpy(m_cStructure->strRecordingId, recordingId.c_str(), | ||
| 110 | sizeof(m_cStructure->strRecordingId) - 1); | ||
| 111 | } | ||
| 112 | |||
| 113 | /// @brief To get with @ref SetRecordingId changed values. | ||
| 114 | std::string GetRecordingId() const { return m_cStructure->strRecordingId; } | ||
| 115 | |||
| 116 | /// @brief **required**\n | ||
| 117 | /// The title of this recording. | ||
| 118 | void SetTitle(const std::string& title) | ||
| 119 | { | ||
| 120 | strncpy(m_cStructure->strTitle, title.c_str(), sizeof(m_cStructure->strTitle) - 1); | ||
| 121 | } | ||
| 122 | |||
| 123 | /// @brief To get with @ref SetTitle changed values. | ||
| 124 | std::string GetTitle() const { return m_cStructure->strTitle; } | ||
| 125 | |||
| 126 | /// @brief **optional**\n | ||
| 127 | /// Episode name (also known as subtitle). | ||
| 128 | void SetEpisodeName(const std::string& episodeName) | ||
| 129 | { | ||
| 130 | strncpy(m_cStructure->strEpisodeName, episodeName.c_str(), | ||
| 131 | sizeof(m_cStructure->strEpisodeName) - 1); | ||
| 132 | } | ||
| 133 | |||
| 134 | /// @brief To get with @ref SetEpisodeName changed values. | ||
| 135 | std::string GetEpisodeName() const { return m_cStructure->strEpisodeName; } | ||
| 136 | |||
| 137 | /// @brief **optional**\n | ||
| 138 | /// Series number (usually called season). | ||
| 139 | /// | ||
| 140 | /// Set to "0" for specials/pilot. For 'invalid' see @ref SetEpisodeNumber or set to -1. | ||
| 141 | void SetSeriesNumber(int seriesNumber) { m_cStructure->iSeriesNumber = seriesNumber; } | ||
| 142 | |||
| 143 | /// @brief To get with @ref SetSeriesNumber changed values. | ||
| 144 | int GetSeriesNumber() const { return m_cStructure->iSeriesNumber; } | ||
| 145 | |||
| 146 | /// @brief **optional**\n | ||
| 147 | /// Eepisode number within the "iSeriesNumber" season. | ||
| 148 | /// | ||
| 149 | /// For 'invalid' set to -1 or seriesNumber=episodeNumber=0 to show both are invalid. | ||
| 150 | void SetEpisodeNumber(int episodeNumber) { m_cStructure->iEpisodeNumber = episodeNumber; } | ||
| 151 | |||
| 152 | /// @brief To get with @ref SetEpisodeNumber changed values. | ||
| 153 | int GetEpisodeNumber() const { return m_cStructure->iEpisodeNumber; } | ||
| 154 | |||
| 155 | /// @brief **optional**\n | ||
| 156 | /// Year of first release (use to identify a specific movie re-make) / first | ||
| 157 | /// airing for TV shows. | ||
| 158 | /// | ||
| 159 | /// Set to '0' for invalid. | ||
| 160 | void SetYear(int year) { m_cStructure->iYear = year; } | ||
| 161 | |||
| 162 | /// @brief To get with @ref SetYear changed values. | ||
| 163 | int GetYear() const { return m_cStructure->iYear; } | ||
| 164 | |||
| 165 | /// @brief **optional**\n | ||
| 166 | /// | ||
| 167 | /// Directory of this recording on the client. | ||
| 168 | void SetDirectory(const std::string& directory) | ||
| 169 | { | ||
| 170 | strncpy(m_cStructure->strDirectory, directory.c_str(), sizeof(m_cStructure->strDirectory) - 1); | ||
| 171 | } | ||
| 172 | |||
| 173 | /// @brief To get with @ref SetDirectory changed values. | ||
| 174 | std::string GetDirectory() const { return m_cStructure->strDirectory; } | ||
| 175 | |||
| 176 | /// @brief **optional**\n | ||
| 177 | /// Plot outline name. | ||
| 178 | void SetPlotOutline(const std::string& plotOutline) | ||
| 179 | { | ||
| 180 | strncpy(m_cStructure->strPlotOutline, plotOutline.c_str(), | ||
| 181 | sizeof(m_cStructure->strPlotOutline) - 1); | ||
| 182 | } | ||
| 183 | |||
| 184 | /// @brief To get with @ref SetPlotOutline changed values. | ||
| 185 | std::string GetPlotOutline() const { return m_cStructure->strPlotOutline; } | ||
| 186 | |||
| 187 | /// @brief **optional**\n | ||
| 188 | /// Plot name. | ||
| 189 | void SetPlot(const std::string& plot) | ||
| 190 | { | ||
| 191 | strncpy(m_cStructure->strPlot, plot.c_str(), sizeof(m_cStructure->strPlot) - 1); | ||
| 192 | } | ||
| 193 | |||
| 194 | /// @brief To get with @ref SetPlot changed values. | ||
| 195 | std::string GetPlot() const { return m_cStructure->strPlot; } | ||
| 196 | |||
| 197 | /// @brief **optional**\n | ||
| 198 | /// Channel name. | ||
| 199 | void SetChannelName(const std::string& channelName) | ||
| 200 | { | ||
| 201 | strncpy(m_cStructure->strChannelName, channelName.c_str(), | ||
| 202 | sizeof(m_cStructure->strChannelName) - 1); | ||
| 203 | } | ||
| 204 | |||
| 205 | /// @brief To get with @ref SetChannelName changed values. | ||
| 206 | std::string GetChannelName() const { return m_cStructure->strChannelName; } | ||
| 207 | |||
| 208 | /// @brief **optional**\n | ||
| 209 | /// Channel logo (icon) path. | ||
| 210 | void SetIconPath(const std::string& iconPath) | ||
| 211 | { | ||
| 212 | strncpy(m_cStructure->strIconPath, iconPath.c_str(), sizeof(m_cStructure->strIconPath) - 1); | ||
| 213 | } | ||
| 214 | |||
| 215 | /// @brief To get with @ref SetIconPath changed values. | ||
| 216 | std::string GetIconPath() const { return m_cStructure->strIconPath; } | ||
| 217 | |||
| 218 | /// @brief **optional**\n | ||
| 219 | /// Thumbnail path. | ||
| 220 | void SetThumbnailPath(const std::string& thumbnailPath) | ||
| 221 | { | ||
| 222 | strncpy(m_cStructure->strThumbnailPath, thumbnailPath.c_str(), | ||
| 223 | sizeof(m_cStructure->strThumbnailPath) - 1); | ||
| 224 | } | ||
| 225 | |||
| 226 | /// @brief To get with @ref SetThumbnailPath changed values. | ||
| 227 | std::string GetThumbnailPath() const { return m_cStructure->strThumbnailPath; } | ||
| 228 | |||
| 229 | /// @brief **optional**\n | ||
| 230 | /// Fanart path. | ||
| 231 | void SetFanartPath(const std::string& fanartPath) | ||
| 232 | { | ||
| 233 | strncpy(m_cStructure->strFanartPath, fanartPath.c_str(), | ||
| 234 | sizeof(m_cStructure->strFanartPath) - 1); | ||
| 235 | } | ||
| 236 | |||
| 237 | /// @brief To get with @ref SetFanartPath changed values. | ||
| 238 | std::string GetFanartPath() const { return m_cStructure->strFanartPath; } | ||
| 239 | |||
| 240 | /// @brief **optional**\n | ||
| 241 | /// Start time of the recording. | ||
| 242 | void SetRecordingTime(time_t recordingTime) { m_cStructure->recordingTime = recordingTime; } | ||
| 243 | |||
| 244 | /// @brief To get with @ref SetRecordingTime changed values. | ||
| 245 | time_t GetRecordingTime() const { return m_cStructure->recordingTime; } | ||
| 246 | |||
| 247 | /// @brief **optional**\n | ||
| 248 | /// Duration of the recording in seconds. | ||
| 249 | void SetDuration(int duration) { m_cStructure->iDuration = duration; } | ||
| 250 | |||
| 251 | /// @brief To get with @ref SetDuration changed values. | ||
| 252 | int GetDuration() const { return m_cStructure->iDuration; } | ||
| 253 | |||
| 254 | /// @brief **optional**\n | ||
| 255 | /// Priority of this recording (from 0 - 100). | ||
| 256 | void SetPriority(int priority) { m_cStructure->iPriority = priority; } | ||
| 257 | |||
| 258 | /// @brief To get with @ref SetPriority changed values. | ||
| 259 | int GetPriority() const { return m_cStructure->iPriority; } | ||
| 260 | |||
| 261 | /// @brief **optional**\n | ||
| 262 | /// Life time in days of this recording. | ||
| 263 | void SetLifetime(int lifetime) { m_cStructure->iLifetime = lifetime; } | ||
| 264 | |||
| 265 | /// @brief To get with @ref SetLifetime changed values. | ||
| 266 | int GetLifetime() const { return m_cStructure->iLifetime; } | ||
| 267 | |||
| 268 | /// @brief **optional**\n | ||
| 269 | /// Genre type. | ||
| 270 | /// | ||
| 271 | /// Use @ref EPG_GENRE_USE_STRING if type becomes given by @ref SetGenreDescription. | ||
| 272 | /// | ||
| 273 | /// @note If confirmed that backend brings the types in [ETSI EN 300 468](https://www.etsi.org/deliver/etsi_en/300400_300499/300468/01.14.01_60/en_300468v011401p.pdf) | ||
| 274 | /// conform values, can be @ref EPG_EVENT_CONTENTMASK ignored and to set here | ||
| 275 | /// with backend value. | ||
| 276 | /// | ||
| 277 | /// | ||
| 278 | /// -------------------------------------------------------------------------- | ||
| 279 | /// | ||
| 280 | /// **Example 1:** | ||
| 281 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 282 | /// kodi::addon::PVRRecording tag; | ||
| 283 | /// tag.SetGenreType(EPG_EVENT_CONTENTMASK_MOVIEDRAMA); | ||
| 284 | /// ~~~~~~~~~~~~~ | ||
| 285 | /// | ||
| 286 | /// -------------------------------------------------------------------------- | ||
| 287 | /// | ||
| 288 | /// **Example 2** (in case of other, not ETSI EN 300 468 conform genre types): | ||
| 289 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 290 | /// kodi::addon::PVRRecording tag; | ||
| 291 | /// tag.SetGenreType(EPG_GENRE_USE_STRING); | ||
| 292 | /// tag.SetGenreDescription("My special genre name"); // Should use (if possible) kodi::GetLocalizedString(...) to have match user language. | ||
| 293 | /// ~~~~~~~~~~~~~ | ||
| 294 | /// | ||
| 295 | void SetGenreType(int genreType) { m_cStructure->iGenreType = genreType; } | ||
| 296 | |||
| 297 | /// @brief To get with @ref SetGenreType changed values. | ||
| 298 | int GetGenreType() const { return m_cStructure->iGenreType; } | ||
| 299 | |||
| 300 | /// @brief **optional**\n | ||
| 301 | /// Genre sub type. | ||
| 302 | /// | ||
| 303 | /// Subtypes groups related to set by @ref SetGenreType: | ||
| 304 | /// | Main genre type | List with available sub genre types | ||
| 305 | /// |-----------------|----------------------------------------- | ||
| 306 | /// | @ref EPG_EVENT_CONTENTMASK_UNDEFINED | Nothing, should be 0 | ||
| 307 | /// | @ref EPG_EVENT_CONTENTMASK_MOVIEDRAMA | @ref EPG_EVENT_CONTENTSUBMASK_MOVIEDRAMA | ||
| 308 | /// | @ref EPG_EVENT_CONTENTMASK_NEWSCURRENTAFFAIRS | @ref EPG_EVENT_CONTENTSUBMASK_NEWSCURRENTAFFAIRS | ||
| 309 | /// | @ref EPG_EVENT_CONTENTMASK_SHOW | @ref EPG_EVENT_CONTENTSUBMASK_SHOW | ||
| 310 | /// | @ref EPG_EVENT_CONTENTMASK_SPORTS | @ref EPG_EVENT_CONTENTSUBMASK_SPORTS | ||
| 311 | /// | @ref EPG_EVENT_CONTENTMASK_CHILDRENYOUTH | @ref EPG_EVENT_CONTENTSUBMASK_CHILDRENYOUTH | ||
| 312 | /// | @ref EPG_EVENT_CONTENTMASK_MUSICBALLETDANCE | @ref EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE | ||
| 313 | /// | @ref EPG_EVENT_CONTENTMASK_ARTSCULTURE | @ref EPG_EVENT_CONTENTSUBMASK_ARTSCULTURE | ||
| 314 | /// | @ref EPG_EVENT_CONTENTMASK_SOCIALPOLITICALECONOMICS | @ref EPG_EVENT_CONTENTSUBMASK_SOCIALPOLITICALECONOMICS | ||
| 315 | /// | @ref EPG_EVENT_CONTENTMASK_EDUCATIONALSCIENCE | @ref EPG_EVENT_CONTENTSUBMASK_EDUCATIONALSCIENCE | ||
| 316 | /// | @ref EPG_EVENT_CONTENTMASK_LEISUREHOBBIES | @ref EPG_EVENT_CONTENTSUBMASK_LEISUREHOBBIES | ||
| 317 | /// | @ref EPG_EVENT_CONTENTMASK_SPECIAL | @ref EPG_EVENT_CONTENTSUBMASK_SPECIAL | ||
| 318 | /// | @ref EPG_EVENT_CONTENTMASK_USERDEFINED | Can be defined by you | ||
| 319 | /// | @ref EPG_GENRE_USE_STRING | **Kodi's own value**, which declares that the type with @ref SetGenreDescription is given. | ||
| 320 | /// | ||
| 321 | /// -------------------------------------------------------------------------- | ||
| 322 | /// | ||
| 323 | /// **Example:** | ||
| 324 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 325 | /// kodi::addon::PVRRecording tag; | ||
| 326 | /// tag.SetGenreType(EPG_EVENT_CONTENTMASK_MUSICBALLETDANCE); | ||
| 327 | /// tag.SetGenreSubType(EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE_JAZZ); | ||
| 328 | /// ~~~~~~~~~~~~~ | ||
| 329 | /// | ||
| 330 | void SetGenreSubType(int genreSubType) { m_cStructure->iGenreSubType = genreSubType; } | ||
| 331 | |||
| 332 | /// @brief To get with @ref SetGenreSubType changed values. | ||
| 333 | int GetGenreSubType() const { return m_cStructure->iGenreSubType; } | ||
| 334 | |||
| 335 | /// @brief **optional**\n | ||
| 336 | /// To set own genre description name. | ||
| 337 | /// | ||
| 338 | /// Will be used only when genreType == @ref EPG_GENRE_USE_STRING or | ||
| 339 | /// genreSubType == @ref EPG_GENRE_USE_STRING. | ||
| 340 | /// | ||
| 341 | /// Use @ref EPG_STRING_TOKEN_SEPARATOR to separate different genres. | ||
| 342 | /// | ||
| 343 | /// In case of other, not [ETSI EN 300 468](https://www.etsi.org/deliver/etsi_en/300400_300499/300468/01.14.01_60/en_300468v011401p.pdf) | ||
| 344 | /// conform genre types or something special. | ||
| 345 | /// | ||
| 346 | /// -------------------------------------------------------------------------- | ||
| 347 | /// | ||
| 348 | /// **Example:** | ||
| 349 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 350 | /// kodi::addon::PVRRecording tag; | ||
| 351 | /// tag.SetGenreType(EPG_GENRE_USE_STRING); | ||
| 352 | /// tag.SetGenreDescription("Action" + EPG_STRING_TOKEN_SEPARATOR + "Thriller"); | ||
| 353 | /// ~~~~~~~~~~~~~ | ||
| 354 | /// | ||
| 355 | void SetGenreDescription(const std::string& genreDescription) | ||
| 356 | { | ||
| 357 | strncpy(m_cStructure->strGenreDescription, genreDescription.c_str(), | ||
| 358 | sizeof(m_cStructure->strGenreDescription) - 1); | ||
| 359 | } | ||
| 360 | |||
| 361 | /// @brief To get with @ref SetGenreDescription changed values. | ||
| 362 | std::string GetGenreDescription() const { return m_cStructure->strGenreDescription; } | ||
| 363 | |||
| 364 | /// @brief **optional**\n | ||
| 365 | /// Play count of this recording on the client. | ||
| 366 | void SetPlayCount(int playCount) { m_cStructure->iPlayCount = playCount; } | ||
| 367 | |||
| 368 | /// @brief To get with @ref SetPlayCount changed values. | ||
| 369 | int GetPlayCount() const { return m_cStructure->iPlayCount; } | ||
| 370 | |||
| 371 | /// @brief **optional**\n | ||
| 372 | /// Last played position of this recording on the client. | ||
| 373 | void SetLastPlayedPosition(int lastPlayedPosition) | ||
| 374 | { | ||
| 375 | m_cStructure->iLastPlayedPosition = lastPlayedPosition; | ||
| 376 | } | ||
| 377 | |||
| 378 | /// @brief To get with @ref SetLastPlayedPosition changed values. | ||
| 379 | int GetLastPlayedPosition() const { return m_cStructure->iLastPlayedPosition; } | ||
| 380 | |||
| 381 | /// @brief **optional**\n | ||
| 382 | /// Shows this recording is deleted and can be undelete. | ||
| 383 | void SetIsDeleted(int isDeleted) { m_cStructure->bIsDeleted = isDeleted; } | ||
| 384 | |||
| 385 | /// @brief To get with @ref SetIsDeleted changed values. | ||
| 386 | int GetIsDeleted() const { return m_cStructure->bIsDeleted; } | ||
| 387 | |||
| 388 | /// @brief **optional**\n | ||
| 389 | /// EPG event id associated with this recording. Valid ids must be greater than @ref EPG_TAG_INVALID_UID. | ||
| 390 | void SetEPGEventId(unsigned int epgEventId) { m_cStructure->iEpgEventId = epgEventId; } | ||
| 391 | |||
| 392 | /// @brief To get with @ref SetEPGEventId changed values. | ||
| 393 | unsigned int GetEPGEventId() const { return m_cStructure->iEpgEventId; } | ||
| 394 | |||
| 395 | /// @brief **optional**\n | ||
| 396 | /// Unique identifier of the channel for this recording. @ref PVR_CHANNEL_INVALID_UID | ||
| 397 | /// denotes that channel uid is not available. | ||
| 398 | void SetChannelUid(int channelUid) { m_cStructure->iChannelUid = channelUid; } | ||
| 399 | |||
| 400 | /// @brief To get with @ref SetChannelUid changed values | ||
| 401 | int GetChannelUid() const { return m_cStructure->iChannelUid; } | ||
| 402 | |||
| 403 | /// @brief **optional**\n | ||
| 404 | /// Channel type. | ||
| 405 | /// | ||
| 406 | /// Set to @ref PVR_RECORDING_CHANNEL_TYPE_UNKNOWN if the type cannot be | ||
| 407 | /// determined. | ||
| 408 | /// | ||
| 409 | /// -------------------------------------------------------------------------- | ||
| 410 | /// | ||
| 411 | /// Example: | ||
| 412 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 413 | /// kodi::addon::PVRRecording tag; | ||
| 414 | /// tag.SetChannelType(PVR_RECORDING_CHANNEL_TYPE_TV); | ||
| 415 | /// ~~~~~~~~~~~~~ | ||
| 416 | /// | ||
| 417 | void SetChannelType(PVR_RECORDING_CHANNEL_TYPE channelType) | ||
| 418 | { | ||
| 419 | m_cStructure->channelType = channelType; | ||
| 420 | } | ||
| 421 | |||
| 422 | /// @brief To get with @ref SetChannelType changed values | ||
| 423 | PVR_RECORDING_CHANNEL_TYPE GetChannelType() const { return m_cStructure->channelType; } | ||
| 424 | |||
| 425 | /// @brief **optional**\n | ||
| 426 | /// First aired date of this recording. | ||
| 427 | /// | ||
| 428 | /// Used only for display purposes. Specify in W3C date format "YYYY-MM-DD". | ||
| 429 | /// | ||
| 430 | /// -------------------------------------------------------------------------- | ||
| 431 | /// | ||
| 432 | /// Example: | ||
| 433 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 434 | /// kodi::addon::PVRRecording tag; | ||
| 435 | /// tag.SetFirstAired(1982-10-22); | ||
| 436 | /// ~~~~~~~~~~~~~ | ||
| 437 | /// | ||
| 438 | void SetFirstAired(const std::string& firstAired) | ||
| 439 | { | ||
| 440 | strncpy(m_cStructure->strFirstAired, firstAired.c_str(), | ||
| 441 | sizeof(m_cStructure->strFirstAired) - 1); | ||
| 442 | } | ||
| 443 | |||
| 444 | /// @brief To get with @ref SetFirstAired changed values | ||
| 445 | std::string GetFirstAired() const { return m_cStructure->strFirstAired; } | ||
| 446 | |||
| 447 | /// @brief **optional**\n | ||
| 448 | /// Bit field of independent flags associated with the recording. | ||
| 449 | /// | ||
| 450 | /// See @ref cpp_kodi_addon_pvr_Defs_Recording_PVR_RECORDING_FLAG for | ||
| 451 | /// available bit flags. | ||
| 452 | /// | ||
| 453 | /// -------------------------------------------------------------------------- | ||
| 454 | /// | ||
| 455 | /// @copydetails cpp_kodi_addon_pvr_Defs_Recording_PVR_RECORDING_FLAG | ||
| 456 | /// | ||
| 457 | void SetFlags(unsigned int flags) { m_cStructure->iFlags = flags; } | ||
| 458 | |||
| 459 | /// @brief To get with @ref SetFlags changed values. | ||
| 460 | unsigned int GetFlags() const { return m_cStructure->iFlags; } | ||
| 461 | |||
| 462 | /// @brief **optional**\n | ||
| 463 | /// Size of the recording in bytes. | ||
| 464 | void SetSizeInBytes(int64_t sizeInBytes) { m_cStructure->sizeInBytes = sizeInBytes; } | ||
| 465 | |||
| 466 | /// @brief To get with @ref SetSizeInBytes changed values. | ||
| 467 | int64_t GetSizeInBytes() const { return m_cStructure->sizeInBytes; } | ||
| 468 | ///@} | ||
| 469 | |||
| 470 | private: | ||
| 471 | PVRRecording(const PVR_RECORDING* recording) : CStructHdl(recording) {} | ||
| 472 | PVRRecording(PVR_RECORDING* recording) : CStructHdl(recording) {} | ||
| 473 | }; | ||
| 474 | ///@} | ||
| 475 | //------------------------------------------------------------------------------ | ||
| 476 | |||
| 477 | //============================================================================== | ||
| 478 | /// @defgroup cpp_kodi_addon_pvr_Defs_Recording_PVRRecordingsResultSet class PVRRecordingsResultSet | ||
| 479 | /// @ingroup cpp_kodi_addon_pvr_Defs_Recording_PVRRecording | ||
| 480 | /// @brief **PVR add-on recording transfer class**\n | ||
| 481 | /// To transfer the content of @ref kodi::addon::CInstancePVRClient::GetRecordings(). | ||
| 482 | /// | ||
| 483 | /// @note This becomes only be used on addon call above, not usable outside on | ||
| 484 | /// addon itself. | ||
| 485 | ///@{ | ||
| 486 | class PVRRecordingsResultSet | ||
| 487 | { | ||
| 488 | public: | ||
| 489 | /*! \cond PRIVATE */ | ||
| 490 | PVRRecordingsResultSet() = delete; | ||
| 491 | PVRRecordingsResultSet(const AddonInstance_PVR* instance, ADDON_HANDLE handle) | ||
| 492 | : m_instance(instance), m_handle(handle) | ||
| 493 | { | ||
| 494 | } | ||
| 495 | /*! \endcond */ | ||
| 496 | |||
| 497 | /// @addtogroup cpp_kodi_addon_pvr_Defs_Recording_PVRRecordingsResultSet | ||
| 498 | ///@{ | ||
| 499 | |||
| 500 | /// @brief To add and give content from addon to Kodi on related call. | ||
| 501 | /// | ||
| 502 | /// @param[in] tag The to transferred data. | ||
| 503 | void Add(const kodi::addon::PVRRecording& tag) | ||
| 504 | { | ||
| 505 | m_instance->toKodi->TransferRecordingEntry(m_instance->toKodi->kodiInstance, m_handle, tag); | ||
| 506 | } | ||
| 507 | |||
| 508 | ///@} | ||
| 509 | |||
| 510 | private: | ||
| 511 | const AddonInstance_PVR* m_instance = nullptr; | ||
| 512 | const ADDON_HANDLE m_handle; | ||
| 513 | }; | ||
| 514 | ///@} | ||
| 515 | //------------------------------------------------------------------------------ | ||
| 516 | |||
| 517 | } /* namespace addon */ | ||
| 518 | } /* namespace kodi */ | ||
| 519 | |||
| 520 | #endif /* __cplusplus */ | ||
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Stream.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Stream.h new file mode 100644 index 0000000..5613947 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Stream.h | |||
| @@ -0,0 +1,330 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2005-2018 Team Kodi | ||
| 3 | * This file is part of Kodi - https://kodi.tv | ||
| 4 | * | ||
| 5 | * SPDX-License-Identifier: GPL-2.0-or-later | ||
| 6 | * See LICENSES/README.md for more information. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #pragma once | ||
| 10 | |||
| 11 | #include "../../AddonBase.h" | ||
| 12 | #include "../../c-api/addon-instance/pvr/pvr_stream.h" | ||
| 13 | |||
| 14 | //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ | ||
| 15 | // "C++" Definitions group 9 - PVR stream definitions (NOTE: Becomes replaced | ||
| 16 | // in future by inputstream addon instance way) | ||
| 17 | |||
| 18 | #ifdef __cplusplus | ||
| 19 | |||
| 20 | namespace kodi | ||
| 21 | { | ||
| 22 | namespace addon | ||
| 23 | { | ||
| 24 | |||
| 25 | //============================================================================== | ||
| 26 | /// @defgroup cpp_kodi_addon_pvr_Defs_Stream_PVRCodec class PVRCodec | ||
| 27 | /// @ingroup cpp_kodi_addon_pvr_Defs_Stream | ||
| 28 | /// @brief **PVR codec identifier**\n | ||
| 29 | /// Used to exchange the desired codec type between Kodi and addon. | ||
| 30 | /// | ||
| 31 | /// @ref kodi::addon::CInstancePVRClient::GetCodecByName is used to get this data. | ||
| 32 | /// | ||
| 33 | /// ---------------------------------------------------------------------------- | ||
| 34 | /// | ||
| 35 | /// @copydetails cpp_kodi_addon_pvr_Defs_Stream_PVRCodec_Help | ||
| 36 | /// | ||
| 37 | ///@{ | ||
| 38 | class PVRCodec : public CStructHdl<PVRCodec, PVR_CODEC> | ||
| 39 | { | ||
| 40 | friend class CInstancePVRClient; | ||
| 41 | |||
| 42 | public: | ||
| 43 | /*! \cond PRIVATE */ | ||
| 44 | PVRCodec() | ||
| 45 | { | ||
| 46 | m_cStructure->codec_type = PVR_CODEC_TYPE_UNKNOWN; | ||
| 47 | m_cStructure->codec_id = PVR_INVALID_CODEC_ID; | ||
| 48 | } | ||
| 49 | PVRCodec(const PVRCodec& type) : CStructHdl(type) {} | ||
| 50 | /*! \endcond */ | ||
| 51 | |||
| 52 | /// @defgroup cpp_kodi_addon_pvr_Defs_Stream_PVRCodec_Help Value Help | ||
| 53 | /// @ingroup cpp_kodi_addon_pvr_Defs_Stream_PVRCodec | ||
| 54 | /// | ||
| 55 | /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Stream_PVRCodec :</b> | ||
| 56 | /// | Name | Type | Set call | Get call | ||
| 57 | /// |------|------|----------|---------- | ||
| 58 | /// | **Codec type** | @ref PVR_CODEC_TYPE | @ref PVRCodec::SetCodecType "SetCodecType" | @ref PVRCodec::GetCodecType "GetCodecType" | ||
| 59 | /// | **Codec identifier** | `unsigned int` | @ref PVRCodec::SetCodecId "SetCodecId" | @ref PVRCodec::GetCodecId "GetCodecId" | ||
| 60 | /// | ||
| 61 | |||
| 62 | /// @addtogroup cpp_kodi_addon_pvr_Defs_Stream_PVRCodec | ||
| 63 | ///@{ | ||
| 64 | |||
| 65 | /// @brief Codec type. | ||
| 66 | void SetCodecType(PVR_CODEC_TYPE codecType) { m_cStructure->codec_type = codecType; } | ||
| 67 | |||
| 68 | /// @brief To get with @ref SetCodecType() changed values. | ||
| 69 | PVR_CODEC_TYPE GetCodecType() const { return m_cStructure->codec_type; } | ||
| 70 | |||
| 71 | /// @brief Codec id. | ||
| 72 | /// | ||
| 73 | /// Related codec identifier, normally match the ffmpeg id's. | ||
| 74 | void SetCodecId(unsigned int codecId) { m_cStructure->codec_id = codecId; } | ||
| 75 | |||
| 76 | /// @brief To get with @ref SetCodecId() changed values. | ||
| 77 | unsigned int GetCodecId() const { return m_cStructure->codec_id; } | ||
| 78 | ///@} | ||
| 79 | |||
| 80 | private: | ||
| 81 | PVRCodec(const PVR_CODEC& type) : CStructHdl(&type) {} | ||
| 82 | PVRCodec(const PVR_CODEC* type) : CStructHdl(type) {} | ||
| 83 | PVRCodec(PVR_CODEC* type) : CStructHdl(type) {} | ||
| 84 | }; | ||
| 85 | ///@} | ||
| 86 | //------------------------------------------------------------------------------ | ||
| 87 | |||
| 88 | //============================================================================== | ||
| 89 | /// @defgroup cpp_kodi_addon_pvr_Defs_Stream_PVRStreamProperties class PVRStreamProperties | ||
| 90 | /// @ingroup cpp_kodi_addon_pvr_Defs_Stream | ||
| 91 | /// @brief **PVR stream properties**\n | ||
| 92 | /// All information about a respective stream is stored in this, so that Kodi | ||
| 93 | /// can process the data given by the addon after demux. | ||
| 94 | /// | ||
| 95 | /// ---------------------------------------------------------------------------- | ||
| 96 | /// | ||
| 97 | /// @copydetails cpp_kodi_addon_pvr_Defs_Stream_PVRStreamProperties_Help | ||
| 98 | /// | ||
| 99 | ///@{ | ||
| 100 | class PVRStreamProperties | ||
| 101 | : public CStructHdl<PVRStreamProperties, PVR_STREAM_PROPERTIES::PVR_STREAM> | ||
| 102 | { | ||
| 103 | friend class CInstancePVRClient; | ||
| 104 | |||
| 105 | public: | ||
| 106 | /*! \cond PRIVATE */ | ||
| 107 | PVRStreamProperties() { memset(m_cStructure, 0, sizeof(PVR_STREAM_PROPERTIES::PVR_STREAM)); } | ||
| 108 | PVRStreamProperties(const PVRStreamProperties& type) : CStructHdl(type) {} | ||
| 109 | /*! \endcond */ | ||
| 110 | |||
| 111 | /// @defgroup cpp_kodi_addon_pvr_Defs_Stream_PVRStreamProperties_Help Value Help | ||
| 112 | /// @ingroup cpp_kodi_addon_pvr_Defs_Stream_PVRStreamProperties | ||
| 113 | /// ---------------------------------------------------------------------------- | ||
| 114 | /// | ||
| 115 | /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Stream_PVRStreamProperties :</b> | ||
| 116 | /// | Name | Type | Set call | Get call | ||
| 117 | /// |------|------|----------|---------- | ||
| 118 | /// | **PID** | `unsigned int` | @ref PVRStreamProperties::SetPID "SetPID" | @ref PVRStreamProperties::GetPID "GetPID" | ||
| 119 | /// | **Codec type** | @ref PVR_CODEC_TYPE | @ref PVRStreamProperties::SetCodecType "SetCodecType" | @ref PVRStreamProperties::GetCodecType "GetCodecType" | ||
| 120 | /// | **Codec identifier** | `unsigned int` | @ref PVRStreamProperties::SetCodecId "SetCodecId" | @ref PVRStreamProperties::GetCodecId "GetCodecId" | ||
| 121 | /// | **Language** | `std::string` | @ref PVRStreamProperties::SetLanguage "SetLanguage" | @ref PVRStreamProperties::GetLanguage "GetLanguage" | ||
| 122 | /// | **Subtitle info** | `int` | @ref PVRStreamProperties::SetSubtitleInfo "SetSubtitleInfo" | @ref PVRStreamProperties::GetSubtitleInfo "GetSubtitleInfo" | ||
| 123 | /// | **FPS scale** | `int` | @ref PVRStreamProperties::SetFPSScale "SetFPSScale" | @ref PVRStreamProperties::GetFPSScale "GetFPSScale" | ||
| 124 | /// | **FPS rate** | `int` | @ref PVRStreamProperties::SetFPSRate "SetFPSRate" | @ref PVRStreamProperties::GetFPSRate "GetFPSRate" | ||
| 125 | /// | **Height** | `int` | @ref PVRStreamProperties::SetHeight "SetHeight" | @ref PVRStreamProperties::GetHeight "GetHeight" | ||
| 126 | /// | **Width** | `int` | @ref PVRStreamProperties::SetWidth "SetWidth" | @ref PVRStreamProperties::GetWidth "GetWidth" | ||
| 127 | /// | **Aspect ratio** | `float` | @ref PVRStreamProperties::SetAspect "SetAspect" | @ref PVRStreamProperties::GetAspect "GetAspect" | ||
| 128 | /// | **Channels** | `int` | @ref PVRStreamProperties::SetChannels "SetChannels" | @ref PVRStreamProperties::GetChannels "GetChannels" | ||
| 129 | /// | **Samplerate** | `int` | @ref PVRStreamProperties::SetSampleRate "SetSampleRate" | @ref PVRStreamProperties::GetSampleRate "GetSampleRate" | ||
| 130 | /// | **Block align** | `int` | @ref PVRStreamProperties::SetBlockAlign "SetBlockAlign" | @ref PVRStreamProperties::GetBlockAlign "GetBlockAlign" | ||
| 131 | /// | **Bit rate** | `int` | @ref PVRStreamProperties::SetBitRate "SetBitRate" | @ref PVRStreamProperties::GetBitRate "GetBitRate" | ||
| 132 | /// | **Bits per sample** | `int` | @ref PVRStreamProperties::SetBitsPerSample "SetBitsPerSample" | @ref PVRStreamProperties::GetBitsPerSample "GetBitsPerSample" | ||
| 133 | /// | ||
| 134 | |||
| 135 | /// @addtogroup cpp_kodi_addon_pvr_Defs_Stream_PVRStreamProperties | ||
| 136 | ///@{ | ||
| 137 | |||
| 138 | /// @brief PID. | ||
| 139 | void SetPID(unsigned int pid) { m_cStructure->iPID = pid; } | ||
| 140 | |||
| 141 | /// @brief To get with @ref SetPID() changed values. | ||
| 142 | unsigned int GetPID() const { return m_cStructure->iPID; } | ||
| 143 | |||
| 144 | /// @brief Codec type this stream. | ||
| 145 | void SetCodecType(PVR_CODEC_TYPE codecType) { m_cStructure->iCodecType = codecType; } | ||
| 146 | |||
| 147 | /// @brief To get with @ref SetCodecType() changed values. | ||
| 148 | PVR_CODEC_TYPE GetCodecType() const { return m_cStructure->iCodecType; } | ||
| 149 | |||
| 150 | /// @brief Codec id of this stream. | ||
| 151 | void SetCodecId(unsigned int codecId) { m_cStructure->iCodecId = codecId; } | ||
| 152 | |||
| 153 | /// @brief To get with @ref SetCodecId() changed values. | ||
| 154 | unsigned int GetCodecId() const { return m_cStructure->iCodecId; } | ||
| 155 | |||
| 156 | /// @brief 3 letter language id. | ||
| 157 | void SetLanguage(const std::string& language) | ||
| 158 | { | ||
| 159 | if (language.size() > 3) | ||
| 160 | { | ||
| 161 | kodi::Log(ADDON_LOG_ERROR, | ||
| 162 | "PVRStreamProperties::%s: Language string size '%li' higher as needed 3", __func__, | ||
| 163 | language.size()); | ||
| 164 | return; | ||
| 165 | } | ||
| 166 | m_cStructure->strLanguage[0] = language[0]; | ||
| 167 | m_cStructure->strLanguage[1] = language[1]; | ||
| 168 | m_cStructure->strLanguage[2] = language[2]; | ||
| 169 | m_cStructure->strLanguage[2] = 0; | ||
| 170 | } | ||
| 171 | |||
| 172 | /// @brief To get with @ref SetLanguage() changed values. | ||
| 173 | std::string GetLanguage() const { return m_cStructure->strLanguage; } | ||
| 174 | |||
| 175 | /// @brief Subtitle Info | ||
| 176 | void SetSubtitleInfo(int subtitleInfo) { m_cStructure->iSubtitleInfo = subtitleInfo; } | ||
| 177 | |||
| 178 | /// @brief To get with @ref SetSubtitleInfo() changed values. | ||
| 179 | int GetSubtitleInfo() const { return m_cStructure->iSubtitleInfo; } | ||
| 180 | |||
| 181 | /// @brief To set scale of 1000 and a rate of 29970 will result in 29.97 fps. | ||
| 182 | void SetFPSScale(int fpsScale) { m_cStructure->iFPSScale = fpsScale; } | ||
| 183 | |||
| 184 | /// @brief To get with @ref SetFPSScale() changed values. | ||
| 185 | int GetFPSScale() const { return m_cStructure->iFPSScale; } | ||
| 186 | |||
| 187 | /// @brief FPS rate | ||
| 188 | void SetFPSRate(int fpsRate) { m_cStructure->iFPSRate = fpsRate; } | ||
| 189 | |||
| 190 | /// @brief To get with @ref SetFPSRate() changed values. | ||
| 191 | int GetFPSRate() const { return m_cStructure->iFPSRate; } | ||
| 192 | |||
| 193 | /// @brief Height of the stream reported by the demuxer | ||
| 194 | void SetHeight(int height) { m_cStructure->iHeight = height; } | ||
| 195 | |||
| 196 | /// @brief To get with @ref SetHeight() changed values. | ||
| 197 | int GetHeight() const { return m_cStructure->iHeight; } | ||
| 198 | |||
| 199 | /// @brief Width of the stream reported by the demuxer. | ||
| 200 | void SetWidth(int width) { m_cStructure->iWidth = width; } | ||
| 201 | |||
| 202 | /// @brief To get with @ref SetWidth() changed values. | ||
| 203 | int GetWidth() const { return m_cStructure->iWidth; } | ||
| 204 | |||
| 205 | /// @brief Display aspect ratio of the stream. | ||
| 206 | void SetAspect(float aspect) { m_cStructure->fAspect = aspect; } | ||
| 207 | |||
| 208 | /// @brief To get with @ref SetAspect() changed values. | ||
| 209 | float GetAspect() const { return m_cStructure->fAspect; } | ||
| 210 | |||
| 211 | /// @brief Amount of channels. | ||
| 212 | void SetChannels(int channels) { m_cStructure->iChannels = channels; } | ||
| 213 | |||
| 214 | /// @brief To get with @ref SetChannels() changed values. | ||
| 215 | int GetChannels() const { return m_cStructure->iChannels; } | ||
| 216 | |||
| 217 | /// @brief Sample rate. | ||
| 218 | void SetSampleRate(int sampleRate) { m_cStructure->iSampleRate = sampleRate; } | ||
| 219 | |||
| 220 | /// @brief To get with @ref SetSampleRate() changed values. | ||
| 221 | int GetSampleRate() const { return m_cStructure->iSampleRate; } | ||
| 222 | |||
| 223 | /// @brief Block alignment | ||
| 224 | void SetBlockAlign(int blockAlign) { m_cStructure->iBlockAlign = blockAlign; } | ||
| 225 | |||
| 226 | /// @brief To get with @ref SetBlockAlign() changed values. | ||
| 227 | int GetBlockAlign() const { return m_cStructure->iBlockAlign; } | ||
| 228 | |||
| 229 | /// @brief Bit rate. | ||
| 230 | void SetBitRate(int bitRate) { m_cStructure->iBitRate = bitRate; } | ||
| 231 | |||
| 232 | /// @brief To get with @ref SetBitRate() changed values. | ||
| 233 | int GetBitRate() const { return m_cStructure->iBitRate; } | ||
| 234 | |||
| 235 | /// @brief Bits per sample. | ||
| 236 | void SetBitsPerSample(int bitsPerSample) { m_cStructure->iBitsPerSample = bitsPerSample; } | ||
| 237 | |||
| 238 | /// @brief To get with @ref SetBitsPerSample() changed values. | ||
| 239 | int GetBitsPerSample() const { return m_cStructure->iBitsPerSample; } | ||
| 240 | ///@} | ||
| 241 | |||
| 242 | private: | ||
| 243 | PVRStreamProperties(const PVR_STREAM_PROPERTIES::PVR_STREAM* type) : CStructHdl(type) {} | ||
| 244 | PVRStreamProperties(PVR_STREAM_PROPERTIES::PVR_STREAM* type) : CStructHdl(type) {} | ||
| 245 | }; | ||
| 246 | ///@} | ||
| 247 | //------------------------------------------------------------------------------ | ||
| 248 | |||
| 249 | //============================================================================== | ||
| 250 | /// @defgroup cpp_kodi_addon_pvr_Defs_Stream_PVRStreamTimes class PVRStreamTimes | ||
| 251 | /// @ingroup cpp_kodi_addon_pvr_Defs_Stream | ||
| 252 | /// @brief **Times of playing stream (Live TV and recordings)**\n | ||
| 253 | /// This class is used to transfer the necessary data when | ||
| 254 | /// @ref kodi::addon::PVRStreamProperties::GetStreamTimes is called. | ||
| 255 | /// | ||
| 256 | /// ---------------------------------------------------------------------------- | ||
| 257 | /// | ||
| 258 | /// @copydetails cpp_kodi_addon_pvr_Defs_Stream_PVRStreamTimes_Help | ||
| 259 | /// | ||
| 260 | ///@{ | ||
| 261 | class PVRStreamTimes : public CStructHdl<PVRStreamTimes, PVR_STREAM_TIMES> | ||
| 262 | { | ||
| 263 | friend class CInstancePVRClient; | ||
| 264 | |||
| 265 | public: | ||
| 266 | /*! \cond PRIVATE */ | ||
| 267 | PVRStreamTimes() { memset(m_cStructure, 0, sizeof(PVR_STREAM_TIMES)); } | ||
| 268 | PVRStreamTimes(const PVRStreamTimes& type) : CStructHdl(type) {} | ||
| 269 | /*! \endcond */ | ||
| 270 | |||
| 271 | /// @defgroup cpp_kodi_addon_pvr_Defs_Stream_PVRStreamTimes_Help Value Help | ||
| 272 | /// @ingroup cpp_kodi_addon_pvr_Defs_Stream_PVRStreamTimes | ||
| 273 | /// ---------------------------------------------------------------------------- | ||
| 274 | /// | ||
| 275 | /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Stream_PVRStreamTimes :</b> | ||
| 276 | /// | Name | Type | Set call | Get call | ||
| 277 | /// |------|------|----------|---------- | ||
| 278 | /// | **Start time** | `time_t` | @ref PVRStreamTimes::SetStartTime "SetStartTime" | @ref PVRStreamTimes::GetStartTime "GetStartTime" | ||
| 279 | /// | **PTS start** | `int64_t` | @ref PVRStreamTimes::SetPTSStart "SetPTSStart" | @ref PVRStreamTimes::GetPTSStart "GetPTSStart" | ||
| 280 | /// | **PTS begin** | `int64_t` | @ref PVRStreamTimes::SetPTSBegin "SetPTSBegin" | @ref PVRStreamTimes::GetPTSBegin "GetPTSBegin" | ||
| 281 | /// | **PTS end** | `int64_t` | @ref PVRStreamTimes::SetPTSEnd "SetPTSEnd" | @ref PVRStreamTimes::GetPTSEnd "GetPTSEnd" | ||
| 282 | /// | ||
| 283 | |||
| 284 | /// @addtogroup cpp_kodi_addon_pvr_Defs_Stream_PVRStreamTimes | ||
| 285 | ///@{ | ||
| 286 | |||
| 287 | /// @brief For recordings, this must be zero. For Live TV, this is a reference | ||
| 288 | /// time in units of time_t (UTC) from which time elapsed starts. Ideally start | ||
| 289 | /// of tv show, but can be any other value. | ||
| 290 | void SetStartTime(time_t startTime) { m_cStructure->startTime = startTime; } | ||
| 291 | |||
| 292 | /// @brief To get with @ref SetStartTime() changed values. | ||
| 293 | time_t GetStartTime() const { return m_cStructure->startTime; } | ||
| 294 | |||
| 295 | /// @brief The pts of startTime. | ||
| 296 | void SetPTSStart(int64_t ptsStart) { m_cStructure->ptsStart = ptsStart; } | ||
| 297 | |||
| 298 | /// @brief To get with @ref SetPTSStart() changed values. | ||
| 299 | int64_t GetPTSStart() const { return m_cStructure->ptsStart; } | ||
| 300 | |||
| 301 | /// @brief Earliest pts player can seek back. Value is in micro seconds, | ||
| 302 | /// relative to PTS start. For recordings, this must be zero. For Live TV, this | ||
| 303 | /// must be zero if not timeshifting and must point to begin of the timeshift | ||
| 304 | /// buffer, otherwise. | ||
| 305 | void SetPTSBegin(int64_t ptsBegin) { m_cStructure->ptsBegin = ptsBegin; } | ||
| 306 | |||
| 307 | /// @brief To get with @ref SetPTSBegin() changed values. | ||
| 308 | int64_t GetPTSBegin() const { return m_cStructure->ptsBegin; } | ||
| 309 | |||
| 310 | /// @brief Latest pts player can seek forward. Value is in micro seconds, | ||
| 311 | /// relative to PTS start. For recordings, this must be the total length. For | ||
| 312 | /// Live TV, this must be zero if not timeshifting and must point to end of | ||
| 313 | /// the timeshift buffer, otherwise. | ||
| 314 | void SetPTSEnd(int64_t ptsEnd) { m_cStructure->ptsEnd = ptsEnd; } | ||
| 315 | |||
| 316 | /// @brief To get with @ref SetPTSEnd() changed values. | ||
| 317 | int64_t GetPTSEnd() const { return m_cStructure->ptsEnd; } | ||
| 318 | ///@} | ||
| 319 | |||
| 320 | private: | ||
| 321 | PVRStreamTimes(const PVR_STREAM_TIMES* type) : CStructHdl(type) {} | ||
| 322 | PVRStreamTimes(PVR_STREAM_TIMES* type) : CStructHdl(type) {} | ||
| 323 | }; | ||
| 324 | ///@} | ||
| 325 | //------------------------------------------------------------------------------ | ||
| 326 | |||
| 327 | } /* namespace addon */ | ||
| 328 | } /* namespace kodi */ | ||
| 329 | |||
| 330 | #endif /* __cplusplus */ | ||
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Timers.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Timers.h new file mode 100644 index 0000000..6e05e55 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Timers.h | |||
| @@ -0,0 +1,896 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2005-2018 Team Kodi | ||
| 3 | * This file is part of Kodi - https://kodi.tv | ||
| 4 | * | ||
| 5 | * SPDX-License-Identifier: GPL-2.0-or-later | ||
| 6 | * See LICENSES/README.md for more information. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #pragma once | ||
| 10 | |||
| 11 | #include "General.h" | ||
| 12 | #include "../../AddonBase.h" | ||
| 13 | #include "../../c-api/addon-instance/pvr.h" | ||
| 14 | |||
| 15 | //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ | ||
| 16 | // "C++" Definitions group 6 - PVR timers | ||
| 17 | #ifdef __cplusplus | ||
| 18 | |||
| 19 | namespace kodi | ||
| 20 | { | ||
| 21 | namespace addon | ||
| 22 | { | ||
| 23 | |||
| 24 | //============================================================================== | ||
| 25 | /// @defgroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimer class PVRTimer | ||
| 26 | /// @ingroup cpp_kodi_addon_pvr_Defs_Timer | ||
| 27 | /// @brief **PVR add-on timer type**\n | ||
| 28 | /// Representation of a timer event. | ||
| 29 | /// | ||
| 30 | /// The related values here are automatically initiated to defaults and need | ||
| 31 | /// only be set if supported and used. | ||
| 32 | /// | ||
| 33 | /// ---------------------------------------------------------------------------- | ||
| 34 | /// | ||
| 35 | /// @copydetails cpp_kodi_addon_pvr_Defs_Timer_PVRTimer_Help | ||
| 36 | /// | ||
| 37 | ///@{ | ||
| 38 | class PVRTimer : public CStructHdl<PVRTimer, PVR_TIMER> | ||
| 39 | { | ||
| 40 | friend class CInstancePVRClient; | ||
| 41 | |||
| 42 | public: | ||
| 43 | /*! \cond PRIVATE */ | ||
| 44 | PVRTimer() | ||
| 45 | { | ||
| 46 | m_cStructure->iClientIndex = 0; | ||
| 47 | m_cStructure->state = PVR_TIMER_STATE_NEW; | ||
| 48 | m_cStructure->iTimerType = PVR_TIMER_TYPE_NONE; | ||
| 49 | m_cStructure->iParentClientIndex = 0; | ||
| 50 | m_cStructure->iClientChannelUid = PVR_TIMER_VALUE_NOT_AVAILABLE; | ||
| 51 | m_cStructure->startTime = 0; | ||
| 52 | m_cStructure->endTime = 0; | ||
| 53 | m_cStructure->bStartAnyTime = false; | ||
| 54 | m_cStructure->bEndAnyTime = false; | ||
| 55 | m_cStructure->bFullTextEpgSearch = false; | ||
| 56 | m_cStructure->iPriority = PVR_TIMER_VALUE_NOT_AVAILABLE; | ||
| 57 | m_cStructure->iLifetime = PVR_TIMER_VALUE_NOT_AVAILABLE; | ||
| 58 | m_cStructure->iMaxRecordings = PVR_TIMER_VALUE_NOT_AVAILABLE; | ||
| 59 | m_cStructure->iRecordingGroup = 0; | ||
| 60 | m_cStructure->firstDay = 0; | ||
| 61 | m_cStructure->iWeekdays = PVR_WEEKDAY_NONE; | ||
| 62 | m_cStructure->iPreventDuplicateEpisodes = 0; | ||
| 63 | m_cStructure->iEpgUid = 0; | ||
| 64 | m_cStructure->iMarginStart = 0; | ||
| 65 | m_cStructure->iMarginEnd = 0; | ||
| 66 | m_cStructure->iGenreType = PVR_TIMER_VALUE_NOT_AVAILABLE; | ||
| 67 | m_cStructure->iGenreSubType = PVR_TIMER_VALUE_NOT_AVAILABLE; | ||
| 68 | } | ||
| 69 | PVRTimer(const PVRTimer& data) : CStructHdl(data) {} | ||
| 70 | /*! \endcond */ | ||
| 71 | |||
| 72 | /// @defgroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimer_Help Value Help | ||
| 73 | /// @ingroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimer | ||
| 74 | /// | ||
| 75 | /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Timer_PVRTimer :</b> | ||
| 76 | /// | Name | Type | Set call | Get call | Usage | ||
| 77 | /// |------|------|----------|----------|----------- | ||
| 78 | /// | **Client index** | `unsigned int` | @ref PVRTimer::SetClientIndex "SetClientIndex" | @ref PVRTimer::GetClientIndex "GetClientIndex" | *required to set* | ||
| 79 | /// | **State** | @ref PVR_TIMER_STATE | @ref PVRTimer::SetState "SetState" | @ref PVRTimer::GetState "GetState" | *required to set* | ||
| 80 | /// | **Type** | `unsigned int` | @ref PVRTimer::SetTimerType "SetTimerType" | @ref PVRTimer::GetTimerType "GetTimerType" | *required to set* | ||
| 81 | /// | **Title** | `std::string` | @ref PVRTimer::SetTitle "SetTitle" | @ref PVRTimer::GetTitle "GetTitle" | *required to set* | ||
| 82 | /// | **Parent client index** | `unsigned int` | @ref PVRTimer::SetParentClientIndex "SetParentClientIndex" | @ref PVRTimer::GetParentClientIndex "GetParentClientIndex" | *optional* | ||
| 83 | /// | **Client channel unique identifier** | `int` | @ref PVRTimer::SetClientChannelUid "SetClientChannelUid" | @ref PVRTimer::GetClientChannelUid "GetClientChannelUid" | *optional* | ||
| 84 | /// | **Start time** | `time_t` | @ref PVRTimer::SetStartTime "SetStartTime" | @ref PVRTimer::GetStartTime "GetStartTime" | *optional* | ||
| 85 | /// | **End time** | `time_t` | @ref PVRTimer::SetEndTime "SetEndTime" | @ref PVRTimer::GetEndTime "GetEndTime" | *optional* | ||
| 86 | /// | **Start any time** | `bool` | @ref PVRTimer::SetStartAnyTime "SetStartAnyTime" | @ref PVRTimer::GetStartAnyTime "GetStartAnyTime" | *optional* | ||
| 87 | /// | **End any time** | `bool` | @ref PVRTimer::SetEndAnyTime "SetEndAnyTime" | @ref PVRTimer::GetEndAnyTime "GetEndAnyTime" | *optional* | ||
| 88 | /// | **EPG search string** | `std::string` | @ref PVRTimer::SetEPGSearchString "SetEPGSearchString" | @ref PVRTimer::GetEPGSearchString "GetEPGSearchString" | *optional* | ||
| 89 | /// | **Full text EPG search** | `bool` | @ref PVRTimer::SetFullTextEpgSearch "SetFullTextEpgSearch" | @ref PVRTimer::GetFullTextEpgSearch "GetFullTextEpgSearch" | *optional* | ||
| 90 | /// | **Recording store directory** | `std::string` | @ref PVRTimer::SetDirectory "SetDirectory" | @ref PVRTimer::GetDirectory "GetDirectory" | *optional* | ||
| 91 | /// | **Timer priority** | `int` | @ref PVRTimer::SetPriority "SetPriority" | @ref PVRTimer::GetPriority "GetPriority" | *optional* | ||
| 92 | /// | **Timer lifetime** | `int` | @ref PVRTimer::SetLifetime "SetLifetime" | @ref PVRTimer::GetLifetime "GetLifetime" | *optional* | ||
| 93 | /// | **Max recordings** | `int` | @ref PVRTimer::SetMaxRecordings "SetMaxRecordings" | @ref PVRTimer::GetMaxRecordings "GetMaxRecordings" | *optional* | ||
| 94 | /// | **Recording group** | `unsigned int` | @ref PVRTimer::SetRecordingGroup "SetRecordingGroup" | @ref PVRTimer::GetRecordingGroup "GetRecordingGroup" | *optional* | ||
| 95 | /// | **First start day** | `time_t` | @ref PVRTimer::SetFirstDay "SetFirstDay" | @ref PVRTimer::GetFirstDay "GetFirstDay" | *optional* | ||
| 96 | /// | **Used timer weekdays** | `unsigned int` | @ref PVRTimer::SetWeekdays "SetWeekdays" | @ref PVRTimer::GetWeekdays "GetWeekdays" | *optional* | ||
| 97 | /// | **Prevent duplicate episodes** | `unsigned int` | @ref PVRTimer::SetPreventDuplicateEpisodes "SetPreventDuplicateEpisodes" | @ref PVRTimer::GetPreventDuplicateEpisodes "GetPreventDuplicateEpisodes" | *optional* | ||
| 98 | /// | **EPG unique identifier** | `unsigned int` | @ref PVRTimer::SetEPGUid "SetEPGUid" | @ref PVRTimer::GetEPGUid "GetEPGUid" | *optional* | ||
| 99 | /// | **Margin start** | `unsigned int` | @ref PVRTimer::SetMarginStart "SetMarginStart" | @ref PVRTimer::GetMarginStart "GetMarginStart" | *optional* | ||
| 100 | /// | **Margin end** | `unsigned int` | @ref PVRTimer::SetMarginEnd "SetMarginEnd" | @ref PVRTimer::GetMarginEnd "GetMarginEnd" | *optional* | ||
| 101 | /// | **Genre type** | `int` | @ref PVRTimer::SetGenreType "SetGenreType" | @ref PVRTimer::GetGenreType "GetGenreType" | *optional* | ||
| 102 | /// | **Genre sub type** | `int` | @ref PVRTimer::SetGenreSubType "SetGenreSubType" | @ref PVRTimer::GetGenreSubType "GetGenreSubType" | *optional* | ||
| 103 | /// | **Series link** | `std::string` | @ref PVRTimer::SetSeriesLink "SetSeriesLink" | @ref PVRTimer::GetSeriesLink "GetSeriesLink" | *optional* | ||
| 104 | |||
| 105 | /// @addtogroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimer | ||
| 106 | ///@{ | ||
| 107 | |||
| 108 | /// @brief **required**\n | ||
| 109 | /// The index of this timer given by the client. | ||
| 110 | /// | ||
| 111 | /// @ref PVR_TIMER_NO_CLIENT_INDEX indicates that the index was not yet set | ||
| 112 | /// by the client, for example for new timers created by Kodi and passed the | ||
| 113 | /// first time to the client. A valid index must be greater than | ||
| 114 | /// @ref PVR_TIMER_NO_CLIENT_INDEX. | ||
| 115 | /// | ||
| 116 | void SetClientIndex(unsigned int clientIndex) { m_cStructure->iClientIndex = clientIndex; } | ||
| 117 | |||
| 118 | /// @brief To get with @ref SetClientIndex changed values. | ||
| 119 | unsigned int GetClientIndex() const { return m_cStructure->iClientIndex; } | ||
| 120 | |||
| 121 | /// @brief **required**\n | ||
| 122 | /// The state of this timer. | ||
| 123 | /// | ||
| 124 | /// @note @ref PVR_TIMER_STATE_NEW is default. | ||
| 125 | /// | ||
| 126 | /// | ||
| 127 | /// -------------------------------------------------------------------------- | ||
| 128 | /// | ||
| 129 | /// **Example:** | ||
| 130 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 131 | /// kodi::addon::PVRTimer tag; | ||
| 132 | /// tag.SetState(PVR_TIMER_STATE_RECORDING); | ||
| 133 | /// ~~~~~~~~~~~~~ | ||
| 134 | /// | ||
| 135 | void SetState(PVR_TIMER_STATE state) { m_cStructure->state = state; } | ||
| 136 | |||
| 137 | /// @brief To get with @ref SetState changed values. | ||
| 138 | PVR_TIMER_STATE GetState() const { return m_cStructure->state; } | ||
| 139 | |||
| 140 | /// @brief **required**\n | ||
| 141 | /// The type of this timer. | ||
| 142 | /// | ||
| 143 | /// It is private to the addon and can be freely defined by the addon. | ||
| 144 | /// The value must be greater than @ref PVR_TIMER_TYPE_NONE. | ||
| 145 | /// | ||
| 146 | /// Kodi does not interpret this value (except for checking for @ref PVR_TIMER_TYPE_NONE), | ||
| 147 | /// but will pass the right id to the addon with every @ref PVRTimer instance, | ||
| 148 | /// thus the addon easily can determine the timer type. | ||
| 149 | /// | ||
| 150 | /// @note @ref PVR_TIMER_TYPE_NONE is default. | ||
| 151 | /// | ||
| 152 | /// | ||
| 153 | /// -------------------------------------------------------------------------- | ||
| 154 | /// | ||
| 155 | /// **Example:** | ||
| 156 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 157 | /// kodi::addon::PVRTimer tag; | ||
| 158 | /// tag.SetTimerType(123); | ||
| 159 | /// ~~~~~~~~~~~~~ | ||
| 160 | /// | ||
| 161 | void SetTimerType(unsigned int timerType) { m_cStructure->iTimerType = timerType; } | ||
| 162 | |||
| 163 | /// @brief To get with @ref SetTimerType changed values. | ||
| 164 | unsigned int GetTimerType() const { return m_cStructure->iTimerType; } | ||
| 165 | |||
| 166 | /// @brief **required**\n | ||
| 167 | /// A title for this timer. | ||
| 168 | void SetTitle(const std::string& title) | ||
| 169 | { | ||
| 170 | strncpy(m_cStructure->strTitle, title.c_str(), sizeof(m_cStructure->strTitle) - 1); | ||
| 171 | } | ||
| 172 | |||
| 173 | /// @brief To get with @ref SetTitle changed values. | ||
| 174 | std::string GetTitle() const { return m_cStructure->strTitle; } | ||
| 175 | |||
| 176 | /// @brief **optional**\n | ||
| 177 | /// For timers scheduled by a repeating timer. | ||
| 178 | /// | ||
| 179 | /// The index of the repeating timer that scheduled this timer (it's | ||
| 180 | /// @ref clientIndex value). Use @ref PVR_TIMER_NO_PARENT to indicate that | ||
| 181 | /// this timer was no scheduled by a repeating timer. | ||
| 182 | void SetParentClientIndex(unsigned int parentClientIndex) | ||
| 183 | { | ||
| 184 | m_cStructure->iParentClientIndex = parentClientIndex; | ||
| 185 | } | ||
| 186 | |||
| 187 | /// @brief To get with @ref SetParentClientIndex changed values. | ||
| 188 | unsigned int GetParentClientIndex() const { return m_cStructure->iParentClientIndex; } | ||
| 189 | |||
| 190 | /// @brief **optional**\n | ||
| 191 | /// Unique identifier of the channel to record on. | ||
| 192 | /// | ||
| 193 | /// @ref PVR_TIMER_ANY_CHANNEL will denote "any channel", not a specific one. | ||
| 194 | /// @ref PVR_CHANNEL_INVALID_UID denotes that channel uid is not available. | ||
| 195 | void SetClientChannelUid(int clientChannelUid) | ||
| 196 | { | ||
| 197 | m_cStructure->iClientChannelUid = clientChannelUid; | ||
| 198 | } | ||
| 199 | |||
| 200 | /// @brief To get with @ref SetClientChannelUid changed values | ||
| 201 | int GetClientChannelUid() const { return m_cStructure->iClientChannelUid; } | ||
| 202 | |||
| 203 | /// @brief **optional**\n | ||
| 204 | /// Start time of the recording in UTC. | ||
| 205 | /// | ||
| 206 | /// Instant timers that are sent to the add-on by Kodi will have this value | ||
| 207 | /// set to 0. | ||
| 208 | void SetStartTime(time_t startTime) { m_cStructure->startTime = startTime; } | ||
| 209 | |||
| 210 | /// @brief To get with @ref SetStartTime changed values. | ||
| 211 | time_t GetStartTime() const { return m_cStructure->startTime; } | ||
| 212 | |||
| 213 | /// @brief **optional**\n | ||
| 214 | /// End time of the recording in UTC. | ||
| 215 | void SetEndTime(time_t endTime) { m_cStructure->endTime = endTime; } | ||
| 216 | |||
| 217 | /// @brief To get with @ref SetEndTime changed values. | ||
| 218 | time_t GetEndTime() const { return m_cStructure->endTime; } | ||
| 219 | |||
| 220 | /// @brief **optional**\n | ||
| 221 | /// For EPG based (not Manual) timers indicates startTime does not apply. | ||
| 222 | /// | ||
| 223 | /// Default = false. | ||
| 224 | void SetStartAnyTime(bool startAnyTime) { m_cStructure->bStartAnyTime = startAnyTime; } | ||
| 225 | |||
| 226 | /// @brief To get with @ref SetStartAnyTime changed values. | ||
| 227 | bool GetStartAnyTime() const { return m_cStructure->bStartAnyTime; } | ||
| 228 | |||
| 229 | /// @brief **optional**\n | ||
| 230 | /// For EPG based (not Manual) timers indicates endTime does not apply. | ||
| 231 | /// | ||
| 232 | /// Default = false | ||
| 233 | void SetEndAnyTime(bool endAnyTime) { m_cStructure->bEndAnyTime = endAnyTime; } | ||
| 234 | |||
| 235 | /// @brief To get with @ref SetEndAnyTime changed values. | ||
| 236 | bool GetEndAnyTime() const { return m_cStructure->bEndAnyTime; } | ||
| 237 | |||
| 238 | /// @brief **optional**\n | ||
| 239 | /// A string used to search epg data for repeating epg-based timers. | ||
| 240 | /// | ||
| 241 | /// Format is backend-dependent, for example regexp. | ||
| 242 | void SetEPGSearchString(const std::string& epgSearchString) | ||
| 243 | { | ||
| 244 | strncpy(m_cStructure->strEpgSearchString, epgSearchString.c_str(), | ||
| 245 | sizeof(m_cStructure->strEpgSearchString) - 1); | ||
| 246 | } | ||
| 247 | |||
| 248 | /// @brief To get with @ref SetEPGSearchString changed values | ||
| 249 | std::string GetEPGSearchString() const { return m_cStructure->strEpgSearchString; } | ||
| 250 | |||
| 251 | /// @brief **optional**\n | ||
| 252 | /// Indicates, whether @ref SetEPGSearchString() is to match against the epg | ||
| 253 | /// episode title only or also against "other" epg data (backend-dependent). | ||
| 254 | void SetFullTextEpgSearch(bool fullTextEpgSearch) | ||
| 255 | { | ||
| 256 | m_cStructure->bFullTextEpgSearch = fullTextEpgSearch; | ||
| 257 | } | ||
| 258 | |||
| 259 | /// @brief To get with @ref SetFullTextEpgSearch changed values. | ||
| 260 | bool GetFullTextEpgSearch() const { return m_cStructure->bFullTextEpgSearch; } | ||
| 261 | |||
| 262 | /// @brief **optional**\n | ||
| 263 | /// The (relative) directory where the recording will be stored in. | ||
| 264 | void SetDirectory(const std::string& directory) | ||
| 265 | { | ||
| 266 | strncpy(m_cStructure->strDirectory, directory.c_str(), sizeof(m_cStructure->strDirectory) - 1); | ||
| 267 | } | ||
| 268 | |||
| 269 | /// @brief To get with @ref SetDirectory changed values. | ||
| 270 | std::string GetDirectory() const { return m_cStructure->strDirectory; } | ||
| 271 | |||
| 272 | /// @brief **optional**\n | ||
| 273 | /// The summary for this timer. | ||
| 274 | void SetSummary(const std::string& summary) | ||
| 275 | { | ||
| 276 | strncpy(m_cStructure->strSummary, summary.c_str(), sizeof(m_cStructure->strSummary) - 1); | ||
| 277 | } | ||
| 278 | |||
| 279 | /// @brief To get with @ref SetDirectory changed values. | ||
| 280 | std::string GetSummary() const { return m_cStructure->strSummary; } | ||
| 281 | |||
| 282 | /// @brief **optional**\n | ||
| 283 | /// The priority of this timer. | ||
| 284 | void SetPriority(int priority) { m_cStructure->iPriority = priority; } | ||
| 285 | |||
| 286 | /// @brief To get with @ref SetPriority changed values. | ||
| 287 | int GetPriority() const { return m_cStructure->iPriority; } | ||
| 288 | |||
| 289 | /// @brief **optional**\n | ||
| 290 | /// Lifetime of recordings created by this timer. | ||
| 291 | /// | ||
| 292 | /// Value > 0 days after which recordings will be deleted by the backend, < 0 | ||
| 293 | /// addon defined integer list reference, == 0 disabled. | ||
| 294 | void SetLifetime(int priority) { m_cStructure->iLifetime = priority; } | ||
| 295 | |||
| 296 | /// @brief To get with @ref SetLifetime changed values. | ||
| 297 | int GetLifetime() const { return m_cStructure->iLifetime; } | ||
| 298 | |||
| 299 | /// @brief **optional**\n | ||
| 300 | /// Maximum number of recordings this timer shall create. | ||
| 301 | /// | ||
| 302 | /// Value > 0 number of recordings, < 0 addon defined integer list reference, == 0 disabled. | ||
| 303 | void SetMaxRecordings(int maxRecordings) { m_cStructure->iMaxRecordings = maxRecordings; } | ||
| 304 | |||
| 305 | /// @brief To get with @ref SetMaxRecordings changed values. | ||
| 306 | int GetMaxRecordings() const { return m_cStructure->iMaxRecordings; } | ||
| 307 | |||
| 308 | /// @brief **optional**\n | ||
| 309 | /// Integer ref to addon/backend defined list of recording groups. | ||
| 310 | void SetRecordingGroup(unsigned int recordingGroup) | ||
| 311 | { | ||
| 312 | m_cStructure->iRecordingGroup = recordingGroup; | ||
| 313 | } | ||
| 314 | |||
| 315 | /// @brief To get with @ref SetRecordingGroup changed values. | ||
| 316 | unsigned int GetRecordingGroup() const { return m_cStructure->iRecordingGroup; } | ||
| 317 | |||
| 318 | /// @brief **optional**\n | ||
| 319 | /// The first day this timer is active, for repeating timers. | ||
| 320 | void SetFirstDay(time_t firstDay) { m_cStructure->firstDay = firstDay; } | ||
| 321 | |||
| 322 | /// @brief To get with @ref SetFirstDay changed values. | ||
| 323 | time_t GetFirstDay() const { return m_cStructure->firstDay; } | ||
| 324 | |||
| 325 | /// @brief **optional**\n | ||
| 326 | /// Week days, for repeating timers (see | ||
| 327 | /// @ref cpp_kodi_addon_pvr_Defs_Timer_PVR_WEEKDAY "PVR_WEEKDAY_*" constant values) | ||
| 328 | /// | ||
| 329 | /// @note @ref PVR_WEEKDAY_NONE is default. | ||
| 330 | /// | ||
| 331 | /// | ||
| 332 | /// -------------------------------------------------------------------------- | ||
| 333 | /// | ||
| 334 | /// **Example:** | ||
| 335 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 336 | /// ... | ||
| 337 | /// kodi::addon::PVRTimer tag; | ||
| 338 | /// tag.SetWeekdays(PVR_WEEKDAY_MONDAY | PVR_WEEKDAY_SATURDAY); | ||
| 339 | /// ... | ||
| 340 | /// ~~~~~~~~~~~~~ | ||
| 341 | void SetWeekdays(unsigned int weekdays) { m_cStructure->iWeekdays = weekdays; } | ||
| 342 | |||
| 343 | /// @brief To get with @ref SetFirstDay changed values. | ||
| 344 | unsigned int GetWeekdays() const { return m_cStructure->iWeekdays; } | ||
| 345 | |||
| 346 | /// @brief **optional**\n | ||
| 347 | /// Prevent duplicate episodes. | ||
| 348 | /// | ||
| 349 | /// Should 1 if backend should only record new episodes in case of a repeating | ||
| 350 | /// epg-based timer, 0 if all episodes shall be recorded (no duplicate detection). | ||
| 351 | /// | ||
| 352 | /// Actual algorithm for duplicate detection is defined by the backend. | ||
| 353 | /// Addons may define own values for different duplicate detection | ||
| 354 | /// algorithms, thus this is not just a bool. | ||
| 355 | void SetPreventDuplicateEpisodes(unsigned int preventDuplicateEpisodes) | ||
| 356 | { | ||
| 357 | m_cStructure->iPreventDuplicateEpisodes = preventDuplicateEpisodes; | ||
| 358 | } | ||
| 359 | |||
| 360 | /// @brief To get with @ref SetPreventDuplicateEpisodes changed values. | ||
| 361 | unsigned int GetPreventDuplicateEpisodes() const | ||
| 362 | { | ||
| 363 | return m_cStructure->iPreventDuplicateEpisodes; | ||
| 364 | } | ||
| 365 | |||
| 366 | /// @brief **optional**\n | ||
| 367 | /// EPG event id associated with this timer. Event ids must be unique for a | ||
| 368 | /// channel. | ||
| 369 | /// | ||
| 370 | /// Valid ids must be greater than @ref EPG_TAG_INVALID_UID. | ||
| 371 | void SetEPGUid(unsigned int epgUid) { m_cStructure->iEpgUid = epgUid; } | ||
| 372 | |||
| 373 | /// @brief To get with @ref SetEPGUid changed values. | ||
| 374 | unsigned int GetEPGUid() const { return m_cStructure->iEpgUid; } | ||
| 375 | |||
| 376 | /// @brief **optional**\n | ||
| 377 | /// If set, the backend starts the recording selected minutes before | ||
| 378 | /// @ref SetStartTime. | ||
| 379 | void SetMarginStart(unsigned int marginStart) { m_cStructure->iMarginStart = marginStart; } | ||
| 380 | |||
| 381 | /// @brief To get with @ref SetMarginStart changed values. | ||
| 382 | unsigned int GetMarginStart() const { return m_cStructure->iMarginStart; } | ||
| 383 | |||
| 384 | /// @brief **optional**\n | ||
| 385 | /// If set, the backend ends the recording selected minutes after | ||
| 386 | /// @ref SetEndTime. | ||
| 387 | void SetMarginEnd(unsigned int marginEnd) { m_cStructure->iMarginEnd = marginEnd; } | ||
| 388 | |||
| 389 | /// @brief To get with @ref SetMarginEnd changed values. | ||
| 390 | unsigned int GetMarginEnd() const { return m_cStructure->iMarginEnd; } | ||
| 391 | |||
| 392 | /// @brief **optional**\n | ||
| 393 | /// Genre type. | ||
| 394 | /// | ||
| 395 | /// @copydetails EPG_EVENT_CONTENTMASK | ||
| 396 | /// | ||
| 397 | /// -------------------------------------------------------------------------- | ||
| 398 | /// | ||
| 399 | /// **Example:** | ||
| 400 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 401 | /// ... | ||
| 402 | /// kodi::addon::PVRTimer tag; | ||
| 403 | /// tag.SetGenreType(EPG_EVENT_CONTENTMASK_MOVIEDRAMA); | ||
| 404 | /// ... | ||
| 405 | /// ~~~~~~~~~~~~~ | ||
| 406 | /// | ||
| 407 | /// @note If confirmed that backend brings the types in [ETSI EN 300 468](https://www.etsi.org/deliver/etsi_en/300400_300499/300468/01.14.01_60/en_300468v011401p.pdf) | ||
| 408 | /// conform values, can be @ref EPG_EVENT_CONTENTMASK ignored and to set here | ||
| 409 | /// with backend value. | ||
| 410 | /// | ||
| 411 | void SetGenreType(int genreType) { m_cStructure->iGenreType = genreType; } | ||
| 412 | |||
| 413 | /// @brief To get with @ref SetGenreType changed values. | ||
| 414 | int GetGenreType() const { return m_cStructure->iGenreType; } | ||
| 415 | |||
| 416 | /// @brief **optional**\n | ||
| 417 | /// Genre sub type. | ||
| 418 | /// | ||
| 419 | /// @copydetails EPG_EVENT_CONTENTMASK | ||
| 420 | /// | ||
| 421 | /// Subtypes groups related to set by @ref SetGenreType: | ||
| 422 | /// | Main genre type | List with available sub genre types | ||
| 423 | /// |-----------------|----------------------------------------- | ||
| 424 | /// | @ref EPG_EVENT_CONTENTMASK_UNDEFINED | Nothing, should be 0 | ||
| 425 | /// | @ref EPG_EVENT_CONTENTMASK_MOVIEDRAMA | @ref EPG_EVENT_CONTENTSUBMASK_MOVIEDRAMA | ||
| 426 | /// | @ref EPG_EVENT_CONTENTMASK_NEWSCURRENTAFFAIRS | @ref EPG_EVENT_CONTENTSUBMASK_NEWSCURRENTAFFAIRS | ||
| 427 | /// | @ref EPG_EVENT_CONTENTMASK_SHOW | @ref EPG_EVENT_CONTENTSUBMASK_SHOW | ||
| 428 | /// | @ref EPG_EVENT_CONTENTMASK_SPORTS | @ref EPG_EVENT_CONTENTSUBMASK_SPORTS | ||
| 429 | /// | @ref EPG_EVENT_CONTENTMASK_CHILDRENYOUTH | @ref EPG_EVENT_CONTENTSUBMASK_CHILDRENYOUTH | ||
| 430 | /// | @ref EPG_EVENT_CONTENTMASK_MUSICBALLETDANCE | @ref EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE | ||
| 431 | /// | @ref EPG_EVENT_CONTENTMASK_ARTSCULTURE | @ref EPG_EVENT_CONTENTSUBMASK_ARTSCULTURE | ||
| 432 | /// | @ref EPG_EVENT_CONTENTMASK_SOCIALPOLITICALECONOMICS | @ref EPG_EVENT_CONTENTSUBMASK_SOCIALPOLITICALECONOMICS | ||
| 433 | /// | @ref EPG_EVENT_CONTENTMASK_EDUCATIONALSCIENCE | @ref EPG_EVENT_CONTENTSUBMASK_EDUCATIONALSCIENCE | ||
| 434 | /// | @ref EPG_EVENT_CONTENTMASK_LEISUREHOBBIES | @ref EPG_EVENT_CONTENTSUBMASK_LEISUREHOBBIES | ||
| 435 | /// | @ref EPG_EVENT_CONTENTMASK_SPECIAL | @ref EPG_EVENT_CONTENTSUBMASK_SPECIAL | ||
| 436 | /// | @ref EPG_EVENT_CONTENTMASK_USERDEFINED | Can be defined by you | ||
| 437 | /// | ||
| 438 | /// -------------------------------------------------------------------------- | ||
| 439 | /// | ||
| 440 | /// **Example:** | ||
| 441 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 442 | /// ... | ||
| 443 | /// kodi::addon::PVRTimer tag; | ||
| 444 | /// tag.SetGenreType(EPG_EVENT_CONTENTMASK_MUSICBALLETDANCE); | ||
| 445 | /// tag.SetGenreSubType(EPG_EVENT_CONTENTSUBMASK_MUSICBALLETDANCE_JAZZ); | ||
| 446 | /// ... | ||
| 447 | /// ~~~~~~~~~~~~~ | ||
| 448 | /// | ||
| 449 | void SetGenreSubType(int genreSubType) { m_cStructure->iGenreSubType = genreSubType; } | ||
| 450 | |||
| 451 | /// @brief To get with @ref SetGenreType changed values. | ||
| 452 | int GetGenreSubType() const { return m_cStructure->iGenreSubType; } | ||
| 453 | |||
| 454 | /// @brief **optional**\n | ||
| 455 | /// Series link for this timer. | ||
| 456 | /// | ||
| 457 | /// If set for an epg-based timer rule, matching events will be found by | ||
| 458 | /// checking with here, instead of @ref SetTitle() (and @ref SetFullTextEpgSearch()). | ||
| 459 | void SetSeriesLink(const std::string& seriesLink) | ||
| 460 | { | ||
| 461 | strncpy(m_cStructure->strSeriesLink, seriesLink.c_str(), | ||
| 462 | sizeof(m_cStructure->strSeriesLink) - 1); | ||
| 463 | } | ||
| 464 | |||
| 465 | /// @brief To get with @ref SetSeriesLink changed values. | ||
| 466 | std::string GetSeriesLink() const { return m_cStructure->strSeriesLink; } | ||
| 467 | ///@} | ||
| 468 | |||
| 469 | private: | ||
| 470 | PVRTimer(const PVR_TIMER* data) : CStructHdl(data) {} | ||
| 471 | PVRTimer(PVR_TIMER* data) : CStructHdl(data) {} | ||
| 472 | }; | ||
| 473 | |||
| 474 | ///@} | ||
| 475 | //------------------------------------------------------------------------------ | ||
| 476 | |||
| 477 | //============================================================================== | ||
| 478 | /// @defgroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimersResultSet class PVRTimersResultSet | ||
| 479 | /// @ingroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimer | ||
| 480 | /// @brief **PVR add-on timer transfer class**\n | ||
| 481 | /// To transfer the content of @ref kodi::addon::CInstancePVRClient::GetTimers(). | ||
| 482 | /// | ||
| 483 | /// @note This becomes only be used on addon call above, not usable outside on | ||
| 484 | /// addon itself. | ||
| 485 | ///@{ | ||
| 486 | class PVRTimersResultSet | ||
| 487 | { | ||
| 488 | public: | ||
| 489 | /*! \cond PRIVATE */ | ||
| 490 | PVRTimersResultSet() = delete; | ||
| 491 | PVRTimersResultSet(const AddonInstance_PVR* instance, ADDON_HANDLE handle) | ||
| 492 | : m_instance(instance), m_handle(handle) | ||
| 493 | { | ||
| 494 | } | ||
| 495 | /*! \endcond */ | ||
| 496 | |||
| 497 | /// @addtogroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimersResultSet | ||
| 498 | ///@{ | ||
| 499 | |||
| 500 | /// @brief To add and give content from addon to Kodi on related call. | ||
| 501 | /// | ||
| 502 | /// @param[in] tag The to transferred data. | ||
| 503 | void Add(const kodi::addon::PVRTimer& tag) | ||
| 504 | { | ||
| 505 | m_instance->toKodi->TransferTimerEntry(m_instance->toKodi->kodiInstance, m_handle, tag); | ||
| 506 | } | ||
| 507 | |||
| 508 | ///@} | ||
| 509 | |||
| 510 | private: | ||
| 511 | const AddonInstance_PVR* m_instance = nullptr; | ||
| 512 | const ADDON_HANDLE m_handle; | ||
| 513 | }; | ||
| 514 | ///@} | ||
| 515 | //------------------------------------------------------------------------------ | ||
| 516 | |||
| 517 | //============================================================================== | ||
| 518 | /// @defgroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimerType class PVRTimerType | ||
| 519 | /// @ingroup cpp_kodi_addon_pvr_Defs_Timer | ||
| 520 | /// @brief **PVR add-on timer type**\n | ||
| 521 | /// To define the content of @ref kodi::addon::CInstancePVRClient::GetTimerTypes() | ||
| 522 | /// given groups. | ||
| 523 | /// | ||
| 524 | /// ---------------------------------------------------------------------------- | ||
| 525 | /// | ||
| 526 | /// @copydetails cpp_kodi_addon_pvr_Defs_Timer_PVRTimerType_Help | ||
| 527 | /// | ||
| 528 | ///@{ | ||
| 529 | class PVRTimerType : public CStructHdl<PVRTimerType, PVR_TIMER_TYPE> | ||
| 530 | { | ||
| 531 | friend class CInstancePVRClient; | ||
| 532 | |||
| 533 | public: | ||
| 534 | /*! \cond PRIVATE */ | ||
| 535 | PVRTimerType() | ||
| 536 | { | ||
| 537 | memset(m_cStructure, 0, sizeof(PVR_TIMER_TYPE)); | ||
| 538 | m_cStructure->iPrioritiesDefault = -1; | ||
| 539 | m_cStructure->iLifetimesDefault = -1; | ||
| 540 | m_cStructure->iPreventDuplicateEpisodesDefault = -1; | ||
| 541 | m_cStructure->iRecordingGroupDefault = -1; | ||
| 542 | m_cStructure->iMaxRecordingsDefault = -1; | ||
| 543 | } | ||
| 544 | PVRTimerType(const PVRTimerType& type) : CStructHdl(type) {} | ||
| 545 | /*! \endcond */ | ||
| 546 | |||
| 547 | /// @defgroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimerType_Help Value Help | ||
| 548 | /// @ingroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimerType | ||
| 549 | /// ---------------------------------------------------------------------------- | ||
| 550 | /// | ||
| 551 | /// <b>The following table contains values that can be set with @ref cpp_kodi_addon_pvr_Defs_Timer_PVRTimerType :</b> | ||
| 552 | /// | Name | Type | Set call | Get call | Usage | ||
| 553 | /// |------|------|----------|----------|----------- | ||
| 554 | /// | **Identifier** | `unsigned int` | @ref PVRTimerType::SetId "SetId" | @ref PVRTimerType::GetId "GetId" | *required to set* | ||
| 555 | /// | **Attributes** | `unsigned int` | @ref PVRTimerType::SetAttributes "SetAttributes" | @ref PVRTimerType::GetAttributes "GetAttributes" | *required to set* | ||
| 556 | /// | **Description** | `std::string` | @ref PVRTimerType::SetDescription "SetDescription" | @ref PVRTimerType::GetDescription "GetDescription" | *optional* | ||
| 557 | /// | | | | | | | ||
| 558 | /// | **Priority selection** | @ref cpp_kodi_addon_pvr_Defs_PVRTypeIntValue "PVRTypeIntValue" | @ref PVRTimerType::SetPriorities "SetPriorities" | @ref PVRTimerType::GetPriorities "GetPriorities" | *optional* | ||
| 559 | /// | **Priority default selection** | `int`| @ref PVRTimerType::SetPrioritiesDefault "SetPrioritiesDefault" | @ref PVRTimerType::GetPrioritiesDefault "GetPrioritiesDefault" | *optional* | ||
| 560 | /// | | | | | | | ||
| 561 | /// | **Lifetime selection** | @ref cpp_kodi_addon_pvr_Defs_PVRTypeIntValue "PVRTypeIntValue" | @ref PVRTimerType::SetLifetimes "SetLifetimes" | @ref PVRTimerType::GetLifetimes "GetLifetimes" | *optional* | ||
| 562 | /// | **Lifetime default selection** | `int`| @ref PVRTimerType::SetLifetimesDefault "SetLifetimesDefault" | @ref PVRTimerType::GetLifetimesDefault "GetLifetimesDefault" | *optional* | ||
| 563 | /// | | | | | | | ||
| 564 | /// | **Prevent duplicate episodes selection** | @ref cpp_kodi_addon_pvr_Defs_PVRTypeIntValue "PVRTypeIntValue" | @ref PVRTimerType::SetPreventDuplicateEpisodes "SetPreventDuplicateEpisodes" | @ref PVRTimerType::GetPreventDuplicateEpisodes "GetPreventDuplicateEpisodes" | *optional* | ||
| 565 | /// | **Prevent duplicate episodes default** | `int`| @ref PVRTimerType::SetPreventDuplicateEpisodesDefault "SetPreventDuplicateEpisodesDefault" | @ref PVRTimerType::GetPreventDuplicateEpisodesDefault "GetPreventDuplicateEpisodesDefault" | *optional* | ||
| 566 | /// | | | | | | | ||
| 567 | /// | **Recording group selection**| @ref cpp_kodi_addon_pvr_Defs_PVRTypeIntValue "PVRTypeIntValue" | @ref PVRTimerType::SetRecordingGroups "SetRecordingGroups" | @ref PVRTimerType::GetRecordingGroups "GetRecordingGroups" | *optional* | ||
| 568 | /// | **Recording group default** | `int`| @ref PVRTimerType::SetRecordingGroupDefault "SetRecordingGroupDefault" | @ref PVRTimerType::GetRecordingGroupDefault "GetRecordingGroupDefault" | *optional* | ||
| 569 | /// | | | | | | | ||
| 570 | /// | **Max recordings selection** | @ref cpp_kodi_addon_pvr_Defs_PVRTypeIntValue "PVRTypeIntValue" | @ref PVRTimerType::SetMaxRecordings "SetMaxRecordings" | @ref PVRTimerType::GetMaxRecordings "GetMaxRecordings" | *optional* | ||
| 571 | /// | **Max recordings default** | `int`| @ref PVRTimerType::SetMaxRecordingsDefault "SetMaxRecordingsDefault" | @ref PVRTimerType::GetMaxRecordingsDefault "GetMaxRecordingsDefault" | *optional* | ||
| 572 | /// | ||
| 573 | |||
| 574 | /// @addtogroup cpp_kodi_addon_pvr_Defs_Timer_PVRTimerType | ||
| 575 | ///@{ | ||
| 576 | |||
| 577 | /// @brief **required**\n | ||
| 578 | /// This type's identifier. Ids must be > @ref PVR_TIMER_TYPE_NONE. | ||
| 579 | void SetId(unsigned int id) { m_cStructure->iId = id; } | ||
| 580 | |||
| 581 | /// @brief To get with @ref SetAttributes changed values. | ||
| 582 | unsigned int GetId() const { return m_cStructure->iId; } | ||
| 583 | |||
| 584 | /// @brief **required**\n | ||
| 585 | /// Defines the attributes for this type (@ref cpp_kodi_addon_pvr_Defs_Timer_PVR_TIMER_TYPE "PVR_TIMER_TYPE_*" constants). | ||
| 586 | /// | ||
| 587 | /// To defines the attributes for a type. These values are bit fields that can be | ||
| 588 | /// used together. | ||
| 589 | /// | ||
| 590 | ///-------------------------------------------------------------------------- | ||
| 591 | /// | ||
| 592 | /// **Example:** | ||
| 593 | /// ~~~~~~~~~~~~~{.cpp} | ||
| 594 | /// kodi::addon::PVRTimerType tag; | ||
| 595 | /// tag.SetAttributes(PVR_TIMER_TYPE_IS_MANUAL | PVR_TIMER_TYPE_IS_REPEATING); | ||
| 596 | /// ~~~~~~~~~~~~~ | ||
| 597 | /// | ||
| 598 | void SetAttributes(uint64_t attributes) { m_cStructure->iAttributes = attributes; } | ||
| 599 | |||
| 600 | /// @brief To get with @ref SetAttributes changed values. | ||
| 601 | uint64_t GetAttributes() const { return m_cStructure->iAttributes; } | ||
| 602 | |||
| 603 | /// @brief **optional**\n | ||
| 604 | /// A short localized string describing the purpose of the type. (e.g. | ||
| 605 | /// "Any time at this channel if title matches"). | ||
| 606 | /// | ||
| 607 | /// If left blank, Kodi will generate a description based on the attributes | ||
| 608 | /// REPEATING and MANUAL. (e.g. "Repeating EPG-based.") | ||
| 609 | void SetDescription(const std::string& description) | ||
| 610 | { | ||
| 611 | strncpy(m_cStructure->strDescription, description.c_str(), | ||
| 612 | sizeof(m_cStructure->strDescription) - 1); | ||
| 613 | } | ||
| 614 | |||
| 615 | /// @brief To get with @ref SetDescription changed values. | ||
| 616 | std::string GetDescription() const { return m_cStructure->strDescription; } | ||
| 617 | |||
| 618 | //---------------------------------------------------------------------------- | ||
| 619 | |||
| 620 | /// @brief **optional**\n | ||
| 621 | /// Priority value definitions. | ||
| 622 | /// | ||
| 623 | /// Array containing the possible values for @ref PVRTimer::SetPriority(). | ||
| 624 | /// | ||
| 625 | /// @param[in] priorities List of priority values | ||
| 626 | /// @param[in] prioritiesDefault [opt] The default value in list, can also be | ||
| 627 | /// set by @ref SetPrioritiesDefault() | ||
| 628 | /// | ||
| 629 | /// -------------------------------------------------------------------------- | ||
| 630 | /// | ||
| 631 | /// @copydetails cpp_kodi_addon_pvr_Defs_PVRTypeIntValue_Help | ||
| 632 | void SetPriorities(const std::vector<PVRTypeIntValue>& priorities, int prioritiesDefault = -1) | ||
| 633 | { | ||
| 634 | m_cStructure->iPrioritiesSize = static_cast<unsigned int>(priorities.size()); | ||
| 635 | for (unsigned int i = 0; | ||
| 636 | i < m_cStructure->iPrioritiesSize && i < sizeof(m_cStructure->priorities); ++i) | ||
| 637 | { | ||
| 638 | m_cStructure->priorities[i].iValue = priorities[i].GetCStructure()->iValue; | ||
| 639 | strncpy(m_cStructure->priorities[i].strDescription, | ||
| 640 | priorities[i].GetCStructure()->strDescription, | ||
| 641 | sizeof(m_cStructure->priorities[i].strDescription) - 1); | ||
| 642 | } | ||
| 643 | if (prioritiesDefault != -1) | ||
| 644 | m_cStructure->iPrioritiesDefault = prioritiesDefault; | ||
| 645 | } | ||
| 646 | |||
| 647 | /// @brief To get with @ref SetPriorities changed values. | ||
| 648 | std::vector<PVRTypeIntValue> GetPriorities() const | ||
| 649 | { | ||
| 650 | std::vector<PVRTypeIntValue> ret; | ||
| 651 | for (unsigned int i = 0; i < m_cStructure->iPrioritiesSize; ++i) | ||
| 652 | ret.emplace_back(m_cStructure->priorities[i].iValue, | ||
| 653 | m_cStructure->priorities[i].strDescription); | ||
| 654 | return ret; | ||
| 655 | } | ||
| 656 | |||
| 657 | /// @brief **optional**\n | ||
| 658 | /// The default value for @ref PVRTimer::SetPriority(). | ||
| 659 | /// | ||
| 660 | /// @note Must be filled if @ref SetPriorities contain values and not | ||
| 661 | /// defined there on second function value. | ||
| 662 | void SetPrioritiesDefault(int prioritiesDefault) | ||
| 663 | { | ||
| 664 | m_cStructure->iPrioritiesDefault = prioritiesDefault; | ||
| 665 | } | ||
| 666 | |||
| 667 | /// @brief To get with @ref SetPrioritiesDefault changed values. | ||
| 668 | int GetPrioritiesDefault() const { return m_cStructure->iPrioritiesDefault; } | ||
| 669 | |||
| 670 | //---------------------------------------------------------------------------- | ||
| 671 | |||
| 672 | /// @brief **optional**\n | ||
| 673 | /// Lifetime value definitions. | ||
| 674 | /// | ||
| 675 | /// Array containing the possible values for @ref PVRTimer::SetLifetime(). | ||
| 676 | /// | ||
| 677 | /// @param[in] lifetimes List of lifetimes values | ||
| 678 | /// @param[in] lifetimesDefault [opt] The default value in list, can also be | ||
| 679 | /// set by @ref SetLifetimesDefault() | ||
| 680 | /// | ||
| 681 | /// -------------------------------------------------------------------------- | ||
| 682 | /// | ||
| 683 | /// @copydetails cpp_kodi_addon_pvr_Defs_PVRTypeIntValue_Help | ||
| 684 | void SetLifetimes(const std::vector<PVRTypeIntValue>& lifetimes, int lifetimesDefault = -1) | ||
| 685 | { | ||
| 686 | m_cStructure->iLifetimesSize = static_cast<unsigned int>(lifetimes.size()); | ||
| 687 | for (unsigned int i = 0; | ||
| 688 | i < m_cStructure->iLifetimesSize && i < sizeof(m_cStructure->lifetimes); ++i) | ||
| 689 | { | ||
| 690 | m_cStructure->lifetimes[i].iValue = lifetimes[i].GetCStructure()->iValue; | ||
| 691 | strncpy(m_cStructure->lifetimes[i].strDescription, | ||
| 692 | lifetimes[i].GetCStructure()->strDescription, | ||
| 693 | sizeof(m_cStructure->lifetimes[i].strDescription) - 1); | ||
| 694 | } | ||
| 695 | if (lifetimesDefault != -1) | ||
| 696 | m_cStructure->iLifetimesDefault = lifetimesDefault; | ||
| 697 | } | ||
| 698 | |||
| 699 | /// @brief To get with @ref SetLifetimes changed values. | ||
| 700 | std::vector<PVRTypeIntValue> GetLifetimes() const | ||
| 701 | { | ||
| 702 | std::vector<PVRTypeIntValue> ret; | ||
| 703 | for (unsigned int i = 0; i < m_cStructure->iLifetimesSize; ++i) | ||
| 704 | ret.emplace_back(m_cStructure->lifetimes[i].iValue, | ||
| 705 | m_cStructure->lifetimes[i].strDescription); | ||
| 706 | return ret; | ||
| 707 | } | ||
| 708 | |||
| 709 | /// @brief **optional**\n | ||
| 710 | /// The default value for @ref SetLifetimes(). | ||
| 711 | /// | ||
| 712 | /// @note Must be filled if @ref SetLifetimes contain values and not | ||
| 713 | /// defined there on second function value. | ||
| 714 | void SetLifetimesDefault(int lifetimesDefault) | ||
| 715 | { | ||
| 716 | m_cStructure->iLifetimesDefault = lifetimesDefault; | ||
| 717 | } | ||
| 718 | |||
| 719 | /// @brief To get with @ref SetLifetimesDefault changed values. | ||
| 720 | int GetLifetimesDefault() const { return m_cStructure->iLifetimesDefault; } | ||
| 721 | |||
| 722 | //---------------------------------------------------------------------------- | ||
| 723 | |||
| 724 | /// @brief **optional**\n | ||
| 725 | /// Prevent duplicate episodes value definitions. | ||
| 726 | /// | ||
| 727 | /// Array containing the possible values for @ref PVRTimer::SetPreventDuplicateEpisodes(). | ||
| 728 | /// | ||
| 729 | /// @note Must be filled if @ref PVRTimer::SetPreventDuplicateEpisodes() is not empty. | ||
| 730 | /// | ||
| 731 | /// @param[in] preventDuplicateEpisodes List of duplicate episodes values | ||
| 732 | /// @param[in] preventDuplicateEpisodesDefault [opt] The default value in list, can also be | ||
| 733 | /// set by @ref SetPreventDuplicateEpisodesDefault() | ||
| 734 | /// | ||
| 735 | /// -------------------------------------------------------------------------- | ||
| 736 | /// | ||
| 737 | /// @copydetails cpp_kodi_addon_pvr_Defs_PVRTypeIntValue_Help | ||
| 738 | void SetPreventDuplicateEpisodes( | ||
| 739 | const std::vector<PVRTypeIntValue>& preventDuplicateEpisodes, | ||
| 740 | int preventDuplicateEpisodesDefault = -1) | ||
| 741 | { | ||
| 742 | m_cStructure->iPreventDuplicateEpisodesSize = | ||
| 743 | static_cast<unsigned int>(preventDuplicateEpisodes.size()); | ||
| 744 | for (unsigned int i = 0; i < m_cStructure->iPreventDuplicateEpisodesSize && | ||
| 745 | i < sizeof(m_cStructure->preventDuplicateEpisodes); | ||
| 746 | ++i) | ||
| 747 | { | ||
| 748 | m_cStructure->preventDuplicateEpisodes[i].iValue = | ||
| 749 | preventDuplicateEpisodes[i].GetCStructure()->iValue; | ||
| 750 | strncpy(m_cStructure->preventDuplicateEpisodes[i].strDescription, | ||
| 751 | preventDuplicateEpisodes[i].GetCStructure()->strDescription, | ||
| 752 | sizeof(m_cStructure->preventDuplicateEpisodes[i].strDescription) - 1); | ||
| 753 | } | ||
| 754 | if (preventDuplicateEpisodesDefault != -1) | ||
| 755 | m_cStructure->iPreventDuplicateEpisodesDefault = preventDuplicateEpisodesDefault; | ||
| 756 | } | ||
| 757 | |||
| 758 | /// @brief To get with @ref SetPreventDuplicateEpisodes changed values. | ||
| 759 | std::vector<PVRTypeIntValue> GetPreventDuplicateEpisodes() const | ||
| 760 | { | ||
| 761 | std::vector<PVRTypeIntValue> ret; | ||
| 762 | for (unsigned int i = 0; i < m_cStructure->iPreventDuplicateEpisodesSize; ++i) | ||
| 763 | ret.emplace_back(m_cStructure->preventDuplicateEpisodes[i].iValue, | ||
| 764 | m_cStructure->preventDuplicateEpisodes[i].strDescription); | ||
| 765 | return ret; | ||
| 766 | } | ||
| 767 | |||
| 768 | /// @brief **optional**\n | ||
| 769 | /// The default value for @ref PVRTimer::SetPreventDuplicateEpisodes(). | ||
| 770 | /// | ||
| 771 | /// @note Must be filled if @ref SetPreventDuplicateEpisodes contain values and not | ||
| 772 | /// defined there on second function value. | ||
| 773 | void SetPreventDuplicateEpisodesDefault(int preventDuplicateEpisodesDefault) | ||
| 774 | { | ||
| 775 | m_cStructure->iPreventDuplicateEpisodesDefault = preventDuplicateEpisodesDefault; | ||
| 776 | } | ||
| 777 | |||
| 778 | /// @brief To get with @ref SetPreventDuplicateEpisodesDefault changed values. | ||
| 779 | int GetPreventDuplicateEpisodesDefault() const | ||
| 780 | { | ||
| 781 | return m_cStructure->iPreventDuplicateEpisodesDefault; | ||
| 782 | } | ||
| 783 | |||
| 784 | //---------------------------------------------------------------------------- | ||
| 785 | |||
| 786 | /// @brief **optional**\n | ||
| 787 | /// Array containing the possible values of @ref PVRTimer::SetRecordingGroup() | ||
| 788 | /// | ||
| 789 | /// @param[in] recordingGroup List of recording group values | ||
| 790 | /// @param[in] recordingGroupDefault [opt] The default value in list, can also be | ||
| 791 | /// set by @ref SetRecordingGroupDefault() | ||
| 792 | /// | ||
| 793 | /// -------------------------------------------------------------------------- | ||
| 794 | /// | ||
| 795 | /// @copydetails cpp_kodi_addon_pvr_Defs_PVRTypeIntValue_Help | ||
| 796 | void SetRecordingGroups(const std::vector<PVRTypeIntValue>& recordingGroup, | ||
| 797 | int recordingGroupDefault = -1) | ||
| 798 | { | ||
| 799 | m_cStructure->iRecordingGroupSize = static_cast<unsigned int>(recordingGroup.size()); | ||
| 800 | for (unsigned int i = 0; | ||
| 801 | i < m_cStructure->iRecordingGroupSize && i < sizeof(m_cStructure->recordingGroup); ++i) | ||
| 802 | { | ||
| 803 | m_cStructure->recordingGroup[i].iValue = recordingGroup[i].GetCStructure()->iValue; | ||
| 804 | strncpy(m_cStructure->recordingGroup[i].strDescription, | ||
| 805 | recordingGroup[i].GetCStructure()->strDescription, | ||
| 806 | sizeof(m_cStructure->recordingGroup[i].strDescription) - 1); | ||
| 807 | } | ||
| 808 | if (recordingGroupDefault != -1) | ||
| 809 | m_cStructure->iRecordingGroupDefault = recordingGroupDefault; | ||
| 810 | } | ||
| 811 | |||
| 812 | /// @brief To get with @ref SetRecordingGroups changed values | ||
| 813 | std::vector<PVRTypeIntValue> GetRecordingGroups() const | ||
| 814 | { | ||
| 815 | std::vector<PVRTypeIntValue> ret; | ||
| 816 | for (unsigned int i = 0; i < m_cStructure->iRecordingGroupSize; ++i) | ||
| 817 | ret.emplace_back(m_cStructure->recordingGroup[i].iValue, | ||
| 818 | m_cStructure->recordingGroup[i].strDescription); | ||
| 819 | return ret; | ||
| 820 | } | ||
| 821 | |||
| 822 | /// @brief **optional**\n | ||
| 823 | /// The default value for @ref PVRTimer::SetRecordingGroup(). | ||
| 824 | /// | ||
| 825 | /// @note Must be filled if @ref SetRecordingGroups contain values and not | ||
| 826 | /// defined there on second function value. | ||
| 827 | void SetRecordingGroupDefault(int recordingGroupDefault) | ||
| 828 | { | ||
| 829 | m_cStructure->iRecordingGroupDefault = recordingGroupDefault; | ||
| 830 | } | ||
| 831 | |||
| 832 | /// @brief To get with @ref SetRecordingGroupDefault changed values | ||
| 833 | int GetRecordingGroupDefault() const { return m_cStructure->iRecordingGroupDefault; } | ||
| 834 | |||
| 835 | //---------------------------------------------------------------------------- | ||
| 836 | |||
| 837 | /// @brief **optional**\n | ||
| 838 | /// Array containing the possible values of @ref PVRTimer::SetMaxRecordings(). | ||
| 839 | /// | ||
| 840 | /// @param[in] maxRecordings List of lifetimes values | ||
| 841 | /// @param[in] maxRecordingsDefault [opt] The default value in list, can also be | ||
| 842 | /// set by @ref SetMaxRecordingsDefault() | ||
| 843 | /// | ||
| 844 | /// -------------------------------------------------------------------------- | ||
| 845 | /// | ||
| 846 | /// @copydetails cpp_kodi_addon_pvr_Defs_PVRTypeIntValue_Help | ||
| 847 | void SetMaxRecordings(const std::vector<PVRTypeIntValue>& maxRecordings, | ||
| 848 | int maxRecordingsDefault = -1) | ||
| 849 | { | ||
| 850 | m_cStructure->iMaxRecordingsSize = static_cast<unsigned int>(maxRecordings.size()); | ||
| 851 | for (unsigned int i = 0; | ||
| 852 | i < m_cStructure->iMaxRecordingsSize && i < sizeof(m_cStructure->maxRecordings); ++i) | ||
| 853 | { | ||
| 854 | m_cStructure->maxRecordings[i].iValue = maxRecordings[i].GetCStructure()->iValue; | ||
| 855 | strncpy(m_cStructure->maxRecordings[i].strDescription, | ||
| 856 | maxRecordings[i].GetCStructure()->strDescription, | ||
| 857 | sizeof(m_cStructure->maxRecordings[i].strDescription) - 1); | ||
| 858 | } | ||
| 859 | if (maxRecordingsDefault != -1) | ||
| 860 | m_cStructure->iMaxRecordingsDefault = maxRecordingsDefault; | ||
| 861 | } | ||
| 862 | |||
| 863 | /// @brief To get with @ref SetMaxRecordings changed values | ||
| 864 | std::vector<PVRTypeIntValue> GetMaxRecordings() const | ||
| 865 | { | ||
| 866 | std::vector<PVRTypeIntValue> ret; | ||
| 867 | for (unsigned int i = 0; i < m_cStructure->iMaxRecordingsSize; ++i) | ||
| 868 | ret.emplace_back(m_cStructure->maxRecordings[i].iValue, | ||
| 869 | m_cStructure->maxRecordings[i].strDescription); | ||
| 870 | return ret; | ||
| 871 | } | ||
| 872 | |||
| 873 | /// @brief **optional**\n | ||
| 874 | /// The default value for @ref SetMaxRecordings(). | ||
| 875 | /// | ||
| 876 | /// Can be set with here if on @ref SetMaxRecordings not given as second value. | ||
| 877 | void SetMaxRecordingsDefault(int maxRecordingsDefault) | ||
| 878 | { | ||
| 879 | m_cStructure->iMaxRecordingsDefault = maxRecordingsDefault; | ||
| 880 | } | ||
| 881 | |||
| 882 | /// @brief To get with @ref SetMaxRecordingsDefault changed values | ||
| 883 | int GetMaxRecordingsDefault() const { return m_cStructure->iMaxRecordingsDefault; } | ||
| 884 | ///@} | ||
| 885 | |||
| 886 | private: | ||
| 887 | PVRTimerType(const PVR_TIMER_TYPE* type) : CStructHdl(type) {} | ||
| 888 | PVRTimerType(PVR_TIMER_TYPE* type) : CStructHdl(type) {} | ||
| 889 | }; | ||
| 890 | ///@} | ||
| 891 | //------------------------------------------------------------------------------ | ||
| 892 | |||
| 893 | } /* namespace addon */ | ||
| 894 | } /* namespace kodi */ | ||
| 895 | |||
| 896 | #endif /* __cplusplus */ | ||
