void set_quality (Quality value) { qualities.clear(); qualities.insert (value); }
};
-class LIBARDOUR_API HasCodecQuality : public PBD::ScopedConnectionList {
+class LIBARDOUR_API HasCodecQuality {
public:
struct CodecQuality {
CodecQuality (std::string const& n, int q)
return _codec_qualties;
}
+ virtual int default_codec_quality () const = 0;
+
protected:
CodecQualityList _codec_qualties;
};
SampleFormat _default_sample_format;
};
-class LIBARDOUR_API ExportFormatOggVorbis : public ExportFormat {
+class LIBARDOUR_API ExportFormatOggVorbis : public ExportFormat, public HasCodecQuality {
public:
ExportFormatOggVorbis ();
~ExportFormatOggVorbis () {};
Type get_type () const { return T_Sndfile; }
SampleFormat get_explicit_sample_format () const { return SF_Vorbis; }
virtual bool supports_tagging () const { return true; }
+
+ int default_codec_quality () const { return 40; }
};
class LIBARDOUR_API ExportFormatFLAC : public ExportFormat, public HasSampleFormat {
bool set_compatibility_state (ExportFormatCompatibility const & compatibility);
Type get_type () const { return T_FFMPEG; }
SampleFormat get_explicit_sample_format () const { return SF_Float; }
+ int default_codec_quality () const { return -2; }
};
} // namespace ARDOUR
add_sample_rate (SR_192);
add_sample_rate (SR_Session);
+ /* these are 100 vorbis_encode_init_vbr() quality */
+ add_codec_quality ("Low (0)", 0);
+ add_codec_quality ("Default (4)", 40);
+ add_codec_quality ("High (6)", 60);
+ add_codec_quality ("Very High (10)", 100);
+
add_endianness (E_FileDefault);
set_extension ("ogg");
writer.reset (new AudioGrapher::SndfileWriter<T> (writer_filename, format, channels, config.format->sample_rate(), config.broadcast_info));
writer->FileWritten.connect_same_thread (copy_files_connection, boost::bind (&ExportGraphBuilder::Encoder::copy_files, this, _1));
+ if (format & ExportFormatBase::SF_Vorbis) {
+ /* libsndfile uses range 0..1 (best .. worst) */
+ double vorbis_quality = 1.0 - config.format->codec_quality () / 100.f;
+ if (vorbis_quality >= 0 && vorbis_quality <= 1.0) {
+ writer->command (SFC_SET_COMPRESSION_LEVEL, &vorbis_quality, sizeof (double));
+ }
+ }
}
template<typename T>