blob: e8deaa11bae3eb01efc72419c413d0f4d0607d74 [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 <memory>
#include <string>
#include <utility>
#include "base/callback.h"
#include "base/macros.h"
#include "content/common/content_export.h"
#include "content/common/media/renderer_audio_input_stream_factory.mojom.h"
#include "content/public/browser/web_contents_observer.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;
}
namespace content {
class WebContents;
// 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.
class CONTENT_EXPORT AudioStreamBroker {
public:
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;
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.
class CONTENT_EXPORT AudioStreamBrokerFactory {
public:
class CONTENT_EXPORT LoopbackSource : public WebContentsObserver {
public:
explicit LoopbackSource(WebContents* source_contents);
~LoopbackSource() override;
// Virtual for mocking in tests.
// Will return an empty token if the source is not present.
virtual base::UnguessableToken GetGroupID();
// Signals the source WebContents that capturing started.
virtual void OnStartCapturing();
// Signals the source WebContents that capturing stopped.
virtual void OnStopCapturing();
// Sets the closure to run when the source WebContents is gone.
void set_on_gone_closure(base::OnceClosure on_gone_closure) {
on_gone_closure_ = std::move(on_gone_closure);
}
// WebContentsObserver implementation.
void WebContentsDestroyed() override;
protected:
LoopbackSource();
private:
base::OnceClosure on_gone_closure_;
DISALLOW_COPY_AND_ASSIGN(LoopbackSource);
};
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,
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,
std::unique_ptr<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;
// TODO(https://crbug.com/830493): Other kinds of streams.
private:
DISALLOW_COPY_AND_ASSIGN(AudioStreamBrokerFactory);
};
} // namespace content
#endif // CONTENT_BROWSER_MEDIA_AUDIO_STREAM_BROKER_H_