diff options
Diffstat (limited to 'dom/media/webspeech/synth/ipc/SpeechSynthesisParent.cpp')
-rw-r--r-- | dom/media/webspeech/synth/ipc/SpeechSynthesisParent.cpp | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/dom/media/webspeech/synth/ipc/SpeechSynthesisParent.cpp b/dom/media/webspeech/synth/ipc/SpeechSynthesisParent.cpp new file mode 100644 index 000000000..8dc70e872 --- /dev/null +++ b/dom/media/webspeech/synth/ipc/SpeechSynthesisParent.cpp @@ -0,0 +1,234 @@ +/* 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 { +namespace dom { + +SpeechSynthesisParent::SpeechSynthesisParent() +{ + MOZ_COUNT_CTOR(SpeechSynthesisParent); +} + +SpeechSynthesisParent::~SpeechSynthesisParent() +{ + MOZ_COUNT_DTOR(SpeechSynthesisParent); +} + +void +SpeechSynthesisParent::ActorDestroy(ActorDestroyReason aWhy) +{ + // Implement me! Bug 1005141 +} + +bool +SpeechSynthesisParent::RecvReadVoicesAndState(InfallibleTArray<RemoteVoice>* aVoices, + InfallibleTArray<nsString>* aDefaults, + bool* aIsSpeaking) +{ + nsSynthVoiceRegistry::GetInstance()->SendVoicesAndState(aVoices, aDefaults, + aIsSpeaking); + return true; +} + +PSpeechSynthesisRequestParent* +SpeechSynthesisParent::AllocPSpeechSynthesisRequestParent(const nsString& aText, + const nsString& aLang, + const nsString& aUri, + const float& aVolume, + const float& aRate, + const float& aPitch) +{ + RefPtr<SpeechTaskParent> task = new SpeechTaskParent(aVolume, aText); + SpeechSynthesisRequestParent* actor = new SpeechSynthesisRequestParent(task); + return actor; +} + +bool +SpeechSynthesisParent::DeallocPSpeechSynthesisRequestParent(PSpeechSynthesisRequestParent* aActor) +{ + delete aActor; + return true; +} + +bool +SpeechSynthesisParent::RecvPSpeechSynthesisRequestConstructor(PSpeechSynthesisRequestParent* aActor, + const nsString& aText, + const nsString& aLang, + const nsString& aUri, + const float& aVolume, + const float& aRate, + const float& aPitch) +{ + MOZ_ASSERT(aActor); + SpeechSynthesisRequestParent* actor = + static_cast<SpeechSynthesisRequestParent*>(aActor); + nsSynthVoiceRegistry::GetInstance()->Speak(aText, aLang, aUri, aVolume, aRate, + aPitch, actor->mTask); + return true; +} + +// 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 +} + +bool +SpeechSynthesisRequestParent::RecvPause() +{ + MOZ_ASSERT(mTask); + mTask->Pause(); + return true; +} + +bool +SpeechSynthesisRequestParent::Recv__delete__() +{ + MOZ_ASSERT(mTask); + mTask->mActor = nullptr; + mTask = nullptr; + return true; +} + +bool +SpeechSynthesisRequestParent::RecvResume() +{ + MOZ_ASSERT(mTask); + mTask->Resume(); + return true; +} + +bool +SpeechSynthesisRequestParent::RecvCancel() +{ + MOZ_ASSERT(mTask); + mTask->Cancel(); + return true; +} + +bool +SpeechSynthesisRequestParent::RecvForceEnd() +{ + MOZ_ASSERT(mTask); + mTask->ForceEnd(); + return true; +} + +bool +SpeechSynthesisRequestParent::RecvSetAudioOutputVolume(const float& aVolume) +{ + MOZ_ASSERT(mTask); + mTask->SetAudioOutputVolume(aVolume); + return true; +} + +// SpeechTaskParent + +nsresult +SpeechTaskParent::DispatchStartImpl(const nsAString& aUri) +{ + MOZ_ASSERT(mActor); + if(NS_WARN_IF(!(mActor->SendOnStart(nsString(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) +{ + MOZ_ASSERT(mActor); + if(NS_WARN_IF(!(mActor->SendOnPause(aElapsedTime, aCharIndex)))) { + return NS_ERROR_FAILURE; + } + + return NS_OK; +} + +nsresult +SpeechTaskParent::DispatchResumeImpl(float aElapsedTime, uint32_t aCharIndex) +{ + MOZ_ASSERT(mActor); + if(NS_WARN_IF(!(mActor->SendOnResume(aElapsedTime, aCharIndex)))) { + return NS_ERROR_FAILURE; + } + + return NS_OK; +} + +nsresult +SpeechTaskParent::DispatchErrorImpl(float aElapsedTime, uint32_t aCharIndex) +{ + MOZ_ASSERT(mActor); + 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) +{ + MOZ_ASSERT(mActor); + if(NS_WARN_IF(!(mActor->SendOnBoundary(nsString(aName), aElapsedTime, aCharIndex)))) { + return NS_ERROR_FAILURE; + } + + return NS_OK; +} + +nsresult +SpeechTaskParent::DispatchMarkImpl(const nsAString& aName, + float aElapsedTime, uint32_t aCharIndex) +{ + MOZ_ASSERT(mActor); + if(NS_WARN_IF(!(mActor->SendOnMark(nsString(aName), aElapsedTime, aCharIndex)))) { + return NS_ERROR_FAILURE; + } + + return NS_OK; +} + +} // namespace dom +} // namespace mozilla |