Bug 1578615 - part11 : remove usages of 'AudibleState::eMaybeAudible' in media element. r=chunmin

In bug1583978, we are going to remove `AudibleState::eMaybeAudible`. But before that, as `AudibleState::eMaybeAudible` is only used for delaying media playback, so we can remove its usage from media element and move it to the dedicated class to reduce confusion about how and when we should use `AudibleState::eMaybeAudible` or `AudibleState::eNotAudible`.

Differential Revision: https://phabricator.services.mozilla.com/D47153

--HG--
extra : moz-landing-system : lando
This commit is contained in:
alwu 2019-09-25 23:55:42 +00:00
Родитель 4f6d0ab620
Коммит 8d8222b8a9
4 изменённых файлов: 41 добавлений и 28 удалений

Просмотреть файл

@ -1293,7 +1293,8 @@ class HTMLMediaElement::AudioChannelAgentCallback final
if (mSuspended != nsISuspendedTypes::NONE_SUSPENDED || mOwner->mPaused) {
return AudibleState::eNotAudible;
}
return mOwner->GetAudibleState();
return mOwner->IsAudible() ? AudibleState::eAudible
: AudibleState::eNotAudible;
}
bool IsPlayingThroughTheAudioChannel() const {
@ -7022,7 +7023,7 @@ void HTMLMediaElement::SetMediaInfo(const MediaInfo& aInfo) {
const bool oldHasAudio = mMediaInfo.HasAudio();
mMediaInfo = aInfo;
if ((aInfo.HasAudio() != oldHasAudio) && mResumeDelayedPlaybackAgent) {
mResumeDelayedPlaybackAgent->UpdateAudibleState(GetAudibleState());
mResumeDelayedPlaybackAgent->UpdateAudibleState(this, IsAudible());
}
if (mAudioChannelWrapper) {
mAudioChannelWrapper->AudioCaptureStreamChangeIfNeeded();
@ -7184,19 +7185,18 @@ void HTMLMediaElement::NotifyDecoderActivityChanges() const {
Document* HTMLMediaElement::GetDocument() const { return OwnerDoc(); }
AudibleState HTMLMediaElement::GetAudibleState() const {
bool HTMLMediaElement::IsAudible() const {
// No audio track.
if (!HasAudio()) {
return AudibleState::eNotAudible;
return false;
}
// Muted or the volume should not be ~0
if (mMuted || (std::fabs(Volume()) <= 1e-7)) {
return AudibleState::eMaybeAudible;
return false;
}
return mIsAudioTrackAudible ? AudibleState::eAudible
: AudibleState::eMaybeAudible;
return mIsAudioTrackAudible;
}
void HTMLMediaElement::ConstructMediaTracks(const MediaInfo* aInfo) {
@ -7419,8 +7419,8 @@ void HTMLMediaElement::CreateResumeDelayedMediaPlaybackAgentIfNeeded() {
return;
}
mResumeDelayedPlaybackAgent =
MediaPlaybackDelayPolicy::CreateResumeDelayedPlaybackAgent(
this, GetAudibleState());
MediaPlaybackDelayPolicy::CreateResumeDelayedPlaybackAgent(this,
IsAudible());
if (!mResumeDelayedPlaybackAgent) {
LOG(LogLevel::Debug,
("%p Failed to create a delayed playback agant", this));

Просмотреть файл

@ -726,7 +726,7 @@ class HTMLMediaElement : public nsGenericHTMLElement,
bool GetShowPosterFlag() const { return mShowPoster; }
AudioChannelService::AudibleState GetAudibleState() const;
bool IsAudible() const;
protected:
virtual ~HTMLMediaElement();

Просмотреть файл

@ -13,6 +13,18 @@ namespace dom {
using AudibleState = AudioChannelService::AudibleState;
static AudibleState DetermineMediaAudibleState(const HTMLMediaElement* aElement,
bool aIsAudible) {
MOZ_ASSERT(aElement);
if (!aElement->HasAudio()) {
return AudibleState::eNotAudible;
}
// `eMaybeAudible` is used to distinguish if the media has audio track or not,
// because we would only show the delayed media playback icon for media with
// an audio track.
return aIsAudible ? AudibleState::eAudible : AudibleState::eMaybeAudible;
}
ResumeDelayedPlaybackAgent::~ResumeDelayedPlaybackAgent() {
if (mDelegate) {
mDelegate->Clear();
@ -21,10 +33,10 @@ ResumeDelayedPlaybackAgent::~ResumeDelayedPlaybackAgent() {
}
bool ResumeDelayedPlaybackAgent::InitDelegate(const HTMLMediaElement* aElement,
AudibleState aAudibleState) {
bool aIsAudible) {
MOZ_ASSERT(!mDelegate, "Delegate has been initialized!");
mDelegate = new ResumePlayDelegate();
if (!mDelegate->Init(aElement, aAudibleState)) {
if (!mDelegate->Init(aElement, aIsAudible)) {
mDelegate->Clear();
mDelegate = nullptr;
return false;
@ -39,9 +51,10 @@ ResumeDelayedPlaybackAgent::GetResumePromise() {
}
void ResumeDelayedPlaybackAgent::UpdateAudibleState(
AudibleState aAudibleState) {
const HTMLMediaElement* aElement, bool aIsAudible) {
MOZ_ASSERT(aElement);
MOZ_ASSERT(mDelegate);
mDelegate->UpdateAudibleState(aAudibleState);
mDelegate->UpdateAudibleState(aElement, aIsAudible);
}
NS_IMPL_ISUPPORTS(ResumeDelayedPlaybackAgent::ResumePlayDelegate,
@ -52,7 +65,7 @@ ResumeDelayedPlaybackAgent::ResumePlayDelegate::~ResumePlayDelegate() {
}
bool ResumeDelayedPlaybackAgent::ResumePlayDelegate::Init(
const HTMLMediaElement* aElement, AudibleState aAudibleState) {
const HTMLMediaElement* aElement, bool aIsAudible) {
MOZ_ASSERT(aElement);
MOZ_ASSERT(aElement->OwnerDoc());
if (!aElement->OwnerDoc()->GetInnerWindow()) {
@ -70,7 +83,8 @@ bool ResumeDelayedPlaybackAgent::ResumePlayDelegate::Init(
// Start AudioChannelAgent in order to wait the suspended state change when we
// are able to resume delayed playback.
rv = mAudioChannelAgent->NotifyStartedPlaying(aAudibleState);
AudibleState audibleState = DetermineMediaAudibleState(aElement, aIsAudible);
rv = mAudioChannelAgent->NotifyStartedPlaying(audibleState);
if (NS_WARN_IF(NS_FAILED(rv))) {
Clear();
return false;
@ -93,14 +107,16 @@ ResumeDelayedPlaybackAgent::ResumePlayDelegate::GetResumePromise() {
}
void ResumeDelayedPlaybackAgent::ResumePlayDelegate::UpdateAudibleState(
AudibleState aAudibleState) {
const HTMLMediaElement* aElement, bool aIsAudible) {
MOZ_ASSERT(aElement);
// It's possible for the owner of `ResumeDelayedPlaybackAgent` to call
// `UpdateAudibleState()` after we resolve the promise and clean resource.
if (!mAudioChannelAgent) {
return;
}
AudibleState audibleState = DetermineMediaAudibleState(aElement, aIsAudible);
mAudioChannelAgent->NotifyStartedAudible(
aAudibleState,
audibleState,
AudioChannelService::AudibleChangedReasons::eDataAudibleChanged);
}
@ -148,10 +164,10 @@ bool MediaPlaybackDelayPolicy::ShouldDelayPlayback(
RefPtr<ResumeDelayedPlaybackAgent>
MediaPlaybackDelayPolicy::CreateResumeDelayedPlaybackAgent(
const HTMLMediaElement* aElement, AudibleState aAudibleState) {
const HTMLMediaElement* aElement, bool aIsAudible) {
MOZ_ASSERT(aElement);
RefPtr<ResumeDelayedPlaybackAgent> agent = new ResumeDelayedPlaybackAgent();
return agent->InitDelegate(aElement, aAudibleState) ? agent : nullptr;
return agent->InitDelegate(aElement, aIsAudible) ? agent : nullptr;
}
} // namespace dom

Просмотреть файл

@ -40,14 +40,13 @@ class ResumeDelayedPlaybackAgent {
using ResumePromise = MozPromise<bool, bool, true /* IsExclusive */>;
RefPtr<ResumePromise> GetResumePromise();
void UpdateAudibleState(AudioChannelService::AudibleState aAudibleState);
void UpdateAudibleState(const HTMLMediaElement* aElement, bool aIsAudible);
private:
friend class MediaPlaybackDelayPolicy;
~ResumeDelayedPlaybackAgent();
bool InitDelegate(const HTMLMediaElement* aElement,
AudioChannelService::AudibleState aAudibleState);
bool InitDelegate(const HTMLMediaElement* aElement, bool aIsAudible);
class ResumePlayDelegate final : public nsIAudioChannelAgentCallback {
public:
@ -55,9 +54,8 @@ class ResumeDelayedPlaybackAgent {
ResumePlayDelegate() = default;
bool Init(const HTMLMediaElement* aElement,
AudioChannelService::AudibleState aAudibleState);
void UpdateAudibleState(AudioChannelService::AudibleState aAudibleState);
bool Init(const HTMLMediaElement* aElement, bool aIsAudible);
void UpdateAudibleState(const HTMLMediaElement* aElement, bool aIsAudible);
RefPtr<ResumePromise> GetResumePromise();
void Clear();
@ -79,8 +77,7 @@ class MediaPlaybackDelayPolicy {
public:
static bool ShouldDelayPlayback(const HTMLMediaElement* aElement);
static RefPtr<ResumeDelayedPlaybackAgent> CreateResumeDelayedPlaybackAgent(
const HTMLMediaElement* aElement,
AudioChannelService::AudibleState aAudibleState);
const HTMLMediaElement* aElement, bool aIsAudible);
};
} // namespace dom