Bug 1235612 - part2 : notify audible state in NotifyStartedPlaying
MozReview-Commit-ID: B1u8FYaX5wd
--- a/dom/audiochannel/AudioChannelAgent.cpp
+++ b/dom/audiochannel/AudioChannelAgent.cpp
@@ -197,29 +197,33 @@ AudioChannelAgent::InitInternal(nsPIDOMW
("AudioChannelAgent, InitInternal, this = %p, type = %d, "
"owner = %p, hasCallback = %d\n", this, mAudioChannelType,
mWindow.get(), (!!mCallback || !!mWeakCallback)));
return NS_OK;
}
NS_IMETHODIMP
-AudioChannelAgent::NotifyStartedPlaying(AudioPlaybackConfig* aConfig)
+AudioChannelAgent::NotifyStartedPlaying(AudioPlaybackConfig* aConfig,
+ bool aAudible)
{
if (NS_WARN_IF(!aConfig)) {
return NS_ERROR_FAILURE;
}
RefPtr<AudioChannelService> service = AudioChannelService::GetOrCreate();
if (mAudioChannelType == AUDIO_AGENT_CHANNEL_ERROR ||
service == nullptr || mIsRegToService) {
return NS_ERROR_FAILURE;
}
- service->RegisterAudioChannelAgent(this);
+ MOZ_ASSERT(AudioChannelService::AudibleState::eAudible == true &&
+ AudioChannelService::AudibleState::eNotAudible == false);
+ service->RegisterAudioChannelAgent(this,
+ static_cast<AudioChannelService::AudibleState>(aAudible));
AudioPlaybackConfig config = service->GetMediaConfig(mWindow,
mAudioChannelType);
MOZ_LOG(AudioChannelService::GetAudioChannelLog(), LogLevel::Debug,
("AudioChannelAgent, NotifyStartedPlaying, this = %p, "
"mute = %d, volume = %f, suspend = %d\n", this,
config.mMuted, config.mVolume, config.mSuspend));
--- a/dom/audiochannel/AudioChannelService.cpp
+++ b/dom/audiochannel/AudioChannelService.cpp
@@ -243,32 +243,33 @@ AudioChannelService::AudioChannelService
"dom.audiochannel.mutedByDefault");
}
AudioChannelService::~AudioChannelService()
{
}
void
-AudioChannelService::RegisterAudioChannelAgent(AudioChannelAgent* aAgent)
+AudioChannelService::RegisterAudioChannelAgent(AudioChannelAgent* aAgent,
+ AudibleState aAudible)
{
MOZ_ASSERT(aAgent);
uint64_t windowID = aAgent->WindowID();
AudioChannelWindow* winData = GetWindowData(windowID);
if (!winData) {
winData = new AudioChannelWindow(windowID);
mWindows.AppendElement(winData);
}
// To make sure agent would be alive because AppendAgent() would trigger the
// callback function of AudioChannelAgentOwner that means the agent might be
// released in their callback.
RefPtr<AudioChannelAgent> kungFuDeathGrip(aAgent);
- winData->AppendAgent(aAgent);
+ winData->AppendAgent(aAgent, aAudible);
MaybeSendStatusUpdate();
}
void
AudioChannelService::UnregisterAudioChannelAgent(AudioChannelAgent* aAgent)
{
MOZ_ASSERT(aAgent);
@@ -996,23 +997,24 @@ AudioChannelService::ChildStatusReceived
/* static */ bool
AudioChannelService::IsAudioChannelMutedByDefault()
{
CreateServiceIfNeeded();
return sAudioChannelMutedByDefault;
}
void
-AudioChannelService::AudioChannelWindow::AppendAgent(AudioChannelAgent* aAgent)
+AudioChannelService::AudioChannelWindow::AppendAgent(AudioChannelAgent* aAgent,
+ AudibleState aAudible)
{
MOZ_ASSERT(aAgent);
AppendAgentAndIncreaseAgentsNum(aAgent);
AudioCapturedChanged(aAgent, AudioCaptureState::eCapturing);
- // Audio-playback would be notified when the agent owner starts audible.
+ AudioAudibleChanged(aAgent, aAudible);
}
void
AudioChannelService::AudioChannelWindow::RemoveAgent(AudioChannelAgent* aAgent)
{
MOZ_ASSERT(aAgent);
RemoveAgentAndReduceAgentsNum(aAgent);
--- a/dom/audiochannel/AudioChannelService.h
+++ b/dom/audiochannel/AudioChannelService.h
@@ -88,17 +88,18 @@ public:
static bool IsAudioChannelMutedByDefault();
static PRLogModuleInfo* GetAudioChannelLog();
/**
* Any audio channel agent that starts playing should register itself to
* this service, sharing the AudioChannel.
*/
- void RegisterAudioChannelAgent(AudioChannelAgent* aAgent);
+ void RegisterAudioChannelAgent(AudioChannelAgent* aAgent,
+ AudibleState aAudible);
/**
* Any audio channel agent that stops playing should unregister itself to
* this service.
*/
void UnregisterAudioChannelAgent(AudioChannelAgent* aAgent);
/**
@@ -239,17 +240,17 @@ private:
mIsAudioCaptured(false)
{
// Workaround for bug1183033, system channel type can always playback.
mChannels[(int16_t)AudioChannel::System].mMuted = false;
}
void AudioAudibleChanged(AudioChannelAgent* aAgent, AudibleState aAudible);
- void AppendAgent(AudioChannelAgent* aAgent);
+ void AppendAgent(AudioChannelAgent* aAgent, AudibleState aAudible);
void RemoveAgent(AudioChannelAgent* aAgent);
uint64_t mWindowID;
bool mIsAudioCaptured;
AudioChannelConfig mChannels[NUMBER_OF_AUDIO_CHANNELS];
// Raw pointer because the AudioChannelAgent must unregister itself.
nsTObserverArray<AudioChannelAgent*> mAgents;
--- a/dom/audiochannel/nsIAudioChannelAgent.idl
+++ b/dom/audiochannel/nsIAudioChannelAgent.idl
@@ -158,17 +158,17 @@ interface nsIAudioChannelAgent : nsISupp
/**
* Notify the agent that we want to start playing.
* Note: Gecko component SHOULD call this function first then start to
* play audio stream only when return value is true.
*
* @param config
* It contains the playback related states (volume/mute/suspend)
*/
- void notifyStartedPlaying(in AudioPlaybackConfig config);
+ void notifyStartedPlaying(in AudioPlaybackConfig config, in bool audible);
/**
* Notify the agent we no longer want to play.
*
* Note : even if notifyStartedPlaying() returned false, the agent would
* still be registered with the audio channel service and receive callbacks
* for status changes. So notifyStoppedPlaying must still eventually be
* called to unregister the agent with the channel service.