TrackPlayer.h 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #pragma once
  2. #include <atomic> // for atomic
  3. #include <cstdint> // for uint8_t, int64_t
  4. #include <ctime> // for size_t, time
  5. #include <functional> // for function
  6. #include <memory> // for shared_ptr, unique_ptr
  7. #include <mutex> // for mutex
  8. #include <string_view> // for string_view
  9. #include <vector> // for vector
  10. #include "BellTask.h" // for Task
  11. #include "CDNTrackStream.h" // for CDNTrackStream, CDNTrackStream::TrackInfo
  12. namespace bell {
  13. class WrappedSemaphore;
  14. } // namespace bell
  15. #ifdef BELL_VORBIS_FLOAT
  16. #include "vorbis/vorbisfile.h"
  17. #else
  18. #include "ivorbisfile.h" // for OggVorbis_File, ov_callbacks
  19. #endif
  20. namespace cspot {
  21. class TrackProvider;
  22. struct Context;
  23. struct TrackReference;
  24. class TrackPlayer : bell::Task {
  25. public:
  26. typedef std::function<void()> TrackLoadedCallback;
  27. typedef std::function<size_t(uint8_t*, size_t, std::string_view, size_t)> DataCallback;
  28. typedef std::function<void()> EOFCallback;
  29. typedef std::function<bool()> isAiringCallback;
  30. TrackPlayer(std::shared_ptr<cspot::Context> ctx, isAiringCallback, EOFCallback, TrackLoadedCallback);
  31. ~TrackPlayer();
  32. void loadTrackFromRef(TrackReference& ref, size_t playbackMs, bool startAutomatically);
  33. void setDataCallback(DataCallback callback);
  34. CDNTrackStream::TrackInfo getCurrentTrackInfo();
  35. void seekMs(size_t ms);
  36. void stopTrack();
  37. // Vorbis codec callbacks
  38. size_t _vorbisRead(void* ptr, size_t size, size_t nmemb);
  39. size_t _vorbisClose();
  40. int _vorbisSeek(int64_t offset, int whence);
  41. long _vorbisTell();
  42. void destroy();
  43. private:
  44. std::shared_ptr<cspot::Context> ctx;
  45. std::shared_ptr<cspot::TrackProvider> trackProvider;
  46. std::shared_ptr<cspot::CDNTrackStream> currentTrackStream;
  47. size_t sequence = std::time(nullptr);
  48. std::unique_ptr<bell::WrappedSemaphore> playbackSemaphore;
  49. TrackLoadedCallback trackLoaded;
  50. DataCallback dataCallback = nullptr;
  51. EOFCallback eofCallback;
  52. isAiringCallback isAiring;
  53. // Playback control
  54. std::atomic<bool> currentSongPlaying;
  55. std::mutex playbackMutex;
  56. std::mutex seekMutex;
  57. // Vorbis related
  58. OggVorbis_File vorbisFile;
  59. ov_callbacks vorbisCallbacks;
  60. int currentSection;
  61. std::vector<uint8_t> pcmBuffer = std::vector<uint8_t>(1024);
  62. size_t playbackPosition = 0;
  63. bool autoStart = false;
  64. std::atomic<bool> isRunning = true;
  65. std::mutex runningMutex;
  66. void runTask() override;
  67. };
  68. } // namespace cspot