Bug 1320005 - don't show the 'play tab' icon for the media element without audio track. r=baku

MozReview-Commit-ID: K42I0yWaI7N

--HG--
extra : rebase_source : 6b2cd50bb327a644f9092c1e018203854d3d899f
This commit is contained in:
Alastor Wu 2016-12-13 22:47:13 +08:00
parent dc0394a1d9
commit ce4c37a7ff
6 changed files with 45 additions and 27 deletions

View File

@ -191,7 +191,7 @@ AudioChannelAgent::InitInternal(nsPIDOMWindowInner* aWindow,
NS_IMETHODIMP
AudioChannelAgent::NotifyStartedPlaying(AudioPlaybackConfig* aConfig,
bool aAudible)
uint8_t aAudible)
{
if (NS_WARN_IF(!aConfig)) {
return NS_ERROR_FAILURE;
@ -203,8 +203,9 @@ AudioChannelAgent::NotifyStartedPlaying(AudioPlaybackConfig* aConfig,
return NS_ERROR_FAILURE;
}
MOZ_ASSERT(AudioChannelService::AudibleState::eAudible == true &&
AudioChannelService::AudibleState::eNotAudible == false);
MOZ_ASSERT(AudioChannelService::AudibleState::eNotAudible == 0 &&
AudioChannelService::AudibleState::eMaybeAudible == 1 &&
AudioChannelService::AudibleState::eAudible == 2);
service->RegisterAudioChannelAgent(this,
static_cast<AudioChannelService::AudibleState>(aAudible));
@ -242,7 +243,7 @@ AudioChannelAgent::NotifyStoppedPlaying()
}
NS_IMETHODIMP
AudioChannelAgent::NotifyStartedAudible(bool aAudible, uint32_t aReason)
AudioChannelAgent::NotifyStartedAudible(uint8_t aAudible, uint32_t aReason)
{
MOZ_LOG(AudioChannelService::GetAudioChannelLog(), LogLevel::Debug,
("AudioChannelAgent, NotifyStartedAudible, this = %p, "

View File

@ -1227,14 +1227,14 @@ AudioChannelService::AudioChannelWindow::AppendAgent(AudioChannelAgent* aAgent,
RequestAudioFocus(aAgent);
AppendAgentAndIncreaseAgentsNum(aAgent);
AudioCapturedChanged(aAgent, AudioCaptureState::eCapturing);
if (aAudible) {
if (aAudible == AudibleState::eAudible) {
AudioAudibleChanged(aAgent,
AudibleState::eAudible,
AudibleChangedReasons::eDataAudibleChanged);
} else if (IsEnableAudioCompetingForAllAgents() && !aAudible) {
} else if (IsEnableAudioCompetingForAllAgents() &&
aAudible != AudibleState::eAudible) {
NotifyAudioCompetingChanged(aAgent, true);
}
MaybeNotifyMediaBlocked(aAgent);
}
void
@ -1305,13 +1305,16 @@ AudioChannelService::AudioChannelWindow::AudioAudibleChanged(AudioChannelAgent*
{
MOZ_ASSERT(aAgent);
if (aAudible) {
if (aAudible == AudibleState::eAudible) {
AppendAudibleAgentIfNotContained(aAgent, aReason);
} else {
RemoveAudibleAgentIfContained(aAgent, aReason);
}
NotifyAudioCompetingChanged(aAgent, aAudible);
NotifyAudioCompetingChanged(aAgent, aAudible == AudibleState::eAudible);
if (aAudible != AudibleState::eNotAudible) {
MaybeNotifyMediaBlocked(aAgent);
}
}
void
@ -1368,7 +1371,9 @@ AudioChannelService::AudioChannelWindow::NotifyAudioAudibleChanged(nsPIDOMWindow
AudibleChangedReasons aReason)
{
RefPtr<AudioPlaybackRunnable> runnable =
new AudioPlaybackRunnable(aWindow, aAudible, aReason);
new AudioPlaybackRunnable(aWindow,
aAudible == AudibleState::eAudible,
aReason);
DebugOnly<nsresult> rv = NS_DispatchToCurrentThread(runnable);
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "NS_DispatchToCurrentThread failed");
}

View File

@ -65,9 +65,15 @@ public:
NS_DECL_NSIOBSERVER
NS_DECL_NSIAUDIOCHANNELSERVICE
enum AudibleState : bool {
eAudible = true,
eNotAudible = false
/**
* eNotAudible : agent is not audible
* eMaybeAudible : agent is not audible now, but it might be audible later
* eAudible : agent is audible now
*/
enum AudibleState : uint8_t {
eNotAudible = 0,
eMaybeAudible = 1,
eAudible = 2
};
enum AudioCaptureState : bool {

View File

@ -163,7 +163,7 @@ interface nsIAudioChannelAgent : nsISupports
* @param config
* It contains the playback related states (volume/mute/suspend)
*/
void notifyStartedPlaying(in AudioPlaybackConfig config, in bool audible);
void notifyStartedPlaying(in AudioPlaybackConfig config, in uint8_t audible);
/**
* Notify the agent we no longer want to play.
@ -183,5 +183,5 @@ interface nsIAudioChannelAgent : nsISupports
* notify the actually audible state to other services which want to know
* about that, ex. tab sound indicator.
*/
void notifyStartedAudible(in bool audible, in uint32_t reason);
void notifyStartedAudible(in uint8_t audible, in uint32_t reason);
};

View File

@ -753,7 +753,7 @@ public:
return;
}
bool newAudibleState = IsOwnerAudible();
AudibleState newAudibleState = IsOwnerAudible();
if (mIsOwnerAudible == newAudibleState) {
return;
}
@ -976,25 +976,25 @@ private:
mSuspended == nsISuspendedTypes::SUSPENDED_BLOCK);
}
bool
AudibleState
IsOwnerAudible() const
{
// Muted or the volume should not be ~0
if (mOwner->Muted() || (std::fabs(mOwner->Volume()) <= 1e-7)) {
return false;
return AudioChannelService::AudibleState::eNotAudible;
}
// No sound can be heard during suspending.
if (IsSuspended()) {
return false;
// No audio track.
if (!mOwner->HasAudio()) {
return AudioChannelService::AudibleState::eNotAudible;
}
// Silent audio track.
if (!mOwner->mIsAudioTrackAudible) {
return false;
// Might be audible but not yet.
if (mOwner->HasAudio() && !mOwner->mIsAudioTrackAudible) {
return AudioChannelService::AudibleState::eMaybeAudible;
}
return true;
return AudioChannelService::AudibleState::eAudible;
}
bool
@ -1064,8 +1064,8 @@ private:
// and stop the audio channel agent. MediaElement can only be restarted by
// play().
SuspendTypes mSuspended;
// True if media element is audible for users.
bool mIsOwnerAudible;
// Indicate whether media element is audible for users.
AudibleState mIsOwnerAudible;
bool mIsShutDown;
};
@ -6976,7 +6976,12 @@ HTMLMediaElement::ShouldElementBePaused()
void
HTMLMediaElement::SetMediaInfo(const MediaInfo& aInfo)
{
const bool oldHasAudio = mMediaInfo.HasAudio();
mMediaInfo = aInfo;
if (aInfo.HasAudio() != oldHasAudio) {
NotifyAudioPlaybackChanged(
AudioChannelService::AudibleChangedReasons::eDataAudibleChanged);
}
if (mAudioChannelWrapper) {
mAudioChannelWrapper->AudioCaptureStreamChangeIfNeeded();
}

View File

@ -38,6 +38,7 @@ typedef uint16_t nsMediaNetworkState;
typedef uint16_t nsMediaReadyState;
typedef uint32_t SuspendTypes;
typedef uint32_t AudibleChangedReasons;
typedef uint8_t AudibleState;
namespace mozilla {
class DecoderDoctorDiagnostics;