encoder: migrate from class Error to C++ exceptions

This commit is contained in:
Max Kellermann
2016-11-07 09:20:12 +01:00
parent b8aac3f8fc
commit d8b6aff23a
16 changed files with 299 additions and 477 deletions

View File

@@ -23,8 +23,6 @@
#include "AudioFormat.hxx"
#include "config/ConfigError.hxx"
#include "util/Alloc.hxx"
#include "util/Error.hxx"
#include "util/Domain.hxx"
#include "system/ByteOrder.hxx"
#include <opus.h>
@@ -61,14 +59,14 @@ public:
~OpusEncoder() override;
/* virtual methods from class Encoder */
bool End(Error &) override;
bool Write(const void *data, size_t length, Error &) override;
void End() override;
void Write(const void *data, size_t length) override;
size_t Read(void *dest, size_t length) override;
private:
bool DoEncode(bool eos, Error &error);
bool WriteSilence(unsigned fill_frames, Error &error);
void DoEncode(bool eos);
void WriteSilence(unsigned fill_frames);
void GenerateHead();
void GenerateTags();
@@ -83,15 +81,13 @@ public:
PreparedOpusEncoder(const ConfigBlock &block);
/* virtual methods from class PreparedEncoder */
Encoder *Open(AudioFormat &audio_format, Error &) override;
Encoder *Open(AudioFormat &audio_format) override;
const char *GetMimeType() const override {
return "audio/ogg";
}
};
static constexpr Domain opus_encoder_domain("opus_encoder");
PreparedOpusEncoder::PreparedOpusEncoder(const ConfigBlock &block)
{
const char *value = block.GetBlockValue("bitrate", "auto");
@@ -141,7 +137,7 @@ OpusEncoder::OpusEncoder(AudioFormat &_audio_format, ::OpusEncoder *_enc)
}
Encoder *
PreparedOpusEncoder::Open(AudioFormat &audio_format, Error &error)
PreparedOpusEncoder::Open(AudioFormat &audio_format)
{
/* libopus supports only 48 kHz */
audio_format.sample_rate = 48000;
@@ -168,11 +164,8 @@ PreparedOpusEncoder::Open(AudioFormat &audio_format, Error &error)
audio_format.channels,
OPUS_APPLICATION_AUDIO,
&error_code);
if (enc == nullptr) {
error.Set(opus_encoder_domain, error_code,
opus_strerror(error_code));
return nullptr;
}
if (enc == nullptr)
throw std::runtime_error(opus_strerror(error_code));
opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate));
opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(complexity));
@@ -187,8 +180,8 @@ OpusEncoder::~OpusEncoder()
opus_encoder_destroy(enc);
}
bool
OpusEncoder::DoEncode(bool eos, Error &error)
void
OpusEncoder::DoEncode(bool eos)
{
assert(buffer_position == buffer_size);
@@ -204,10 +197,8 @@ OpusEncoder::DoEncode(bool eos, Error &error)
buffer_frames,
buffer2,
sizeof(buffer2));
if (result < 0) {
error.Set(opus_encoder_domain, "Opus encoder error");
return false;
}
if (result < 0)
throw std::runtime_error("Opus encoder error");
granulepos += buffer_frames;
@@ -221,12 +212,10 @@ OpusEncoder::DoEncode(bool eos, Error &error)
stream.PacketIn(packet);
buffer_position = 0;
return true;
}
bool
OpusEncoder::End(Error &error)
void
OpusEncoder::End()
{
Flush();
@@ -234,11 +223,11 @@ OpusEncoder::End(Error &error)
buffer_size - buffer_position);
buffer_position = buffer_size;
return DoEncode(true, error);
DoEncode(true);
}
bool
OpusEncoder::WriteSilence(unsigned fill_frames, Error &error)
void
OpusEncoder::WriteSilence(unsigned fill_frames)
{
size_t fill_bytes = fill_frames * frame_size;
@@ -251,16 +240,13 @@ OpusEncoder::WriteSilence(unsigned fill_frames, Error &error)
buffer_position += nbytes;
fill_bytes -= nbytes;
if (buffer_position == buffer_size &&
!DoEncode(false, error))
return false;
if (buffer_position == buffer_size)
DoEncode(false);
}
return true;
}
bool
OpusEncoder::Write(const void *_data, size_t length, Error &error)
void
OpusEncoder::Write(const void *_data, size_t length)
{
const uint8_t *data = (const uint8_t *)_data;
@@ -270,9 +256,7 @@ OpusEncoder::Write(const void *_data, size_t length, Error &error)
assert(buffer_position == 0);
if (!WriteSilence(lookahead, error))
return false;
WriteSilence(lookahead);
lookahead = 0;
}
@@ -286,12 +270,9 @@ OpusEncoder::Write(const void *_data, size_t length, Error &error)
length -= nbytes;
buffer_position += nbytes;
if (buffer_position == buffer_size &&
!DoEncode(false, error))
return false;
if (buffer_position == buffer_size)
DoEncode(false);
}
return true;
}
void