X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fsndfile_decoder.cc;h=602014d5883d2dba1381588bb44a7036debc9c96;hb=8102046b2f29e0c7b234c29bf204b056cb30e64f;hp=f114979de71faae98b8079877b5aafc6244d1e4b;hpb=237a0052c60af768f4d62b00321932918b7ba4d9;p=dcpomatic.git diff --git a/src/lib/sndfile_decoder.cc b/src/lib/sndfile_decoder.cc index f114979de..602014d58 100644 --- a/src/lib/sndfile_decoder.cc +++ b/src/lib/sndfile_decoder.cc @@ -18,10 +18,13 @@ */ #include +#ifdef DCPOMATIC_WINDOWS +#include +#define ENABLE_SNDFILE_WINDOWS_PROTOTYPES 1 +#endif #include #include "sndfile_content.h" #include "sndfile_decoder.h" -#include "film.h" #include "exceptions.h" #include "audio_buffers.h" @@ -33,13 +36,20 @@ using std::min; using std::cout; using boost::shared_ptr; -SndfileDecoder::SndfileDecoder (shared_ptr f, shared_ptr c) - : Decoder (f) - , AudioDecoder (f, c) +SndfileDecoder::SndfileDecoder (shared_ptr c) + : AudioDecoder (c) , _sndfile_content (c) , _deinterleave_buffer (0) { - _sndfile = sf_open (_sndfile_content->file().string().c_str(), SFM_READ, &_info); + _info.format = 0; + + /* Here be monsters. See fopen_boost for similar shenanigans */ +#ifdef DCPOMATIC_WINDOWS + _sndfile = sf_wchar_open (_sndfile_content->path(0).c_str(), SFM_READ, &_info); +#else + _sndfile = sf_open (_sndfile_content->path(0).string().c_str(), SFM_READ, &_info); +#endif + if (!_sndfile) { throw DecodeError (_("could not open audio file for reading")); } @@ -57,19 +67,23 @@ SndfileDecoder::~SndfileDecoder () bool SndfileDecoder::pass () { + if (_remaining == 0) { + return true; + } + /* Do things in half second blocks as I think there may be limits to what FFmpeg (and in particular the resampler) can cope with. */ - sf_count_t const block = _sndfile_content->content_audio_frame_rate() / 2; + sf_count_t const block = _sndfile_content->audio_frame_rate() / 2; sf_count_t const this_time = min (block, _remaining); int const channels = _sndfile_content->audio_channels (); - shared_ptr audio (new AudioBuffers (channels, this_time)); + shared_ptr data (new AudioBuffers (channels, this_time)); if (_sndfile_content->audio_channels() == 1) { /* No de-interleaving required */ - sf_read_float (_sndfile, audio->data(0), this_time); + sf_read_float (_sndfile, data->data(0), this_time); } else { /* Deinterleave */ if (!_deinterleave_buffer) { @@ -78,7 +92,7 @@ SndfileDecoder::pass () sf_readf_float (_sndfile, _deinterleave_buffer, this_time); vector out_ptr (channels); for (int i = 0; i < channels; ++i) { - out_ptr[i] = audio->data(i); + out_ptr[i] = data->data(i); } float* in_ptr = _deinterleave_buffer; for (int i = 0; i < this_time; ++i) { @@ -88,12 +102,12 @@ SndfileDecoder::pass () } } - audio->set_frames (this_time); - Audio (audio, double(_done) / audio_frame_rate()); + data->set_frames (this_time); + audio (data, ContentTime::from_frames (_done, audio_frame_rate ())); _done += this_time; _remaining -= this_time; - return (_remaining == 0); + return _remaining == 0; } int @@ -102,10 +116,10 @@ SndfileDecoder::audio_channels () const return _info.channels; } -ContentAudioFrame +ContentTime SndfileDecoder::audio_length () const { - return _info.frames; + return ContentTime::from_frames (_info.frames, audio_frame_rate ()); } int @@ -113,3 +127,12 @@ SndfileDecoder::audio_frame_rate () const { return _info.samplerate; } + +void +SndfileDecoder::seek (ContentTime t, bool accurate) +{ + AudioDecoder::seek (t, accurate); + + _done = t.frames (audio_frame_rate ()); + _remaining = _info.frames - _done; +}