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 "wmcommon.hh"
#include "sfinputstream.hh"
#include "sfoutputstream.hh"
#include "mp3.hh"
#include "mp3inputstream.hh"
#include "rawconverter.hh"
#include "rawoutputstream.hh"
#include "stdoutwavoutputstream.hh"
using std::string;
......@@ -44,3 +47,35 @@ AudioInputStream::create (const string& filename, Error& err)
}
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:
class AudioOutputStream : public AudioStream
{
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 close() = 0;
};
......
......@@ -63,19 +63,19 @@ WavData::load (AudioInputStream *in_stream)
Error
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.reset (sostream);
Error err = sostream->open (filename, m_n_channels, m_sample_rate, m_bit_depth, m_samples.size() / m_n_channels);
out_stream = AudioOutputStream::create (filename, m_n_channels, m_sample_rate, m_bit_depth, m_samples.size() / m_n_channels, err);
if (err)
return err;
err = sostream->write_frames (m_samples);
err = out_stream->write_frames (m_samples);
if (err)
return err;
return Error::Code::NONE;
err = out_stream->close();
return err;
}
int
......
......@@ -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;
std::unique_ptr<AudioOutputStream> out_stream;
if (Params::output_format == Format::RAW)
{
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
out_stream = AudioOutputStream::create (outfile, in_stream->n_channels(), in_stream->sample_rate(), out_bit_depth, in_stream->n_frames(), err);
if (err)
{
SFOutputStream *sfostream = new SFOutputStream();
out_stream.reset (sfostream);
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;
}
error ("audiowmark: error writing to %s: %s\n", outfile.c_str(), err.message());
return 1;
}
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