michael@0: /* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */ michael@0: /* vim: set ts=2 et sw=2 tw=80: */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this file, michael@0: * You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "SpeakerManagerServiceChild.h" michael@0: #include "mozilla/Services.h" michael@0: #include "mozilla/StaticPtr.h" michael@0: #include "mozilla/unused.h" michael@0: #include "mozilla/dom/ContentChild.h" michael@0: #include "mozilla/dom/ContentParent.h" michael@0: #include "nsIObserverService.h" michael@0: #include "nsThreadUtils.h" michael@0: #include "AudioChannelService.h" michael@0: #include michael@0: michael@0: using namespace mozilla; michael@0: using namespace mozilla::dom; michael@0: michael@0: StaticRefPtr gSpeakerManagerServiceChild; michael@0: michael@0: // static michael@0: SpeakerManagerService* michael@0: SpeakerManagerServiceChild::GetSpeakerManagerService() michael@0: { michael@0: MOZ_ASSERT(NS_IsMainThread()); michael@0: michael@0: // If we already exist, exit early michael@0: if (gSpeakerManagerServiceChild) { michael@0: return gSpeakerManagerServiceChild; michael@0: } michael@0: michael@0: // Create new instance, register, return michael@0: nsRefPtr service = new SpeakerManagerServiceChild(); michael@0: NS_ENSURE_TRUE(service, nullptr); michael@0: michael@0: gSpeakerManagerServiceChild = service; michael@0: return gSpeakerManagerServiceChild; michael@0: } michael@0: michael@0: void michael@0: SpeakerManagerServiceChild::ForceSpeaker(bool aEnable, bool aVisible) michael@0: { michael@0: mVisible = aVisible; michael@0: mOrgSpeakerStatus = aEnable; michael@0: ContentChild *cc = ContentChild::GetSingleton(); michael@0: if (cc) { michael@0: cc->SendSpeakerManagerForceSpeaker(aEnable && aVisible); michael@0: } michael@0: } michael@0: michael@0: bool michael@0: SpeakerManagerServiceChild::GetSpeakerStatus() michael@0: { michael@0: ContentChild *cc = ContentChild::GetSingleton(); michael@0: bool status = false; michael@0: if (cc) { michael@0: cc->SendSpeakerManagerGetSpeakerStatus(&status); michael@0: } michael@0: char propQemu[PROPERTY_VALUE_MAX]; michael@0: property_get("ro.kernel.qemu", propQemu, ""); michael@0: if (!strncmp(propQemu, "1", 1)) { michael@0: return mOrgSpeakerStatus; michael@0: } michael@0: return status; michael@0: } michael@0: michael@0: void michael@0: SpeakerManagerServiceChild::Shutdown() michael@0: { michael@0: if (gSpeakerManagerServiceChild) { michael@0: gSpeakerManagerServiceChild = nullptr; michael@0: } michael@0: } michael@0: michael@0: void michael@0: SpeakerManagerServiceChild::SetAudioChannelActive(bool aIsActive) michael@0: { michael@0: // Content process and switch to background with no audio and speaker forced. michael@0: // Then disable speaker michael@0: for (uint32_t i = 0; i < mRegisteredSpeakerManagers.Length(); i++) { michael@0: mRegisteredSpeakerManagers[i]->SetAudioChannelActive(aIsActive); michael@0: } michael@0: } michael@0: michael@0: SpeakerManagerServiceChild::SpeakerManagerServiceChild() michael@0: { michael@0: MOZ_ASSERT(NS_IsMainThread()); michael@0: AudioChannelService* audioChannelService = AudioChannelService::GetAudioChannelService(); michael@0: if (audioChannelService) { michael@0: audioChannelService->RegisterSpeakerManager(this); michael@0: } michael@0: MOZ_COUNT_CTOR(SpeakerManagerServiceChild); michael@0: } michael@0: michael@0: SpeakerManagerServiceChild::~SpeakerManagerServiceChild() michael@0: { michael@0: AudioChannelService* audioChannelService = AudioChannelService::GetAudioChannelService(); michael@0: if (audioChannelService) { michael@0: audioChannelService->UnregisterSpeakerManager(this); michael@0: } michael@0: MOZ_COUNT_DTOR(SpeakerManagerServiceChild); michael@0: } michael@0: michael@0: void michael@0: SpeakerManagerServiceChild::Notify() michael@0: { michael@0: for (uint32_t i = 0; i < mRegisteredSpeakerManagers.Length(); i++) { michael@0: mRegisteredSpeakerManagers[i]->DispatchSimpleEvent(NS_LITERAL_STRING("speakerforcedchange")); michael@0: } michael@0: }