X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fsndfile_decoder.cc;h=67bb25e0dc71e56fe5678c8bef2b25bd0f17c655;hb=e6f28e7cda23c1ba3c49cc1bf2dc1491c2f87160;hp=f114979de71faae98b8079877b5aafc6244d1e4b;hpb=21ce34c2cd04a2e7e133ff693b84c054182f4f91;p=dcpomatic.git diff --git a/src/lib/sndfile_decoder.cc b/src/lib/sndfile_decoder.cc index f114979de..67bb25e0d 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,6 +67,10 @@ 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. */ @@ -65,11 +79,11 @@ SndfileDecoder::pass () 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,13 @@ SndfileDecoder::audio_frame_rate () const { return _info.samplerate; } + +void +SndfileDecoder::seek (ContentTime t, bool accurate) +{ + Decoder::seek (t, accurate); + AudioDecoder::seek (t, accurate); + + _done = t.frames (audio_frame_rate ()); + _remaining = _info.frames - _done; +}