#pragma once #include #include #include #include namespace WallpaperEngine::Media { class MediaSource { public: enum PlaybackState { Stopped = 0, Playing = 1, Paused = 2, }; struct MediaInfo { PlaybackState playbackState; std::string title; std::string artist; std::string album; std::optional url; double duration; double position; bool available; }; explicit MediaSource (std::chrono::milliseconds updateInterval); virtual ~MediaSource (); virtual void update (); /** * @param listener The callback to call when media info changes * * @return A function that can be called to remove the listener */ std::function addMetadataListener (std::function listener); /** * @param listener The callback to call when media info changes * * @return A function that can be called to remove the listener */ std::function addAlbumArtListener (std::function listener); [[nodiscard]] const MediaInfo& getMediaInfo () const { return m_mediaInfo; } protected: void fireMetadataListeners (); void fireAlbumArtListeners (); virtual void performUpdate () = 0; std::shared_ptr m_aliveFlag; uint32_t m_metadataListenerId = 0; std::map> m_metadataListeners; uint32_t m_albumArtListenerId = 0; std::map> m_albumArtListeners; MediaInfo m_mediaInfo; std::chrono::milliseconds m_updateInterval; std::chrono::time_point m_nextUpdate; }; }