LibAudio: Allow generating sine waves
This commit is contained in:
@@ -23,25 +23,17 @@ namespace LibAudio
|
||||
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)));
|
||||
TRY(result.initialize(256 * 1024));
|
||||
Audio result(BAN::move(audio_stream));
|
||||
TRY(result.initialize(result.m_audio_stream->channels() * result.m_audio_stream->sample_rate()));
|
||||
return result;
|
||||
}
|
||||
|
||||
BAN::ErrorOr<Audio> Audio::random(uint32_t samples)
|
||||
BAN::ErrorOr<Audio> Audio::load(BAN::StringView path)
|
||||
{
|
||||
Audio result;
|
||||
TRY(result.initialize(samples));
|
||||
|
||||
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;
|
||||
|
||||
Audio result(TRY(AudioStream::load(path)));
|
||||
TRY(result.initialize(result.m_audio_stream->channels() * result.m_audio_stream->sample_rate()));
|
||||
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
|
||||
AudioStream.cpp
|
||||
AudioStreams/WAVAudioStream.cpp
|
||||
AudioStreams/SineWaveAudioStream.cpp
|
||||
)
|
||||
|
||||
add_library(libaudio ${LIBAUDIO_SOURCES})
|
||||
|
||||
@@ -30,8 +30,8 @@ namespace LibAudio
|
||||
|
||||
public:
|
||||
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> random(uint32_t samples);
|
||||
~Audio() { clear(); }
|
||||
|
||||
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 };
|
||||
};
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user