#ifndef PCM_CHUNK_H #define PCM_CHUNK_H #include "message.h" #include "wireChunk.h" #include "sampleFormat.h" typedef std::chrono::time_point time_point_ms; class PcmChunk : public WireChunk { public: PcmChunk(const SampleFormat& sampleFormat, size_t ms); PcmChunk(); ~PcmChunk(); int readFrames(void* outputBuffer, size_t frameCount); bool isEndOfChunk() const; inline time_point_ms timePoint() const { time_point_ms tp; std::chrono::milliseconds::rep relativeIdxTp = ((double)idx / ((double)format.rate/1000.)); return tp + std::chrono::seconds(tv_sec) + std::chrono::milliseconds(tv_usec / 1000) + std::chrono::milliseconds(relativeIdxTp); } template inline T getAge() const { return getAge(timePoint()); } inline long getAge() const { return getAge().count(); } inline static long getAge(const time_point_ms& time_point) { return getAge(time_point).count(); } template static inline T getAge(const std::chrono::time_point& time_point) { return std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - time_point); } int seek(int frames); double getDuration() const; double getDurationUs() const; double getTimeLeft() const; double getFrameCount() const; SampleFormat format; private: // SampleFormat format_; uint32_t idx; }; #endif