221 lines
5.9 KiB
C++
221 lines
5.9 KiB
C++
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "SpeechSynthesisParent.h"
|
|
#include "nsSynthVoiceRegistry.h"
|
|
|
|
namespace mozilla::dom {
|
|
|
|
SpeechSynthesisParent::SpeechSynthesisParent() {
|
|
MOZ_COUNT_CTOR(SpeechSynthesisParent);
|
|
}
|
|
|
|
SpeechSynthesisParent::~SpeechSynthesisParent() {
|
|
MOZ_COUNT_DTOR(SpeechSynthesisParent);
|
|
}
|
|
|
|
void SpeechSynthesisParent::ActorDestroy(ActorDestroyReason aWhy) {
|
|
// Implement me! Bug 1005141
|
|
}
|
|
|
|
bool SpeechSynthesisParent::SendInit() {
|
|
return nsSynthVoiceRegistry::GetInstance()->SendInitialVoicesAndState(this);
|
|
}
|
|
|
|
PSpeechSynthesisRequestParent*
|
|
SpeechSynthesisParent::AllocPSpeechSynthesisRequestParent(
|
|
const nsAString& aText, const nsAString& aLang, const nsAString& aUri,
|
|
const float& aVolume, const float& aRate, const float& aPitch,
|
|
const bool& aShouldResistFingerprinting) {
|
|
RefPtr<SpeechTaskParent> task =
|
|
new SpeechTaskParent(aVolume, aText, aShouldResistFingerprinting);
|
|
SpeechSynthesisRequestParent* actor = new SpeechSynthesisRequestParent(task);
|
|
return actor;
|
|
}
|
|
|
|
bool SpeechSynthesisParent::DeallocPSpeechSynthesisRequestParent(
|
|
PSpeechSynthesisRequestParent* aActor) {
|
|
delete aActor;
|
|
return true;
|
|
}
|
|
|
|
mozilla::ipc::IPCResult
|
|
SpeechSynthesisParent::RecvPSpeechSynthesisRequestConstructor(
|
|
PSpeechSynthesisRequestParent* aActor, const nsAString& aText,
|
|
const nsAString& aLang, const nsAString& aUri, const float& aVolume,
|
|
const float& aRate, const float& aPitch,
|
|
const bool& aShouldResistFingerprinting) {
|
|
MOZ_ASSERT(aActor);
|
|
SpeechSynthesisRequestParent* actor =
|
|
static_cast<SpeechSynthesisRequestParent*>(aActor);
|
|
nsSynthVoiceRegistry::GetInstance()->Speak(aText, aLang, aUri, aVolume, aRate,
|
|
aPitch, actor->mTask);
|
|
return IPC_OK();
|
|
}
|
|
|
|
// SpeechSynthesisRequestParent
|
|
|
|
SpeechSynthesisRequestParent::SpeechSynthesisRequestParent(
|
|
SpeechTaskParent* aTask)
|
|
: mTask(aTask) {
|
|
mTask->mActor = this;
|
|
MOZ_COUNT_CTOR(SpeechSynthesisRequestParent);
|
|
}
|
|
|
|
SpeechSynthesisRequestParent::~SpeechSynthesisRequestParent() {
|
|
if (mTask) {
|
|
mTask->mActor = nullptr;
|
|
// If we still have a task, cancel it.
|
|
mTask->Cancel();
|
|
}
|
|
MOZ_COUNT_DTOR(SpeechSynthesisRequestParent);
|
|
}
|
|
|
|
void SpeechSynthesisRequestParent::ActorDestroy(ActorDestroyReason aWhy) {
|
|
// Implement me! Bug 1005141
|
|
}
|
|
|
|
mozilla::ipc::IPCResult SpeechSynthesisRequestParent::RecvPause() {
|
|
MOZ_ASSERT(mTask);
|
|
mTask->Pause();
|
|
return IPC_OK();
|
|
}
|
|
|
|
mozilla::ipc::IPCResult SpeechSynthesisRequestParent::Recv__delete__() {
|
|
MOZ_ASSERT(mTask);
|
|
mTask->mActor = nullptr;
|
|
mTask = nullptr;
|
|
return IPC_OK();
|
|
}
|
|
|
|
mozilla::ipc::IPCResult SpeechSynthesisRequestParent::RecvResume() {
|
|
MOZ_ASSERT(mTask);
|
|
mTask->Resume();
|
|
return IPC_OK();
|
|
}
|
|
|
|
mozilla::ipc::IPCResult SpeechSynthesisRequestParent::RecvCancel() {
|
|
MOZ_ASSERT(mTask);
|
|
mTask->Cancel();
|
|
return IPC_OK();
|
|
}
|
|
|
|
mozilla::ipc::IPCResult SpeechSynthesisRequestParent::RecvForceEnd() {
|
|
MOZ_ASSERT(mTask);
|
|
mTask->ForceEnd();
|
|
return IPC_OK();
|
|
}
|
|
|
|
mozilla::ipc::IPCResult SpeechSynthesisRequestParent::RecvSetAudioOutputVolume(
|
|
const float& aVolume) {
|
|
MOZ_ASSERT(mTask);
|
|
mTask->SetAudioOutputVolume(aVolume);
|
|
return IPC_OK();
|
|
}
|
|
|
|
// SpeechTaskParent
|
|
|
|
nsresult SpeechTaskParent::DispatchStartImpl(const nsAString& aUri) {
|
|
if (!mActor) {
|
|
// Child is already gone.
|
|
return NS_OK;
|
|
}
|
|
|
|
if (NS_WARN_IF(!(mActor->SendOnStart(aUri)))) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
nsresult SpeechTaskParent::DispatchEndImpl(float aElapsedTime,
|
|
uint32_t aCharIndex) {
|
|
if (!mActor) {
|
|
// Child is already gone.
|
|
return NS_OK;
|
|
}
|
|
|
|
if (NS_WARN_IF(!(mActor->SendOnEnd(false, aElapsedTime, aCharIndex)))) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
nsresult SpeechTaskParent::DispatchPauseImpl(float aElapsedTime,
|
|
uint32_t aCharIndex) {
|
|
if (!mActor) {
|
|
// Child is already gone.
|
|
return NS_OK;
|
|
}
|
|
|
|
if (NS_WARN_IF(!(mActor->SendOnPause(aElapsedTime, aCharIndex)))) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
nsresult SpeechTaskParent::DispatchResumeImpl(float aElapsedTime,
|
|
uint32_t aCharIndex) {
|
|
if (!mActor) {
|
|
// Child is already gone.
|
|
return NS_OK;
|
|
}
|
|
|
|
if (NS_WARN_IF(!(mActor->SendOnResume(aElapsedTime, aCharIndex)))) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
nsresult SpeechTaskParent::DispatchErrorImpl(float aElapsedTime,
|
|
uint32_t aCharIndex) {
|
|
if (!mActor) {
|
|
// Child is already gone.
|
|
return NS_OK;
|
|
}
|
|
|
|
if (NS_WARN_IF(!(mActor->SendOnEnd(true, aElapsedTime, aCharIndex)))) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
nsresult SpeechTaskParent::DispatchBoundaryImpl(const nsAString& aName,
|
|
float aElapsedTime,
|
|
uint32_t aCharIndex,
|
|
uint32_t aCharLength,
|
|
uint8_t argc) {
|
|
if (!mActor) {
|
|
// Child is already gone.
|
|
return NS_OK;
|
|
}
|
|
|
|
if (NS_WARN_IF(!(mActor->SendOnBoundary(aName, aElapsedTime, aCharIndex,
|
|
aCharLength, argc)))) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
nsresult SpeechTaskParent::DispatchMarkImpl(const nsAString& aName,
|
|
float aElapsedTime,
|
|
uint32_t aCharIndex) {
|
|
if (!mActor) {
|
|
// Child is already gone.
|
|
return NS_OK;
|
|
}
|
|
|
|
if (NS_WARN_IF(!(mActor->SendOnMark(aName, aElapsedTime, aCharIndex)))) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
} // namespace mozilla::dom
|