Home | History | Annotate | Download | only in source
      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 "processing_component.h"
     12 
     13 #include <cassert>
     14 
     15 #include "audio_processing_impl.h"
     16 
     17 namespace webrtc {
     18 
     19 ProcessingComponent::ProcessingComponent(const AudioProcessingImpl* apm)
     20   : apm_(apm),
     21     initialized_(false),
     22     enabled_(false),
     23     num_handles_(0) {}
     24 
     25 ProcessingComponent::~ProcessingComponent() {
     26   assert(initialized_ == false);
     27 }
     28 
     29 int ProcessingComponent::Destroy() {
     30   while (!handles_.empty()) {
     31     DestroyHandle(handles_.back());
     32     handles_.pop_back();
     33   }
     34   initialized_ = false;
     35 
     36   return apm_->kNoError;
     37 }
     38 
     39 int ProcessingComponent::EnableComponent(bool enable) {
     40   if (enable && !enabled_) {
     41     enabled_ = enable; // Must be set before Initialize() is called.
     42 
     43     int err = Initialize();
     44     if (err != apm_->kNoError) {
     45       enabled_ = false;
     46       return err;
     47     }
     48   } else {
     49     enabled_ = enable;
     50   }
     51 
     52   return apm_->kNoError;
     53 }
     54 
     55 bool ProcessingComponent::is_component_enabled() const {
     56   return enabled_;
     57 }
     58 
     59 void* ProcessingComponent::handle(int index) const {
     60   assert(index < num_handles_);
     61   return handles_[index];
     62 }
     63 
     64 int ProcessingComponent::num_handles() const {
     65   return num_handles_;
     66 }
     67 
     68 int ProcessingComponent::Initialize() {
     69   if (!enabled_) {
     70     return apm_->kNoError;
     71   }
     72 
     73   num_handles_ = num_handles_required();
     74   if (num_handles_ > static_cast<int>(handles_.size())) {
     75     handles_.resize(num_handles_, NULL);
     76   }
     77 
     78   assert(static_cast<int>(handles_.size()) >= num_handles_);
     79   for (int i = 0; i < num_handles_; i++) {
     80     if (handles_[i] == NULL) {
     81       handles_[i] = CreateHandle();
     82       if (handles_[i] == NULL) {
     83         return apm_->kCreationFailedError;
     84       }
     85     }
     86 
     87     int err = InitializeHandle(handles_[i]);
     88     if (err != apm_->kNoError) {
     89       return GetHandleError(handles_[i]);
     90     }
     91   }
     92 
     93   initialized_ = true;
     94   return Configure();
     95 }
     96 
     97 int ProcessingComponent::Configure() {
     98   if (!initialized_) {
     99     return apm_->kNoError;
    100   }
    101 
    102   assert(static_cast<int>(handles_.size()) >= num_handles_);
    103   for (int i = 0; i < num_handles_; i++) {
    104     int err = ConfigureHandle(handles_[i]);
    105     if (err != apm_->kNoError) {
    106       return GetHandleError(handles_[i]);
    107     }
    108   }
    109 
    110   return apm_->kNoError;
    111 }
    112 }  // namespace webrtc
    113