void AudioChannelServiceChild::SetDefaultVolumeControlChannel( AudioChannelType aType, bool aHidden) { ContentChild *cc = ContentChild::GetSingleton(); if (cc) { cc->SendAudioChannelChangeDefVolChannel(aType, aHidden); } }
void AudioChannelService::SetDefaultVolumeControlChannelInternal(int32_t aChannel, bool aVisible, uint64_t aChildID) { if (!IsParentProcess()) { ContentChild* cc = ContentChild::GetSingleton(); if (cc) { cc->SendAudioChannelChangeDefVolChannel(aChannel, aVisible); } return; } // If this child is in the background and mDefChannelChildID is set to // others then it means other child in the foreground already set it's // own default channel. if (!aVisible && mDefChannelChildID != aChildID) { return; } // Workaround for the call screen app. The call screen app is running on the // main process, that will results in wrong visible state. Because we use the // docshell's active state as visible state, the main process is always // active. Therefore, we will see the strange situation that the visible // state of the call screen is always true. If the mDefChannelChildID is set // to others then it means other child in the foreground already set it's // own default channel already. // Summary : // Child process : foreground app always can set type. // Parent process : check the mDefChannelChildID. else if (aChildID == CONTENT_PROCESS_ID_MAIN && mDefChannelChildID != CONTENT_PROCESS_ID_UNKNOWN) { return; } mDefChannelChildID = aVisible ? aChildID : CONTENT_PROCESS_ID_UNKNOWN; nsAutoString channelName; if (aChannel == -1) { channelName.AssignASCII("unknown"); } else { GetAudioChannelString(static_cast<AudioChannel>(aChannel), channelName); } nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService(); if (obs) { obs->NotifyObservers(nullptr, "default-volume-channel-changed", channelName.get()); } }