Kodi Development 22.0
for Binary and Script based Add-Ons
 
Loading...
Searching...
No Matches
Visualization.h
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//==============================================================================
39{
41 friend class CInstanceVisualization;
44public:
46 VisualizationTrack() = default;
47 VisualizationTrack(const VisualizationTrack& tag) { *this = tag; }
48
49 VisualizationTrack& operator=(const VisualizationTrack& right)
50 {
51 if (&right == this)
52 return *this;
53
54 m_title = right.m_title;
55 m_artist = right.m_artist;
56 m_album = right.m_album;
57 m_albumArtist = right.m_albumArtist;
58 m_genre = right.m_genre;
59 m_comment = right.m_comment;
60 m_lyrics = right.m_lyrics;
61
62 m_trackNumber = right.m_trackNumber;
63 m_discNumber = right.m_discNumber;
64 m_duration = right.m_duration;
65 m_year = right.m_year;
66 m_rating = right.m_rating;
67 return *this;
68 }
90
93
95 void SetTitle(const std::string& title) { m_title = title; }
96
98 const std::string& GetTitle() const { return m_title; }
99
101 void SetArtist(const std::string& artist) { m_artist = artist; }
102
104 const std::string& GetArtist() const { return m_artist; }
105
107 void SetAlbum(const std::string& album) { m_album = album; }
108
110 const std::string& GetAlbum() const { return m_album; }
111
113 void SetAlbumArtist(const std::string& albumArtist) { m_albumArtist = albumArtist; }
114
116 const std::string& GetAlbumArtist() const { return m_albumArtist; }
117
119 void SetGenre(const std::string& genre) { m_genre = genre; }
120
122 const std::string& GetGenre() const { return m_genre; }
123
125 void SetDuration(int duration) { m_duration = duration; }
126
128 int GetDuration() const { return m_duration; }
129
131 void SetTrack(int trackNumber) { m_trackNumber = trackNumber; }
132
134 int GetTrack() const { return m_trackNumber; }
135
137 void SetDisc(int discNumber) { m_discNumber = discNumber; }
138
140 int GetDisc() const { return m_discNumber; }
141
143 void SetYear(int year) { m_year = year; }
144
146 int GetYear() const { return m_year; }
147
149 void SetLyrics(const std::string& lyrics) { m_lyrics = lyrics; }
150
152 const std::string& GetLyrics() const { return m_lyrics; }
153
155 void SetRating(int rating) { m_rating = rating; }
156
158 int GetRating() const { return m_rating; }
159
161 void SetComment(const std::string& comment) { m_comment = comment; }
162
164 const std::string& GetComment() const { return m_comment; }
165
167
168private:
170 {
171 if (!tag)
172 return;
173
174 m_title = tag->title ? tag->title : "";
175 m_artist = tag->artist ? tag->artist : "";
176 m_album = tag->album ? tag->album : "";
177 m_albumArtist = tag->albumArtist ? tag->albumArtist : "";
178 m_genre = tag->genre ? tag->genre : "";
179 m_comment = tag->comment ? tag->comment : "";
180 m_lyrics = tag->lyrics ? tag->lyrics : "";
181
182 m_trackNumber = tag->trackNumber;
183 m_discNumber = tag->discNumber;
184 m_duration = tag->duration;
185 m_year = tag->year;
186 m_rating = tag->rating;
187 }
188
189 std::string m_title;
190 std::string m_artist;
191 std::string m_album;
192 std::string m_albumArtist;
193 std::string m_genre;
194 std::string m_comment;
195 std::string m_lyrics;
196
197 int m_trackNumber = 0;
198 int m_discNumber = 0;
199 int m_duration = 0;
200 int m_year = 0;
201 int m_rating = 0;
202};
204//------------------------------------------------------------------------------
205
206//==============================================================================
214
215//==============================================================================
385class ATTR_DLL_LOCAL CInstanceVisualization : public IAddonInstance
386{
387public:
388 //============================================================================
396 : IAddonInstance(IInstanceInfo(CPrivateBase::m_interface->firstKodiInstance))
397 {
398 if (CPrivateBase::m_interface->globalSingleInstance != nullptr)
399 throw std::logic_error(
400 "kodi::addon::CInstanceVisualization: Cannot create multiple instances of add-on.");
401
402 SetAddonStruct(CPrivateBase::m_interface->firstKodiInstance);
403 CPrivateBase::m_interface->globalSingleInstance = this;
404 }
405 //----------------------------------------------------------------------------
406
407 //==========================================================================
445 explicit CInstanceVisualization(const IInstanceInfo& instance) : IAddonInstance(instance)
446 {
447 if (CPrivateBase::m_interface->globalSingleInstance != nullptr)
448 throw std::logic_error("kodi::addon::CInstanceVisualization: Creation of multiple together "
449 "with single instance way is not allowed!");
450
451 SetAddonStruct(instance);
452 }
453 //----------------------------------------------------------------------------
454
455 //============================================================================
459 ~CInstanceVisualization() override = default;
460 //----------------------------------------------------------------------------
461
462 //============================================================================
471 virtual bool Init() { return true; }
472 //----------------------------------------------------------------------------
473
474 //============================================================================
478 virtual void DeInit() {}
479 //----------------------------------------------------------------------------
480
481 //============================================================================
492 virtual bool AudioStart(int channels, int samplesPerSec, int bitsPerSample) { return true; }
493 //----------------------------------------------------------------------------
494
495 //============================================================================
500 virtual void AudioStop() {}
501 //----------------------------------------------------------------------------
502
503 //============================================================================
511 virtual int AudioGetSyncDelay() { return 0; }
512 //----------------------------------------------------------------------------
513 //
514 //============================================================================
521 virtual void AudioData(const float* audioData, size_t audioDataLength) {}
522 //----------------------------------------------------------------------------
523
524 //============================================================================
531 virtual bool IsDirty() { return true; }
532 //----------------------------------------------------------------------------
533
534 //============================================================================
538 virtual void Render() {}
539 //----------------------------------------------------------------------------
540
541 //============================================================================
551 virtual bool GetPresets(std::vector<std::string>& presets) { return false; }
552 //----------------------------------------------------------------------------
553
554 //============================================================================
560 virtual int GetActivePreset() { return -1; }
561 //----------------------------------------------------------------------------
562
563 //============================================================================
569 virtual bool IsLocked() { return false; }
570 //----------------------------------------------------------------------------
571
572 //============================================================================
578 virtual bool PrevPreset() { return false; }
579 //----------------------------------------------------------------------------
580
581 //============================================================================
587 virtual bool NextPreset() { return false; }
588 //----------------------------------------------------------------------------
589
590 //============================================================================
599 virtual bool LoadPreset(int select) { return false; }
600 //----------------------------------------------------------------------------
601
602 //============================================================================
608 virtual bool RandomPreset() { return false; }
609 //----------------------------------------------------------------------------
610
611 //============================================================================
618 virtual bool LockPreset(bool lockUnlock) { return false; }
619 //----------------------------------------------------------------------------
620
621 //============================================================================
629 virtual bool RatePreset(bool plusMinus) { return false; }
630 //----------------------------------------------------------------------------
631
632 //============================================================================
639 virtual bool UpdateAlbumart(const std::string& albumart) { return false; }
640 //----------------------------------------------------------------------------
641
642 //============================================================================
679 virtual bool UpdateTrack(const kodi::addon::VisualizationTrack& track) { return false; }
680 //----------------------------------------------------------------------------
681
682 //============================================================================
689
690 //============================================================================
701 inline void TransferPresets(const std::vector<std::string>& presets)
702 {
703 m_instanceData->visualization->toKodi->clear_presets(m_instanceData->info->kodi);
704 for (const auto& it : presets)
705 m_instanceData->visualization->toKodi->transfer_preset(m_instanceData->info->kodi,
706 it.c_str());
707 }
708 //----------------------------------------------------------------------------
709
710 //============================================================================
731 inline kodi::HardwareContext Device() { return m_props.device; }
732 //----------------------------------------------------------------------------
733
734 //============================================================================
740 inline int X() { return m_props.x; }
741 //----------------------------------------------------------------------------
742
743 //============================================================================
749 inline int Y() { return m_props.y; }
750 //----------------------------------------------------------------------------
751
752 //============================================================================
758 inline int Width() { return m_props.width; }
759 //----------------------------------------------------------------------------
760
761 //============================================================================
767 inline int Height() { return m_props.height; }
768 //----------------------------------------------------------------------------
769
770 //============================================================================
777 inline float PixelRatio() { return m_props.pixelRatio; }
778 //----------------------------------------------------------------------------
779
781
782private:
783 void SetAddonStruct(KODI_ADDON_INSTANCE_STRUCT* instance)
784 {
785 m_instanceData = instance;
786 m_instanceData->hdl = this;
787 m_instanceData->visualization->toAddon->init = ADDON_init;
788 m_instanceData->visualization->toAddon->deinit = ADDON_deinit;
789 m_instanceData->visualization->toAddon->audio_start = ADDON_audio_start;
790 m_instanceData->visualization->toAddon->audio_stop = ADDON_audio_stop;
791 m_instanceData->visualization->toAddon->audio_get_sync_delay = ADDON_audio_get_sync_delay;
792 m_instanceData->visualization->toAddon->audio_data = ADDON_audio_data;
793 m_instanceData->visualization->toAddon->is_dirty = ADDON_is_dirty;
794 m_instanceData->visualization->toAddon->render = ADDON_render;
795 m_instanceData->visualization->toAddon->prev_preset = ADDON_prev_preset;
796 m_instanceData->visualization->toAddon->next_preset = ADDON_next_preset;
797 m_instanceData->visualization->toAddon->load_preset = ADDON_load_preset;
798 m_instanceData->visualization->toAddon->random_preset = ADDON_random_preset;
799 m_instanceData->visualization->toAddon->lock_preset = ADDON_lock_preset;
800 m_instanceData->visualization->toAddon->rate_preset = ADDON_rate_preset;
801 m_instanceData->visualization->toAddon->update_albumart = ADDON_update_albumart;
802 m_instanceData->visualization->toAddon->update_track = ADDON_update_track;
803 m_instanceData->visualization->toAddon->get_presets = ADDON_get_presets;
804 m_instanceData->visualization->toAddon->get_active_preset = ADDON_get_active_preset;
805 m_instanceData->visualization->toAddon->is_locked = ADDON_is_locked;
806
807 m_instanceData->visualization->toKodi->get_properties(instance->info->kodi, &m_props);
808 }
809
810 inline static bool ADDON_init(const KODI_ADDON_VISUALIZATION_HDL hdl)
811 {
812 CInstanceVisualization* thisClass = static_cast<CInstanceVisualization*>(hdl);
813 thisClass->m_renderHelper = kodi::gui::GetRenderHelper();
814 return thisClass->Init();
815 }
816
817 inline static void ADDON_deinit(const KODI_ADDON_VISUALIZATION_HDL hdl)
818 {
819 CInstanceVisualization* thisClass = static_cast<CInstanceVisualization*>(hdl);
820 thisClass->DeInit();
821 thisClass->m_renderHelper = nullptr;
822 }
823
824 inline static bool ADDON_audio_start(const KODI_ADDON_VISUALIZATION_HDL hdl,
825 int channels,
826 int samplesPerSec,
827 int bitsPerSample)
828 {
829 return static_cast<CInstanceVisualization*>(hdl)->AudioStart(channels, samplesPerSec,
830 bitsPerSample);
831 }
832
833 inline static void ADDON_audio_stop(const KODI_ADDON_VISUALIZATION_HDL hdl)
834 {
835 static_cast<CInstanceVisualization*>(hdl)->AudioStop();
836 }
837
838 inline static int ADDON_audio_get_sync_delay(const KODI_ADDON_VISUALIZATION_HDL hdl)
839 {
840 return static_cast<CInstanceVisualization*>(hdl)->AudioGetSyncDelay();
841 }
842
843 inline static void ADDON_audio_data(const KODI_ADDON_VISUALIZATION_HDL hdl,
844 const float* audioData,
845 size_t audioDataLength)
846 {
847 static_cast<CInstanceVisualization*>(hdl)->AudioData(audioData, audioDataLength);
848 }
849
850 inline static bool ADDON_is_dirty(const KODI_ADDON_VISUALIZATION_HDL hdl)
851 {
852 return static_cast<CInstanceVisualization*>(hdl)->IsDirty();
853 }
854
855 inline static void ADDON_render(const KODI_ADDON_VISUALIZATION_HDL hdl)
856 {
857 CInstanceVisualization* thisClass = static_cast<CInstanceVisualization*>(hdl);
858 if (!thisClass->m_renderHelper)
859 return;
860 thisClass->m_renderHelper->Begin();
861 thisClass->Render();
862 thisClass->m_renderHelper->End();
863 }
864
865 inline static unsigned int ADDON_get_presets(const KODI_ADDON_VISUALIZATION_HDL hdl)
866 {
867 CInstanceVisualization* thisClass = static_cast<CInstanceVisualization*>(hdl);
868 std::vector<std::string> presets;
869 if (thisClass->GetPresets(presets))
870 {
871 for (const auto& it : presets)
872 thisClass->m_instanceData->visualization->toKodi->transfer_preset(
873 thisClass->m_instanceData->info->kodi, it.c_str());
874 }
875
876 return static_cast<unsigned int>(presets.size());
877 }
878
879 inline static int ADDON_get_active_preset(const KODI_ADDON_VISUALIZATION_HDL hdl)
880 {
881 return static_cast<CInstanceVisualization*>(hdl)->GetActivePreset();
882 }
883
884 inline static bool ADDON_prev_preset(const KODI_ADDON_VISUALIZATION_HDL hdl)
885 {
886 return static_cast<CInstanceVisualization*>(hdl)->PrevPreset();
887 }
888
889 inline static bool ADDON_next_preset(const KODI_ADDON_VISUALIZATION_HDL hdl)
890 {
891 return static_cast<CInstanceVisualization*>(hdl)->NextPreset();
892 }
893
894 inline static bool ADDON_load_preset(const KODI_ADDON_VISUALIZATION_HDL hdl, int select)
895
896 {
897 return static_cast<CInstanceVisualization*>(hdl)->LoadPreset(select);
898 }
899
900 inline static bool ADDON_random_preset(const KODI_ADDON_VISUALIZATION_HDL hdl)
901 {
902 return static_cast<CInstanceVisualization*>(hdl)->RandomPreset();
903 }
904
905 inline static bool ADDON_lock_preset(const KODI_ADDON_VISUALIZATION_HDL hdl)
906 {
907 CInstanceVisualization* thisClass = static_cast<CInstanceVisualization*>(hdl);
908 thisClass->m_presetLockedByUser = !thisClass->m_presetLockedByUser;
909 return thisClass->LockPreset(thisClass->m_presetLockedByUser);
910 }
911
912 inline static bool ADDON_rate_preset(const KODI_ADDON_VISUALIZATION_HDL hdl, bool plus_minus)
913 {
914 return static_cast<CInstanceVisualization*>(hdl)->RatePreset(plus_minus);
915 }
916
917 inline static bool ADDON_is_locked(const KODI_ADDON_VISUALIZATION_HDL hdl)
918 {
919 return static_cast<CInstanceVisualization*>(hdl)->IsLocked();
920 }
921
922 inline static bool ADDON_update_albumart(const KODI_ADDON_VISUALIZATION_HDL hdl,
923 const char* albumart)
924 {
925 return static_cast<CInstanceVisualization*>(hdl)->UpdateAlbumart(albumart);
926 }
927
928 inline static bool ADDON_update_track(const KODI_ADDON_VISUALIZATION_HDL hdl,
930 {
931 VisualizationTrack cppTrack(track);
932 return static_cast<CInstanceVisualization*>(hdl)->UpdateTrack(cppTrack);
933 }
934
935 std::shared_ptr<kodi::gui::IRenderHelper> m_renderHelper;
936 bool m_presetLockedByUser = false;
937 KODI_ADDON_INSTANCE_STRUCT* m_instanceData{nullptr};
939};
940
941} /* namespace addon */
942} /* namespace kodi */
943#endif /* __cplusplus */
Definition Visualization.h:386
Definition AddonBase.h:566
Definition AddonBase.h:502
Definition Visualization.h:39
int Height()
Returns the height of the rendering window.
Definition Visualization.h:767
kodi::HardwareContext Device()
Device that represents the display adapter.
Definition Visualization.h:731
void TransferPresets(const std::vector< std::string > &presets)
To transfer available presets on addon.
Definition Visualization.h:701
int X()
Returns the X position of the rendering window.
Definition Visualization.h:740
int Width()
Returns the width of the rendering window.
Definition Visualization.h:758
int Y()
Returns the Y position of the rendering window.
Definition Visualization.h:749
float PixelRatio()
Pixel aspect ratio (often abbreviated PAR) is a ratio that describes how the width of a pixel compare...
Definition Visualization.h:777
int GetDisc() const
Get disk number (if present)
Definition Visualization.h:140
const std::string & GetAlbumArtist() const
Get album artist names, as a single string-.
Definition Visualization.h:116
void SetAlbum(const std::string &album)
Set Album that the current song is from.
Definition Visualization.h:107
void SetTrack(int trackNumber)
Set track number (if present) from music info as integer.
Definition Visualization.h:131
void SetComment(const std::string &comment)
Set additional information comment (if present).
Definition Visualization.h:161
void SetDuration(int duration)
Set the duration of music as integer from info.
Definition Visualization.h:125
int GetYear() const
Get year that the current song was released.
Definition Visualization.h:146
void SetLyrics(const std::string &lyrics)
Set string from lyrics.
Definition Visualization.h:149
int GetRating() const
Get the user-defined rating of the current song.
Definition Visualization.h:158
const std::string & GetAlbum() const
Get Album that the current song is from.
Definition Visualization.h:110
void SetTitle(const std::string &title)
Set title of the current song.
Definition Visualization.h:95
void SetArtist(const std::string &artist)
Set artist names, as a single string-.
Definition Visualization.h:101
void SetAlbumArtist(const std::string &albumArtist)
Set album artist names, as a single stringalbum artist name.
Definition Visualization.h:113
const std::string & GetComment() const
Get additional information comment (if present).
Definition Visualization.h:164
int GetDuration() const
Get the duration of music as integer from info.
Definition Visualization.h:128
const std::string & GetGenre() const
Get genre name from music as string if present.
Definition Visualization.h:122
void SetDisc(int discNumber)
Set disk number (if present) from music info as integer.
Definition Visualization.h:137
const std::string & GetLyrics() const
Get string from lyrics.
Definition Visualization.h:152
void SetRating(int rating)
Set the user-defined rating of the current song.
Definition Visualization.h:155
void SetYear(int year)
Set year that the current song was released.
Definition Visualization.h:143
const std::string & GetTitle() const
Get title of the current song.
Definition Visualization.h:98
int GetTrack() const
Get track number (if present).
Definition Visualization.h:134
void SetGenre(const std::string &genre)
Set genre name from music as string if present.
Definition Visualization.h:119
const std::string & GetArtist() const
Get artist names, as a single string-.
Definition Visualization.h:104
virtual bool LockPreset(bool lockUnlock)
Lock the current visualization preset, preventing it from changing.
Definition Visualization.h:618
virtual bool AudioStart(int channels, int samplesPerSec, int bitsPerSample)
Used to notify the visualization that a new song has been started.
Definition Visualization.h:492
virtual void Render()
Used to indicate when the add-on should render.
Definition Visualization.h:538
virtual void AudioStop()
Used to inform the visualization that the rendering control was stopped.
Definition Visualization.h:500
virtual bool RandomPreset()
Switch to a new random preset.
Definition Visualization.h:608
virtual int AudioGetSyncDelay()
Used to get the number of buffers from the current visualization.
Definition Visualization.h:511
virtual bool LoadPreset(int select)
Load a visualization preset.
Definition Visualization.h:599
virtual bool IsDirty()
Used to inform Kodi that the rendered region is dirty and need an update.
Definition Visualization.h:531
virtual bool UpdateTrack(const kodi::addon::VisualizationTrack &track)
Inform the visualization of the current track's tag information.
Definition Visualization.h:679
virtual bool PrevPreset()
Load the previous visualization preset.
Definition Visualization.h:578
virtual bool GetPresets(std::vector< std::string > &presets)
Used to get a list of visualization presets the user can select. from.
Definition Visualization.h:551
virtual void AudioData(const float *audioData, size_t audioDataLength)
Pass audio data to the visualization.
Definition Visualization.h:521
virtual void DeInit()
Called from Kodi to Deinitialize the visualization.
Definition Visualization.h:478
virtual int GetActivePreset()
Get the index of the current preset.
Definition Visualization.h:560
~CInstanceVisualization() override=default
Destructor.
CInstanceVisualization()
Visualization class constructor.
Definition Visualization.h:395
virtual bool NextPreset()
Load the next visualization preset.
Definition Visualization.h:587
virtual bool UpdateAlbumart(const std::string &albumart)
Inform the visualization of the current album art image.
Definition Visualization.h:639
virtual bool IsLocked()
Check if the add-on is locked to the current preset.
Definition Visualization.h:569
CInstanceVisualization(const IInstanceInfo &instance)
Visualization class constructor used to support multiple instance types.
Definition Visualization.h:445
virtual bool RatePreset(bool plusMinus)
Used to increase/decrease the visualization preset rating.
Definition Visualization.h:629
virtual bool Init()
Called from Kodi to Initialize the visualization.
Definition Visualization.h:471
Definition addon_base.h:269
Definition visualization.h:45
Definition visualization.h:22
Internal used structure to have stored C API data above and available for everything below.
Definition AddonBase.h:73