1 // Copyright 2020 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/services/speech/speech_recognition_service_impl.h"
6 
7 #include "chrome/services/speech/speech_recognition_recognizer_impl.h"
8 
9 namespace speech {
10 
SpeechRecognitionServiceImpl(mojo::PendingReceiver<media::mojom::SpeechRecognitionService> receiver)11 SpeechRecognitionServiceImpl::SpeechRecognitionServiceImpl(
12     mojo::PendingReceiver<media::mojom::SpeechRecognitionService> receiver)
13     : receiver_(this, std::move(receiver)) {}
14 
15 SpeechRecognitionServiceImpl::~SpeechRecognitionServiceImpl() = default;
16 
BindContext(mojo::PendingReceiver<media::mojom::SpeechRecognitionContext> context)17 void SpeechRecognitionServiceImpl::BindContext(
18     mojo::PendingReceiver<media::mojom::SpeechRecognitionContext> context) {
19   speech_recognition_contexts_.Add(this, std::move(context));
20 }
21 
SetUrlLoaderFactory(mojo::PendingRemote<network::mojom::URLLoaderFactory> url_loader_factory)22 void SpeechRecognitionServiceImpl::SetUrlLoaderFactory(
23     mojo::PendingRemote<network::mojom::URLLoaderFactory> url_loader_factory) {
24   url_loader_factory_ = mojo::Remote<network::mojom::URLLoaderFactory>(
25       std::move(url_loader_factory));
26   url_loader_factory_.set_disconnect_handler(
27       base::BindOnce(&SpeechRecognitionServiceImpl::DisconnectHandler,
28                      base::Unretained(this)));
29 }
30 
SetSodaPath(const base::FilePath & binary_path,const base::FilePath & config_path)31 void SpeechRecognitionServiceImpl::SetSodaPath(
32     const base::FilePath& binary_path,
33     const base::FilePath& config_path) {
34   binary_path_ = binary_path;
35   config_path_ = config_path;
36 }
37 
BindSpeechRecognitionServiceClient(mojo::PendingRemote<media::mojom::SpeechRecognitionServiceClient> client)38 void SpeechRecognitionServiceImpl::BindSpeechRecognitionServiceClient(
39     mojo::PendingRemote<media::mojom::SpeechRecognitionServiceClient> client) {
40   client_ = mojo::Remote<media::mojom::SpeechRecognitionServiceClient>(
41       std::move(client));
42 }
43 
44 mojo::PendingRemote<network::mojom::URLLoaderFactory>
GetUrlLoaderFactory()45 SpeechRecognitionServiceImpl::GetUrlLoaderFactory() {
46   mojo::PendingRemote<network::mojom::URLLoaderFactory> pending_factory_remote;
47   url_loader_factory_->Clone(
48       pending_factory_remote.InitWithNewPipeAndPassReceiver());
49 
50   return pending_factory_remote;
51 }
52 
BindRecognizer(mojo::PendingReceiver<media::mojom::SpeechRecognitionRecognizer> receiver,mojo::PendingRemote<media::mojom::SpeechRecognitionRecognizerClient> client,BindRecognizerCallback callback)53 void SpeechRecognitionServiceImpl::BindRecognizer(
54     mojo::PendingReceiver<media::mojom::SpeechRecognitionRecognizer> receiver,
55     mojo::PendingRemote<media::mojom::SpeechRecognitionRecognizerClient> client,
56     BindRecognizerCallback callback) {
57   SpeechRecognitionRecognizerImpl::Create(
58       std::move(receiver), std::move(client), weak_factory_.GetWeakPtr(),
59       binary_path_, config_path_);
60   std::move(callback).Run(
61       SpeechRecognitionRecognizerImpl::IsMultichannelSupported());
62 }
63 
DisconnectHandler()64 void SpeechRecognitionServiceImpl::DisconnectHandler() {
65   if (client_.is_bound())
66     client_->OnNetworkServiceDisconnect();
67 }
68 
69 }  // namespace speech
70