зеркало из https://github.com/mozilla/gecko-dev.git
Backed out changeset 91cc337bef3b (bug 1191814) for m-e10s(3) failures in test_global_queue_pause.html
This commit is contained in:
Родитель
10db60555b
Коммит
5bfb9df98b
|
@ -23,8 +23,6 @@ async protocol PSpeechSynthesisRequest
|
||||||
|
|
||||||
ForceEnd();
|
ForceEnd();
|
||||||
|
|
||||||
SetAudioOutputVolume(uint32_t aVolume);
|
|
||||||
|
|
||||||
child:
|
child:
|
||||||
|
|
||||||
__delete__(bool aIsError, float aElapsedTime, uint32_t aCharIndex);
|
__delete__(bool aIsError, float aElapsedTime, uint32_t aCharIndex);
|
||||||
|
|
|
@ -191,13 +191,5 @@ SpeechTaskChild::ForceEnd()
|
||||||
mActor->SendForceEnd();
|
mActor->SendForceEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
SpeechTaskChild::SetAudioOutputVolume(uint32_t aVolume)
|
|
||||||
{
|
|
||||||
if (mActor) {
|
|
||||||
mActor->SendSetAudioOutputVolume(aVolume);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace dom
|
} // namespace dom
|
||||||
} // namespace mozilla
|
} // namespace mozilla
|
||||||
|
|
|
@ -92,8 +92,6 @@ public:
|
||||||
|
|
||||||
virtual void ForceEnd() override;
|
virtual void ForceEnd() override;
|
||||||
|
|
||||||
virtual void SetAudioOutputVolume(uint32_t aVolume) override;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SpeechSynthesisRequestChild* mActor;
|
SpeechSynthesisRequestChild* mActor;
|
||||||
};
|
};
|
||||||
|
|
|
@ -127,14 +127,6 @@ SpeechSynthesisRequestParent::RecvForceEnd()
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
|
||||||
SpeechSynthesisRequestParent::RecvSetAudioOutputVolume(const uint32_t& aVolume)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(mTask);
|
|
||||||
mTask->SetAudioOutputVolume(aVolume);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// SpeechTaskParent
|
// SpeechTaskParent
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
|
|
|
@ -69,8 +69,6 @@ protected:
|
||||||
virtual bool RecvCancel() override;
|
virtual bool RecvCancel() override;
|
||||||
|
|
||||||
virtual bool RecvForceEnd() override;
|
virtual bool RecvForceEnd() override;
|
||||||
|
|
||||||
virtual bool RecvSetAudioOutputVolume(const uint32_t& aVolume) override;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class SpeechTaskParent : public nsSpeechTask
|
class SpeechTaskParent : public nsSpeechTask
|
||||||
|
|
|
@ -4,13 +4,10 @@
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* 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/. */
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
#include "AudioChannelAgent.h"
|
|
||||||
#include "AudioChannelService.h"
|
|
||||||
#include "AudioSegment.h"
|
#include "AudioSegment.h"
|
||||||
#include "mozilla/Preferences.h"
|
|
||||||
#include "nsSpeechTask.h"
|
#include "nsSpeechTask.h"
|
||||||
#include "nsSynthVoiceRegistry.h"
|
|
||||||
#include "SpeechSynthesis.h"
|
#include "SpeechSynthesis.h"
|
||||||
|
#include "nsSynthVoiceRegistry.h"
|
||||||
|
|
||||||
// GetCurrentTime is defined in winbase.h as zero argument macro forwarding to
|
// GetCurrentTime is defined in winbase.h as zero argument macro forwarding to
|
||||||
// GetTickCount() and conflicts with nsSpeechTask::GetCurrentTime().
|
// GetTickCount() and conflicts with nsSpeechTask::GetCurrentTime().
|
||||||
|
@ -25,11 +22,6 @@ extern PRLogModuleInfo* GetSpeechSynthLog();
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
namespace dom {
|
namespace dom {
|
||||||
|
|
||||||
static bool UseAudioChannelService()
|
|
||||||
{
|
|
||||||
return Preferences::GetBool("media.useAudioChannelService");
|
|
||||||
}
|
|
||||||
|
|
||||||
class SynthStreamListener : public MediaStreamListener
|
class SynthStreamListener : public MediaStreamListener
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -97,7 +89,6 @@ NS_IMPL_CYCLE_COLLECTION(nsSpeechTask, mSpeechSynthesis, mUtterance, mCallback);
|
||||||
|
|
||||||
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsSpeechTask)
|
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsSpeechTask)
|
||||||
NS_INTERFACE_MAP_ENTRY(nsISpeechTask)
|
NS_INTERFACE_MAP_ENTRY(nsISpeechTask)
|
||||||
NS_INTERFACE_MAP_ENTRY(nsIAudioChannelAgentCallback)
|
|
||||||
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsISpeechTask)
|
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsISpeechTask)
|
||||||
NS_INTERFACE_MAP_END
|
NS_INTERFACE_MAP_END
|
||||||
|
|
||||||
|
@ -110,6 +101,7 @@ nsSpeechTask::nsSpeechTask(SpeechSynthesisUtterance* aUtterance)
|
||||||
, mPrePaused(false)
|
, mPrePaused(false)
|
||||||
, mPreCanceled(false)
|
, mPreCanceled(false)
|
||||||
, mCallback(nullptr)
|
, mCallback(nullptr)
|
||||||
|
, mIndirectAudio(false)
|
||||||
{
|
{
|
||||||
mText = aUtterance->mText;
|
mText = aUtterance->mText;
|
||||||
mVolume = aUtterance->Volume();
|
mVolume = aUtterance->Volume();
|
||||||
|
@ -123,6 +115,7 @@ nsSpeechTask::nsSpeechTask(float aVolume, const nsAString& aText)
|
||||||
, mPrePaused(false)
|
, mPrePaused(false)
|
||||||
, mPreCanceled(false)
|
, mPreCanceled(false)
|
||||||
, mCallback(nullptr)
|
, mCallback(nullptr)
|
||||||
|
, mIndirectAudio(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -149,7 +142,9 @@ nsSpeechTask::Init(ProcessedMediaStream* aStream)
|
||||||
if (aStream) {
|
if (aStream) {
|
||||||
mStream = MediaStreamGraph::GetInstance()->CreateSourceStream(nullptr);
|
mStream = MediaStreamGraph::GetInstance()->CreateSourceStream(nullptr);
|
||||||
mPort = aStream->AllocateInputPort(mStream, 0);
|
mPort = aStream->AllocateInputPort(mStream, 0);
|
||||||
|
mIndirectAudio = false;
|
||||||
} else {
|
} else {
|
||||||
|
mIndirectAudio = true;
|
||||||
}
|
}
|
||||||
mInited = true;
|
mInited = true;
|
||||||
}
|
}
|
||||||
|
@ -170,7 +165,8 @@ nsSpeechTask::Setup(nsISpeechTaskCallback* aCallback,
|
||||||
|
|
||||||
mCallback = aCallback;
|
mCallback = aCallback;
|
||||||
|
|
||||||
if (!mStream) {
|
if (mIndirectAudio) {
|
||||||
|
MOZ_ASSERT(!mStream);
|
||||||
if (argc > 0) {
|
if (argc > 0) {
|
||||||
NS_WARNING("Audio info arguments in Setup() are ignored for indirect audio services.");
|
NS_WARNING("Audio info arguments in Setup() are ignored for indirect audio services.");
|
||||||
}
|
}
|
||||||
|
@ -230,7 +226,7 @@ nsSpeechTask::SendAudio(JS::Handle<JS::Value> aData, JS::Handle<JS::Value> aLand
|
||||||
return NS_ERROR_INVALID_ARG;
|
return NS_ERROR_INVALID_ARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mStream) {
|
if (mIndirectAudio) {
|
||||||
NS_WARNING("Can't call SendAudio from an indirect audio speech service.");
|
NS_WARNING("Can't call SendAudio from an indirect audio speech service.");
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
}
|
||||||
|
@ -277,7 +273,7 @@ nsSpeechTask::SendAudioNative(int16_t* aData, uint32_t aDataLen)
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mStream) {
|
if (mIndirectAudio) {
|
||||||
NS_WARNING("Can't call SendAudio from an indirect audio speech service.");
|
NS_WARNING("Can't call SendAudio from an indirect audio speech service.");
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
}
|
||||||
|
@ -307,7 +303,7 @@ nsSpeechTask::SendAudioImpl(nsRefPtr<mozilla::SharedBuffer>& aSamples, uint32_t
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsSpeechTask::DispatchStart()
|
nsSpeechTask::DispatchStart()
|
||||||
{
|
{
|
||||||
if (mStream) {
|
if (!mIndirectAudio) {
|
||||||
NS_WARNING("Can't call DispatchStart() from a direct audio speech service");
|
NS_WARNING("Can't call DispatchStart() from a direct audio speech service");
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
}
|
||||||
|
@ -318,8 +314,6 @@ nsSpeechTask::DispatchStart()
|
||||||
nsresult
|
nsresult
|
||||||
nsSpeechTask::DispatchStartInner()
|
nsSpeechTask::DispatchStartInner()
|
||||||
{
|
{
|
||||||
CreateAudioChannelAgent();
|
|
||||||
|
|
||||||
nsSynthVoiceRegistry::GetInstance()->SetIsSpeaking(true);
|
nsSynthVoiceRegistry::GetInstance()->SetIsSpeaking(true);
|
||||||
return DispatchStartImpl();
|
return DispatchStartImpl();
|
||||||
}
|
}
|
||||||
|
@ -351,7 +345,7 @@ nsSpeechTask::DispatchStartImpl(const nsAString& aUri)
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsSpeechTask::DispatchEnd(float aElapsedTime, uint32_t aCharIndex)
|
nsSpeechTask::DispatchEnd(float aElapsedTime, uint32_t aCharIndex)
|
||||||
{
|
{
|
||||||
if (mStream) {
|
if (!mIndirectAudio) {
|
||||||
NS_WARNING("Can't call DispatchEnd() from a direct audio speech service");
|
NS_WARNING("Can't call DispatchEnd() from a direct audio speech service");
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
}
|
||||||
|
@ -362,8 +356,6 @@ nsSpeechTask::DispatchEnd(float aElapsedTime, uint32_t aCharIndex)
|
||||||
nsresult
|
nsresult
|
||||||
nsSpeechTask::DispatchEndInner(float aElapsedTime, uint32_t aCharIndex)
|
nsSpeechTask::DispatchEndInner(float aElapsedTime, uint32_t aCharIndex)
|
||||||
{
|
{
|
||||||
DestroyAudioChannelAgent();
|
|
||||||
|
|
||||||
if (!mPreCanceled) {
|
if (!mPreCanceled) {
|
||||||
nsSynthVoiceRegistry::GetInstance()->SpeakNext();
|
nsSynthVoiceRegistry::GetInstance()->SpeakNext();
|
||||||
}
|
}
|
||||||
|
@ -407,7 +399,7 @@ nsSpeechTask::DispatchEndImpl(float aElapsedTime, uint32_t aCharIndex)
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsSpeechTask::DispatchPause(float aElapsedTime, uint32_t aCharIndex)
|
nsSpeechTask::DispatchPause(float aElapsedTime, uint32_t aCharIndex)
|
||||||
{
|
{
|
||||||
if (mStream) {
|
if (!mIndirectAudio) {
|
||||||
NS_WARNING("Can't call DispatchPause() from a direct audio speech service");
|
NS_WARNING("Can't call DispatchPause() from a direct audio speech service");
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
}
|
||||||
|
@ -439,7 +431,7 @@ nsSpeechTask::DispatchPauseImpl(float aElapsedTime, uint32_t aCharIndex)
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsSpeechTask::DispatchResume(float aElapsedTime, uint32_t aCharIndex)
|
nsSpeechTask::DispatchResume(float aElapsedTime, uint32_t aCharIndex)
|
||||||
{
|
{
|
||||||
if (mStream) {
|
if (!mIndirectAudio) {
|
||||||
NS_WARNING("Can't call DispatchResume() from a direct audio speech service");
|
NS_WARNING("Can't call DispatchResume() from a direct audio speech service");
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
}
|
||||||
|
@ -472,7 +464,7 @@ nsSpeechTask::DispatchResumeImpl(float aElapsedTime, uint32_t aCharIndex)
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsSpeechTask::DispatchError(float aElapsedTime, uint32_t aCharIndex)
|
nsSpeechTask::DispatchError(float aElapsedTime, uint32_t aCharIndex)
|
||||||
{
|
{
|
||||||
if (mStream) {
|
if (!mIndirectAudio) {
|
||||||
NS_WARNING("Can't call DispatchError() from a direct audio speech service");
|
NS_WARNING("Can't call DispatchError() from a direct audio speech service");
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
}
|
||||||
|
@ -499,7 +491,7 @@ NS_IMETHODIMP
|
||||||
nsSpeechTask::DispatchBoundary(const nsAString& aName,
|
nsSpeechTask::DispatchBoundary(const nsAString& aName,
|
||||||
float aElapsedTime, uint32_t aCharIndex)
|
float aElapsedTime, uint32_t aCharIndex)
|
||||||
{
|
{
|
||||||
if (mStream) {
|
if (!mIndirectAudio) {
|
||||||
NS_WARNING("Can't call DispatchBoundary() from a direct audio speech service");
|
NS_WARNING("Can't call DispatchBoundary() from a direct audio speech service");
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
}
|
||||||
|
@ -526,7 +518,7 @@ NS_IMETHODIMP
|
||||||
nsSpeechTask::DispatchMark(const nsAString& aName,
|
nsSpeechTask::DispatchMark(const nsAString& aName,
|
||||||
float aElapsedTime, uint32_t aCharIndex)
|
float aElapsedTime, uint32_t aCharIndex)
|
||||||
{
|
{
|
||||||
if (mStream) {
|
if (!mIndirectAudio) {
|
||||||
NS_WARNING("Can't call DispatchMark() from a direct audio speech service");
|
NS_WARNING("Can't call DispatchMark() from a direct audio speech service");
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
}
|
||||||
|
@ -567,7 +559,7 @@ nsSpeechTask::Pause()
|
||||||
mPrePaused = true;
|
mPrePaused = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mStream) {
|
if (!mIndirectAudio) {
|
||||||
DispatchPauseImpl(GetCurrentTime(), GetCurrentCharOffset());
|
DispatchPauseImpl(GetCurrentTime(), GetCurrentCharOffset());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -591,7 +583,7 @@ nsSpeechTask::Resume()
|
||||||
nsSynthVoiceRegistry::GetInstance()->ResumeQueue();
|
nsSynthVoiceRegistry::GetInstance()->ResumeQueue();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mStream) {
|
if (!mIndirectAudio) {
|
||||||
DispatchResumeImpl(GetCurrentTime(), GetCurrentCharOffset());
|
DispatchResumeImpl(GetCurrentTime(), GetCurrentCharOffset());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -616,7 +608,7 @@ nsSpeechTask::Cancel()
|
||||||
mPreCanceled = true;
|
mPreCanceled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mStream) {
|
if (!mIndirectAudio) {
|
||||||
DispatchEndInner(GetCurrentTime(), GetCurrentCharOffset());
|
DispatchEndInner(GetCurrentTime(), GetCurrentCharOffset());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -653,53 +645,5 @@ nsSpeechTask::SetSpeechSynthesis(SpeechSynthesis* aSpeechSynthesis)
|
||||||
mSpeechSynthesis = aSpeechSynthesis;
|
mSpeechSynthesis = aSpeechSynthesis;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
nsSpeechTask::CreateAudioChannelAgent()
|
|
||||||
{
|
|
||||||
if (!mUtterance || !UseAudioChannelService()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mAudioChannelAgent) {
|
|
||||||
mAudioChannelAgent->NotifyStoppedPlaying(nsIAudioChannelAgent::AUDIO_AGENT_NOTIFY);
|
|
||||||
}
|
|
||||||
|
|
||||||
mAudioChannelAgent = new AudioChannelAgent();
|
|
||||||
mAudioChannelAgent->InitWithWeakCallback(mUtterance->GetOwner(),
|
|
||||||
static_cast<int32_t>(AudioChannelService::GetDefaultAudioChannel()),
|
|
||||||
this);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
nsSpeechTask::DestroyAudioChannelAgent()
|
|
||||||
{
|
|
||||||
if (mAudioChannelAgent) {
|
|
||||||
mAudioChannelAgent->NotifyStoppedPlaying(nsIAudioChannelAgent::AUDIO_AGENT_NOTIFY);
|
|
||||||
mAudioChannelAgent = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsSpeechTask::WindowVolumeChanged(float aVolume, bool aMuted)
|
|
||||||
{
|
|
||||||
SetAudioOutputVolume(mVolume * aVolume * aMuted);
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsSpeechTask::WindowAudioCaptureChanged()
|
|
||||||
{
|
|
||||||
// This is not supported yet.
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
nsSpeechTask::SetAudioOutputVolume(uint32_t aVolume)
|
|
||||||
{
|
|
||||||
if (mStream) {
|
|
||||||
mStream->SetAudioOutputVolume(this, aVolume);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace dom
|
} // namespace dom
|
||||||
} // namespace mozilla
|
} // namespace mozilla
|
||||||
|
|
|
@ -9,7 +9,6 @@
|
||||||
|
|
||||||
#include "MediaStreamGraph.h"
|
#include "MediaStreamGraph.h"
|
||||||
#include "SpeechSynthesisUtterance.h"
|
#include "SpeechSynthesisUtterance.h"
|
||||||
#include "nsIAudioChannelAgent.h"
|
|
||||||
#include "nsISpeechService.h"
|
#include "nsISpeechService.h"
|
||||||
|
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
|
@ -20,7 +19,6 @@ class SpeechSynthesis;
|
||||||
class SynthStreamListener;
|
class SynthStreamListener;
|
||||||
|
|
||||||
class nsSpeechTask : public nsISpeechTask
|
class nsSpeechTask : public nsISpeechTask
|
||||||
, public nsIAudioChannelAgentCallback
|
|
||||||
{
|
{
|
||||||
friend class SynthStreamListener;
|
friend class SynthStreamListener;
|
||||||
|
|
||||||
|
@ -29,7 +27,6 @@ public:
|
||||||
NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsSpeechTask, nsISpeechTask)
|
NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsSpeechTask, nsISpeechTask)
|
||||||
|
|
||||||
NS_DECL_NSISPEECHTASK
|
NS_DECL_NSISPEECHTASK
|
||||||
NS_DECL_NSIAUDIOCHANNELAGENTCALLBACK
|
|
||||||
|
|
||||||
explicit nsSpeechTask(SpeechSynthesisUtterance* aUtterance);
|
explicit nsSpeechTask(SpeechSynthesisUtterance* aUtterance);
|
||||||
nsSpeechTask(float aVolume, const nsAString& aText);
|
nsSpeechTask(float aVolume, const nsAString& aText);
|
||||||
|
@ -52,8 +49,6 @@ public:
|
||||||
|
|
||||||
void SetChosenVoiceURI(const nsAString& aUri);
|
void SetChosenVoiceURI(const nsAString& aUri);
|
||||||
|
|
||||||
virtual void SetAudioOutputVolume(uint32_t aVolume);
|
|
||||||
|
|
||||||
bool IsPreCanceled()
|
bool IsPreCanceled()
|
||||||
{
|
{
|
||||||
return mPreCanceled;
|
return mPreCanceled;
|
||||||
|
@ -107,22 +102,18 @@ private:
|
||||||
|
|
||||||
nsresult DispatchEndInner(float aElapsedTime, uint32_t aCharIndex);
|
nsresult DispatchEndInner(float aElapsedTime, uint32_t aCharIndex);
|
||||||
|
|
||||||
void CreateAudioChannelAgent();
|
|
||||||
|
|
||||||
void DestroyAudioChannelAgent();
|
|
||||||
|
|
||||||
nsRefPtr<SourceMediaStream> mStream;
|
nsRefPtr<SourceMediaStream> mStream;
|
||||||
|
|
||||||
nsRefPtr<MediaInputPort> mPort;
|
nsRefPtr<MediaInputPort> mPort;
|
||||||
|
|
||||||
nsCOMPtr<nsISpeechTaskCallback> mCallback;
|
nsCOMPtr<nsISpeechTaskCallback> mCallback;
|
||||||
|
|
||||||
nsCOMPtr<nsIAudioChannelAgent> mAudioChannelAgent;
|
|
||||||
|
|
||||||
uint32_t mChannels;
|
uint32_t mChannels;
|
||||||
|
|
||||||
nsRefPtr<SpeechSynthesis> mSpeechSynthesis;
|
nsRefPtr<SpeechSynthesis> mSpeechSynthesis;
|
||||||
|
|
||||||
|
bool mIndirectAudio;
|
||||||
|
|
||||||
nsString mChosenVoiceURI;
|
nsString mChosenVoiceURI;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче