summaryrefslogtreecommitdiff
path: root/src/lib/audio_decoder.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2013-07-25 13:26:40 +0100
committerCarl Hetherington <cth@carlh.net>2013-07-25 13:26:40 +0100
commitd9362bdd24f01e4c833e89d63ac3816f36eae36e (patch)
treee1355acbfad222fb14ec386b14dcddce0b212bb5 /src/lib/audio_decoder.cc
parentfd970b185e9357522f5d12d62800df8769764729 (diff)
Move resampling back into AudioDecoder and fix various screw-ups with audio in the player.
Diffstat (limited to 'src/lib/audio_decoder.cc')
-rw-r--r--src/lib/audio_decoder.cc23
1 files changed, 19 insertions, 4 deletions
diff --git a/src/lib/audio_decoder.cc b/src/lib/audio_decoder.cc
index 59c631632..0ed3505cf 100644
--- a/src/lib/audio_decoder.cc
+++ b/src/lib/audio_decoder.cc
@@ -21,6 +21,7 @@
#include "audio_buffers.h"
#include "exceptions.h"
#include "log.h"
+#include "resampler.h"
#include "i18n.h"
@@ -31,16 +32,30 @@ using std::cout;
using boost::optional;
using boost::shared_ptr;
-AudioDecoder::AudioDecoder (shared_ptr<const Film> f)
- : Decoder (f)
+AudioDecoder::AudioDecoder (shared_ptr<const Film> film, shared_ptr<const AudioContent> content)
+ : Decoder (film)
, _audio_position (0)
{
-
+ if (content->content_audio_frame_rate() != content->output_audio_frame_rate()) {
+ _resampler.reset (
+ new Resampler (
+ content->content_audio_frame_rate(),
+ content->output_audio_frame_rate(),
+ content->audio_channels()
+ )
+ );
+ }
}
void
AudioDecoder::audio (shared_ptr<const AudioBuffers> data, AudioContent::Frame frame)
{
- Audio (data, frame);
+ /* XXX: no-one's calling _resampler->flush() again */
+
+ if (_resampler) {
+ data = _resampler->run (data);
+ }
+
+ Audio (data, _audio_position);
_audio_position = frame + data->frames ();
}