Thu, 15 Jan 2015 15:55:04 +0100
Back out 97036ab72558 which inappropriately compared turds to third parties.
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 "AudioChannelServiceChild.h"
9 #include "base/basictypes.h"
11 #include "mozilla/Services.h"
12 #include "mozilla/StaticPtr.h"
13 #include "mozilla/unused.h"
14 #include "mozilla/dom/ContentChild.h"
15 #include "mozilla/dom/ContentParent.h"
16 #include "nsIObserverService.h"
17 #include "nsThreadUtils.h"
19 #ifdef MOZ_WIDGET_GONK
20 #include "SpeakerManagerService.h"
21 #endif
23 using namespace mozilla;
24 using namespace mozilla::dom;
25 using namespace mozilla::hal;
27 StaticRefPtr<AudioChannelServiceChild> gAudioChannelServiceChild;
29 // static
30 AudioChannelService*
31 AudioChannelServiceChild::GetAudioChannelService()
32 {
33 MOZ_ASSERT(NS_IsMainThread());
35 // If we already exist, exit early
36 if (gAudioChannelServiceChild) {
37 return gAudioChannelServiceChild;
38 }
40 // Create new instance, register, return
41 nsRefPtr<AudioChannelServiceChild> service = new AudioChannelServiceChild();
42 NS_ENSURE_TRUE(service, nullptr);
44 gAudioChannelServiceChild = service;
45 return gAudioChannelServiceChild;
46 }
48 void
49 AudioChannelServiceChild::Shutdown()
50 {
51 if (gAudioChannelServiceChild) {
52 gAudioChannelServiceChild = nullptr;
53 }
54 }
56 AudioChannelServiceChild::AudioChannelServiceChild()
57 {
58 }
60 AudioChannelServiceChild::~AudioChannelServiceChild()
61 {
62 }
64 AudioChannelState
65 AudioChannelServiceChild::GetState(AudioChannelAgent* aAgent, bool aElementHidden)
66 {
67 AudioChannelAgentData* data;
68 if (!mAgents.Get(aAgent, &data)) {
69 return AUDIO_CHANNEL_STATE_MUTED;
70 }
72 AudioChannelState state = AUDIO_CHANNEL_STATE_MUTED;
73 bool oldElementHidden = data->mElementHidden;
75 UpdateChannelType(data->mChannel, CONTENT_PROCESS_ID_MAIN, aElementHidden,
76 oldElementHidden);
78 // Update visibility.
79 data->mElementHidden = aElementHidden;
81 ContentChild* cc = ContentChild::GetSingleton();
82 cc->SendAudioChannelGetState(data->mChannel, aElementHidden, oldElementHidden,
83 &state);
84 data->mState = state;
85 cc->SendAudioChannelChangedNotification();
87 return state;
88 }
90 void
91 AudioChannelServiceChild::RegisterAudioChannelAgent(AudioChannelAgent* aAgent,
92 AudioChannel aChannel,
93 bool aWithVideo)
94 {
95 AudioChannelService::RegisterAudioChannelAgent(aAgent, aChannel, aWithVideo);
97 ContentChild::GetSingleton()->SendAudioChannelRegisterType(aChannel, aWithVideo);
99 nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
100 if (obs) {
101 obs->NotifyObservers(nullptr, "audio-channel-agent-changed", nullptr);
102 }
103 }
105 void
106 AudioChannelServiceChild::UnregisterAudioChannelAgent(AudioChannelAgent* aAgent)
107 {
108 AudioChannelAgentData *pData;
109 if (!mAgents.Get(aAgent, &pData)) {
110 return;
111 }
113 // We need to keep a copy because unregister will remove the
114 // AudioChannelAgentData object from the hashtable.
115 AudioChannelAgentData data(*pData);
117 AudioChannelService::UnregisterAudioChannelAgent(aAgent);
119 ContentChild::GetSingleton()->SendAudioChannelUnregisterType(
120 data.mChannel, data.mElementHidden, data.mWithVideo);
122 nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
123 if (obs) {
124 obs->NotifyObservers(nullptr, "audio-channel-agent-changed", nullptr);
125 }
126 #ifdef MOZ_WIDGET_GONK
127 bool active = AnyAudioChannelIsActive();
128 for (uint32_t i = 0; i < mSpeakerManager.Length(); i++) {
129 mSpeakerManager[i]->SetAudioChannelActive(active);
130 }
131 #endif
132 }
134 void
135 AudioChannelServiceChild::SetDefaultVolumeControlChannel(int32_t aChannel,
136 bool aHidden)
137 {
138 ContentChild *cc = ContentChild::GetSingleton();
139 if (cc) {
140 cc->SendAudioChannelChangeDefVolChannel(aChannel, aHidden);
141 }
142 }