2 #include "external_audio_decoder.h"
4 #include "exceptions.h"
9 using boost::shared_ptr;
11 ExternalAudioDecoder::ExternalAudioDecoder (shared_ptr<Film> f, shared_ptr<const Options> o, Job* j)
13 , AudioDecoder (f, o, j)
19 ExternalAudioDecoder::pass ()
21 vector<string> const files = _film->external_audio ();
24 for (size_t i = 0; i < files.size(); ++i) {
25 if (!files[i].empty()) {
35 sf_count_t frames = 0;
37 vector<SNDFILE*> sndfiles;
38 for (vector<string>::const_iterator i = files.begin(); i != files.end(); ++i) {
40 sndfiles.push_back (0);
43 SNDFILE* s = sf_open (i->c_str(), SFM_READ, &info);
45 throw DecodeError ("could not open external audio file for reading");
48 if (info.channels != 1) {
49 throw DecodeError ("external audio files must be mono");
52 sndfiles.push_back (s);
55 /* XXX: nasty magic value */
56 AudioStream st ("DVDOMATIC-EXTERNAL", -1, info.samplerate, av_get_default_channel_layout (info.channels));
57 _audio_streams.push_back (st);
62 if (info.frames != frames) {
63 throw DecodeError ("external audio files have differing lengths");
69 sf_count_t const block = 65536;
71 shared_ptr<AudioBuffers> audio (new AudioBuffers (_audio_stream.get().channels(), block));
73 sf_count_t const this_time = min (block, frames);
74 for (size_t i = 0; i < sndfiles.size(); ++i) {
76 audio->make_silent (i);
78 sf_read_float (sndfiles[i], audio->data(i), block);