ChunkedAudioStream.h 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #ifndef CHUNKEDAUDIOSTREAM_H
  2. #define CHUNKEDAUDIOSTREAM_H
  3. #include <iostream>
  4. #include <vector>
  5. #include <fstream>
  6. #include <array>
  7. #include <unistd.h>
  8. #include <atomic>
  9. #include "ivorbisfile.h"
  10. #include "MercuryManager.h"
  11. #include "AudioSink.h"
  12. #include "AudioChunk.h"
  13. #include "platform/WrappedMutex.h"
  14. #include "ChunkedByteStream.h"
  15. #define SPOTIFY_HEADER_SIZE 167
  16. #define BUFFER_SIZE 0x20000 * 1.5
  17. typedef std::function<void(std::vector<uint8_t>&)> pcmDataCallback;
  18. enum class Whence
  19. {
  20. START,
  21. CURRENT,
  22. END
  23. };
  24. class ChunkedAudioStream
  25. {
  26. private:
  27. // Vorbis related
  28. OggVorbis_File vorbisFile;
  29. ov_callbacks vorbisCallbacks;
  30. int currentSection;
  31. // Audio data
  32. uint32_t duration;
  33. bool loadingChunks = false;
  34. uint16_t lastSequenceId = 0;
  35. std::shared_ptr<MercuryManager> manager;
  36. std::vector<uint8_t> fileId;
  37. uint32_t startPositionMs;
  38. public:
  39. ChunkedAudioStream(std::vector<uint8_t> fileId, std::vector<uint8_t> audioKey, uint32_t duration, std::shared_ptr<MercuryManager> manager, uint32_t startPositionMs, bool isPaused);
  40. ~ChunkedAudioStream();
  41. std::shared_ptr<ChunkedByteStream> byteStream;
  42. std::function<void()> streamFinishedCallback;
  43. std::atomic<bool> isPaused = false;
  44. std::atomic<bool> isRunning = false;
  45. std::atomic<bool> finished = false;
  46. pcmDataCallback pcmCallback;
  47. std::shared_ptr<AudioSink> audioSink;
  48. WrappedMutex seekMutex;
  49. std::vector<uint8_t> read(size_t bytes);
  50. void seekMs(uint32_t positionMs);
  51. void seek(size_t pos, Whence whence);
  52. void startPlaybackLoop();
  53. };
  54. #endif