TrackPlayer.h 2.0 KB

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