1 #ifndef AUDIOGRAPHER_SNDFILE_WRITER_H
2 #define AUDIOGRAPHER_SNDFILE_WRITER_H
6 #include <boost/format.hpp>
8 #include "audiographer/flag_debuggable.h"
9 #include "audiographer/sink.h"
10 #include "audiographer/types.h"
11 #include "audiographer/sndfile/sndfile_base.h"
12 #include "audiographer/broadcast_info.h"
14 #include "pbd/signals.h"
16 namespace AudioGrapher
19 /** Writer for audio files using libsndfile.
20 * Only short, int and float are valid template parameters
22 template <typename T = DefaultSampleType>
24 : public virtual SndfileBase
27 , public FlagDebuggable<>
30 SndfileWriter (std::string const & path, int format, ChannelCount channels, framecnt_t samplerate, boost::shared_ptr<BroadcastInfo> broadcast_info)
31 : SndfileHandle (path, Write, format, channels, samplerate)
34 add_supported_flag (ProcessContext<T>::EndOfInput);
37 broadcast_info->write_to_file (this);
41 virtual ~SndfileWriter () {}
43 SndfileWriter (SndfileWriter const & other) : SndfileHandle (other) {}
44 using SndfileHandle::operator=;
46 /// Writes data to file
47 void process (ProcessContext<T> const & c)
49 check_flags (*this, c);
51 if (throw_level (ThrowStrict) && c.channels() != channels()) {
52 throw Exception (*this, boost::str (boost::format
53 ("Wrong number of channels given to process(), %1% instead of %2%")
54 % c.channels() % channels()));
57 framecnt_t const written = write (c.data(), c.frames());
58 if (throw_level (ThrowProcess) && written != c.frames()) {
59 throw Exception (*this, boost::str (boost::format
60 ("Could not write data to output file (%1%)")
64 if (c.has_flag(ProcessContext<T>::EndOfInput)) {
70 using Sink<T>::process;
72 PBD::Signal1<void, std::string> FileWritten;
75 /// SndfileHandle has to be constructed directly by deriving classes
78 add_supported_flag (ProcessContext<T>::EndOfInput);
87 #endif // AUDIOGRAPHER_SNDFILE_WRITER_H