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