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
17namespace webrtc {
18
19ProcessingComponent::ProcessingComponent()
20  : initialized_(false),
21    enabled_(false),
22    num_handles_(0) {}
23
24ProcessingComponent::~ProcessingComponent() {
25  assert(initialized_ == false);
26}
27
28int 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
38int 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
54bool ProcessingComponent::is_component_enabled() const {
55  return enabled_;
56}
57
58void* ProcessingComponent::handle(int index) const {
59  assert(index < num_handles_);
60  return handles_[index];
61}
62
63int ProcessingComponent::num_handles() const {
64  return num_handles_;
65}
66
67int ProcessingComponent::Initialize() {
68  if (!enabled_) {
69    return AudioProcessing::kNoError;
70  }
71
72  num_handles_ = num_handles_required();
73  if (num_handles_ > static_cast<int>(handles_.size())) {
74    handles_.resize(num_handles_, NULL);
75  }
76
77  assert(static_cast<int>(handles_.size()) >= num_handles_);
78  for (int 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
96int ProcessingComponent::Configure() {
97  if (!initialized_) {
98    return AudioProcessing::kNoError;
99  }
100
101  assert(static_cast<int>(handles_.size()) >= num_handles_);
102  for (int 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