Commit 47f798ae authored by Evan Liu's avatar Evan Liu Committed by Commit Bot

Reland "Add OnReady callback to the speech recognition client"

Patchset 1 contains the reland without any changes.

This CL adds a callback to the speech recognition client that is called
when all of the mojo pipes are bound, indicating that the speech
recognition service is available.

Bug: 1096632
Change-Id: I0006298c3d3191c84c80d920031abfcbf10e5cf6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2260935Reviewed-by: default avatarDale Curtis <dalecurtis@chromium.org>
Reviewed-by: default avatarScott Violet <sky@chromium.org>
Commit-Queue: Evan Liu <evliu@google.com>
Cr-Commit-Position: refs/heads/master@{#781504}
parent d1cfab1b
...@@ -1439,8 +1439,10 @@ ChromeContentRendererClient::CreateWorkerContentSettingsClient( ...@@ -1439,8 +1439,10 @@ ChromeContentRendererClient::CreateWorkerContentSettingsClient(
#if !defined(OS_ANDROID) #if !defined(OS_ANDROID)
std::unique_ptr<media::SpeechRecognitionClient> std::unique_ptr<media::SpeechRecognitionClient>
ChromeContentRendererClient::CreateSpeechRecognitionClient( ChromeContentRendererClient::CreateSpeechRecognitionClient(
content::RenderFrame* render_frame) { content::RenderFrame* render_frame,
return std::make_unique<ChromeSpeechRecognitionClient>(render_frame); media::SpeechRecognitionClient::OnReadyCallback callback) {
return std::make_unique<ChromeSpeechRecognitionClient>(render_frame,
std::move(callback));
} }
#endif #endif
......
...@@ -151,7 +151,8 @@ class ChromeContentRendererClient ...@@ -151,7 +151,8 @@ class ChromeContentRendererClient
content::RenderFrame* render_frame) override; content::RenderFrame* render_frame) override;
#if !defined(OS_ANDROID) #if !defined(OS_ANDROID)
std::unique_ptr<media::SpeechRecognitionClient> CreateSpeechRecognitionClient( std::unique_ptr<media::SpeechRecognitionClient> CreateSpeechRecognitionClient(
content::RenderFrame* render_frame) override; content::RenderFrame* render_frame,
media::SpeechRecognitionClient::OnReadyCallback callback) override;
#endif #endif
void AddSupportedKeySystems( void AddSupportedKeySystems(
std::vector<std::unique_ptr<::media::KeySystemProperties>>* key_systems) std::vector<std::unique_ptr<::media::KeySystemProperties>>* key_systems)
......
...@@ -26,8 +26,9 @@ std::vector<std::string> GetBlockedURLs() { ...@@ -26,8 +26,9 @@ std::vector<std::string> GetBlockedURLs() {
} }
ChromeSpeechRecognitionClient::ChromeSpeechRecognitionClient( ChromeSpeechRecognitionClient::ChromeSpeechRecognitionClient(
content::RenderFrame* render_frame) content::RenderFrame* render_frame,
: blocked_urls_(GetBlockedURLs()) { media::SpeechRecognitionClient::OnReadyCallback callback)
: on_ready_callback_(std::move(callback)), blocked_urls_(GetBlockedURLs()) {
mojo::PendingReceiver<media::mojom::SpeechRecognitionContext> mojo::PendingReceiver<media::mojom::SpeechRecognitionContext>
speech_recognition_context_receiver = speech_recognition_context_receiver =
speech_recognition_context_.BindNewPipeAndPassReceiver(); speech_recognition_context_.BindNewPipeAndPassReceiver();
...@@ -36,6 +37,7 @@ ChromeSpeechRecognitionClient::ChromeSpeechRecognitionClient( ...@@ -36,6 +37,7 @@ ChromeSpeechRecognitionClient::ChromeSpeechRecognitionClient(
speech_recognition_client_receiver_.BindNewPipeAndPassRemote(), speech_recognition_client_receiver_.BindNewPipeAndPassRemote(),
base::BindOnce(&ChromeSpeechRecognitionClient::OnRecognizerBound, base::BindOnce(&ChromeSpeechRecognitionClient::OnRecognizerBound,
base::Unretained(this))); base::Unretained(this)));
render_frame->GetBrowserInterfaceBroker()->GetInterface( render_frame->GetBrowserInterfaceBroker()->GetInterface(
std::move(speech_recognition_context_receiver)); std::move(speech_recognition_context_receiver));
render_frame->GetBrowserInterfaceBroker()->GetInterface( render_frame->GetBrowserInterfaceBroker()->GetInterface(
...@@ -47,6 +49,10 @@ ChromeSpeechRecognitionClient::ChromeSpeechRecognitionClient( ...@@ -47,6 +49,10 @@ ChromeSpeechRecognitionClient::ChromeSpeechRecognitionClient(
void ChromeSpeechRecognitionClient::OnRecognizerBound( void ChromeSpeechRecognitionClient::OnRecognizerBound(
bool is_multichannel_supported) { bool is_multichannel_supported) {
is_multichannel_supported_ = is_multichannel_supported; is_multichannel_supported_ = is_multichannel_supported;
is_recognizer_bound_ = true;
if (on_ready_callback_)
std::move(on_ready_callback_).Run();
} }
ChromeSpeechRecognitionClient::~ChromeSpeechRecognitionClient() = default; ChromeSpeechRecognitionClient::~ChromeSpeechRecognitionClient() = default;
...@@ -61,9 +67,9 @@ void ChromeSpeechRecognitionClient::AddAudio( ...@@ -61,9 +67,9 @@ void ChromeSpeechRecognitionClient::AddAudio(
} }
bool ChromeSpeechRecognitionClient::IsSpeechRecognitionAvailable() { bool ChromeSpeechRecognitionClient::IsSpeechRecognitionAvailable() {
// TODO(evliu): Check if SODA is available.
return !is_website_blocked_ && is_browser_requesting_transcription_ && return !is_website_blocked_ && is_browser_requesting_transcription_ &&
speech_recognition_recognizer_.is_bound() && is_recognizer_bound_ && speech_recognition_recognizer_.is_connected();
speech_recognition_recognizer_.is_connected();
} }
void ChromeSpeechRecognitionClient::OnSpeechRecognitionRecognitionEvent( void ChromeSpeechRecognitionClient::OnSpeechRecognitionRecognitionEvent(
......
...@@ -28,7 +28,9 @@ class ChromeSpeechRecognitionClient ...@@ -28,7 +28,9 @@ class ChromeSpeechRecognitionClient
: public media::SpeechRecognitionClient, : public media::SpeechRecognitionClient,
public media::mojom::SpeechRecognitionRecognizerClient { public media::mojom::SpeechRecognitionRecognizerClient {
public: public:
explicit ChromeSpeechRecognitionClient(content::RenderFrame* render_frame); explicit ChromeSpeechRecognitionClient(
content::RenderFrame* render_frame,
media::SpeechRecognitionClient::OnReadyCallback callback);
ChromeSpeechRecognitionClient(const ChromeSpeechRecognitionClient&) = delete; ChromeSpeechRecognitionClient(const ChromeSpeechRecognitionClient&) = delete;
ChromeSpeechRecognitionClient& operator=( ChromeSpeechRecognitionClient& operator=(
const ChromeSpeechRecognitionClient&) = delete; const ChromeSpeechRecognitionClient&) = delete;
...@@ -61,6 +63,8 @@ class ChromeSpeechRecognitionClient ...@@ -61,6 +63,8 @@ class ChromeSpeechRecognitionClient
void ResetChannelMixer(const media::AudioBuffer& buffer); void ResetChannelMixer(const media::AudioBuffer& buffer);
bool IsUrlBlocked(const std::string& url) const; bool IsUrlBlocked(const std::string& url) const;
media::SpeechRecognitionClient::OnReadyCallback on_ready_callback_;
mojo::Remote<media::mojom::SpeechRecognitionContext> mojo::Remote<media::mojom::SpeechRecognitionContext>
speech_recognition_context_; speech_recognition_context_;
mojo::Remote<media::mojom::SpeechRecognitionRecognizer> mojo::Remote<media::mojom::SpeechRecognitionRecognizer>
...@@ -78,6 +82,9 @@ class ChromeSpeechRecognitionClient ...@@ -78,6 +82,9 @@ class ChromeSpeechRecognitionClient
// Whether the browser is still requesting transcriptions. // Whether the browser is still requesting transcriptions.
bool is_browser_requesting_transcription_ = true; bool is_browser_requesting_transcription_ = true;
bool is_recognizer_bound_ = false;
// The temporary audio bus used to mix multichannel audio into a single // The temporary audio bus used to mix multichannel audio into a single
// channel. // channel.
std::unique_ptr<media::AudioBus> monaural_audio_bus_; std::unique_ptr<media::AudioBus> monaural_audio_bus_;
......
...@@ -189,7 +189,8 @@ ContentRendererClient::CreateWorkerContentSettingsClient( ...@@ -189,7 +189,8 @@ ContentRendererClient::CreateWorkerContentSettingsClient(
#if !defined(OS_ANDROID) #if !defined(OS_ANDROID)
std::unique_ptr<media::SpeechRecognitionClient> std::unique_ptr<media::SpeechRecognitionClient>
ContentRendererClient::CreateSpeechRecognitionClient( ContentRendererClient::CreateSpeechRecognitionClient(
RenderFrame* render_frame) { RenderFrame* render_frame,
media::SpeechRecognitionClient::OnReadyCallback callback) {
return nullptr; return nullptr;
} }
#endif #endif
......
...@@ -305,7 +305,9 @@ class CONTENT_EXPORT ContentRendererClient { ...@@ -305,7 +305,9 @@ class CONTENT_EXPORT ContentRendererClient {
#if !defined(OS_ANDROID) #if !defined(OS_ANDROID)
// Creates a speech recognition client used to transcribe audio into captions. // Creates a speech recognition client used to transcribe audio into captions.
virtual std::unique_ptr<media::SpeechRecognitionClient> virtual std::unique_ptr<media::SpeechRecognitionClient>
CreateSpeechRecognitionClient(RenderFrame* render_frame); CreateSpeechRecognitionClient(
RenderFrame* render_frame,
media::SpeechRecognitionClient::OnReadyCallback callback);
#endif #endif
// Returns true if the page at |url| can use Pepper CameraDevice APIs. // Returns true if the page at |url| can use Pepper CameraDevice APIs.
......
...@@ -181,7 +181,7 @@ std::unique_ptr<media::DefaultRendererFactory> CreateDefaultRendererFactory( ...@@ -181,7 +181,7 @@ std::unique_ptr<media::DefaultRendererFactory> CreateDefaultRendererFactory(
media_log, decoder_factory, media_log, decoder_factory,
base::BindRepeating(&content::RenderThreadImpl::GetGpuFactories, base::BindRepeating(&content::RenderThreadImpl::GetGpuFactories,
base::Unretained(render_thread)), base::Unretained(render_thread)),
render_frame->CreateSpeechRecognitionClient()); render_frame->CreateSpeechRecognitionClient(base::OnceClosure()));
#endif #endif
return default_factory; return default_factory;
} }
......
...@@ -3676,10 +3676,12 @@ RenderFrameImpl::CreateWorkerContentSettingsClient() { ...@@ -3676,10 +3676,12 @@ RenderFrameImpl::CreateWorkerContentSettingsClient() {
#if !defined(OS_ANDROID) #if !defined(OS_ANDROID)
std::unique_ptr<media::SpeechRecognitionClient> std::unique_ptr<media::SpeechRecognitionClient>
RenderFrameImpl::CreateSpeechRecognitionClient() { RenderFrameImpl::CreateSpeechRecognitionClient(
media::SpeechRecognitionClient::OnReadyCallback callback) {
if (!frame_ || !frame_->View()) if (!frame_ || !frame_->View())
return nullptr; return nullptr;
return GetContentClient()->renderer()->CreateSpeechRecognitionClient(this); return GetContentClient()->renderer()->CreateSpeechRecognitionClient(
this, std::move(callback));
} }
#endif #endif
......
...@@ -57,6 +57,7 @@ ...@@ -57,6 +57,7 @@
#include "ipc/ipc_message.h" #include "ipc/ipc_message.h"
#include "ipc/ipc_platform_file.h" #include "ipc/ipc_platform_file.h"
#include "media/base/routing_token_callback.h" #include "media/base/routing_token_callback.h"
#include "media/base/speech_recognition_client.h"
#include "mojo/public/cpp/bindings/associated_receiver.h" #include "mojo/public/cpp/bindings/associated_receiver.h"
#include "mojo/public/cpp/bindings/associated_remote.h" #include "mojo/public/cpp/bindings/associated_remote.h"
#include "mojo/public/cpp/bindings/pending_associated_receiver.h" #include "mojo/public/cpp/bindings/pending_associated_receiver.h"
...@@ -136,9 +137,6 @@ class Range; ...@@ -136,9 +137,6 @@ class Range;
namespace media { namespace media {
class MediaPermission; class MediaPermission;
#if !defined(OS_ANDROID)
class SpeechRecognitionClient;
#endif
} }
namespace service_manager { namespace service_manager {
...@@ -615,8 +613,8 @@ class CONTENT_EXPORT RenderFrameImpl ...@@ -615,8 +613,8 @@ class CONTENT_EXPORT RenderFrameImpl
std::unique_ptr<blink::WebContentSettingsClient> std::unique_ptr<blink::WebContentSettingsClient>
CreateWorkerContentSettingsClient() override; CreateWorkerContentSettingsClient() override;
#if !defined(OS_ANDROID) #if !defined(OS_ANDROID)
std::unique_ptr<media::SpeechRecognitionClient> std::unique_ptr<media::SpeechRecognitionClient> CreateSpeechRecognitionClient(
CreateSpeechRecognitionClient(); media::SpeechRecognitionClient::OnReadyCallback callback);
#endif #endif
scoped_refptr<blink::WebWorkerFetchContext> CreateWorkerFetchContext() scoped_refptr<blink::WebWorkerFetchContext> CreateWorkerFetchContext()
override; override;
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <memory> #include <memory>
#include "base/callback.h"
#include "media/base/audio_buffer.h" #include "media/base/audio_buffer.h"
#include "media/base/media_export.h" #include "media/base/media_export.h"
...@@ -16,6 +17,8 @@ namespace media { ...@@ -16,6 +17,8 @@ namespace media {
// captions. // captions.
class MEDIA_EXPORT SpeechRecognitionClient { class MEDIA_EXPORT SpeechRecognitionClient {
public: public:
using OnReadyCallback = base::OnceCallback<void()>;
virtual ~SpeechRecognitionClient() = default; virtual ~SpeechRecognitionClient() = default;
virtual void AddAudio(scoped_refptr<AudioBuffer> buffer) = 0; virtual void AddAudio(scoped_refptr<AudioBuffer> buffer) = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment