1
Fork 0
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:
kleines Filmröllchen 2023-06-30 20:02:49 +02:00 committed by Andrew Kaster
parent 513e000e86
commit ae039977d1
4 changed files with 12 additions and 15 deletions

View file

@ -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 {};
})); }));

View file

@ -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()

View file

@ -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; }

View file

@ -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 {