#include "job_manager.h"
#include "film.h"
#include "exceptions.h"
+#include "config.h"
#include "i18n.h"
int const AudioContentProperty::AUDIO_DELAY = 204;
int const AudioContentProperty::AUDIO_MAPPING = 205;
-AudioContent::AudioContent (shared_ptr<const Film> f, Time s)
+AudioContent::AudioContent (shared_ptr<const Film> f, DCPTime s)
: Content (f, s)
, _audio_gain (0)
- , _audio_delay (0)
+ , _audio_delay (Config::instance()->default_audio_delay ())
{
}
AudioContent::AudioContent (shared_ptr<const Film> f, boost::filesystem::path p)
: Content (f, p)
, _audio_gain (0)
- , _audio_delay (0)
+ , _audio_delay (Config::instance()->default_audio_delay ())
{
}
signal_changed (AudioContentProperty::AUDIO_DELAY);
}
-void
+boost::signals2::connection
AudioContent::analyse_audio (boost::function<void()> finished)
{
shared_ptr<const Film> film = _film.lock ();
- if (!film) {
- return;
- }
+ assert (film);
shared_ptr<AnalyseAudioJob> job (new AnalyseAudioJob (film, dynamic_pointer_cast<AudioContent> (shared_from_this())));
- job->Finished.connect (finished);
+ boost::signals2::connection c = job->Finished.connect (finished);
JobManager::instance()->add (job);
+
+ return c;
}
boost::filesystem::path
{
return String::compose ("audio: channels %1, length %2, raw rate %3, out rate %4", audio_channels(), audio_length(), content_audio_frame_rate(), output_audio_frame_rate());
}
+
+/** Note: this is not particularly fast, as the FrameRateChange lookup
+ * is not very intelligent.
+ *
+ * @param t Some duration to convert.
+ * @param at The time within the DCP to get the active frame rate change from; i.e. a point at which
+ * the `controlling' video content is active.
+ */
+AudioContent::Frame
+AudioContent::time_to_content_audio_frames (DCPTime t, DCPTime at) const
+{
+ shared_ptr<const Film> film = _film.lock ();
+ assert (film);
+
+ /* Consider the case where we're running a 25fps video at 24fps (i.e. slow)
+ Our audio is at 44.1kHz. We will resample it to 48000 * 25 / 24 and then
+ run it at 48kHz (i.e. slow, to match).
+
+ After 1 second, we'll have run the equivalent of 44.1kHz * 24 / 25 samples
+ in the source.
+ */
+
+ return rint (t * content_audio_frame_rate() * film->active_frame_rate_change(at).speed_up / TIME_HZ);
+}