LibAudio: Allow generating sine waves

This commit is contained in:
2026-08-24 01:44:04 +03:00
parent 2e22ebf0b5
commit c6a435ed36
5 changed files with 79 additions and 15 deletions
+6 -14
View File
@@ -23,25 +23,17 @@ namespace LibAudio
return result; return result;
} }
BAN::ErrorOr<Audio> Audio::load(BAN::StringView path) BAN::ErrorOr<Audio> Audio::create(BAN::UniqPtr<AudioStream>&& audio_stream)
{ {
Audio result(TRY(AudioStream::load(path))); Audio result(BAN::move(audio_stream));
TRY(result.initialize(256 * 1024)); TRY(result.initialize(result.m_audio_stream->channels() * result.m_audio_stream->sample_rate()));
return result; return result;
} }
BAN::ErrorOr<Audio> Audio::random(uint32_t samples) BAN::ErrorOr<Audio> Audio::load(BAN::StringView path)
{ {
Audio result; Audio result(TRY(AudioStream::load(path)));
TRY(result.initialize(samples)); TRY(result.initialize(result.m_audio_stream->channels() * result.m_audio_stream->sample_rate()));
result.m_audio_buffer->sample_rate = 48000;
result.m_audio_buffer->channels = 1;
for (size_t i = 0; i < samples - 1; i++)
result.m_audio_buffer->samples[i] = (rand() - RAND_MAX / 2) / (RAND_MAX / 2.0);
result.m_audio_buffer->head = samples - 1;
return result; return result;
} }
@@ -0,0 +1,36 @@
#include <LibAudio/AudioStreams/SineWaveAudioStream.h>
#include <BAN/Math.h>
namespace LibAudio
{
BAN::ErrorOr<BAN::UniqPtr<AudioStream>> SineWaveAudioStream::create(uint32_t channels, uint32_t sample_rate, float frequency)
{
auto* stream_ptr = new SineWaveAudioStream(channels, sample_rate, frequency);
if (stream_ptr == nullptr)
return BAN::Error::from_errno(ENOMEM);
return BAN::UniqPtr<AudioStream>::adopt(stream_ptr);
}
SineWaveAudioStream::SineWaveAudioStream(uint32_t channels, uint32_t sample_rate, float frequency)
: m_channels(channels)
, m_sample_rate(sample_rate)
, m_frequency(frequency)
, m_phase_inc(2.0f * BAN::numbers::pi_v<float> * m_frequency / m_sample_rate)
{ }
float SineWaveAudioStream::get_sample()
{
if (m_sample_idx++ % m_channels == 0)
{
m_phase += m_phase_inc;
if (m_phase >= 2.0f * BAN::numbers::pi_v<float>)
m_phase -= 2.0f * BAN::numbers::pi_v<float>;
m_sample = BAN::Math::sin(m_phase);
}
return m_sample;
}
}
@@ -2,6 +2,7 @@ set(LIBAUDIO_SOURCES
Audio.cpp Audio.cpp
AudioStream.cpp AudioStream.cpp
AudioStreams/WAVAudioStream.cpp AudioStreams/WAVAudioStream.cpp
AudioStreams/SineWaveAudioStream.cpp
) )
add_library(libaudio ${LIBAUDIO_SOURCES}) add_library(libaudio ${LIBAUDIO_SOURCES})
@@ -30,8 +30,8 @@ namespace LibAudio
public: public:
static BAN::ErrorOr<Audio> create(uint32_t channels, uint32_t sample_rate, uint32_t sample_frames); static BAN::ErrorOr<Audio> create(uint32_t channels, uint32_t sample_rate, uint32_t sample_frames);
static BAN::ErrorOr<Audio> create(BAN::UniqPtr<AudioStream>&&);
static BAN::ErrorOr<Audio> load(BAN::StringView path); static BAN::ErrorOr<Audio> load(BAN::StringView path);
static BAN::ErrorOr<Audio> random(uint32_t samples);
~Audio() { clear(); } ~Audio() { clear(); }
Audio(Audio&& other) { *this = BAN::move(other); } Audio(Audio&& other) { *this = BAN::move(other); }
@@ -0,0 +1,35 @@
#pragma once
#include <LibAudio/AudioStream.h>
#include <BAN/Limits.h>
namespace LibAudio
{
class SineWaveAudioStream : public AudioStream
{
public:
static BAN::ErrorOr<BAN::UniqPtr<AudioStream>> create(uint32_t channels, uint32_t sample_rate, float frequency);
uint32_t channels() const override { return m_channels; }
uint32_t sample_rate() const override { return m_sample_rate; }
uint32_t samples_remaining() const override { return BAN::numeric_limits<uint32_t>::max(); }
float get_sample() override;
private:
SineWaveAudioStream(uint32_t channels, uint32_t sample_rate, float frequency);
private:
const uint32_t m_channels;
const uint32_t m_sample_rate;
const float m_frequency;
const float m_phase_inc;
uint32_t m_sample_idx { 0 };
float m_sample { 0 };
float m_phase { 0 };
};
}