summaryrefslogtreecommitdiff
path: root/src/lib/audio_content.h
blob: ba998a5ad5f62e414008c0474a56b226849ab142 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*
    Copyright (C) 2013-2021 Carl Hetherington <cth@carlh.net>

    This file is part of DCP-o-matic.

    DCP-o-matic is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    DCP-o-matic is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.

*/


/** @file  src/lib/audio_content.h
 *  @brief AudioContent and AudioContentProperty classes.
 */


#ifndef DCPOMATIC_AUDIO_CONTENT_H
#define DCPOMATIC_AUDIO_CONTENT_H


#include "content_part.h"
#include "audio_stream.h"
#include "audio_mapping.h"


/** @class AudioContentProperty
 *  @brief Names for properties of AudioContent.
 */
class AudioContentProperty
{
public:
	static int const STREAMS;
	static int const GAIN;
	static int const DELAY;
	static int const FADE_IN;
	static int const FADE_OUT;
};


class AudioContent : public ContentPart
{
public:
	explicit AudioContent (Content* parent);
	AudioContent (Content* parent, std::vector<std::shared_ptr<Content>>);
	AudioContent (Content* parent, cxml::ConstNodePtr);

	void as_xml (xmlpp::Node *) const;
	std::string technical_summary () const;
	void take_settings_from (std::shared_ptr<const AudioContent> c);

	AudioMapping mapping () const;
	void set_mapping (AudioMapping);
	int resampled_frame_rate (std::shared_ptr<const Film> film) const;
	std::vector<NamedChannel> channel_names () const;

	/** Set gain in dB */
	void set_gain (double);
	/** Set delay in milliseconds (positive moves audio later) */
	void set_delay (int);

	double gain () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _gain;
	}

	int delay () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _delay;
	}

	dcpomatic::ContentTime fade_in () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _fade_in;
	}

	dcpomatic::ContentTime fade_out () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _fade_out;
	}

	void set_fade_in (dcpomatic::ContentTime time);
	void set_fade_out (dcpomatic::ContentTime time);

	std::string processing_description (std::shared_ptr<const Film> film) const;

	std::vector<AudioStreamPtr> streams () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _streams;
	}

	void add_stream (AudioStreamPtr stream);
	void set_stream (AudioStreamPtr stream);
	void set_streams (std::vector<AudioStreamPtr> streams);
	AudioStreamPtr stream () const;

	void add_properties (std::shared_ptr<const Film> film, std::list<UserProperty> &) const;

	void modify_position (std::shared_ptr<const Film> film, dcpomatic::DCPTime& pos) const;
	void modify_trim_start (dcpomatic::ContentTime& pos) const;

	/** @param frame frame within the whole (untrimmed) content.
	 *  @param frame_rate The frame rate of the audio (it may have been resampled).
	 *  @return a fade coefficient for @ref length samples starting at an offset @frame within
	 *  the content, or an empty vector if the given section has no fade.
	 */
	std::vector<float> fade (AudioStreamPtr stream, Frame frame, Frame length, int frame_rate) const;

	static std::shared_ptr<AudioContent> from_xml (Content* parent, cxml::ConstNodePtr, int version);

private:

	/** Gain to apply to audio in dB */
	double _gain = 0;
	/** Delay to apply to audio (positive moves audio later) in milliseconds */
	int _delay = 0;
	dcpomatic::ContentTime _fade_in;
	dcpomatic::ContentTime _fade_out;
	std::vector<AudioStreamPtr> _streams;
};

#endif