1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- #ifndef CHUNKEDAUDIOSTREAM_H
- #define CHUNKEDAUDIOSTREAM_H
- #include <iostream>
- #include <vector>
- #include <fstream>
- #include <array>
- #include <unistd.h>
- #include <atomic>
- #include "ivorbisfile.h"
- #include "MercuryManager.h"
- #include "AudioSink.h"
- #include "AudioChunk.h"
- #include "platform/WrappedMutex.h"
- #include "ChunkedByteStream.h"
- #define SPOTIFY_HEADER_SIZE 167
- #define BUFFER_SIZE 0x20000 * 1.5
- typedef std::function<void(std::vector<uint8_t>&)> pcmDataCallback;
- enum class Whence
- {
- START,
- CURRENT,
- END
- };
- class ChunkedAudioStream
- {
- private:
- // Vorbis related
- OggVorbis_File vorbisFile;
- ov_callbacks vorbisCallbacks;
- int currentSection;
- // Audio data
- uint32_t duration;
- bool loadingChunks = false;
- uint16_t lastSequenceId = 0;
- std::shared_ptr<MercuryManager> manager;
- std::vector<uint8_t> fileId;
- uint32_t startPositionMs;
- public:
- ChunkedAudioStream(std::vector<uint8_t> fileId, std::vector<uint8_t> audioKey, uint32_t duration, std::shared_ptr<MercuryManager> manager, uint32_t startPositionMs, bool isPaused);
- ~ChunkedAudioStream();
- std::shared_ptr<ChunkedByteStream> byteStream;
- std::function<void()> streamFinishedCallback;
- std::atomic<bool> isPaused = false;
- std::atomic<bool> isRunning = false;
- std::atomic<bool> finished = false;
- pcmDataCallback pcmCallback;
- std::shared_ptr<AudioSink> audioSink;
- WrappedMutex seekMutex;
- std::vector<uint8_t> read(size_t bytes);
- void seekMs(uint32_t positionMs);
- void seek(size_t pos, Whence whence);
- void startPlaybackLoop();
- };
- #endif
|