ChunkedAudioStream.h 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. #define SPOTIFY_HEADER_SIZE 167
  15. #define BUFFER_SIZE 0x20000 * 1.5
  16. typedef std::function<void(std::vector<uint8_t>&)> pcmDataCallback;
  17. enum class Whence
  18. {
  19. START,
  20. CURRENT,
  21. END
  22. };
  23. class ChunkedAudioStream
  24. {
  25. private:
  26. // Vorbis related
  27. OggVorbis_File vorbisFile;
  28. ov_callbacks vorbisCallbacks;
  29. int currentSection;
  30. // Audio chunking
  31. std::vector<uint8_t> audioKey;
  32. std::vector<std::shared_ptr<AudioChunk>> chunks;
  33. // Audio data
  34. uint32_t duration;
  35. bool loadingChunks = false;
  36. uint16_t lastSequenceId = 0;
  37. std::shared_ptr<MercuryManager> manager;
  38. std::vector<uint8_t> fileId;
  39. uint32_t startPositionMs;
  40. std::shared_ptr<AudioChunk> requestChunk(size_t chunkIndex);
  41. void fetchTraillingPacket();
  42. std::shared_ptr<AudioChunk> findChunkForPosition(size_t position);
  43. public:
  44. ChunkedAudioStream(std::vector<uint8_t> fileId, std::vector<uint8_t> audioKey, uint32_t duration, std::shared_ptr<MercuryManager> manager, uint32_t startPositionMs, bool isPaused);
  45. ~ChunkedAudioStream();
  46. int requestedChunkIndex = 0;
  47. std::function<void()> streamFinishedCallback;
  48. size_t pos = SPOTIFY_HEADER_SIZE; // size of some spotify header
  49. uint32_t fileSize;
  50. uint32_t readBeforeSeek = 0;
  51. bool loadingMeta = true;
  52. std::atomic<bool> isPaused = false;
  53. std::atomic<bool> isRunning = false;
  54. std::atomic<bool> finished = false;
  55. pcmDataCallback pcmCallback;
  56. std::shared_ptr<AudioSink> audioSink;
  57. WrappedMutex seekMutex;
  58. std::vector<uint8_t> read(size_t bytes);
  59. void seekMs(uint32_t positionMs);
  60. void seek(size_t pos, Whence whence);
  61. void startPlaybackLoop();
  62. };
  63. #endif