| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 | 
							- #ifndef CSPOT_CHUNKEDBYTESTREAM_H
 
- #define CSPOT_CHUNKEDBYTESTREAM_H
 
- #include "ByteStream.h"
 
- #include "BellLogger.h"
 
- #include <memory>
 
- #include "MercuryManager.h"
 
- #include "stdint.h"
 
- class ChunkedByteStream : public bell::ByteStream {
 
- private:
 
-     // AES key used for data decryption
 
-     std::vector<uint8_t> audioKey;
 
-     // Spotify internal fileId
 
-     std::vector<uint8_t> fileId;
 
-     // Buffer for storing currently read chunks
 
-     std::vector<std::shared_ptr<AudioChunk>> chunks;
 
-     // Current position of the read pointer
 
-     size_t pos = 0;
 
-     size_t fileSize = -1;
 
-     std::mutex readMutex;
 
-     std::atomic<bool> loadAheadEnabled = false;
 
-     std::shared_ptr<MercuryManager> mercuryManager;
 
-     /**
 
-      * Returns an audio chunk for given position.
 
-      * @param position requested position
 
-      * @return matching audio chunk, or nullptr if no chunk is available
 
-      */
 
-     std::shared_ptr<AudioChunk> getChunkForPosition(size_t position);
 
-     /**
 
-      * Requests a new audio chunk from mercury manager. Returns its structure immediately.
 
-      * @param position index of a chunk to request
 
-      * @return requested chunk
 
-      */
 
-     std::shared_ptr<AudioChunk> requestChunk(uint16_t position);
 
-     /**
 
-      * Tries to read data from a given audio chunk.
 
-      * @param buffer destination buffer
 
-      * @param bytes number of bytes to read
 
-      * @param chunk `AudioChunk` to read from
 
-      * @return number of bytes read
 
-      */
 
-     size_t attemptRead(uint8_t *buffer, size_t bytes, std::shared_ptr<AudioChunk> chunk);
 
- public:
 
-     ChunkedByteStream(std::shared_ptr<MercuryManager> manager);
 
-     ~ChunkedByteStream() {};
 
-     /**
 
-      * Requests first chunk from the file, and then fills file information based on its header
 
-      */
 
-     void fetchFileInformation();
 
-     /**
 
-      * Enables / disables load-ahead of chunks.
 
-      * @param loadAhead true to enable load ahead
 
-      */
 
-     void setEnableLoadAhead(bool loadAhead);
 
-     /**
 
-      * Sets information about given spotify file, necessary for chunk request
 
-      * @param fileId id of given audio file
 
-      * @param audioKey audio key used for decryption
 
-      */
 
-     void setFileInfo(std::vector<uint8_t>& fileId, std::vector<uint8_t>& audioKey);
 
-     // ---- ByteStream methods ----
 
-     /**
 
-      * Reads given amount of bytes from stream. Data is OPUS encoded.
 
-      * @param buffer buffer to read into
 
-      * @param size amount of bytes to read
 
-      * @return amount of bytes read
 
-      */
 
-     size_t read(uint8_t *buf, size_t nbytes);
 
-     /**
 
-      * Seeks to given position in stream
 
-      * @param pos position to seek to
 
-      */
 
-     void seek(size_t pos);
 
-     /**
 
-      * skip given amount of bytes in stream.
 
-      * @param nbytes amount of bytes to skip
 
-      */
 
-     size_t skip(size_t nbytes);
 
-     /**
 
-      * Returns current position in stream.
 
-      * @return position
 
-      */
 
-     size_t position();
 
-     /**
 
-      * Returns size of the file
 
-      * @return bytes in file
 
-      */
 
-     size_t size();
 
-     /**
 
-      * Close the reader
 
-      */
 
-     void close();
 
- };
 
- #endif //CSPOT_CHUNKEDBYTESTREAM_H
 
 
  |