1 /*
2  *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "webrtc/modules/audio_processing/processing_component.h"
12 
13 #include <assert.h>
14 
15 #include "webrtc/modules/audio_processing/include/audio_processing.h"
16 
17 namespace webrtc {
18 
ProcessingComponent()19 ProcessingComponent::ProcessingComponent()
20   : initialized_(false),
21     enabled_(false),
22     num_handles_(0) {}
23 
~ProcessingComponent()24 ProcessingComponent::~ProcessingComponent() {
25   assert(initialized_ == false);
26 }
27 
Destroy()28 int ProcessingComponent::Destroy() {
29   while (!handles_.empty()) {
30     DestroyHandle(handles_.back());
31     handles_.pop_back();
32   }
33   initialized_ = false;
34 
35   return AudioProcessing::kNoError;
36 }
37 
EnableComponent(bool enable)38 int ProcessingComponent::EnableComponent(bool enable) {
39   if (enable && !enabled_) {
40     enabled_ = enable; // Must be set before Initialize() is called.
41 
42     int err = Initialize();
43     if (err != AudioProcessing::kNoError) {
44       enabled_ = false;
45       return err;
46     }
47   } else {
48     enabled_ = enable;
49   }
50 
51   return AudioProcessing::kNoError;
52 }
53 
is_component_enabled() const54 bool ProcessingComponent::is_component_enabled() const {
55   return enabled_;
56 }
57 
handle(size_t index) const58 void* ProcessingComponent::handle(size_t index) const {
59   assert(index < num_handles_);
60   return handles_[index];
61 }
62 
num_handles() const63 size_t ProcessingComponent::num_handles() const {
64   return num_handles_;
65 }
66 
Initialize()67 int ProcessingComponent::Initialize() {
68   if (!enabled_) {
69     return AudioProcessing::kNoError;
70   }
71 
72   num_handles_ = num_handles_required();
73   if (num_handles_ > handles_.size()) {
74     handles_.resize(num_handles_, NULL);
75   }
76 
77   assert(handles_.size() >= num_handles_);
78   for (size_t i = 0; i < num_handles_; i++) {
79     if (handles_[i] == NULL) {
80       handles_[i] = CreateHandle();
81       if (handles_[i] == NULL) {
82         return AudioProcessing::kCreationFailedError;
83       }
84     }
85 
86     int err = InitializeHandle(handles_[i]);
87     if (err != AudioProcessing::kNoError) {
88       return GetHandleError(handles_[i]);
89     }
90   }
91 
92   initialized_ = true;
93   return Configure();
94 }
95 
Configure()96 int ProcessingComponent::Configure() {
97   if (!initialized_) {
98     return AudioProcessing::kNoError;
99   }
100 
101   assert(handles_.size() >= num_handles_);
102   for (size_t i = 0; i < num_handles_; i++) {
103     int err = ConfigureHandle(handles_[i]);
104     if (err != AudioProcessing::kNoError) {
105       return GetHandleError(handles_[i]);
106     }
107   }
108 
109   return AudioProcessing::kNoError;
110 }
111 }  // namespace webrtc
112