mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 14:17:36 +00:00
LibAudio: Use Encoder interface for WavWriter
The only real change here is the fallibility of the finalization function, which makes WavWriter's code quite a bit nicer.
This commit is contained in:
parent
513e000e86
commit
ae039977d1
4 changed files with 12 additions and 15 deletions
|
@ -141,7 +141,7 @@ ErrorOr<void> AudioPlayerLoop::write_wav_if_needed()
|
||||||
m_wav_percent_written.store(100);
|
m_wav_percent_written.store(100);
|
||||||
m_track_manager.reset();
|
m_track_manager.reset();
|
||||||
m_track_manager.set_should_loop(true);
|
m_track_manager.set_should_loop(true);
|
||||||
wav_writer.finalize();
|
TRY(wav_writer.finalize());
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
}));
|
}));
|
||||||
|
|
|
@ -28,7 +28,7 @@ WavWriter::WavWriter(int sample_rate, u16 num_channels, PcmSampleFormat sample_f
|
||||||
WavWriter::~WavWriter()
|
WavWriter::~WavWriter()
|
||||||
{
|
{
|
||||||
if (!m_finalized)
|
if (!m_finalized)
|
||||||
finalize();
|
(void)finalize();
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<void> WavWriter::set_file(StringView path)
|
ErrorOr<void> WavWriter::set_file(StringView path)
|
||||||
|
@ -39,7 +39,7 @@ ErrorOr<void> WavWriter::set_file(StringView path)
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<void> WavWriter::write_samples(Span<Sample> samples)
|
ErrorOr<void> WavWriter::write_samples(ReadonlySpan<Sample> samples)
|
||||||
{
|
{
|
||||||
switch (m_sample_format) {
|
switch (m_sample_format) {
|
||||||
// FIXME: For non-float formats, we don't add good quantization noise, leading to possibly unpleasant quantization artifacts.
|
// FIXME: For non-float formats, we don't add good quantization noise, leading to possibly unpleasant quantization artifacts.
|
||||||
|
@ -72,22 +72,18 @@ ErrorOr<void> WavWriter::write_samples(Span<Sample> samples)
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
void WavWriter::finalize()
|
ErrorOr<void> WavWriter::finalize()
|
||||||
{
|
{
|
||||||
VERIFY(!m_finalized);
|
VERIFY(!m_finalized);
|
||||||
m_finalized = true;
|
m_finalized = true;
|
||||||
|
|
||||||
if (m_file && m_file->is_open()) {
|
if (m_file && m_file->is_open()) {
|
||||||
auto result = [&]() -> ErrorOr<void> {
|
TRY(m_file->seek(0, SeekMode::SetPosition));
|
||||||
TRY(m_file->seek(0, SeekMode::SetPosition));
|
TRY(write_header());
|
||||||
return TRY(write_header());
|
|
||||||
}();
|
|
||||||
|
|
||||||
if (result.is_error())
|
|
||||||
dbgln("Failed to finalize WavWriter: {}", result.error());
|
|
||||||
m_file->close();
|
m_file->close();
|
||||||
}
|
}
|
||||||
m_data_sz = 0;
|
m_data_sz = 0;
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<void> WavWriter::write_header()
|
ErrorOr<void> WavWriter::write_header()
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include <AK/Noncopyable.h>
|
#include <AK/Noncopyable.h>
|
||||||
#include <AK/RefPtr.h>
|
#include <AK/RefPtr.h>
|
||||||
#include <AK/StringView.h>
|
#include <AK/StringView.h>
|
||||||
|
#include <LibAudio/Encoder.h>
|
||||||
#include <LibAudio/Sample.h>
|
#include <LibAudio/Sample.h>
|
||||||
#include <LibAudio/SampleFormats.h>
|
#include <LibAudio/SampleFormats.h>
|
||||||
#include <LibCore/File.h>
|
#include <LibCore/File.h>
|
||||||
|
@ -17,7 +18,7 @@
|
||||||
|
|
||||||
namespace Audio {
|
namespace Audio {
|
||||||
|
|
||||||
class WavWriter {
|
class WavWriter : public Encoder {
|
||||||
AK_MAKE_NONCOPYABLE(WavWriter);
|
AK_MAKE_NONCOPYABLE(WavWriter);
|
||||||
AK_MAKE_NONMOVABLE(WavWriter);
|
AK_MAKE_NONMOVABLE(WavWriter);
|
||||||
|
|
||||||
|
@ -26,8 +27,8 @@ public:
|
||||||
WavWriter(int sample_rate = 44100, u16 num_channels = 2, PcmSampleFormat sample_format = PcmSampleFormat::Int16);
|
WavWriter(int sample_rate = 44100, u16 num_channels = 2, PcmSampleFormat sample_format = PcmSampleFormat::Int16);
|
||||||
~WavWriter();
|
~WavWriter();
|
||||||
|
|
||||||
ErrorOr<void> write_samples(Span<Sample> samples);
|
virtual ErrorOr<void> write_samples(ReadonlySpan<Sample> samples) override;
|
||||||
void finalize(); // You can finalize manually or let the destructor do it.
|
virtual ErrorOr<void> finalize() override;
|
||||||
|
|
||||||
u32 sample_rate() const { return m_sample_rate; }
|
u32 sample_rate() const { return m_sample_rate; }
|
||||||
u16 num_channels() const { return m_num_channels; }
|
u16 num_channels() const { return m_num_channels; }
|
||||||
|
|
|
@ -137,7 +137,7 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (writer.has_value())
|
if (writer.has_value())
|
||||||
(*writer)->finalize();
|
TRY((*writer)->finalize());
|
||||||
if (output != "-"sv)
|
if (output != "-"sv)
|
||||||
outln();
|
outln();
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue