
/*
 *  Copyright (c) 2020 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */
#include "modules/async_audio_processing/async_audio_processing.h"

#include <utility>

#include "api/audio/audio_frame.h"
#include "api/task_queue/task_queue_factory.h"
#include "rtc_base/checks.h"

namespace webrtc {

AsyncAudioProcessing::Factory::~Factory() = default;
AsyncAudioProcessing::Factory::Factory(AudioFrameProcessor& frame_processor,
                                       TaskQueueFactory& task_queue_factory)
    : frame_processor_(frame_processor),
      task_queue_factory_(task_queue_factory) {}

AsyncAudioProcessing::Factory::Factory(
    std::unique_ptr<AudioFrameProcessor> frame_processor,
    TaskQueueFactory& task_queue_factory)
    : frame_processor_(*frame_processor),
      owned_frame_processor_(std::move(frame_processor)),
      task_queue_factory_(task_queue_factory) {}

std::unique_ptr<AsyncAudioProcessing>
AsyncAudioProcessing::Factory::CreateAsyncAudioProcessing(
    AudioFrameProcessor::OnAudioFrameCallback on_frame_processed_callback) {
  if (owned_frame_processor_) {
    return std::make_unique<AsyncAudioProcessing>(
        std::move(owned_frame_processor_), task_queue_factory_,
        std::move(on_frame_processed_callback));
  } else {
    return std::make_unique<AsyncAudioProcessing>(
        frame_processor_, task_queue_factory_,
        std::move(on_frame_processed_callback));
  }
}

AsyncAudioProcessing::~AsyncAudioProcessing() {
  if (owned_frame_processor_) {
    owned_frame_processor_->SetSink(nullptr);
  } else {
    frame_processor_.SetSink(nullptr);
  }
}

AsyncAudioProcessing::AsyncAudioProcessing(
    AudioFrameProcessor& frame_processor,
    TaskQueueFactory& task_queue_factory,
    AudioFrameProcessor::OnAudioFrameCallback on_frame_processed_callback)
    : on_frame_processed_callback_(std::move(on_frame_processed_callback)),
      frame_processor_(frame_processor),
      task_queue_(task_queue_factory.CreateTaskQueue(
          "AsyncAudioProcessing",
          TaskQueueFactory::Priority::NORMAL)) {
  frame_processor_.SetSink([this](std::unique_ptr<AudioFrame> frame) {
    task_queue_->PostTask([this, frame = std::move(frame)]() mutable {
      on_frame_processed_callback_(std::move(frame));
    });
  });
}

AsyncAudioProcessing::AsyncAudioProcessing(
    std::unique_ptr<AudioFrameProcessor> frame_processor,
    TaskQueueFactory& task_queue_factory,
    AudioFrameProcessor::OnAudioFrameCallback on_frame_processed_callback)
    : on_frame_processed_callback_(std::move(on_frame_processed_callback)),
      frame_processor_(*frame_processor),
      owned_frame_processor_(std::move(frame_processor)),
      task_queue_(task_queue_factory.CreateTaskQueue(
          "AsyncAudioProcessing",
          TaskQueueFactory::Priority::NORMAL)) {
  owned_frame_processor_->SetSink([this](std::unique_ptr<AudioFrame> frame) {
    task_queue_->PostTask([this, frame = std::move(frame)]() mutable {
      on_frame_processed_callback_(std::move(frame));
    });
  });
}

void AsyncAudioProcessing::Process(std::unique_ptr<AudioFrame> frame) {
  if (owned_frame_processor_) {
    task_queue_->PostTask([this, frame = std::move(frame)]() mutable {
      owned_frame_processor_->Process(std::move(frame));
    });
  } else {
    task_queue_->PostTask([this, frame = std::move(frame)]() mutable {
      frame_processor_.Process(std::move(frame));
    });
  }
}

}  // namespace webrtc
