1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 23:27:43 +00:00

Audio: Make ABuffer sit on top of a SharedBuffer.

This allows us to carry the same buffer all the way from the WAV loader
to the AudioServer mixer.

This alleviates some of the stutter, but there's still a noticeable
skip when switching buffers. We're gonna need to do better. :^)
This commit is contained in:
Andreas Kling 2019-07-27 18:17:17 +02:00
parent b805f112c2
commit 5e01dde7b1
6 changed files with 38 additions and 31 deletions

View file

@ -4,6 +4,7 @@
#include <AK/ByteBuffer.h>
#include <AK/Types.h>
#include <AK/Vector.h>
#include <LibC/SharedBuffer.h>
// A single sample in an audio buffer.
// Values are floating point, and should range from -1.0 to +1.0
@ -57,17 +58,29 @@ public:
{
return adopt(*new ABuffer(move(samples)));
}
static NonnullRefPtr<ABuffer> create_with_shared_buffer(NonnullRefPtr<SharedBuffer>&& buffer)
{
return adopt(*new ABuffer(move(buffer)));
}
const Vector<ASample>& samples() const { return m_samples; }
Vector<ASample>& samples() { return m_samples; }
const void* data() const { return m_samples.data(); }
int size_in_bytes() const { return m_samples.size() * sizeof(ASample); }
const ASample* samples() const { return (const ASample*)data(); }
int sample_count() const { return m_buffer->size() / (int)sizeof(ASample); }
const void* data() const { return m_buffer->data(); }
int size_in_bytes() const { return m_buffer->size(); }
int shared_buffer_id() const { return m_buffer->shared_buffer_id(); }
private:
ABuffer(Vector<ASample>&& samples)
: m_samples(move(samples))
explicit ABuffer(Vector<ASample>&& samples)
: m_buffer(*SharedBuffer::create_with_size(samples.size() * sizeof(ASample)))
{
memcpy(m_buffer->data(), samples.data(), samples.size() * sizeof(ASample));
}
explicit ABuffer(NonnullRefPtr<SharedBuffer>&& buffer)
: m_buffer(move(buffer))
{
}
Vector<ASample> m_samples;
NonnullRefPtr<SharedBuffer> m_buffer;
int m_sample_count { 0 };
};

View file

@ -254,5 +254,5 @@ RefPtr<ABuffer> ABuffer::from_pcm_data(ByteBuffer& data, int num_channels, int b
// don't belong.
ASSERT(!stream.handle_read_failure());
return adopt(*new ABuffer(move(fdata)));
return ABuffer::create_with_samples(move(fdata));
}