blob: e6f4943da36159b3cad1beac5ef7ade191fb4640 [file] [log] [blame]
// Copyright 2021 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.
#include "chrome/browser/speech/fake_speech_recognition_service.h"
#include <utility>
#include "media/mojo/mojom/speech_recognition_service.mojom.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace speech {
FakeSpeechRecognitionService::FakeSpeechRecognitionService() = default;
FakeSpeechRecognitionService::~FakeSpeechRecognitionService() = default;
void FakeSpeechRecognitionService::Create(
mojo::PendingReceiver<media::mojom::SpeechRecognitionContext> receiver) {
speech_recognition_contexts_.Add(this, std::move(receiver));
}
void FakeSpeechRecognitionService::BindRecognizer(
mojo::PendingReceiver<media::mojom::SpeechRecognitionRecognizer> receiver,
mojo::PendingRemote<media::mojom::SpeechRecognitionRecognizerClient> client,
media::mojom::SpeechRecognitionOptionsPtr options,
BindRecognizerCallback callback) {
recognizer_receiver_.Bind(std::move(receiver));
recognizer_client_remote_.Bind(std::move(client));
recognizer_client_remote_.set_disconnect_handler(base::BindOnce(
&FakeSpeechRecognitionService::OnRecognizerClientDisconnected,
base::Unretained(this)));
std::move(callback).Run(is_multichannel_supported_);
}
void FakeSpeechRecognitionService::BindAudioSourceFetcher(
mojo::PendingReceiver<media::mojom::AudioSourceFetcher> fetcher_receiver,
mojo::PendingRemote<media::mojom::SpeechRecognitionRecognizerClient> client,
media::mojom::SpeechRecognitionOptionsPtr options,
BindRecognizerCallback callback) {
fetcher_receiver_.Bind(std::move(fetcher_receiver));
recognizer_client_remote_.Bind(std::move(client));
recognizer_client_remote_.set_disconnect_handler(base::BindOnce(
&FakeSpeechRecognitionService::OnRecognizerClientDisconnected,
base::Unretained(this)));
std::move(callback).Run(is_multichannel_supported_);
}
void FakeSpeechRecognitionService::Start(
mojo::PendingRemote<media::mojom::AudioStreamFactory> stream_factory,
const std::string& device_id,
const ::media::AudioParameters& audio_parameters) {
capturing_audio_ = true;
device_id_ = device_id;
audio_parameters_ = audio_parameters;
if (recognition_started_closure_) {
std::move(recognition_started_closure_).Run();
}
}
void FakeSpeechRecognitionService::Stop() {
capturing_audio_ = false;
device_id_ = "";
audio_parameters_ = base::nullopt;
}
void FakeSpeechRecognitionService::SendAudioToSpeechRecognitionService(
media::mojom::AudioDataS16Ptr buffer) {
has_received_audio_ = true;
}
void FakeSpeechRecognitionService::SendSpeechRecognitionResult(
media::mojom::SpeechRecognitionResultPtr result) {
ASSERT_TRUE(recognizer_client_remote_.is_bound());
EXPECT_TRUE(capturing_audio_ || has_received_audio_);
recognizer_client_remote_->OnSpeechRecognitionRecognitionEvent(
std::move(result),
base::BindOnce(&FakeSpeechRecognitionService::
OnSpeechRecognitionRecognitionEventCallback,
base::Unretained(this)));
}
void FakeSpeechRecognitionService::OnSpeechRecognitionRecognitionEventCallback(
bool success) {
capturing_audio_ = success;
}
void FakeSpeechRecognitionService::SendSpeechRecognitionError() {
ASSERT_TRUE(recognizer_client_remote_.is_bound());
recognizer_client_remote_->OnSpeechRecognitionError();
}
void FakeSpeechRecognitionService::WaitForRecognitionStarted() {
base::RunLoop runner;
recognition_started_closure_ = runner.QuitClosure();
runner.Run();
}
void FakeSpeechRecognitionService::OnRecognizerClientDisconnected() {
// Reset everything in case it will be re-used.
recognizer_client_remote_.reset();
fetcher_receiver_.reset();
recognizer_receiver_.reset();
capturing_audio_ = false;
device_id_ = "";
audio_parameters_ = base::nullopt;
}
} // namespace speech