summaryrefslogtreecommitdiffstats
path: root/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance
diff options
context:
space:
mode:
authormanuel <manuel@mausz.at>2020-10-19 00:52:24 +0200
committermanuel <manuel@mausz.at>2020-10-19 00:52:24 +0200
commitbe933ef2241d79558f91796cc5b3a161f72ebf9c (patch)
treefe3ab2f130e20c99001f2d7a81d610c78c96a3f4 /xbmc/addons/kodi-dev-kit/include/kodi/addon-instance
parent5f8335c1e49ce108ef3481863833c98efa00411b (diff)
downloadkodi-pvr-build-be933ef2241d79558f91796cc5b3a161f72ebf9c.tar.gz
kodi-pvr-build-be933ef2241d79558f91796cc5b3a161f72ebf9c.tar.bz2
kodi-pvr-build-be933ef2241d79558f91796cc5b3a161f72ebf9c.zip
sync with upstream
Diffstat (limited to 'xbmc/addons/kodi-dev-kit/include/kodi/addon-instance')
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/AudioDecoder.h595
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/AudioEncoder.h353
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/CMakeLists.txt15
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Game.h1190
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/ImageDecoder.h315
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Inputstream.h934
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/PVR.h3423
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Peripheral.h907
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Screensaver.h470
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/VFS.h1226
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/VideoCodec.h249
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Visualization.h992
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/peripheral/CMakeLists.txt5
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/peripheral/PeripheralUtils.h1277
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/CMakeLists.txt13
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/ChannelGroups.h271
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Channels.h518
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/EDL.h90
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/EPG.h500
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/General.h511
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/MenuHook.h130
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Recordings.h520
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Stream.h330
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Timers.h896
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
16namespace kodi
17{
18namespace addon
19{
20
21class 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///@{
37class AudioDecoderInfoTag : public CStructHdl<AudioDecoderInfoTag, AUDIO_DECODER_INFO_TAG>
38{
39 /*! \cond PRIVATE */
40 friend class CInstanceAudioDecoder;
41 /*! \endcond */
42
43public:
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
224private:
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///
379class ATTRIBUTE_HIDDEN CInstanceAudioDecoder : public IAddonInstance
380{
381public:
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
520private:
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
15namespace kodi
16{
17namespace 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///
151class ATTRIBUTE_HIDDEN CInstanceAudioEncoder : public IAddonInstance
152{
153public:
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
301private:
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 @@
1set(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
13if(NOT ENABLE_STATIC_LIBS)
14 core_add_library(addons_kodi-dev-kit_include_kodi_addon-instance)
15endif()
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
16namespace kodi
17{
18namespace 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///@{
44class GameControllerLayout
45{
46public:
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///
116class ATTRIBUTE_HIDDEN CInstanceGame : public IAddonInstance
117{
118public:
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
954private:
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
15namespace kodi
16{
17namespace 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//------------------------------------------------------------------------------
198class ATTRIBUTE_HIDDEN CInstanceImageDecoder : public IAddonInstance
199{
200public:
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
276private:
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
37extern "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
432namespace kodi
433{
434namespace addon
435{
436
437class ATTRIBUTE_HIDDEN CInstanceInputStream : public IAddonInstance
438{
439public:
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
688private:
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
48namespace kodi
49{
50namespace 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///
384class ATTRIBUTE_HIDDEN CInstancePVRClient : public IAddonInstance
385{
386public:
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
2625private:
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
15namespace kodi
16{
17namespace 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///
215class ATTRIBUTE_HIDDEN CInstancePeripheral : public IAddonInstance
216{
217public:
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
617private:
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
16namespace kodi
17{
18namespace 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///
193class ATTRIBUTE_HIDDEN CInstanceScreensaver : public IAddonInstance
194{
195public:
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
413private:
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
16namespace kodi
17{
18namespace addon
19{
20
21class 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///@{
33using 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///@{
50class ATTRIBUTE_HIDDEN VFSUrl : public CStructHdl<VFSUrl, VFSURL>
51{
52 /*! \cond PRIVATE */
53 friend class CInstanceVFS;
54 /*! \endcond */
55
56public:
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
144private:
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//------------------------------------------------------------------------------
436class ATTRIBUTE_HIDDEN CInstanceVFS : public IAddonInstance
437{
438public:
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
914private:
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
21extern "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
139namespace 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
16namespace kodi
17{
18namespace 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///@{
39class VisualizationTrack
40{
41 /*! \cond PRIVATE */
42 friend class CInstanceVisualization;
43 /*! \endcond */
44
45public:
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
172private:
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///
395class ATTRIBUTE_HIDDEN CInstanceVisualization : public IAddonInstance
396{
397public:
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
832private:
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 @@
1set(HEADERS PeripheralUtils.h)
2
3if(NOT ENABLE_STATIC_LIBS)
4 core_add_library(addons_kodi-dev-kit_include_kodi_addon-instance_peripheral)
5endif()
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
36namespace kodi
37{
38namespace addon
39{
40
41class CInstancePeripheral;
42
43/*!
44 * Utility class to manipulate arrays of peripheral types.
45 */
46template<class THE_CLASS, typename THE_STRUCT>
47class PeripheralVector
48{
49public:
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///@{
132class PeripheralCapabilities : public CStructHdl<PeripheralCapabilities, PERIPHERAL_CAPABILITIES>
133{
134 /*! \cond PRIVATE */
135 friend class CInstancePeripheral;
136 /*! \endcond */
137
138public:
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
204private:
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///@{
224class Peripheral
225{
226public:
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
342private:
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
352typedef 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///@{
368class PeripheralEvent
369{
370public:
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
531private:
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
543typedef 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///@{
568class Joystick : public Peripheral
569{
570public:
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
746private:
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
758typedef PeripheralVector<Joystick, JOYSTICK_INFO> Joysticks;
759
760class 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///@{
805struct DriverPrimitive
806{
807protected:
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
816public:
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
1099private:
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
1112typedef 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///@{
1139class JoystickFeature
1140{
1141public:
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
1264private:
1265 std::string m_name;
1266 JOYSTICK_FEATURE_TYPE m_type;
1267 std::array<DriverPrimitive, JOYSTICK_PRIMITIVE_MAX> m_primitives;
1268};
1269///@}
1270//------------------------------------------------------------------------------
1271
1272typedef 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 @@
1set(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
11if(NOT ENABLE_STATIC_LIBS)
12 core_add_library(addons_kodi-dev-kit_include_kodi_addon-instance_pvr)
13endif()
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
18namespace kodi
19{
20namespace 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///@{
37class PVRChannelGroup : public CStructHdl<PVRChannelGroup, PVR_CHANNEL_GROUP>
38{
39 friend class CInstancePVRClient;
40
41public:
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
88private:
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///@{
102class PVRChannelGroupsResultSet
103{
104public:
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
127private:
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///@{
148class PVRChannelGroupMember : public CStructHdl<PVRChannelGroupMember, PVR_CHANNEL_GROUP_MEMBER>
149{
150 friend class CInstancePVRClient;
151
152public:
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
223private:
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///@{
237class PVRChannelGroupMembersResultSet
238{
239public:
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
261private:
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
18namespace kodi
19{
20namespace 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///@{
38class PVRChannel : public CStructHdl<PVRChannel, PVR_CHANNEL>
39{
40 friend class CInstancePVRClient;
41
42public:
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
176private:
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///@{
190class PVRChannelsResultSet
191{
192public:
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
214private:
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///@{
235class PVRSignalStatus : public CStructHdl<PVRSignalStatus, PVR_SIGNAL_STATUS>
236{
237 friend class CInstancePVRClient;
238
239public:
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
353private:
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///@{
375class PVRDescrambleInfo : public CStructHdl<PVRDescrambleInfo, PVR_DESCRAMBLE_INFO>
376{
377 friend class CInstancePVRClient;
378
379public:
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
508private:
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
18namespace kodi
19{
20namespace 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///@{
37class PVREDLEntry : public CStructHdl<PVREDLEntry, PVR_EDL_ENTRY>
38{
39 friend class CInstancePVRClient;
40
41public:
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
80private:
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
18namespace kodi
19{
20namespace 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///@{
39class PVREPGTag : public CStructHdl<PVREPGTag, EPG_TAG>
40{
41 friend class CInstancePVRClient;
42
43public:
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
415private:
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///@{
466class PVREPGTagsResultSet
467{
468public:
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
490private:
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
18namespace kodi
19{
20namespace 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///@{
34class PVRTypeIntValue : public CStructHdl<PVRTypeIntValue, PVR_ATTRIBUTE_INT_VALUE>
35{
36 friend class CInstancePVRClient;
37
38public:
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
89private:
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///@{
115class PVRCapabilities
116{
117 friend class CInstancePVRClient;
118
119public:
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
389private:
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///@{
444class PVRStreamProperty : public CStructHdl<PVRStreamProperty, PVR_NAMED_VALUE>
445{
446 friend class CInstancePVRClient;
447
448public:
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
501private:
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
18namespace kodi
19{
20namespace 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///@{
45class PVRMenuhook : public CStructHdl<PVRMenuhook, PVR_MENUHOOK>
46{
47 friend class CInstancePVRClient;
48
49public:
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
120private:
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
18namespace kodi
19{
20namespace 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///@{
38class PVRRecording : public CStructHdl<PVRRecording, PVR_RECORDING>
39{
40 friend class CInstancePVRClient;
41
42public:
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
470private:
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///@{
486class PVRRecordingsResultSet
487{
488public:
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
510private:
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
20namespace kodi
21{
22namespace 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///@{
38class PVRCodec : public CStructHdl<PVRCodec, PVR_CODEC>
39{
40 friend class CInstancePVRClient;
41
42public:
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
80private:
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///@{
100class PVRStreamProperties
101 : public CStructHdl<PVRStreamProperties, PVR_STREAM_PROPERTIES::PVR_STREAM>
102{
103 friend class CInstancePVRClient;
104
105public:
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
242private:
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///@{
261class PVRStreamTimes : public CStructHdl<PVRStreamTimes, PVR_STREAM_TIMES>
262{
263 friend class CInstancePVRClient;
264
265public:
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
320private:
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
19namespace kodi
20{
21namespace 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///@{
38class PVRTimer : public CStructHdl<PVRTimer, PVR_TIMER>
39{
40 friend class CInstancePVRClient;
41
42public:
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
469private:
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///@{
486class PVRTimersResultSet
487{
488public:
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
510private:
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///@{
529class PVRTimerType : public CStructHdl<PVRTimerType, PVR_TIMER_TYPE>
530{
531 friend class CInstancePVRClient;
532
533public:
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
886private:
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 */