#pragma once #include #include #include #include // A single sample in an audio buffer. // Values are floating point, and should range from -1.0 to +1.0 struct ASample { ASample() : left(0) , right(0) {} // For mono ASample(float left) : left(left) , right(left) {} // For stereo ASample(float left, float right) : left(left) , right(right) {} void clip() { if (left > 1) left = 1; else if (left < -1) left = -1; if (right > 1) right = 1; else if (right < -1) right = -1; } ASample& operator+=(const ASample& other) { left += other.left; right += other.right; return *this; } float left; float right; }; // A buffer of audio samples, normalized to 44100hz. class ABuffer : public RefCounted { public: static RefPtr from_pcm_data(ByteBuffer& data, int num_channels, int bits_per_sample, int source_rate); static NonnullRefPtr create_with_samples(Vector&& samples) { return adopt(*new ABuffer(move(samples))); } const Vector& samples() const { return m_samples; } Vector& samples() { return m_samples; } const void* data() const { return m_samples.data(); } int size_in_bytes() const { return m_samples.size() * sizeof(ASample); } private: ABuffer(Vector&& samples) : m_samples(move(samples)) { } Vector m_samples; };