Skip to content

Commit 3031ea1

Browse files
committed
Bug 1940906 - Add IsModelInstalled to the model install IPC. r=media-playback-reviewers,alwu
Differential Revision: https://phabricator.services.mozilla.com/D315356
1 parent 255db86 commit 3031ea1

3 files changed

Lines changed: 34 additions & 2 deletions

File tree

‎dom/media/webspeech/recognition/PSpeechRecognition.ipdl‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ parent: // HWInference
3030
// Check if speech recognition models are available (cached or downloadable)
3131
// for the given languages, used for the "downloadable" Available() result.
3232
async IsModelAvailable(nsCString[] languages) returns (bool available);
33+
// Whether the models are already downloaded to the local cache, used for the
34+
// "available" Available() result.
35+
async IsModelInstalled(nsCString[] languages) returns (bool installed);
3336
// Install speech recognition models for the given languages
3437
async InstallModels(nsCString[] languages) returns (bool success);
3538
// Initialize the speech recognition session with a language and a list of

‎dom/media/webspeech/recognition/SpeechRecognitionParent.cpp‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,27 @@ mozilla::ipc::IPCResult SpeechRecognitionParent::RecvIsModelAvailable(
127127
std::move(aResolver), mIsModelAvailableRequest);
128128
}
129129

130+
mozilla::ipc::IPCResult SpeechRecognitionParent::RecvIsModelInstalled(
131+
const nsTArray<nsCString>& aLanguages,
132+
IsModelInstalledResolver&& aResolver) {
133+
if (aLanguages.IsEmpty()) {
134+
return IPC_FAIL(this,
135+
"RecvIsModelInstalled requires at least one language");
136+
}
137+
138+
nsCString modelId = dom::LanguagesToSpeechModelId(aLanguages);
139+
LOGD("{} languages: {} mapped to id={}", __func__,
140+
fmt::join(aLanguages, ", "), modelId.get());
141+
142+
return RunHWInferenceBoolQuery(
143+
__func__,
144+
[modelId](hwinference::HWInferenceChild* aChild) {
145+
return aChild->SendIsModelInstalled(dom::kSpeechRecognitionTask,
146+
modelId);
147+
},
148+
std::move(aResolver), mIsModelInstalledRequest);
149+
}
150+
130151
mozilla::ipc::IPCResult SpeechRecognitionParent::RecvInstallModels(
131152
const nsTArray<nsCString>& aLanguages, InstallModelsResolver&& aResolver) {
132153
if (aLanguages.IsEmpty()) {
@@ -447,6 +468,7 @@ void SpeechRecognitionParent::ActorDestroy(ActorDestroyReason aReason) {
447468
// resolve/reject callbacks never run and try to resolve a dead IPDL
448469
// resolver after this actor is torn down.
449470
mIsModelAvailableRequest.DisconnectIfExists();
471+
mIsModelInstalledRequest.DisconnectIfExists();
450472
mRetrieveModelIsInstalledRequest.DisconnectIfExists();
451473
mInstallModelRequest.DisconnectIfExists();
452474
mGetModelFileRequest.DisconnectIfExists();

‎dom/media/webspeech/recognition/SpeechRecognitionParent.h‎

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ class SpeechRecognitionParent final : public PSpeechRecognitionParent {
4949

5050
ipc::IPCResult RecvIsModelAvailable(const nsTArray<nsCString>& aLanguages,
5151
IsModelAvailableResolver&& aResolver);
52+
ipc::IPCResult RecvIsModelInstalled(const nsTArray<nsCString>& aLanguages,
53+
IsModelInstalledResolver&& aResolver);
5254
mozilla::ipc::IPCResult RecvInstallModels(
5355
const nsTArray<nsCString>& aLanguages, InstallModelsResolver&& aResolver);
5456
mozilla::ipc::IPCResult RecvInit(const nsCString& aEngineId,
@@ -72,8 +74,9 @@ class SpeechRecognitionParent final : public PSpeechRecognitionParent {
7274

7375
const dom::ContentParentId mContentId;
7476

75-
// Shared by RecvIsModelAvailable and RecvInstallModels, which otherwise
76-
// only differ in the HWInferenceChild call they make. Resolves
77+
// Shared by RecvIsModelAvailable, RecvIsModelInstalled, and
78+
// RecvInstallModels, which otherwise only differ in the HWInferenceChild
79+
// call they make and which request holder they track it with. Resolves
7780
// aResolver(false) if the utility process/HWInferenceChild isn't
7881
// available; otherwise calls aSendFunc(hwInferenceChild), tracks the
7982
// resulting promise in aRequestHolder, and resolves aResolver with the
@@ -146,6 +149,10 @@ class SpeechRecognitionParent final : public PSpeechRecognitionParent {
146149
MozPromiseRequestHolder<
147150
hwinference::PHWInferenceChild::IsModelAvailablePromise>
148151
mIsModelAvailableRequest;
152+
// Backs the JS-facing IsModelInstalled query.
153+
MozPromiseRequestHolder<
154+
hwinference::PHWInferenceChild::IsModelInstalledPromise>
155+
mIsModelInstalledRequest;
149156
// Tracks RetrieveModel()'s installation check, run before fetching the model
150157
// file for a recognition session.
151158
MozPromiseRequestHolder<

0 commit comments

Comments
 (0)