summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2012-10-22 13:40:55 +0100
committerCarl Hetherington <cth@carlh.net>2012-10-22 13:40:55 +0100
commit6bec4750da08011e944ab53bda1ff9a51065c795 (patch)
tree38b32086c462584b601bdf9b5dfcdb15a0172676 /src/lib
parentc0e04acd1e9875fa67800a7861bd8a370157b49f (diff)
Try to make audio discard work properly.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/decoder.cc4
-rw-r--r--src/lib/film.cc1
-rw-r--r--src/lib/film_state.cc12
-rw-r--r--src/lib/film_state.h13
4 files changed, 29 insertions, 1 deletions
diff --git a/src/lib/decoder.cc b/src/lib/decoder.cc
index a90c14b2b..c9235f8e1 100644
--- a/src/lib/decoder.cc
+++ b/src/lib/decoder.cc
@@ -90,10 +90,12 @@ Decoder::~Decoder ()
void
Decoder::process_begin ()
{
- _delay_in_bytes = _fs->audio_delay() * _fs->audio_sample_rate() * _fs->audio_channels() * bytes_per_audio_sample() / 1000;
+ _delay_in_bytes = _fs->total_audio_delay() * _fs->audio_sample_rate() * _fs->audio_channels() * bytes_per_audio_sample() / 1000;
delete _delay_line;
_delay_line = new DelayLine (_delay_in_bytes);
+ _log->log (String::compose ("Decoding audio with total delay of %1", _fs->total_audio_delay()));
+
_audio_frames_processed = 0;
}
diff --git a/src/lib/film.cc b/src/lib/film.cc
index aa0bfa211..3a8b29f86 100644
--- a/src/lib/film.cc
+++ b/src/lib/film.cc
@@ -256,6 +256,7 @@ void
Film::examine_content_post_gui ()
{
set_length (_examine_content_job->last_video_frame ());
+ set_audio_to_discard (_examine_content_job->audio_to_discard ());
_examine_content_job.reset ();
string const tdir = dir ("thumbs");
diff --git a/src/lib/film_state.cc b/src/lib/film_state.cc
index c8d519d71..deaacca84 100644
--- a/src/lib/film_state.cc
+++ b/src/lib/film_state.cc
@@ -809,6 +809,13 @@ FilmState::set_frames_per_second (float f)
_frames_per_second = f;
signal_changed (FRAMES_PER_SECOND);
}
+
+void
+FilmState::set_audio_to_discard (int a)
+{
+ _audio_to_discard = a;
+ signal_changed (AUDIO_TO_DISCARD);
+}
void
FilmState::signal_changed (Property p)
@@ -833,3 +840,8 @@ FilmState::audio_channels () const
return _audio_streams[_audio_stream].channels ();
}
+int
+FilmState::total_audio_delay () const
+{
+ return _audio_delay - _audio_to_discard;
+}
diff --git a/src/lib/film_state.h b/src/lib/film_state.h
index 294b9aa10..d1d7489f6 100644
--- a/src/lib/film_state.h
+++ b/src/lib/film_state.h
@@ -73,6 +73,7 @@ public:
, _audio_sample_rate (0)
, _has_subtitles (false)
, _frames_per_second (0)
+ , _audio_to_discard (0)
, _dirty (false)
{}
@@ -113,6 +114,7 @@ public:
, _audio_streams (o._audio_streams)
, _subtitle_streams (o._subtitle_streams)
, _frames_per_second (o._frames_per_second)
+ , _audio_to_discard (o._audio_to_discard)
, _dirty (o._dirty)
{}
@@ -148,6 +150,7 @@ public:
}
int audio_channels () const;
+ int total_audio_delay () const;
enum Property {
NONE,
@@ -179,6 +182,7 @@ public:
AUDIO_STREAMS,
SUBTITLE_STREAMS,
FRAMES_PER_SECOND,
+ AUDIO_TO_DISCARD
};
@@ -338,6 +342,10 @@ public:
return _frames_per_second;
}
+ int audio_to_discard () const {
+ return _audio_to_discard;
+ }
+
/* SET */
@@ -382,6 +390,7 @@ public:
void set_audio_streams (std::vector<AudioStream>);
void set_subtitle_streams (std::vector<SubtitleStream>);
void set_frames_per_second (float);
+ void set_audio_to_discard (int);
/** Emitted when some property has changed */
mutable sigc::signal1<void, Property> Changed;
@@ -471,6 +480,10 @@ private:
std::vector<SubtitleStream> _subtitle_streams;
/** Frames per second of the source */
float _frames_per_second;
+ /** Number of milliseconds of audio to discard at the start of this film
+ in order to sync audio with video. Can be negative.
+ */
+ int _audio_to_discard;
mutable bool _dirty;