blob: 1087fe4832d59ecfcd8474db992923b820bac468 [file] [log] [blame]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_PUBLIC_BROWSER_AUDIO_STREAM_BROKER_H_
#define CONTENT_PUBLIC_BROWSER_AUDIO_STREAM_BROKER_H_
#include <cstdint>
#include <memory>
#include <string>
#include "base/functional/callback.h"
#include "content/common/content_export.h"
#include "content/public/browser/global_routing_id.h"
#include "media/mojo/mojom/audio_output_stream.mojom.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "third_party/blink/public/mojom/media/renderer_audio_input_stream_factory.mojom.h"
namespace base {
class UnguessableToken;
}
namespace media {
class AudioParameters;
namespace mojom {
class AudioStreamFactory;
}
} // namespace media
namespace content {
// An AudioStreamBroker is used to broker a connection between a client
// (typically renderer) and the audio service. It also sets up all objects
// used for monitoring the stream. All AudioStreamBrokers are used on the IO
// thread.
class CONTENT_EXPORT AudioStreamBroker {
public:
class CONTENT_EXPORT LoopbackSink {
public:
LoopbackSink();
LoopbackSink(const LoopbackSink&) = delete;
LoopbackSink& operator=(const LoopbackSink&) = delete;
virtual ~LoopbackSink();
virtual void OnSourceGone() = 0;
};
class CONTENT_EXPORT LoopbackSource {
public:
LoopbackSource();
LoopbackSource(const LoopbackSource&) = delete;
LoopbackSource& operator=(const LoopbackSource&) = delete;
virtual ~LoopbackSource();
virtual void AddLoopbackSink(LoopbackSink* sink) = 0;
virtual void RemoveLoopbackSink(LoopbackSink* sink) = 0;
virtual const base::UnguessableToken& GetGroupID() = 0;
};
using DeleterCallback = base::OnceCallback<void(AudioStreamBroker*)>;
AudioStreamBroker(int render_process_id, int render_frame_id);
AudioStreamBroker(const AudioStreamBroker&) = delete;
AudioStreamBroker& operator=(const AudioStreamBroker&) = delete;
virtual ~AudioStreamBroker();
virtual void CreateStream(media::mojom::AudioStreamFactory* factory) = 0;
int render_process_id() const { return render_process_id_; }
int render_frame_id() const { return render_frame_id_; }
protected:
const int render_process_id_;
const int render_frame_id_;
};
// Used for dependency injection into ForwardingAudioStreamFactory. Used on the
// IO thread.
class CONTENT_EXPORT AudioStreamBrokerFactory {
public:
static std::unique_ptr<AudioStreamBrokerFactory> CreateImpl();
AudioStreamBrokerFactory();
AudioStreamBrokerFactory(const AudioStreamBrokerFactory&) = delete;
AudioStreamBrokerFactory& operator=(const AudioStreamBrokerFactory&) = delete;
virtual ~AudioStreamBrokerFactory();
virtual std::unique_ptr<AudioStreamBroker> CreateAudioInputStreamBroker(
int render_process_id,
int render_frame_id,
const std::string& device_id,
const media::AudioParameters& params,
const base::UnguessableToken& group_id,
uint32_t shared_memory_count,
bool enable_agc,
media::mojom::AudioProcessingConfigPtr processing_config,
AudioStreamBroker::DeleterCallback deleter,
mojo::PendingRemote<blink::mojom::RendererAudioInputStreamFactoryClient>
renderer_factory_client) = 0;
virtual std::unique_ptr<AudioStreamBroker> CreateAudioLoopbackStreamBroker(
int render_process_id,
int render_frame_id,
AudioStreamBroker::LoopbackSource* source,
const media::AudioParameters& params,
uint32_t shared_memory_count,
bool mute_source,
AudioStreamBroker::DeleterCallback deleter,
mojo::PendingRemote<blink::mojom::RendererAudioInputStreamFactoryClient>
renderer_factory_client) = 0;
virtual std::unique_ptr<AudioStreamBroker> CreateAudioOutputStreamBroker(
int render_process_id,
int render_frame_id,
const GlobalRenderFrameHostToken& main_frame_token,
int stream_id,
const std::string& output_device_id,
const media::AudioParameters& params,
const base::UnguessableToken& group_id,
AudioStreamBroker::DeleterCallback deleter,
mojo::PendingRemote<media::mojom::AudioOutputStreamProviderClient>
client) = 0;
};
} // namespace content
#endif // CONTENT_PUBLIC_BROWSER_AUDIO_STREAM_BROKER_H_