1 /* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */
2 /* vim: set ts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "SpeakerManagerServiceChild.h"
8 #include "mozilla/Services.h"
9 #include "mozilla/StaticPtr.h"
10 #include "mozilla/unused.h"
11 #include "mozilla/dom/ContentChild.h"
12 #include "mozilla/dom/ContentParent.h"
13 #include "nsIObserverService.h"
14 #include "nsThreadUtils.h"
15 #include "AudioChannelService.h"
16 #include <cutils/properties.h>
18 using namespace mozilla
;
19 using namespace mozilla::dom
;
21 StaticRefPtr
<SpeakerManagerServiceChild
> gSpeakerManagerServiceChild
;
24 SpeakerManagerService
*
25 SpeakerManagerServiceChild::GetOrCreateSpeakerManagerService()
27 MOZ_ASSERT(NS_IsMainThread());
29 // If we already exist, exit early
30 if (gSpeakerManagerServiceChild
) {
31 return gSpeakerManagerServiceChild
;
34 // Create new instance, register, return
35 nsRefPtr
<SpeakerManagerServiceChild
> service
= new SpeakerManagerServiceChild();
37 gSpeakerManagerServiceChild
= service
;
39 return gSpeakerManagerServiceChild
;
43 SpeakerManagerService
*
44 SpeakerManagerServiceChild::GetSpeakerManagerService()
46 MOZ_ASSERT(NS_IsMainThread());
48 return gSpeakerManagerServiceChild
;
52 SpeakerManagerServiceChild::ForceSpeaker(bool aEnable
, bool aVisible
)
55 mOrgSpeakerStatus
= aEnable
;
56 ContentChild
*cc
= ContentChild::GetSingleton();
58 cc
->SendSpeakerManagerForceSpeaker(aEnable
&& aVisible
);
63 SpeakerManagerServiceChild::GetSpeakerStatus()
65 ContentChild
*cc
= ContentChild::GetSingleton();
68 cc
->SendSpeakerManagerGetSpeakerStatus(&status
);
70 char propQemu
[PROPERTY_VALUE_MAX
];
71 property_get("ro.kernel.qemu", propQemu
, "");
72 if (!strncmp(propQemu
, "1", 1)) {
73 return mOrgSpeakerStatus
;
79 SpeakerManagerServiceChild::Shutdown()
81 if (gSpeakerManagerServiceChild
) {
82 gSpeakerManagerServiceChild
= nullptr;
87 SpeakerManagerServiceChild::SetAudioChannelActive(bool aIsActive
)
89 // Content process and switch to background with no audio and speaker forced.
90 // Then disable speaker
91 for (uint32_t i
= 0; i
< mRegisteredSpeakerManagers
.Length(); i
++) {
92 mRegisteredSpeakerManagers
[i
]->SetAudioChannelActive(aIsActive
);
96 SpeakerManagerServiceChild::SpeakerManagerServiceChild()
98 MOZ_ASSERT(NS_IsMainThread());
99 AudioChannelService
* audioChannelService
= AudioChannelService::GetOrCreateAudioChannelService();
100 if (audioChannelService
) {
101 audioChannelService
->RegisterSpeakerManager(this);
103 MOZ_COUNT_CTOR(SpeakerManagerServiceChild
);
106 SpeakerManagerServiceChild::~SpeakerManagerServiceChild()
108 AudioChannelService
* audioChannelService
= AudioChannelService::GetOrCreateAudioChannelService();
109 if (audioChannelService
) {
110 audioChannelService
->UnregisterSpeakerManager(this);
112 MOZ_COUNT_DTOR(SpeakerManagerServiceChild
);
116 SpeakerManagerServiceChild::Notify()
118 for (uint32_t i
= 0; i
< mRegisteredSpeakerManagers
.Length(); i
++) {
119 mRegisteredSpeakerManagers
[i
]->DispatchSimpleEvent(NS_LITERAL_STRING("speakerforcedchange"));