blob: 1a7799ba6ede20268cb5aa0e847c9199ef7a94ed [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_BROWSER_RENDERER_HOST_MEDIA_OLD_RENDER_FRAME_AUDIO_INPUT_STREAM_FACTORY_H_
#define CONTENT_BROWSER_RENDERER_HOST_MEDIA_OLD_RENDER_FRAME_AUDIO_INPUT_STREAM_FACTORY_H_
#include <cstdint>
#include <memory>
#include <string>
#include "base/callback.h"
#include "base/containers/flat_set.h"
#include "base/containers/unique_ptr_adapters.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "build/build_config.h"
#include "content/browser/media/media_devices_util.h"
#include "content/browser/renderer_host/media/audio_input_device_manager.h"
#include "content/browser/renderer_host/media/audio_input_stream_handle.h"
#include "content/browser/renderer_host/media/media_devices_manager.h"
#include "content/common/content_export.h"
#include "content/common/media/renderer_audio_input_stream_factory.mojom.h"
#include "content/public/browser/browser_thread.h"
#include "media/audio/audio_input_delegate.h"
#include "media/mojo/interfaces/audio_logging.mojom.h"
#include "mojo/public/cpp/bindings/binding.h"
#include "services/audio/public/mojom/audio_processing.mojom.h"
namespace media {
class AudioParameters;
} // namespace media
namespace content {
class MediaStreamManager;
// Handles a RendererAudioInputStreamFactory request for a render frame host,
// using the provided RendererAudioInputStreamFactoryContext. This class may
// be constructed on any thread, but must be used on the IO thread after that,
// and also destructed on the IO thread. It is being
// replaced by RenderFrameAudioInputStreamFactory, which forwards stream
// requests to the audio service (https://crbug.com/830493).
class CONTENT_EXPORT OldRenderFrameAudioInputStreamFactory
: public mojom::RendererAudioInputStreamFactory {
public:
using CreateDelegateCallback =
base::RepeatingCallback<std::unique_ptr<media::AudioInputDelegate>(
AudioInputDeviceManager* audio_input_device_manager,
media::mojom::AudioLogPtr audio_log,
AudioInputDeviceManager::KeyboardMicRegistration
keyboard_mic_registration,
uint32_t shared_memory_count,
int stream_id,
int session_id,
bool automatic_gain_control,
const media::AudioParameters& parameters,
media::AudioInputDelegate::EventHandler* event_handler)>;
OldRenderFrameAudioInputStreamFactory(
CreateDelegateCallback create_delegate_callback,
MediaStreamManager* media_stream_manager,
int render_process_id,
int render_frame_id);
~OldRenderFrameAudioInputStreamFactory() override;
private:
using InputStreamSet = base::flat_set<std::unique_ptr<AudioInputStreamHandle>,
base::UniquePtrComparator>;
// mojom::RendererAudioInputStreamFactory implementation.
void CreateStream(
mojom::RendererAudioInputStreamFactoryClientPtr client,
int32_t session_id,
const media::AudioParameters& audio_params,
bool automatic_gain_control,
uint32_t shared_memory_count,
audio::mojom::AudioProcessingConfigPtr processing_config) override;
void DoCreateStream(mojom::RendererAudioInputStreamFactoryClientPtr client,
int session_id,
const media::AudioParameters& audio_params,
bool automatic_gain_control,
uint32_t shared_memory_count,
AudioInputDeviceManager::KeyboardMicRegistration
keyboard_mic_registration);
void AssociateInputAndOutputForAec(
const base::UnguessableToken& input_stream_id,
const std::string& output_device_id) override;
void TranslateAndSetOutputDeviceForAec(
const base::UnguessableToken& input_stream_id,
const std::string& output_device_id,
const MediaDeviceSaltAndOrigin& salt_and_origin,
const MediaDeviceEnumeration& devices);
void RemoveStream(AudioInputStreamHandle* input_stream);
const CreateDelegateCallback create_delegate_callback_;
MediaStreamManager* media_stream_manager_;
const int render_process_id_;
const int render_frame_id_;
InputStreamSet streams_;
int next_stream_id_ = 0;
base::WeakPtrFactory<OldRenderFrameAudioInputStreamFactory> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(OldRenderFrameAudioInputStreamFactory);
};
// This class is a convenient bundle of factory and binding.
// It can be created on any thread, but should be destroyed on the IO thread
// (hence the DeleteOnIOThread pointer).
class CONTENT_EXPORT RenderFrameAudioInputStreamFactoryHandle {
public:
static std::unique_ptr<RenderFrameAudioInputStreamFactoryHandle,
BrowserThread::DeleteOnIOThread>
CreateFactory(OldRenderFrameAudioInputStreamFactory::CreateDelegateCallback
create_delegate_callback,
MediaStreamManager* media_stream_manager,
int render_process_id,
int render_frame_id,
mojom::RendererAudioInputStreamFactoryRequest request);
~RenderFrameAudioInputStreamFactoryHandle();
private:
RenderFrameAudioInputStreamFactoryHandle(
OldRenderFrameAudioInputStreamFactory::CreateDelegateCallback
create_delegate_callback,
MediaStreamManager* media_stream_manager,
int render_process_id,
int render_frame_id);
void Init(mojom::RendererAudioInputStreamFactoryRequest request);
OldRenderFrameAudioInputStreamFactory impl_;
mojo::Binding<mojom::RendererAudioInputStreamFactory> binding_;
DISALLOW_COPY_AND_ASSIGN(RenderFrameAudioInputStreamFactoryHandle);
};
using UniqueAudioInputStreamFactoryPtr =
std::unique_ptr<RenderFrameAudioInputStreamFactoryHandle,
BrowserThread::DeleteOnIOThread>;
} // namespace content
#endif // CONTENT_BROWSER_RENDERER_HOST_MEDIA_OLD_RENDER_FRAME_AUDIO_INPUT_STREAM_FACTORY_H_