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