
/*
 *  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 <memory>
#include <utility>

#include "api/audio/audio_frame.h"
#include "api/audio/audio_frame_processor.h"
#include "api/task_queue/task_queue_factory.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
