From 5f8335c1e49ce108ef3481863833c98efa00411b Mon Sep 17 00:00:00 2001 From: manuel Date: Thu, 2 Jul 2020 23:09:26 +0200 Subject: sync with upstream --- .../include/kodi/addon-instance/Visualization.h | 128 +++++++++++++-------- 1 file changed, 82 insertions(+), 46 deletions(-) (limited to 'xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/Visualization.h') diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/Visualization.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/Visualization.h index 6c29693..4be785d 100644 --- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/Visualization.h +++ b/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/Visualization.h @@ -14,6 +14,7 @@ */ #include "../AddonBase.h" +#include "../gui/renderHelper.h" namespace kodi { namespace addon { class CInstanceVisualization; }} @@ -59,6 +60,7 @@ typedef struct AddonToKodiFuncTable_Visualization /* internal */ { KODI_HANDLE kodiInstance; void (__cdecl* transfer_preset) (void* kodiInstance, const char* preset); + void (__cdecl* clear_presets) (void* kodiInstance); } AddonToKodiFuncTable_Visualization; typedef struct KodiToAddonFuncTable_Visualization /* internal */ @@ -78,9 +80,9 @@ typedef struct KodiToAddonFuncTable_Visualization /* internal */ typedef struct AddonInstance_Visualization /* internal */ { - AddonProps_Visualization props; - AddonToKodiFuncTable_Visualization toKodi; - KodiToAddonFuncTable_Visualization toAddon; + AddonProps_Visualization* props; + AddonToKodiFuncTable_Visualization* toKodi; + KodiToAddonFuncTable_Visualization* toAddon; } AddonInstance_Visualization; //============================================================================ @@ -296,7 +298,7 @@ namespace addon /// Kodi's header. Manually deleting the add-on instance is not required. /// //---------------------------------------------------------------------------- - class CInstanceVisualization : public IAddonInstance + class ATTRIBUTE_HIDDEN CInstanceVisualization : public IAddonInstance { public: //========================================================================== @@ -307,7 +309,8 @@ namespace addon /// Used by an add-on that only supports visualizations. /// CInstanceVisualization() - : IAddonInstance(ADDON_INSTANCE_VISUALIZATION) + : IAddonInstance(ADDON_INSTANCE_VISUALIZATION, + GetKodiTypeVersion(ADDON_INSTANCE_VISUALIZATION)) { if (CAddonBase::m_interface->globalSingleInstance != nullptr) throw std::logic_error("kodi::addon::CInstanceVisualization: Cannot create multiple instances of add-on."); @@ -325,11 +328,16 @@ namespace addon /// /// @param[in] instance The instance value given to /// `kodi::addon::CAddonBase::CreateInstance(...)`. + /// @param[in] kodiVersion [opt] Version used in Kodi for this instance, to + /// allow compatibility to older Kodi versions. + /// @note Recommended to set. /// /// @warning Only use `instance` from the CreateInstance call /// - explicit CInstanceVisualization(KODI_HANDLE instance) - : IAddonInstance(ADDON_INSTANCE_VISUALIZATION) + explicit CInstanceVisualization(KODI_HANDLE instance, const std::string& kodiVersion = "") + : IAddonInstance(ADDON_INSTANCE_VISUALIZATION, + !kodiVersion.empty() ? kodiVersion + : GetKodiTypeVersion(ADDON_INSTANCE_VISUALIZATION)) { if (CAddonBase::m_interface->globalSingleInstance != nullptr) throw std::logic_error("kodi::addon::CInstanceVisualization: Creation of multiple together with single instance way is not allowed!"); @@ -545,6 +553,26 @@ namespace addon /// //@{ + //========================================================================== + /// + /// @ingroup cpp_kodi_addon_visualization_CB + /// @brief To transfer available presets on addon + /// + /// Used if @ref GetPresets not possible to use, e.g. where available presets + /// are only known during @ref Start call. + /// + /// @param[in] presets List to store available presets. + /// + /// @note The function should only be called once, if possible + /// + inline void TransferPresets(const std::vector& presets) + { + m_instanceData->toKodi->clear_presets(m_instanceData->toKodi->kodiInstance); + for (auto it : presets) + m_instanceData->toKodi->transfer_preset(m_instanceData->toKodi->kodiInstance, it.c_str()); + } + //-------------------------------------------------------------------------- + //========================================================================== /// /// @ingroup cpp_kodi_addon_visualization_CB @@ -555,7 +583,7 @@ namespace addon /// @note This is only available on **DirectX**, It us unused (`nullptr`) on /// **OpenGL** /// - inline void* Device() { return m_instanceData->props.device; } + inline void* Device() { return m_instanceData->props->device; } //-------------------------------------------------------------------------- //========================================================================== @@ -565,7 +593,7 @@ namespace addon /// /// @return The X position, in pixels /// - inline int X() { return m_instanceData->props.x; } + inline int X() { return m_instanceData->props->x; } //-------------------------------------------------------------------------- //========================================================================== @@ -575,7 +603,7 @@ namespace addon /// /// @return The Y position, in pixels /// - inline int Y() { return m_instanceData->props.y; } + inline int Y() { return m_instanceData->props->y; } //-------------------------------------------------------------------------- //========================================================================== @@ -585,7 +613,7 @@ namespace addon /// /// @return The width, in pixels /// - inline int Width() { return m_instanceData->props.width; } + inline int Width() { return m_instanceData->props->width; } //-------------------------------------------------------------------------- //========================================================================== @@ -595,7 +623,7 @@ namespace addon /// /// @return The height, in pixels /// - inline int Height() { return m_instanceData->props.height; } + inline int Height() { return m_instanceData->props->height; } //-------------------------------------------------------------------------- //========================================================================== @@ -606,7 +634,7 @@ namespace addon /// /// @return The pixel aspect ratio used by the display /// - inline float PixelRatio() { return m_instanceData->props.pixelRatio; } + inline float PixelRatio() { return m_instanceData->props->pixelRatio; } //-------------------------------------------------------------------------- //========================================================================== @@ -616,7 +644,7 @@ namespace addon /// /// @return The add-on name /// - inline std::string Name() { return m_instanceData->props.name; } + inline std::string Name() { return m_instanceData->props->name; } //-------------------------------------------------------------------------- //========================================================================== @@ -626,7 +654,7 @@ namespace addon /// /// @return The add-on installation path /// - inline std::string Presets() { return m_instanceData->props.presets; } + inline std::string Presets() { return m_instanceData->props->presets; } //-------------------------------------------------------------------------- //========================================================================== @@ -640,7 +668,7 @@ namespace addon /// /// @return Path to the user profile /// - inline std::string Profile() { return m_instanceData->props.profile; } + inline std::string Profile() { return m_instanceData->props->profile; } //-------------------------------------------------------------------------- //@} @@ -651,46 +679,53 @@ namespace addon throw std::logic_error("kodi::addon::CInstanceVisualization: Null pointer instance passed."); m_instanceData = static_cast(instance); - m_instanceData->toAddon.addonInstance = this; - m_instanceData->toAddon.start = ADDON_Start; - m_instanceData->toAddon.stop = ADDON_Stop; - m_instanceData->toAddon.audio_data = ADDON_AudioData; - m_instanceData->toAddon.render = ADDON_Render; - m_instanceData->toAddon.get_info = ADDON_GetInfo; - m_instanceData->toAddon.on_action = ADDON_OnAction; - m_instanceData->toAddon.get_presets = ADDON_GetPresets; - m_instanceData->toAddon.get_active_preset = ADDON_GetActivePreset; - m_instanceData->toAddon.is_locked = ADDON_IsLocked; + m_instanceData->toAddon->addonInstance = this; + m_instanceData->toAddon->start = ADDON_Start; + m_instanceData->toAddon->stop = ADDON_Stop; + m_instanceData->toAddon->audio_data = ADDON_AudioData; + m_instanceData->toAddon->is_dirty = ADDON_IsDirty; + m_instanceData->toAddon->render = ADDON_Render; + m_instanceData->toAddon->get_info = ADDON_GetInfo; + m_instanceData->toAddon->on_action = ADDON_OnAction; + m_instanceData->toAddon->get_presets = ADDON_GetPresets; + m_instanceData->toAddon->get_active_preset = ADDON_GetActivePreset; + m_instanceData->toAddon->is_locked = ADDON_IsLocked; } inline static bool ADDON_Start(const AddonInstance_Visualization* addon, int channels, int samplesPerSec, int bitsPerSample, const char* songName) { - return addon->toAddon.addonInstance->Start(channels, samplesPerSec, bitsPerSample, songName); + addon->toAddon->addonInstance->m_renderHelper = kodi::gui::GetRenderHelper(); + return addon->toAddon->addonInstance->Start(channels, samplesPerSec, bitsPerSample, songName); } inline static void ADDON_Stop(const AddonInstance_Visualization* addon) { - addon->toAddon.addonInstance->Stop(); + addon->toAddon->addonInstance->Stop(); + addon->toAddon->addonInstance->m_renderHelper = nullptr; } inline static void ADDON_AudioData(const AddonInstance_Visualization* addon, const float* audioData, int audioDataLength, float *freqData, int freqDataLength) { - addon->toAddon.addonInstance->AudioData(audioData, audioDataLength, freqData, freqDataLength); + addon->toAddon->addonInstance->AudioData(audioData, audioDataLength, freqData, freqDataLength); } inline static bool ADDON_IsDirty(const AddonInstance_Visualization* addon) { - return addon->toAddon.addonInstance->IsDirty(); + return addon->toAddon->addonInstance->IsDirty(); } inline static void ADDON_Render(const AddonInstance_Visualization* addon) { - addon->toAddon.addonInstance->Render(); + if (!addon->toAddon->addonInstance->m_renderHelper) + return; + addon->toAddon->addonInstance->m_renderHelper->Begin(); + addon->toAddon->addonInstance->Render(); + addon->toAddon->addonInstance->m_renderHelper->End(); } inline static void ADDON_GetInfo(const AddonInstance_Visualization* addon, VIS_INFO *info) { - addon->toAddon.addonInstance->GetInfo(info->bWantsFreq, info->iSyncDelay); + addon->toAddon->addonInstance->GetInfo(info->bWantsFreq, info->iSyncDelay); } inline static bool ADDON_OnAction(const AddonInstance_Visualization* addon, VIS_ACTION action, const void *param) @@ -698,24 +733,24 @@ namespace addon switch (action) { case VIS_ACTION_NEXT_PRESET: - return addon->toAddon.addonInstance->NextPreset(); + return addon->toAddon->addonInstance->NextPreset(); case VIS_ACTION_PREV_PRESET: - return addon->toAddon.addonInstance->PrevPreset(); + return addon->toAddon->addonInstance->PrevPreset(); case VIS_ACTION_LOAD_PRESET: - return addon->toAddon.addonInstance->LoadPreset(*static_cast(param)); + return addon->toAddon->addonInstance->LoadPreset(*static_cast(param)); case VIS_ACTION_RANDOM_PRESET: - return addon->toAddon.addonInstance->RandomPreset(); + return addon->toAddon->addonInstance->RandomPreset(); case VIS_ACTION_LOCK_PRESET: - addon->toAddon.addonInstance->m_presetLockedByUser = !addon->toAddon.addonInstance->m_presetLockedByUser; - return addon->toAddon.addonInstance->LockPreset(addon->toAddon.addonInstance->m_presetLockedByUser); + addon->toAddon->addonInstance->m_presetLockedByUser = !addon->toAddon->addonInstance->m_presetLockedByUser; + return addon->toAddon->addonInstance->LockPreset(addon->toAddon->addonInstance->m_presetLockedByUser); case VIS_ACTION_RATE_PRESET_PLUS: - return addon->toAddon.addonInstance->RatePreset(true); + return addon->toAddon->addonInstance->RatePreset(true); case VIS_ACTION_RATE_PRESET_MINUS: - return addon->toAddon.addonInstance->RatePreset(false); + return addon->toAddon->addonInstance->RatePreset(false); case VIS_ACTION_UPDATE_ALBUMART: - return addon->toAddon.addonInstance->UpdateAlbumart(static_cast(param)); + return addon->toAddon->addonInstance->UpdateAlbumart(static_cast(param)); case VIS_ACTION_UPDATE_TRACK: - return addon->toAddon.addonInstance->UpdateTrack(*static_cast(param)); + return addon->toAddon->addonInstance->UpdateTrack(*static_cast(param)); case VIS_ACTION_NONE: default: break; @@ -726,10 +761,10 @@ namespace addon inline static unsigned int ADDON_GetPresets(const AddonInstance_Visualization* addon) { std::vector presets; - if (addon->toAddon.addonInstance->GetPresets(presets)) + if (addon->toAddon->addonInstance->GetPresets(presets)) { for (auto it : presets) - addon->toAddon.addonInstance->m_instanceData->toKodi.transfer_preset(addon->toKodi.kodiInstance, it.c_str()); + addon->toAddon->addonInstance->m_instanceData->toKodi->transfer_preset(addon->toKodi->kodiInstance, it.c_str()); } return static_cast(presets.size()); @@ -737,14 +772,15 @@ namespace addon inline static int ADDON_GetActivePreset(const AddonInstance_Visualization* addon) { - return addon->toAddon.addonInstance->GetActivePreset(); + return addon->toAddon->addonInstance->GetActivePreset(); } inline static bool ADDON_IsLocked(const AddonInstance_Visualization* addon) { - return addon->toAddon.addonInstance->IsLocked(); + return addon->toAddon->addonInstance->IsLocked(); } + std::shared_ptr m_renderHelper; bool m_presetLockedByUser = false; AddonInstance_Visualization* m_instanceData; }; -- cgit v1.2.3