summaryrefslogtreecommitdiffstats
path: root/xbmc/addons/Visualization.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/addons/Visualization.cpp')
-rw-r--r--xbmc/addons/Visualization.cpp234
1 files changed, 234 insertions, 0 deletions
diff --git a/xbmc/addons/Visualization.cpp b/xbmc/addons/Visualization.cpp
new file mode 100644
index 0000000..e519e30
--- /dev/null
+++ b/xbmc/addons/Visualization.cpp
@@ -0,0 +1,234 @@
+/*
+ * Copyright (C) 2005-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#include "Visualization.h"
+
+#include "filesystem/SpecialProtocol.h"
+#include "guilib/GUIWindowManager.h"
+#include "utils/log.h"
+
+using namespace ADDON;
+using namespace KODI::ADDONS;
+
+namespace
+{
+
+void get_properties(const KODI_HANDLE hdl, struct KODI_ADDON_VISUALIZATION_PROPS* props)
+{
+ if (hdl)
+ static_cast<CVisualization*>(hdl)->GetProperties(props);
+}
+
+void transfer_preset(const KODI_HANDLE hdl, const char* preset)
+{
+ if (hdl && preset)
+ static_cast<CVisualization*>(hdl)->TransferPreset(preset);
+}
+
+void clear_presets(const KODI_HANDLE hdl)
+{
+ if (hdl)
+ static_cast<CVisualization*>(hdl)->ClearPresets();
+}
+
+} // namespace
+
+CVisualization::CVisualization(const AddonInfoPtr& addonInfo, float x, float y, float w, float h)
+ : IAddonInstanceHandler(ADDON_INSTANCE_VISUALIZATION, addonInfo),
+ m_x(static_cast<int>(x)),
+ m_y(static_cast<int>(y)),
+ m_width(static_cast<int>(w)),
+ m_height(static_cast<int>(h))
+{
+ // Setup new Visualization instance
+ m_ifc.visualization = new AddonInstance_Visualization;
+ m_ifc.visualization->toAddon = new KodiToAddonFuncTable_Visualization();
+ m_ifc.visualization->toKodi = new AddonToKodiFuncTable_Visualization();
+ m_ifc.visualization->toKodi->get_properties = get_properties;
+ m_ifc.visualization->toKodi->transfer_preset = transfer_preset;
+ m_ifc.visualization->toKodi->clear_presets = clear_presets;
+
+ /* Open the class "kodi::addon::CInstanceVisualization" on add-on side */
+ if (CreateInstance() != ADDON_STATUS_OK)
+ {
+ CLog::Log(LOGFATAL, "Visualization: failed to create instance for '{}' and not usable!", ID());
+ return;
+ }
+
+ /* presets becomes send with "transfer_preset" during call of function below */
+ if (m_ifc.visualization->toAddon->get_presets)
+ m_ifc.visualization->toAddon->get_presets(m_ifc.hdl);
+}
+
+CVisualization::~CVisualization()
+{
+ /* Destroy the class "kodi::addon::CInstanceVisualization" on add-on side */
+ DestroyInstance();
+
+ delete m_ifc.visualization->toAddon;
+ delete m_ifc.visualization->toKodi;
+ delete m_ifc.visualization;
+}
+
+bool CVisualization::Start(int channels,
+ int samplesPerSec,
+ int bitsPerSample,
+ const std::string& songName)
+{
+ if (m_ifc.visualization->toAddon->start)
+ return m_ifc.visualization->toAddon->start(m_ifc.hdl, channels, samplesPerSec, bitsPerSample,
+ songName.c_str());
+ return false;
+}
+
+void CVisualization::Stop()
+{
+ if (m_ifc.visualization->toAddon->stop)
+ m_ifc.visualization->toAddon->stop(m_ifc.hdl);
+}
+
+void CVisualization::AudioData(const float* audioData, int audioDataLength)
+{
+ if (m_ifc.visualization->toAddon->audio_data)
+ m_ifc.visualization->toAddon->audio_data(m_ifc.hdl, audioData, audioDataLength);
+}
+
+bool CVisualization::IsDirty()
+{
+ if (m_ifc.visualization->toAddon->is_dirty)
+ return m_ifc.visualization->toAddon->is_dirty(m_ifc.hdl);
+ return false;
+}
+
+void CVisualization::Render()
+{
+ if (m_ifc.visualization->toAddon->render)
+ m_ifc.visualization->toAddon->render(m_ifc.hdl);
+}
+
+int CVisualization::GetSyncDelay()
+{
+ if (m_ifc.visualization->toAddon->get_sync_delay)
+ m_ifc.visualization->toAddon->get_sync_delay(m_ifc.hdl);
+ return 0;
+}
+
+bool CVisualization::NextPreset()
+{
+ if (m_ifc.visualization->toAddon->next_preset)
+ return m_ifc.visualization->toAddon->next_preset(m_ifc.hdl);
+ return false;
+}
+
+bool CVisualization::PrevPreset()
+{
+ if (m_ifc.visualization->toAddon->prev_preset)
+ return m_ifc.visualization->toAddon->prev_preset(m_ifc.hdl);
+ return false;
+}
+
+bool CVisualization::LoadPreset(int select)
+{
+ if (m_ifc.visualization->toAddon->load_preset)
+ return m_ifc.visualization->toAddon->load_preset(m_ifc.hdl, select);
+ return false;
+}
+
+bool CVisualization::RandomPreset()
+{
+ if (m_ifc.visualization->toAddon->random_preset)
+ return m_ifc.visualization->toAddon->random_preset(m_ifc.hdl);
+ return false;
+}
+
+bool CVisualization::LockPreset()
+{
+ if (m_ifc.visualization->toAddon->lock_preset)
+ return m_ifc.visualization->toAddon->lock_preset(m_ifc.hdl);
+ return false;
+}
+
+bool CVisualization::RatePreset(bool plus_minus)
+{
+ if (m_ifc.visualization->toAddon->rate_preset)
+ return m_ifc.visualization->toAddon->rate_preset(m_ifc.hdl, plus_minus);
+ return false;
+}
+
+bool CVisualization::UpdateAlbumart(const char* albumart)
+{
+ if (m_ifc.visualization->toAddon->update_albumart)
+ return m_ifc.visualization->toAddon->update_albumart(m_ifc.hdl, albumart);
+ return false;
+}
+
+bool CVisualization::UpdateTrack(const KODI_ADDON_VISUALIZATION_TRACK* track)
+{
+ if (m_ifc.visualization->toAddon->update_track)
+ return m_ifc.visualization->toAddon->update_track(m_ifc.hdl, track);
+ return false;
+}
+
+bool CVisualization::HasPresets()
+{
+ return !m_presets.empty();
+}
+
+bool CVisualization::GetPresetList(std::vector<std::string>& vecpresets)
+{
+ vecpresets = m_presets;
+ return !m_presets.empty();
+}
+
+int CVisualization::GetActivePreset()
+{
+ if (m_ifc.visualization->toAddon->get_active_preset)
+ return m_ifc.visualization->toAddon->get_active_preset(m_ifc.hdl);
+ return -1;
+}
+
+std::string CVisualization::GetActivePresetName()
+{
+ if (!m_presets.empty())
+ return m_presets[GetActivePreset()];
+ return "";
+}
+
+bool CVisualization::IsLocked()
+{
+ if (m_ifc.visualization->toAddon->is_locked)
+ return m_ifc.visualization->toAddon->is_locked(m_ifc.hdl);
+ return false;
+}
+
+void CVisualization::TransferPreset(const std::string& preset)
+{
+ m_presets.emplace_back(preset);
+}
+
+void CVisualization::ClearPresets()
+{
+ m_presets.clear();
+}
+
+void CVisualization::GetProperties(struct KODI_ADDON_VISUALIZATION_PROPS* props)
+{
+ if (!props)
+ return;
+
+ const auto winSystem = CServiceBroker::GetWinSystem();
+ if (!winSystem)
+ return;
+
+ props->x = m_x;
+ props->y = m_y;
+ props->width = m_width;
+ props->height = m_height;
+ props->device = winSystem->GetHWContext();
+ props->pixelRatio = winSystem->GetGfxContext().GetResInfo().fPixelRatio;
+}