/* * 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. */ #ifndef MODULES_ASYNC_AUDIO_PROCESSING_ASYNC_AUDIO_PROCESSING_H_ #define MODULES_ASYNC_AUDIO_PROCESSING_ASYNC_AUDIO_PROCESSING_H_ #include #include "api/audio/audio_frame_processor.h" #include "rtc_base/ref_count.h" #include "rtc_base/task_queue.h" namespace webrtc { class AudioFrame; class TaskQueueFactory; // Helper class taking care of interactions with AudioFrameProcessor // in asynchronous manner. Offloads AudioFrameProcessor::Process calls // to a dedicated task queue. Makes sure that it's always safe for // AudioFrameProcessor to pass processed frames back to its sink. class AsyncAudioProcessing final { public: // Helper class passing AudioFrameProcessor and TaskQueueFactory into // AsyncAudioProcessing constructor. class Factory : public rtc::RefCountInterface { public: Factory(const Factory&) = delete; Factory& operator=(const Factory&) = delete; ~Factory(); Factory(AudioFrameProcessor& frame_processor, TaskQueueFactory& task_queue_factory); std::unique_ptr CreateAsyncAudioProcessing( AudioFrameProcessor::OnAudioFrameCallback on_frame_processed_callback); private: AudioFrameProcessor& frame_processor_; TaskQueueFactory& task_queue_factory_; }; AsyncAudioProcessing(const AsyncAudioProcessing&) = delete; AsyncAudioProcessing& operator=(const AsyncAudioProcessing&) = delete; ~AsyncAudioProcessing(); // Creates AsyncAudioProcessing which will pass audio frames to // |frame_processor| on |task_queue_| and reply with processed frames passed // into |on_frame_processed_callback|, which is posted back onto // |task_queue_|. |task_queue_| is created using the provided // |task_queue_factory|. AsyncAudioProcessing( AudioFrameProcessor& frame_processor, TaskQueueFactory& task_queue_factory, AudioFrameProcessor::OnAudioFrameCallback on_frame_processed_callback); // Accepts |frame| for asynchronous processing. Thread-safe. void Process(std::unique_ptr frame); private: AudioFrameProcessor::OnAudioFrameCallback on_frame_processed_callback_; AudioFrameProcessor& frame_processor_; rtc::TaskQueue task_queue_; }; } // namespace webrtc #endif // MODULES_ASYNC_AUDIO_PROCESSING_ASYNC_AUDIO_PROCESSING_H_