ae470d537acd008f6f608b2051f2e311c57cc4ff
[dcpomatic.git] / src / lib / resampler_manager.h
1 #include "audio_content.h"
2 #include "dcpomatic_time.h"
3 #include <boost/noncopyable.hpp>
4 #include <boost/shared_ptr.hpp>
5 #include <boost/weak_ptr.hpp>
6 #include <vector>
7
8
9 class AudioContent;
10 class AudioDecoder;
11 class AudioStream;
12 class Resampler;
13
14
15 class ResamplerManager
16 {
17 public:
18         ResamplerManager (std::weak_ptr<const Film> film)
19                 : _film (film)
20         {}
21
22         ResamplerManager (ResamplerManager const&) = delete;
23         ResamplerManager& operator= (ResamplerManager const&) = delete;
24
25         void add (dcpomatic::DCPTime start, dcpomatic::DCPTime end, std::shared_ptr<AudioContent> content, std::shared_ptr<AudioDecoder> decoder);
26         std::shared_ptr<Resampler> get (AudioDecoder* decoder, AudioStreamPtr stream, bool fast);
27
28 private:
29         friend struct resampler_manager_setup_test;
30
31         class Group
32         {
33         public:
34                 Group (dcpomatic::DCPTime start_, dcpomatic::DCPTime end_, std::shared_ptr<AudioContent> content, std::shared_ptr<AudioDecoder> decoder)
35                         : start(start_)
36                         , end(end_)
37                 {
38                         contents.push_back (content);
39                         decoders.push_back (decoder);
40                         resamplers.resize (content->streams().size());
41                 }
42
43                 dcpomatic::DCPTime start;
44                 dcpomatic::DCPTime end;
45                 std::vector<std::shared_ptr<AudioContent>> contents;
46                 std::vector<std::shared_ptr<AudioDecoder>> decoders;
47                 std::vector<std::shared_ptr<Resampler>> resamplers;
48         };
49
50         bool can_share (Group const& a, Group const& b) const;
51         void coalesce ();
52         bool coalesce_pass ();
53
54         std::weak_ptr<const Film> _film;
55         std::vector<Group> _groups;
56 };
57