blob: 24d8928f4ba13f214274bce53bba7b00e5131cc4 [file] [log] [blame]
// Copyright 2018 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_MEDIA_AUDIO_STREAM_BROKER_H_
#define CONTENT_BROWSER_MEDIA_AUDIO_STREAM_BROKER_H_
#include <cstdint>
#include <memory>
#include <string>
#include "base/callback.h"
#include "base/macros.h"
#include "base/optional.h"
#include "content/common/content_export.h"
#include "content/common/media/renderer_audio_input_stream_factory.mojom.h"
#include "media/mojo/interfaces/audio_input_stream.mojom.h"
#include "media/mojo/interfaces/audio_output_stream.mojom.h"
#include "services/audio/public/mojom/audio_processing.mojom.h"
namespace audio {
namespace mojom {
class StreamFactory;
}
} // namespace audio
namespace base {
class UnguessableToken;
}
namespace media {
class AudioParameters;
class UserInputMonitorBase;
}
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();
virtual ~LoopbackSink();
virtual void OnSourceGone() = 0;
private:
DISALLOW_COPY_AND_ASSIGN(LoopbackSink);
};
class CONTENT_EXPORT LoopbackSource {
public:
LoopbackSource();
virtual ~LoopbackSource();
virtual void AddLoopbackSink(LoopbackSink* sink) = 0;
virtual void RemoveLoopbackSink(LoopbackSink* sink) = 0;
virtual const base::UnguessableToken& GetGroupID() = 0;
private:
DISALLOW_COPY_AND_ASSIGN(LoopbackSource);
};
using DeleterCallback = base::OnceCallback<void(AudioStreamBroker*)>;
AudioStreamBroker(int render_process_id, int render_frame_id);
virtual ~AudioStreamBroker();
virtual void CreateStream(audio::mojom::StreamFactory* factory) = 0;
// Thread-safe utility that notifies the process host identified by
// |render_process_id| of a started stream to ensure that the renderer is not
// backgrounded. Must be paired with a later call to
// NotifyRenderProcessOfStoppedStream()
static void NotifyProcessHostOfStartedStream(int render_process_id);
static void NotifyProcessHostOfStoppedStream(int render_process_id);
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_;
private:
DISALLOW_COPY_AND_ASSIGN(AudioStreamBroker);
};
// Used for dependency injection into ForwardingAudioStreamFactory. Used on the
// IO thread.
class CONTENT_EXPORT AudioStreamBrokerFactory {
public:
static std::unique_ptr<AudioStreamBrokerFactory> CreateImpl();
AudioStreamBrokerFactory();
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,
uint32_t shared_memory_count,
media::UserInputMonitorBase* user_input_monitor,
bool enable_agc,
audio::mojom::AudioProcessingConfigPtr processing_config,
AudioStreamBroker::DeleterCallback deleter,
mojom::RendererAudioInputStreamFactoryClientPtr
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,
mojom::RendererAudioInputStreamFactoryClientPtr
renderer_factory_client) = 0;
virtual std::unique_ptr<AudioStreamBroker> CreateAudioOutputStreamBroker(
int render_process_id,
int render_frame_id,
int stream_id,
const std::string& output_device_id,
const media::AudioParameters& params,
const base::UnguessableToken& group_id,
const base::Optional<base::UnguessableToken>& processing_id,
AudioStreamBroker::DeleterCallback deleter,
media::mojom::AudioOutputStreamProviderClientPtr client) = 0;
private:
DISALLOW_COPY_AND_ASSIGN(AudioStreamBrokerFactory);
};
} // namespace content
#endif // CONTENT_BROWSER_MEDIA_AUDIO_STREAM_BROKER_H_