|
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/. */ |
|
6 |
|
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> |
|
17 |
|
18 using namespace mozilla; |
|
19 using namespace mozilla::dom; |
|
20 |
|
21 StaticRefPtr<SpeakerManagerServiceChild> gSpeakerManagerServiceChild; |
|
22 |
|
23 // static |
|
24 SpeakerManagerService* |
|
25 SpeakerManagerServiceChild::GetSpeakerManagerService() |
|
26 { |
|
27 MOZ_ASSERT(NS_IsMainThread()); |
|
28 |
|
29 // If we already exist, exit early |
|
30 if (gSpeakerManagerServiceChild) { |
|
31 return gSpeakerManagerServiceChild; |
|
32 } |
|
33 |
|
34 // Create new instance, register, return |
|
35 nsRefPtr<SpeakerManagerServiceChild> service = new SpeakerManagerServiceChild(); |
|
36 NS_ENSURE_TRUE(service, nullptr); |
|
37 |
|
38 gSpeakerManagerServiceChild = service; |
|
39 return gSpeakerManagerServiceChild; |
|
40 } |
|
41 |
|
42 void |
|
43 SpeakerManagerServiceChild::ForceSpeaker(bool aEnable, bool aVisible) |
|
44 { |
|
45 mVisible = aVisible; |
|
46 mOrgSpeakerStatus = aEnable; |
|
47 ContentChild *cc = ContentChild::GetSingleton(); |
|
48 if (cc) { |
|
49 cc->SendSpeakerManagerForceSpeaker(aEnable && aVisible); |
|
50 } |
|
51 } |
|
52 |
|
53 bool |
|
54 SpeakerManagerServiceChild::GetSpeakerStatus() |
|
55 { |
|
56 ContentChild *cc = ContentChild::GetSingleton(); |
|
57 bool status = false; |
|
58 if (cc) { |
|
59 cc->SendSpeakerManagerGetSpeakerStatus(&status); |
|
60 } |
|
61 char propQemu[PROPERTY_VALUE_MAX]; |
|
62 property_get("ro.kernel.qemu", propQemu, ""); |
|
63 if (!strncmp(propQemu, "1", 1)) { |
|
64 return mOrgSpeakerStatus; |
|
65 } |
|
66 return status; |
|
67 } |
|
68 |
|
69 void |
|
70 SpeakerManagerServiceChild::Shutdown() |
|
71 { |
|
72 if (gSpeakerManagerServiceChild) { |
|
73 gSpeakerManagerServiceChild = nullptr; |
|
74 } |
|
75 } |
|
76 |
|
77 void |
|
78 SpeakerManagerServiceChild::SetAudioChannelActive(bool aIsActive) |
|
79 { |
|
80 // Content process and switch to background with no audio and speaker forced. |
|
81 // Then disable speaker |
|
82 for (uint32_t i = 0; i < mRegisteredSpeakerManagers.Length(); i++) { |
|
83 mRegisteredSpeakerManagers[i]->SetAudioChannelActive(aIsActive); |
|
84 } |
|
85 } |
|
86 |
|
87 SpeakerManagerServiceChild::SpeakerManagerServiceChild() |
|
88 { |
|
89 MOZ_ASSERT(NS_IsMainThread()); |
|
90 AudioChannelService* audioChannelService = AudioChannelService::GetAudioChannelService(); |
|
91 if (audioChannelService) { |
|
92 audioChannelService->RegisterSpeakerManager(this); |
|
93 } |
|
94 MOZ_COUNT_CTOR(SpeakerManagerServiceChild); |
|
95 } |
|
96 |
|
97 SpeakerManagerServiceChild::~SpeakerManagerServiceChild() |
|
98 { |
|
99 AudioChannelService* audioChannelService = AudioChannelService::GetAudioChannelService(); |
|
100 if (audioChannelService) { |
|
101 audioChannelService->UnregisterSpeakerManager(this); |
|
102 } |
|
103 MOZ_COUNT_DTOR(SpeakerManagerServiceChild); |
|
104 } |
|
105 |
|
106 void |
|
107 SpeakerManagerServiceChild::Notify() |
|
108 { |
|
109 for (uint32_t i = 0; i < mRegisteredSpeakerManagers.Length(); i++) { |
|
110 mRegisteredSpeakerManagers[i]->DispatchSimpleEvent(NS_LITERAL_STRING("speakerforcedchange")); |
|
111 } |
|
112 } |