Bug 1225347 - Apply audio setting to volume parameter of Speak(). r=eeejay

This commit is contained in:
Makoto Kato 2015-12-24 13:58:24 +09:00
Родитель d7478b6b1e
Коммит b194b8e4da
2 изменённых файлов: 19 добавлений и 3 удалений

Просмотреть файл

@ -697,7 +697,6 @@ nsSpeechTask::CreateAudioChannelAgent()
float volume = 0.0f; float volume = 0.0f;
bool muted = true; bool muted = true;
mAudioChannelAgent->NotifyStartedPlaying(nsIAudioChannelAgent::AUDIO_AGENT_NOTIFY, &volume, &muted); mAudioChannelAgent->NotifyStartedPlaying(nsIAudioChannelAgent::AUDIO_AGENT_NOTIFY, &volume, &muted);
WindowVolumeChanged(volume, muted);
} }
void void

Просмотреть файл

@ -12,6 +12,7 @@
#include "SpeechSynthesisVoice.h" #include "SpeechSynthesisVoice.h"
#include "nsSynthVoiceRegistry.h" #include "nsSynthVoiceRegistry.h"
#include "nsSpeechTask.h" #include "nsSpeechTask.h"
#include "AudioChannelService.h"
#include "nsString.h" #include "nsString.h"
#include "mozilla/StaticPtr.h" #include "mozilla/StaticPtr.h"
@ -619,6 +620,22 @@ nsSynthVoiceRegistry::SpeakUtterance(SpeechSynthesisUtterance& aUtterance,
aUtterance.mVoice->GetVoiceURI(uri); aUtterance.mVoice->GetVoiceURI(uri);
} }
// Get current audio volume to apply speech call
float volume = aUtterance.Volume();
RefPtr<AudioChannelService> service = AudioChannelService::GetOrCreate();
if (service) {
nsCOMPtr<nsPIDOMWindow> topWindow =
do_QueryInterface(aUtterance.GetOwner());
if (topWindow) {
float audioVolume = 1.0f;
bool muted = false;
service->GetState(topWindow->GetOuterWindow(),
static_cast<uint32_t>(AudioChannelService::GetDefaultAudioChannel()),
&audioVolume, &muted);
volume = muted ? 0.0f : audioVolume * volume;
}
}
RefPtr<nsSpeechTask> task; RefPtr<nsSpeechTask> task;
if (XRE_IsContentProcess()) { if (XRE_IsContentProcess()) {
task = new SpeechTaskChild(&aUtterance); task = new SpeechTaskChild(&aUtterance);
@ -628,13 +645,13 @@ nsSynthVoiceRegistry::SpeakUtterance(SpeechSynthesisUtterance& aUtterance,
aUtterance.mText, aUtterance.mText,
lang, lang,
uri, uri,
aUtterance.Volume(), volume,
aUtterance.Rate(), aUtterance.Rate(),
aUtterance.Pitch()); aUtterance.Pitch());
} else { } else {
task = new nsSpeechTask(&aUtterance); task = new nsSpeechTask(&aUtterance);
Speak(aUtterance.mText, lang, uri, Speak(aUtterance.mText, lang, uri,
aUtterance.Volume(), aUtterance.Rate(), aUtterance.Pitch(), task); volume, aUtterance.Rate(), aUtterance.Pitch(), task);
} }
return task.forget(); return task.forget();