Commit f139f169 authored by Stefan Westerfeld's avatar Stefan Westerfeld

Unify audio input stream creation.

Signed-off-by: Stefan Westerfeld's avatarStefan Westerfeld <stefan@space.twc.de>
parent 627a6734
...@@ -3,10 +3,10 @@ bin_PROGRAMS = audiowmark ...@@ -3,10 +3,10 @@ bin_PROGRAMS = audiowmark
COMMON_SRC = utils.hh utils.cc convcode.hh convcode.cc random.hh random.cc mp3.cc mp3.hh wavdata.cc wavdata.hh \ COMMON_SRC = utils.hh utils.cc convcode.hh convcode.cc random.hh random.cc mp3.cc mp3.hh wavdata.cc wavdata.hh \
audiostream.cc audiostream.hh sfinputstream.cc sfinputstream.hh stdoutwavoutputstream.cc stdoutwavoutputstream.hh \ audiostream.cc audiostream.hh sfinputstream.cc sfinputstream.hh stdoutwavoutputstream.cc stdoutwavoutputstream.hh \
sfoutputstream.cc sfoutputstream.hh rawinputstream.cc rawinputstream.hh rawoutputstream.cc rawoutputstream.hh \ sfoutputstream.cc sfoutputstream.hh rawinputstream.cc rawinputstream.hh rawoutputstream.cc rawoutputstream.hh \
rawconverter.cc rawconverter.hh mp3inputstream.cc mp3inputstream.hh rawconverter.cc rawconverter.hh mp3inputstream.cc mp3inputstream.hh wmcommon.cc wmcommon.hh fft.cc fft.hh
COMMON_LIBS = $(SNDFILE_LIBS) $(FFTW_LIBS) $(LIBGCRYPT_LIBS) $(LIBMPG123_LIBS) COMMON_LIBS = $(SNDFILE_LIBS) $(FFTW_LIBS) $(LIBGCRYPT_LIBS) $(LIBMPG123_LIBS)
audiowmark_SOURCES = audiowmark.cc fft.cc fft.hh wmget.cc wmadd.cc wmcommon.hh wmcommon.cc $(COMMON_SRC) audiowmark_SOURCES = audiowmark.cc wmget.cc wmadd.cc $(COMMON_SRC)
audiowmark_LDFLAGS = $(COMMON_LIBS) audiowmark_LDFLAGS = $(COMMON_LIBS)
noinst_PROGRAMS = testconvcode testrandom testmp3 teststream noinst_PROGRAMS = testconvcode testrandom testmp3 teststream
......
#include "audiostream.hh" #include "audiostream.hh"
#include "wmcommon.hh"
#include "sfinputstream.hh"
#include "mp3.hh"
#include "mp3inputstream.hh"
#include "rawconverter.hh"
using std::string;
AudioStream::~AudioStream() AudioStream::~AudioStream()
{ {
} }
std::unique_ptr<AudioInputStream>
AudioInputStream::create (const string& filename, Error& err)
{
std::unique_ptr<AudioInputStream> in_stream;
if (Params::input_format == Format::AUTO)
{
SFInputStream *sistream = new SFInputStream();
in_stream.reset (sistream);
Error err = sistream->open (filename);
if (err && mp3_detect (filename))
{
MP3InputStream *mistream = new MP3InputStream();
in_stream.reset (mistream);
err = mistream->open (filename);
if (err)
return nullptr;
}
else if (err)
return nullptr;
}
else
{
RawInputStream *ristream = new RawInputStream();
in_stream.reset (ristream);
err = ristream->open (filename, Params::raw_input_format);
if (err)
return nullptr;
}
return in_stream;
}
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#define AUDIOWMARK_AUDIO_STREAM_HH #define AUDIOWMARK_AUDIO_STREAM_HH
#include <vector> #include <vector>
#include <memory>
#include "utils.hh" #include "utils.hh"
class AudioStream class AudioStream
...@@ -17,6 +18,8 @@ public: ...@@ -17,6 +18,8 @@ public:
class AudioInputStream : public AudioStream class AudioInputStream : public AudioStream
{ {
public: public:
static std::unique_ptr<AudioInputStream> create (const std::string& filename, Error& err);
// for streams that do not know the number of frames in advance (i.e. raw input stream) // for streams that do not know the number of frames in advance (i.e. raw input stream)
static constexpr size_t N_FRAMES_UNKNOWN = ~size_t (0); static constexpr size_t N_FRAMES_UNKNOWN = ~size_t (0);
virtual size_t n_frames() const = 0; virtual size_t n_frames() const = 0;
......
...@@ -48,7 +48,7 @@ public: ...@@ -48,7 +48,7 @@ public:
NONE, NONE,
STR STR
}; };
Error (Code code) : Error (Code code = Code::NONE) :
m_code (code) m_code (code)
{ {
switch (code) switch (code)
......
...@@ -27,21 +27,10 @@ WavData::WavData (const vector<float>& samples, int n_channels, int sample_rate, ...@@ -27,21 +27,10 @@ WavData::WavData (const vector<float>& samples, int n_channels, int sample_rate,
Error Error
WavData::load (const string& filename) WavData::load (const string& filename)
{ {
std::unique_ptr<AudioInputStream> in_stream; // FIXME: virtual constructor Error err;
SFInputStream *sistream = new SFInputStream(); std::unique_ptr<AudioInputStream> in_stream = AudioInputStream::create (filename, err);
in_stream.reset (sistream); if (err)
Error err = sistream->open (filename);
if (err && mp3_detect (filename))
{
MP3InputStream *mistream = new MP3InputStream();
in_stream.reset (mistream);
err = mistream->open (filename);
if (err)
return err;
}
else if (err)
return err; return err;
return load (in_stream.get()); return load (in_stream.get());
......
...@@ -593,40 +593,12 @@ add_watermark (const string& infile, const string& outfile, const string& bits) ...@@ -593,40 +593,12 @@ add_watermark (const string& infile, const string& outfile, const string& bits)
auto bitvec_a = randomize_bit_order (conv_encode (ConvBlockType::a, bitvec), /* encode */ true); auto bitvec_a = randomize_bit_order (conv_encode (ConvBlockType::a, bitvec), /* encode */ true);
auto bitvec_b = randomize_bit_order (conv_encode (ConvBlockType::b, bitvec), /* encode */ true); auto bitvec_b = randomize_bit_order (conv_encode (ConvBlockType::b, bitvec), /* encode */ true);
std::unique_ptr<AudioInputStream> in_stream; // FIXME: virtual constructor Error err;
if (Params::input_format == Format::AUTO) std::unique_ptr<AudioInputStream> in_stream = AudioInputStream::create (infile, err);
{ if (err)
SFInputStream *sistream = new SFInputStream();
in_stream.reset (sistream);
Error err = sistream->open (infile);
if (err && mp3_detect (infile))
{
MP3InputStream *mistream = new MP3InputStream();
in_stream.reset (mistream);
err = mistream->open (infile);
if (err)
{
error ("audiowmark: error opening mp3 %s: %s\n", infile.c_str(), err.message());
return 1;
}
}
else if (err)
{
error ("audiowmark: error opening %s: %s\n", infile.c_str(), err.message());
return 1;
}
}
else
{ {
RawInputStream *ristream = new RawInputStream(); error ("audiowmark: error opening %s: %s\n", infile.c_str(), err.message());
in_stream.reset (ristream); return 1;
Error err = ristream->open (infile, Params::raw_input_format);
if (err)
{
error ("audiowmark: error opening %s: %s\n", infile.c_str(), err.message());
return 1;
}
} }
if (in_stream->n_frames() == AudioInputStream::N_FRAMES_UNKNOWN) if (in_stream->n_frames() == AudioInputStream::N_FRAMES_UNKNOWN)
{ {
...@@ -646,7 +618,7 @@ add_watermark (const string& infile, const string& outfile, const string& bits) ...@@ -646,7 +618,7 @@ add_watermark (const string& infile, const string& outfile, const string& bits)
{ {
RawOutputStream *rostream = new RawOutputStream(); RawOutputStream *rostream = new RawOutputStream();
out_stream.reset (rostream); out_stream.reset (rostream);
Error err = rostream->open (outfile, Params::raw_output_format); err = rostream->open (outfile, Params::raw_output_format);
if (err) if (err)
{ {
error ("audiowmark: error opening %s: %s\n", outfile.c_str(), err.message()); error ("audiowmark: error opening %s: %s\n", outfile.c_str(), err.message());
...@@ -756,7 +728,7 @@ add_watermark (const string& infile, const string& outfile, const string& bits) ...@@ -756,7 +728,7 @@ add_watermark (const string& infile, const string& outfile, const string& bits)
} }
} }
Error err = out_stream->close(); err = out_stream->close();
if (err) if (err)
error ("audiowmark: closing output stream failed: %s\n", err.message()); error ("audiowmark: closing output stream failed: %s\n", err.message());
......
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