MediaSource.h 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #pragma once
  2. #include <chrono>
  3. #include <functional>
  4. #include <map>
  5. #include <string>
  6. namespace WallpaperEngine::Media {
  7. class MediaSource {
  8. public:
  9. enum PlaybackState {
  10. Stopped = 0,
  11. Playing = 1,
  12. Paused = 2,
  13. };
  14. struct MediaInfo {
  15. PlaybackState playbackState;
  16. std::string title;
  17. std::string artist;
  18. std::string album;
  19. std::optional<std::string> url;
  20. double duration;
  21. double position;
  22. bool available;
  23. };
  24. explicit MediaSource (std::chrono::milliseconds updateInterval);
  25. virtual ~MediaSource ();
  26. virtual void update ();
  27. /**
  28. * @param listener The callback to call when media info changes
  29. *
  30. * @return A function that can be called to remove the listener
  31. */
  32. std::function<void ()> addMetadataListener (std::function<void (const MediaInfo&)> listener);
  33. /**
  34. * @param listener The callback to call when media info changes
  35. *
  36. * @return A function that can be called to remove the listener
  37. */
  38. std::function<void ()> addAlbumArtListener (std::function<void (const MediaInfo&)> listener);
  39. [[nodiscard]] const MediaInfo& getMediaInfo () const { return m_mediaInfo; }
  40. protected:
  41. void fireMetadataListeners ();
  42. void fireAlbumArtListeners ();
  43. virtual void performUpdate () = 0;
  44. std::shared_ptr<bool> m_aliveFlag;
  45. uint32_t m_metadataListenerId = 0;
  46. std::map<uint32_t, std::function<void (MediaInfo&)>> m_metadataListeners;
  47. uint32_t m_albumArtListenerId = 0;
  48. std::map<uint32_t, std::function<void (MediaInfo&)>> m_albumArtListeners;
  49. MediaInfo m_mediaInfo;
  50. std::chrono::milliseconds m_updateInterval;
  51. std::chrono::time_point<std::chrono::steady_clock> m_nextUpdate;
  52. };
  53. }