Commit e52e763b authored by Stefan Westerfeld's avatar Stefan Westerfeld

Unify output stream creation.

Signed-off-by: Stefan Westerfeld's avatarStefan Westerfeld <stefan@space.twc.de>
parent 4fdcb9f7
#include "audiostream.hh" #include "audiostream.hh"
#include "wmcommon.hh" #include "wmcommon.hh"
#include "sfinputstream.hh" #include "sfinputstream.hh"
#include "sfoutputstream.hh"
#include "mp3.hh" #include "mp3.hh"
#include "mp3inputstream.hh" #include "mp3inputstream.hh"
#include "rawconverter.hh" #include "rawconverter.hh"
#include "rawoutputstream.hh"
#include "stdoutwavoutputstream.hh"
using std::string; using std::string;
...@@ -44,3 +47,35 @@ AudioInputStream::create (const string& filename, Error& err) ...@@ -44,3 +47,35 @@ AudioInputStream::create (const string& filename, Error& err)
} }
return in_stream; return in_stream;
} }
std::unique_ptr<AudioOutputStream>
AudioOutputStream::create (const string& filename, int n_channels, int sample_rate, int bit_depth, size_t n_frames, Error& err)
{
std::unique_ptr<AudioOutputStream> out_stream;
if (Params::output_format == Format::RAW)
{
RawOutputStream *rostream = new RawOutputStream();
out_stream.reset (rostream);
err = rostream->open (filename, Params::raw_output_format);
if (err)
return nullptr;
}
else if (filename == "-")
{
StdoutWavOutputStream *swstream = new StdoutWavOutputStream();
out_stream.reset (swstream);
err = swstream->open (n_channels, sample_rate, bit_depth, n_frames);
if (err)
return nullptr;
}
else
{
SFOutputStream *sfostream = new SFOutputStream();
out_stream.reset (sfostream);
err = sfostream->open (filename, n_channels, sample_rate, bit_depth, n_frames);
if (err)
return nullptr;
}
return out_stream;
}
...@@ -30,6 +30,9 @@ public: ...@@ -30,6 +30,9 @@ public:
class AudioOutputStream : public AudioStream class AudioOutputStream : public AudioStream
{ {
public: public:
static std::unique_ptr<AudioOutputStream> create (const std::string& filename,
int n_channels, int sample_rate, int bit_depth, size_t n_frames, Error& err);
virtual Error write_frames (const std::vector<float>& frames) = 0; virtual Error write_frames (const std::vector<float>& frames) = 0;
virtual Error close() = 0; virtual Error close() = 0;
}; };
......
...@@ -63,19 +63,19 @@ WavData::load (AudioInputStream *in_stream) ...@@ -63,19 +63,19 @@ WavData::load (AudioInputStream *in_stream)
Error Error
WavData::save (const string& filename) WavData::save (const string& filename)
{ {
std::unique_ptr<AudioOutputStream> out_stream; // FIXME: virtual constructor std::unique_ptr<AudioOutputStream> out_stream;
Error err;
SFOutputStream *sostream = new SFOutputStream(); out_stream = AudioOutputStream::create (filename, m_n_channels, m_sample_rate, m_bit_depth, m_samples.size() / m_n_channels, err);
out_stream.reset (sostream);
Error err = sostream->open (filename, m_n_channels, m_sample_rate, m_bit_depth, m_samples.size() / m_n_channels);
if (err) if (err)
return err; return err;
err = sostream->write_frames (m_samples); err = out_stream->write_frames (m_samples);
if (err) if (err)
return err; return err;
return Error::Code::NONE; err = out_stream->close();
return err;
} }
int int
......
...@@ -614,38 +614,11 @@ add_watermark (const string& infile, const string& outfile, const string& bits) ...@@ -614,38 +614,11 @@ add_watermark (const string& infile, const string& outfile, const string& bits)
const int out_bit_depth = in_stream->bit_depth() > 16 ? 24 : 16; const int out_bit_depth = in_stream->bit_depth() > 16 ? 24 : 16;
std::unique_ptr<AudioOutputStream> out_stream; std::unique_ptr<AudioOutputStream> out_stream;
if (Params::output_format == Format::RAW) out_stream = AudioOutputStream::create (outfile, in_stream->n_channels(), in_stream->sample_rate(), out_bit_depth, in_stream->n_frames(), err);
{ if (err)
RawOutputStream *rostream = new RawOutputStream();
out_stream.reset (rostream);
err = rostream->open (outfile, Params::raw_output_format);
if (err)
{
error ("audiowmark: error opening %s: %s\n", outfile.c_str(), err.message());
return 1;
}
}
else if (outfile == "-")
{
StdoutWavOutputStream *swstream = new StdoutWavOutputStream();
out_stream.reset (swstream);
Error err = swstream->open (in_stream->n_channels(), in_stream->sample_rate(), out_bit_depth, in_stream->n_frames());
if (err)
{
error ("audiowmark: error writing to -: %s\n", err.message());
return 1;
}
}
else
{ {
SFOutputStream *sfostream = new SFOutputStream(); error ("audiowmark: error writing to %s: %s\n", outfile.c_str(), err.message());
out_stream.reset (sfostream); return 1;
Error err = sfostream->open (outfile, in_stream->n_channels(), in_stream->sample_rate(), out_bit_depth, in_stream->n_frames());
if (err)
{
error ("audiowmark: error writing to %s: %s\n", outfile.c_str(), err.message());
return 1;
}
} }
if (out_stream->sample_rate() != in_stream->sample_rate()) if (out_stream->sample_rate() != in_stream->sample_rate())
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment