Bug 1240423 - part3 : add reason when media element notify audible changing. r=baku

MozReview-Commit-ID: C3DAZHhZOqH

--HG--
extra : rebase_source : 229630696f45ff10e22ae98ccf730b10ce0a2d0f
This commit is contained in:
Alastor Wu 2016-06-01 10:26:10 +08:00
Родитель 4e4bd18cc6
Коммит 7a3285dc7e
2 изменённых файлов: 51 добавлений и 16 удалений

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

@ -1876,7 +1876,8 @@ void HTMLMediaElement::SetVolumeInternal()
}
}
UpdateAudioChannelPlayingState();
NotifyAudioPlaybackChanged(
AudioChannelService::AudibleChangedReasons::eVolumeChanged);
}
NS_IMETHODIMP HTMLMediaElement::SetMuted(bool aMuted)
@ -2281,7 +2282,8 @@ HTMLMediaElement::HTMLMediaElement(already_AddRefed<mozilla::dom::NodeInfo>& aNo
mHasUserInteraction(false),
mFirstFrameLoaded(false),
mDefaultPlaybackStartPosition(0.0),
mIsAudioTrackAudible(false)
mIsAudioTrackAudible(false),
mAudible(IsAudible())
{
mAudioChannel = AudioChannelService::GetDefaultAudioChannel();
@ -4969,8 +4971,8 @@ HTMLMediaElement::IsPlayingThroughTheAudioChannel() const
return true;
}
// Are we paused or muted
if (mPaused || Muted()) {
// Are we paused
if (mPaused) {
return false;
}
@ -4984,11 +4986,6 @@ HTMLMediaElement::IsPlayingThroughTheAudioChannel() const
return false;
}
// The volume should not be ~0
if (std::fabs(Volume()) <= 1e-7) {
return false;
}
// We should consider any bfcached page or inactive document as non-playing.
if (!IsActive()) {
return false;
@ -5053,7 +5050,7 @@ HTMLMediaElement::NotifyAudioChannelAgent(bool aPlaying)
// any sound.
AudioPlaybackConfig config;
nsresult rv = mAudioChannelAgent->NotifyStartedPlaying(&config,
mIsAudioTrackAudible);
IsAudible());
if (NS_WARN_IF(NS_FAILED(rv))) {
return;
}
@ -5114,6 +5111,9 @@ HTMLMediaElement::WindowSuspendChanged(SuspendTypes aSuspend)
"Error : unknown suspended type!\n", this));
}
NotifyAudioPlaybackChanged(
AudioChannelService::AudibleChangedReasons::ePauseStateChanged);
return NS_OK;
}
@ -5609,16 +5609,45 @@ HTMLMediaElement::SetAudibleState(bool aAudible)
{
if (mIsAudioTrackAudible != aAudible) {
mIsAudioTrackAudible = aAudible;
NotifyAudioPlaybackChanged();
NotifyAudioPlaybackChanged(
AudioChannelService::AudibleChangedReasons::eDataAudibleChanged);
}
}
void
HTMLMediaElement::NotifyAudioPlaybackChanged()
HTMLMediaElement::NotifyAudioPlaybackChanged(AudibleChangedReasons aReason)
{
if (mAudioChannelAgent) {
mAudioChannelAgent->NotifyStartedAudible(mIsAudioTrackAudible);
if (!mAudioChannelAgent) {
return;
}
if (mAudible == IsAudible()) {
return;
}
mAudible = IsAudible();
mAudioChannelAgent->NotifyStartedAudible(mAudible, aReason);
}
bool
HTMLMediaElement::IsAudible() const
{
// Muted or the volume should not be ~0
if (Muted() || (std::fabs(Volume()) <= 1e-7)) {
return false;
}
// No sound can be heard during suspending.
if (IsSuspendedByAudioChannel()) {
return false;
}
// Silent audio track.
if (!mIsAudioTrackAudible) {
return false;
}
return true;
}
} // namespace dom

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

@ -38,6 +38,7 @@
typedef uint16_t nsMediaNetworkState;
typedef uint16_t nsMediaReadyState;
typedef uint32_t SuspendTypes;
typedef uint32_t AudibleChangedReasons;
namespace mozilla {
class DecoderDoctorDiagnostics;
@ -453,7 +454,7 @@ public:
virtual void SetAudibleState(bool aAudible) final override;
// Notify agent when the MediaElement changes its audible state.
void NotifyAudioPlaybackChanged();
void NotifyAudioPlaybackChanged(AudibleChangedReasons aReason);
// XPCOM GetPreload() is OK
void SetPreload(const nsAString& aValue, ErrorResult& aRv)
@ -1175,6 +1176,8 @@ protected:
bool IsAllowedToPlay();
bool IsAudible() const;
class nsAsyncEventRunner;
using nsGenericHTMLElement::DispatchEvent;
// For nsAsyncEventRunner.
@ -1606,8 +1609,11 @@ private:
// be seeked even before the media is loaded.
double mDefaultPlaybackStartPosition;
// True if the audio track is producing audible sound.
// True if the audio track is not silent.
bool mIsAudioTrackAudible;
// True if media element is audible for users.
bool mAudible;
};
} // namespace dom