1/*
2Copyright 2018 Google Inc. All Rights Reserved.
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS-IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
15*/
16
17#ifndef RESONANCE_AUDIO_NODE_PROCESSING_NODE_H_
18#define RESONANCE_AUDIO_NODE_PROCESSING_NODE_H_
19
20#include <memory>
21#include <vector>
22
23#include "base/audio_buffer.h"
24#include "node/publisher_node.h"
25#include "node/subscriber_node.h"
26
27namespace vraudio {
28
29// Audio processing node that reads from multiple inputs, processes the
30// received data and outputs its result.
31class ProcessingNode : public Node,
32 public SubscriberNode<const AudioBuffer*>,
33 public PublisherNode<const AudioBuffer*> {
34 public:
35 typedef SubscriberNode<const AudioBuffer*> SubscriberNodeType;
36 typedef PublisherNode<const AudioBuffer*> PublisherNodeType;
37
38 // Helper class to manage incoming |AudioBuffer|s.
39 class NodeInput {
40 public:
41 // Constructor.
42 //
43 // @param input_vector Vector containing pointers to incoming
44 // |AudioBuffer|s.
45 explicit NodeInput(const std::vector<const AudioBuffer*>& input_vector);
46
47 // Returns a nullptr if zero or more than one input buffers are available.
48 // Otherwise a pointer to the single input |AudioBuffer| is returned. This
49 // method should be used if only a single input |AudioBuffer| is expected.
50 //
51 // @return Pointer to single input |AudioBuffer|.
52 const AudioBuffer* GetSingleInput() const;
53
54 // Returns vector with input |AudioBuffer|s.
55 //
56 // @return Pointer to single input |AudioBuffer|.
57 const std::vector<const AudioBuffer*>& GetInputBuffers() const;
58
59 // Delete copy constructor.
60 NodeInput(const NodeInput& that) = delete;
61
62 private:
63 // Const reference to vector of input |AudioBuffer|s.
64 const std::vector<const AudioBuffer*>& input_vector_;
65 };
66
67 ProcessingNode();
68
69 // SubscriberNode<InputType> implementation.
70 void Connect(
71 const std::shared_ptr<PublisherNodeType>& publisher_node) override;
72
73 // Node implementation.
74 void Process() final;
75 bool CleanUp() override;
76
77 // By default, calls to AudioProcess() are skipped in case of empty input
78 // buffers. This enables this node to process audio buffers in the absence of
79 // input data (which is needed for instance for a reverberation effect).
80 void EnableProcessOnEmptyInput(bool enable);
81
82 // Disable copy constructor.
83 ProcessingNode(const ProcessingNode& that) = delete;
84
85 protected:
86 // Calls |CleanUp| on all connected input nodes.
87 void CallCleanUpOnInputNodes();
88
89 // Pure virtual method to implement the audio processing method. This method
90 // receives a vector of all input arguments to be processed and requires to
91 // output a single output buffer.
92 //
93 // @param input Input instance to receive pointers to input |AudioBuffer|s.
94 // @return Returns output data.
95 virtual const AudioBuffer* AudioProcess(const NodeInput& input) = 0;
96
97 private:
98 // PublisherNode<OutputType> implementation.
99 std::shared_ptr<Node> GetSharedNodePtr() final;
100 Node::Output<const AudioBuffer*>* GetOutput() final;
101
102 // Input stream to poll for incoming data.
103 Node::Input<const AudioBuffer*> input_stream_;
104
105 // Output stream to write processed data to.
106 Node::Output<const AudioBuffer*> output_stream_;
107
108 // Flag that indicates if |AudioProcess| should be called in case no input
109 // data is available.
110 bool process_on_no_input_;
111};
112
113} // namespace vraudio
114
115#endif // RESONANCE_AUDIO_NODE_PROCESSING_NODE_H_
116

source code of qtmultimedia/src/3rdparty/resonance-audio/resonance_audio/node/processing_node.h