Skip to content

Commit

Permalink
[drwav] Improve the writer
Browse files Browse the repository at this point in the history
  • Loading branch information
jcelerier committed Apr 8, 2024
1 parent f695698 commit 55466ff
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 6 deletions.
16 changes: 15 additions & 1 deletion src/ossia/audio/alsa_protocol.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ class libasound
pcm_hw_params_set_access = library.symbol<decltype(&::snd_pcm_hw_params_set_access)>(
"snd_pcm_hw_params_set_access");
pcm_hw_params_get_format = library.symbol<decltype(&::snd_pcm_hw_params_get_format)>(
"snd_pcm_hw_params_set_format");
"snd_pcm_hw_params_get_format");
pcm_hw_params_set_format = library.symbol<decltype(&::snd_pcm_hw_params_set_format)>(
"snd_pcm_hw_params_set_format");
pcm_hw_params_set_channels
Expand Down Expand Up @@ -450,6 +450,13 @@ class alsa_engine final : public audio_engine
});
m_activated = true;
break;
case SND_PCM_FORMAT_S24_3LE:
m_thread = std::thread([this] {
init_thread();
run_thread_deinterleaved<SND_PCM_FORMAT_S24_LE>();
});
m_activated = true;
break;
case SND_PCM_FORMAT_S32_LE:
m_thread = std::thread([this] {
init_thread();
Expand Down Expand Up @@ -487,6 +494,13 @@ class alsa_engine final : public audio_engine
});
m_activated = true;
break;
case SND_PCM_FORMAT_S24_3LE:
m_thread = std::thread([this] {
init_thread();
run_thread_interleaved<SND_PCM_FORMAT_S24_LE>();
});
m_activated = true;
break;
case SND_PCM_FORMAT_S32_LE:
m_thread = std::thread([this] {
init_thread();
Expand Down
36 changes: 31 additions & 5 deletions src/ossia/audio/drwav_write_handle.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,24 @@ struct drwav_write_handle
: impl{new drwav}
{
}

~drwav_write_handle()
{
close();
delete impl;
}

void open(std::string_view path, int channels, int rate, int bits)
{
close();

if(channels <= 0)
return;
if(rate <= 0)
return;
if(path.empty())
return;

format.container = drwav_container_riff;
format.format = DR_WAVE_FORMAT_PCM;
format.channels = channels;
Expand All @@ -30,23 +46,28 @@ struct drwav_write_handle
bool ok = drwav_init_file_write(impl, path.data(), &format, nullptr);

buffer.reserve(channels * 8192 * (bits / 8));
started = ok;
m_started = ok;
m_written_frames = 0;
}

void close()
{
if(impl)
{
if(started)
if(m_started)
{
drwav_uninit(impl);
}
}
started = false;
m_started = false;
m_written_frames = 0;
}

drwav_uint64 write_pcm_frames(drwav_uint64 frames, const double* const* in)
{
if(!m_started)
return 0;

this->buffer.clear();
this->buffer.resize(
frames * format.channels * (format.bitsPerSample / 8),
Expand All @@ -55,16 +76,19 @@ struct drwav_write_handle
switch(format.bitsPerSample)
{
case 16:
m_written_frames += frames;
interleave<int16_t, 16, 2>(
in, reinterpret_cast<int16_t*>(buffer.data()), format.channels, frames);

return drwav_write_raw(impl, frames * 2 * format.channels, buffer.data());
case 24:
m_written_frames += frames;
interleave<int32_t, 24, 3>(
in, reinterpret_cast<int32_t*>(buffer.data()), format.channels, frames);

return drwav_write_raw(impl, frames * 3 * format.channels, buffer.data());
case 32:
m_written_frames += frames;
interleave<int32_t, 32, 4>(
in, reinterpret_cast<int32_t*>(buffer.data()), format.channels, frames);

Expand All @@ -74,11 +98,13 @@ struct drwav_write_handle
return 0;
}

bool is_open() const noexcept { return started; }
bool is_open() const noexcept { return m_started; }
int64_t written_frames() const noexcept { return m_written_frames; }

private:
::drwav* impl{};
ossia::pod_vector<char> buffer;
bool started{};
bool m_started{};
int64_t m_written_frames = 0;
};
}

0 comments on commit 55466ff

Please sign in to comment.