blob: f0d973b8cc1a1d8d38b6413cf3f6fbee8d5e08b5 [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.
#ifndef CHROME_BROWSER_SPEECH_FAKE_SPEECH_RECOGNITION_SERVICE_H_
#define CHROME_BROWSER_SPEECH_FAKE_SPEECH_RECOGNITION_SERVICE_H_
#include <string>
#include "chrome/browser/speech/chrome_speech_recognition_service.h"
#include "media/base/audio_parameters.h"
#include "media/mojo/mojom/speech_recognition_service.mojom.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "mojo/public/cpp/bindings/remote.h"
namespace speech {
// A fake SpeechRecognitionService. This can only be used by one client at a
// time. This class also acts as the AudioSourceFetcher receiver and
// SpeechRecognitionRecognizer receiver to allow tests to inspect whether
// methods have been called properly.
class FakeSpeechRecognitionService
: public SpeechRecognitionService,
public media::mojom::SpeechRecognitionContext,
public media::mojom::SpeechRecognitionRecognizer,
public media::mojom::AudioSourceFetcher {
public:
FakeSpeechRecognitionService();
FakeSpeechRecognitionService(const FakeSpeechRecognitionService&) = delete;
FakeSpeechRecognitionService& operator=(const SpeechRecognitionService&) =
delete;
~FakeSpeechRecognitionService() override;
void Create(mojo::PendingReceiver<media::mojom::SpeechRecognitionContext>
receiver) override;
// media::mojom::SpeechRecognitionContext:
void BindRecognizer(
mojo::PendingReceiver<media::mojom::SpeechRecognitionRecognizer> receiver,
mojo::PendingRemote<media::mojom::SpeechRecognitionRecognizerClient>
client,
media::mojom::SpeechRecognitionOptionsPtr options,
BindRecognizerCallback callback) override;
void BindAudioSourceFetcher(
mojo::PendingReceiver<media::mojom::AudioSourceFetcher> fetcher_receiver,
mojo::PendingRemote<media::mojom::SpeechRecognitionRecognizerClient>
client,
media::mojom::SpeechRecognitionOptionsPtr options,
BindRecognizerCallback callback) override;
// media::mojom::AudioSourceFetcher:
void Start(
mojo::PendingRemote<media::mojom::AudioStreamFactory> stream_factory,
const std::string& device_id,
const ::media::AudioParameters& audio_parameters) override;
void Stop() override;
// media::mojom::SpeechRecognitionRecognizer:
void SendAudioToSpeechRecognitionService(
media::mojom::AudioDataS16Ptr buffer) override;
void OnLanguageChanged(const std::string& language) override {}
// Methods for testing plumbing to SpeechRecognitionRecognizerClient.
void SendSpeechRecognitionResult(
media::mojom::SpeechRecognitionResultPtr result);
void SendSpeechRecognitionError();
void WaitForRecognitionStarted();
// Whether AudioSourceFetcher is capturing audio.
bool is_capturing_audio() { return capturing_audio_; }
// Whether SendAudioToSpeechRecognitionService has been called.
bool has_received_audio() { return has_received_audio_; }
std::string device_id() { return device_id_; }
const base::Optional<::media::AudioParameters>& audio_parameters() {
return audio_parameters_;
}
void set_multichannel_supported(bool is_multichannel_supported) {
is_multichannel_supported_ = is_multichannel_supported;
}
private:
void OnRecognizerClientDisconnected();
void OnSpeechRecognitionRecognitionEventCallback(bool success);
// Whether multichannel audio is supported.
bool is_multichannel_supported_ = false;
// Whether the AudioSourceFetcher has been started.
bool capturing_audio_ = false;
// Whether any audio has been sent to the SpeechRecognitionRecognizer.
bool has_received_audio_ = false;
// The device ID used to capture audio.
std::string device_id_;
// The audio parameters used to capture audio.
base::Optional<::media::AudioParameters> audio_parameters_;
base::OnceClosure recognition_started_closure_;
mojo::Remote<media::mojom::SpeechRecognitionRecognizerClient>
recognizer_client_remote_;
mojo::ReceiverSet<media::mojom::SpeechRecognitionContext>
speech_recognition_contexts_;
mojo::Receiver<media::mojom::SpeechRecognitionRecognizer>
recognizer_receiver_{this};
mojo::Receiver<media::mojom::AudioSourceFetcher> fetcher_receiver_{this};
};
} // namespace speech
#endif // CHROME_BROWSER_SPEECH_FAKE_SPEECH_RECOGNITION_SERVICE_H_