#include <libcxml/cxml.h>
#include "audio_content.h"
+using std::string;
using boost::shared_ptr;
+using boost::lexical_cast;
int const AudioContentProperty::AUDIO_CHANNELS = 200;
int const AudioContentProperty::AUDIO_LENGTH = 201;
int const AudioContentProperty::AUDIO_FRAME_RATE = 202;
+int const AudioContentProperty::AUDIO_GAIN = 203;
+int const AudioContentProperty::AUDIO_DELAY = 204;
AudioContent::AudioContent (boost::filesystem::path f)
: Content (f)
+ , _audio_gain (0)
+ , _audio_delay (0)
{
}
AudioContent::AudioContent (shared_ptr<const cxml::Node> node)
: Content (node)
{
+ _audio_gain = node->number_child<float> ("AudioGain");
+ _audio_delay = node->number_child<int> ("AudioDelay");
}
AudioContent::AudioContent (AudioContent const & o)
: Content (o)
+ , _audio_gain (o._audio_gain)
+ , _audio_delay (o._audio_delay)
{
}
void
AudioContent::as_xml (xmlpp::Node* node) const
{
+ boost::mutex::scoped_lock lm (_mutex);
+ node->add_child("AudioGain")->add_child_text (lexical_cast<string> (_audio_gain));
+ node->add_child("AudioDelay")->add_child_text (lexical_cast<string> (_audio_delay));
+}
+
+
+void
+AudioContent::set_audio_gain (float g)
+{
+ {
+ boost::mutex::scoped_lock lm (_mutex);
+ _audio_gain = g;
+ }
+ signal_changed (AudioContentProperty::AUDIO_GAIN);
}
+
+void
+AudioContent::set_audio_delay (int d)
+{
+ {
+ boost::mutex::scoped_lock lm (_mutex);
+ _audio_delay = d;
+ }
+
+ signal_changed (AudioContentProperty::AUDIO_DELAY);
+}
+
static int const AUDIO_CHANNELS;
static int const AUDIO_LENGTH;
static int const AUDIO_FRAME_RATE;
+ static int const AUDIO_GAIN;
+ static int const AUDIO_DELAY;
};
class AudioContent : public virtual Content
virtual int content_audio_frame_rate () const = 0;
virtual int output_audio_frame_rate (boost::shared_ptr<const Film>) const = 0;
virtual AudioMapping audio_mapping () const = 0;
+
+ void set_audio_gain (float);
+ void set_audio_delay (int);
+
+ float audio_gain () const {
+ boost::mutex::scoped_lock lm (_mutex);
+ return _audio_gain;
+ }
+
+ int audio_delay () const {
+ boost::mutex::scoped_lock lm (_mutex);
+ return _audio_delay;
+ }
+
+private:
+ /** Gain to apply to audio in dB */
+ float _audio_gain;
+ /** Delay to apply to audio (positive moves audio later) in milliseconds */
+ int _audio_delay;
};
#endif
, _container (Config::instance()->default_container ())
, _scaler (Scaler::from_id ("bicubic"))
, _ab (false)
- , _audio_gain (0)
- , _audio_delay (0)
, _with_subtitles (false)
, _subtitle_offset (0)
, _subtitle_scale (1)
, _filters (o._filters)
, _scaler (o._scaler)
, _ab (o._ab)
- , _audio_gain (o._audio_gain)
- , _audio_delay (o._audio_delay)
, _with_subtitles (o._with_subtitles)
, _subtitle_offset (o._subtitle_offset)
, _subtitle_scale (o._subtitle_scale)
root->add_child("Scaler")->add_child_text (_scaler->id ());
root->add_child("AB")->add_child_text (_ab ? "1" : "0");
- root->add_child("AudioGain")->add_child_text (boost::lexical_cast<string> (_audio_gain));
- root->add_child("AudioDelay")->add_child_text (boost::lexical_cast<string> (_audio_delay));
root->add_child("WithSubtitles")->add_child_text (_with_subtitles ? "1" : "0");
root->add_child("SubtitleOffset")->add_child_text (boost::lexical_cast<string> (_subtitle_offset));
root->add_child("SubtitleScale")->add_child_text (boost::lexical_cast<string> (_subtitle_scale));
_scaler = Scaler::from_id (f.string_child ("Scaler"));
_ab = f.bool_child ("AB");
- _audio_gain = f.number_child<float> ("AudioGain");
- _audio_delay = f.number_child<int> ("AudioDelay");
_with_subtitles = f.bool_child ("WithSubtitles");
_subtitle_offset = f.number_child<float> ("SubtitleOffset");
_subtitle_scale = f.number_child<float> ("SubtitleScale");
signal_changed (AB);
}
-void
-Film::set_audio_gain (float g)
-{
- {
- boost::mutex::scoped_lock lm (_state_mutex);
- _audio_gain = g;
- }
- signal_changed (AUDIO_GAIN);
-}
-
-void
-Film::set_audio_delay (int d)
-{
- {
- boost::mutex::scoped_lock lm (_state_mutex);
- _audio_delay = d;
- }
- signal_changed (AUDIO_DELAY);
-}
-
void
Film::set_with_subtitles (bool w)
{
FILTERS,
SCALER,
AB,
- AUDIO_GAIN,
- AUDIO_DELAY,
WITH_SUBTITLES,
SUBTITLE_OFFSET,
SUBTITLE_SCALE,
return _ab;
}
- float audio_gain () const {
- boost::mutex::scoped_lock lm (_state_mutex);
- return _audio_gain;
- }
-
- int audio_delay () const {
- boost::mutex::scoped_lock lm (_state_mutex);
- return _audio_delay;
- }
-
bool with_subtitles () const {
boost::mutex::scoped_lock lm (_state_mutex);
return _with_subtitles;
void set_filters (std::vector<Filter const *>);
void set_scaler (Scaler const *);
void set_ab (bool);
- void set_audio_gain (float);
- void set_audio_delay (int);
void set_with_subtitles (bool);
void set_subtitle_offset (int);
void set_subtitle_scale (float);
has the specified filters and post-processing.
*/
bool _ab;
- /** Gain to apply to audio in dB */
- float _audio_gain;
- /** Delay to apply to audio (positive moves audio later) in milliseconds */
- int _audio_delay;
/** True if subtitles should be shown for this film */
bool _with_subtitles;
/** y offset for placing subtitles, in source pixels; +ve is further down
try {
_film->log()->log (N_("Transcode job starting"));
- _film->log()->log (String::compose (N_("Audio delay is %1ms"), _film->audio_delay()));
_transcoder.reset (new Transcoder (_film, shared_from_this ()));
_transcoder->go ();
_film = f;
try_to_load_analysis ();
- _plot->set_gain (_film->audio_gain ());
+// _plot->set_gain (_film->audio_gain ());
_film_changed_connection = _film->Changed.connect (bind (&AudioDialog::film_changed, this, _1));
_film_audio_analysis_succeeded_connection = _film->AudioAnalysisSucceeded.connect (bind (&AudioDialog::try_to_load_analysis, this));
AudioDialog::film_changed (Film::Property p)
{
switch (p) {
- case Film::AUDIO_GAIN:
- _plot->set_gain (_film->audio_gain ());
+// case Film::AUDIO_GAIN:
+// _plot->set_gain (_film->audio_gain ());
break;
default:
break;
case Film::SCALER:
checked_set (_scaler, Scaler::as_index (_film->scaler ()));
break;
- case Film::AUDIO_GAIN:
- checked_set (_audio_gain, _film->audio_gain ());
- break;
- case Film::AUDIO_DELAY:
- checked_set (_audio_delay, _film->audio_delay ());
- break;
case Film::WITH_SUBTITLES:
checked_set (_with_subtitles, _film->with_subtitles ());
setup_subtitle_control_sensitivity ();
shared_ptr<Content> content = weak_content.lock ();
shared_ptr<VideoContent> video_content;
+ shared_ptr<AudioContent> audio_content;
if (content) {
video_content = dynamic_pointer_cast<VideoContent> (content);
+ audio_content = dynamic_pointer_cast<AudioContent> (content);
}
if (property == VideoContentProperty::VIDEO_CROP) {
checked_set (_top_crop, video_content ? video_content->crop().top : 0);
checked_set (_bottom_crop, video_content ? video_content->crop().bottom : 0);
setup_scaling_description ();
+ } else if (property == AudioContentProperty::AUDIO_GAIN) {
+ checked_set (_audio_gain, audio_content ? audio_content->audio_gain() : 0);
+ } else if (property == AudioContentProperty::AUDIO_DELAY) {
+ checked_set (_audio_delay, audio_content ? audio_content->audio_delay() : 0);
} else if (property == FFmpegContentProperty::SUBTITLE_STREAMS) {
setup_subtitle_control_sensitivity ();
} else if (property == FFmpegContentProperty::AUDIO_STREAMS) {
film_changed (Film::CONTAINER);
film_changed (Film::FILTERS);
film_changed (Film::SCALER);
- film_changed (Film::AUDIO_GAIN);
- film_changed (Film::AUDIO_DELAY);
film_changed (Film::WITH_SUBTITLES);
film_changed (Film::SUBTITLE_OFFSET);
film_changed (Film::SUBTITLE_SCALE);
film_changed (Film::DCP_VIDEO_FRAME_RATE);
film_content_changed (boost::shared_ptr<Content> (), VideoContentProperty::VIDEO_CROP);
+ film_content_changed (boost::shared_ptr<Content> (), AudioContentProperty::AUDIO_GAIN);
+ film_content_changed (boost::shared_ptr<Content> (), AudioContentProperty::AUDIO_DELAY);
film_content_changed (boost::shared_ptr<Content> (), FFmpegContentProperty::SUBTITLE_STREAMS);
film_content_changed (boost::shared_ptr<Content> (), FFmpegContentProperty::SUBTITLE_STREAM);
film_content_changed (boost::shared_ptr<Content> (), FFmpegContentProperty::AUDIO_STREAMS);
void
FilmEditor::audio_gain_changed (wxCommandEvent &)
{
- if (!_film) {
+ shared_ptr<AudioContent> ac = selected_audio_content ();
+ if (!ac) {
return;
}
- _film->set_audio_gain (_audio_gain->GetValue ());
+ ac->set_audio_gain (_audio_gain->GetValue ());
}
void
FilmEditor::audio_delay_changed (wxCommandEvent &)
{
- if (!_film) {
+ shared_ptr<AudioContent> ac = selected_audio_content ();
+ if (!ac) {
return;
}
- _film->set_audio_delay (_audio_delay->GetValue ());
+ ac->set_audio_delay (_audio_delay->GetValue ());
}
void
return dynamic_pointer_cast<VideoContent> (c);
}
+shared_ptr<AudioContent>
+FilmEditor::selected_audio_content ()
+{
+ shared_ptr<Content> c = selected_content ();
+ if (!c) {
+ return shared_ptr<AudioContent> ();
+ }
+
+ return dynamic_pointer_cast<AudioContent> (c);
+}
+
void
FilmEditor::setup_scaling_description ()
{
void active_jobs_changed (bool);
boost::shared_ptr<Content> selected_content ();
boost::shared_ptr<VideoContent> selected_video_content ();
+ boost::shared_ptr<AudioContent> selected_audio_content ();
wxNotebook* _main_notebook;
wxNotebook* _content_notebook;