فهرست منبع

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.
kleines Filmröllchen 2 سال پیش
والد
کامیت
ae039977d1

+ 1 - 1
Userland/Applications/Piano/AudioPlayerLoop.cpp

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

+ 6 - 10
Userland/Libraries/LibAudio/WavWriter.cpp

@@ -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));
-            return TRY(write_header());
-        }();
-
-        if (result.is_error())
-            dbgln("Failed to finalize WavWriter: {}", result.error());
+        TRY(m_file->seek(0, SeekMode::SetPosition));
+        TRY(write_header());
         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()

+ 4 - 3
Userland/Libraries/LibAudio/WavWriter.h

@@ -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);
-    void finalize(); // You can finalize manually or let the destructor do it.
+    virtual ErrorOr<void> write_samples(ReadonlySpan<Sample> samples) override;
+    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; }

+ 1 - 1
Userland/Utilities/aconv.cpp

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