
/*
 *  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::kNormal)) {
  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::kNormal)) {
  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
