зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1309162 - part2 : remove audio channel code from media element. r=jwwang
Remove the audio channel related codes. MozReview-Commit-ID: Fc09gDDF21a --HG-- extra : rebase_source : 08aa5c042924de7f0c9a9dffd3f71ecfa59e7a05
This commit is contained in:
Родитель
b32367de75
Коммит
59b85ce47d
|
@ -2519,10 +2519,6 @@ HTMLMediaElement::Seek(double aTime,
|
||||||
// MediaDecoderReaders.
|
// MediaDecoderReaders.
|
||||||
|
|
||||||
mPlayingBeforeSeek = IsPotentiallyPlaying();
|
mPlayingBeforeSeek = IsPotentiallyPlaying();
|
||||||
// Set the Variable if the Seekstarted while active playing
|
|
||||||
if (mPlayingThroughTheAudioChannel) {
|
|
||||||
mPlayingThroughTheAudioChannelBeforeSeek = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The media backend is responsible for dispatching the timeupdate
|
// The media backend is responsible for dispatching the timeupdate
|
||||||
// event if it changes the playback position as a result of the seek.
|
// event if it changes the playback position as a result of the seek.
|
||||||
|
@ -3458,14 +3454,11 @@ HTMLMediaElement::HTMLMediaElement(already_AddRefed<mozilla::dom::NodeInfo>& aNo
|
||||||
mAutoplayEnabled(true),
|
mAutoplayEnabled(true),
|
||||||
mPaused(true),
|
mPaused(true),
|
||||||
mMuted(0),
|
mMuted(0),
|
||||||
mAudioChannelSuspended(nsISuspendedTypes::NONE_SUSPENDED),
|
|
||||||
mStatsShowing(false),
|
mStatsShowing(false),
|
||||||
mAllowCasting(false),
|
mAllowCasting(false),
|
||||||
mIsCasting(false),
|
mIsCasting(false),
|
||||||
mAudioCaptured(false),
|
mAudioCaptured(false),
|
||||||
mAudioCapturedByWindow(false),
|
|
||||||
mPlayingBeforeSeek(false),
|
mPlayingBeforeSeek(false),
|
||||||
mPlayingThroughTheAudioChannelBeforeSeek(false),
|
|
||||||
mPausedForInactiveDocumentOrChannel(false),
|
mPausedForInactiveDocumentOrChannel(false),
|
||||||
mEventDeliveryPaused(false),
|
mEventDeliveryPaused(false),
|
||||||
mIsRunningLoadMethod(false),
|
mIsRunningLoadMethod(false),
|
||||||
|
@ -3487,14 +3480,11 @@ HTMLMediaElement::HTMLMediaElement(already_AddRefed<mozilla::dom::NodeInfo>& aNo
|
||||||
mWaitingForKey(NOT_WAITING_FOR_KEY),
|
mWaitingForKey(NOT_WAITING_FOR_KEY),
|
||||||
mDownloadSuspendedByCache(false, "HTMLMediaElement::mDownloadSuspendedByCache"),
|
mDownloadSuspendedByCache(false, "HTMLMediaElement::mDownloadSuspendedByCache"),
|
||||||
mAudioChannel(AudioChannelService::GetDefaultAudioChannel()),
|
mAudioChannel(AudioChannelService::GetDefaultAudioChannel()),
|
||||||
mAudioChannelVolume(1.0),
|
|
||||||
mPlayingThroughTheAudioChannel(false),
|
|
||||||
mDisableVideo(false),
|
mDisableVideo(false),
|
||||||
mHasUserInteraction(false),
|
mHasUserInteraction(false),
|
||||||
mFirstFrameLoaded(false),
|
mFirstFrameLoaded(false),
|
||||||
mDefaultPlaybackStartPosition(0.0),
|
mDefaultPlaybackStartPosition(0.0),
|
||||||
mIsAudioTrackAudible(false),
|
mIsAudioTrackAudible(false),
|
||||||
mAudible(IsAudible()),
|
|
||||||
mVisibilityState(Visibility::APPROXIMATELY_NONVISIBLE),
|
mVisibilityState(Visibility::APPROXIMATELY_NONVISIBLE),
|
||||||
mErrorSink(new ErrorSink(this)),
|
mErrorSink(new ErrorSink(this)),
|
||||||
mAudioChannelWrapper(new AudioChannelAgentCallback(this, mAudioChannel))
|
mAudioChannelWrapper(new AudioChannelAgentCallback(this, mAudioChannel))
|
||||||
|
@ -3516,7 +3506,6 @@ HTMLMediaElement::HTMLMediaElement(already_AddRefed<mozilla::dom::NodeInfo>& aNo
|
||||||
mWatchManager.Watch(mReadyState, &HTMLMediaElement::UpdateReadyStateInternal);
|
mWatchManager.Watch(mReadyState, &HTMLMediaElement::UpdateReadyStateInternal);
|
||||||
|
|
||||||
mShutdownObserver->Subscribe(this);
|
mShutdownObserver->Subscribe(this);
|
||||||
MaybeCreateAudioChannelAgent();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
HTMLMediaElement::~HTMLMediaElement()
|
HTMLMediaElement::~HTMLMediaElement()
|
||||||
|
@ -3557,7 +3546,6 @@ HTMLMediaElement::~HTMLMediaElement()
|
||||||
}
|
}
|
||||||
|
|
||||||
WakeLockRelease();
|
WakeLockRelease();
|
||||||
mAudioChannelAgent = nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void HTMLMediaElement::StopSuspendingAfterFirstFrame()
|
void HTMLMediaElement::StopSuspendingAfterFirstFrame()
|
||||||
|
@ -5093,8 +5081,6 @@ void HTMLMediaElement::SeekCompleted()
|
||||||
if (mCurrentPlayRangeStart == -1.0) {
|
if (mCurrentPlayRangeStart == -1.0) {
|
||||||
mCurrentPlayRangeStart = CurrentTime();
|
mCurrentPlayRangeStart = CurrentTime();
|
||||||
}
|
}
|
||||||
// Unset the variable on seekend
|
|
||||||
mPlayingThroughTheAudioChannelBeforeSeek = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void HTMLMediaElement::NotifySuspendedByCache(bool aIsSuspended)
|
void HTMLMediaElement::NotifySuspendedByCache(bool aIsSuspended)
|
||||||
|
@ -6337,74 +6323,6 @@ ImageContainer* HTMLMediaElement::GetImageContainer()
|
||||||
return container ? container->GetImageContainer() : nullptr;
|
return container ? container->GetImageContainer() : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
|
||||||
HTMLMediaElement::MaybeCreateAudioChannelAgent()
|
|
||||||
{
|
|
||||||
if (mAudioChannelAgent) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
mAudioChannelAgent = new AudioChannelAgent();
|
|
||||||
nsresult rv = mAudioChannelAgent->InitWithWeakCallback(OwnerDoc()->GetInnerWindow(),
|
|
||||||
static_cast<int32_t>(mAudioChannel),
|
|
||||||
this);
|
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
||||||
mAudioChannelAgent = nullptr;
|
|
||||||
MOZ_LOG(AudioChannelService::GetAudioChannelLog(), LogLevel::Debug,
|
|
||||||
("HTMLMediaElement, Fail to initialize the audio channel agent,"
|
|
||||||
" this = %p\n", this));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
HTMLMediaElement::IsPlayingThroughTheAudioChannel() const
|
|
||||||
{
|
|
||||||
// If we have an error, we are not playing.
|
|
||||||
if (mErrorSink->mError) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// It might be resumed from remote, we should keep the audio channel agent.
|
|
||||||
if (IsSuspendedByAudioChannel()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Are we paused
|
|
||||||
if (mPaused) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// We should consider any bfcached page or inactive document as non-playing.
|
|
||||||
if (!IsActive()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// A loop always is playing
|
|
||||||
if (HasAttr(kNameSpaceID_None, nsGkAtoms::loop)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we are actually playing...
|
|
||||||
if (IsCurrentlyPlaying()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we are seeking, we consider it as playing
|
|
||||||
if (mPlayingThroughTheAudioChannelBeforeSeek) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we are playing an external stream.
|
|
||||||
if (mSrcAttrStream) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
HTMLMediaElement::UpdateAudioChannelPlayingState(bool aForcePlaying)
|
HTMLMediaElement::UpdateAudioChannelPlayingState(bool aForcePlaying)
|
||||||
{
|
{
|
||||||
|
@ -6413,177 +6331,6 @@ HTMLMediaElement::UpdateAudioChannelPlayingState(bool aForcePlaying)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
HTMLMediaElement::NotifyAudioChannelAgent(bool aPlaying)
|
|
||||||
{
|
|
||||||
if (aPlaying) {
|
|
||||||
// The reason we don't call NotifyStartedPlaying after the media element
|
|
||||||
// really becomes audible is because there is another case needs to block
|
|
||||||
// element as early as we can, we would hear sound leaking if we block it
|
|
||||||
// too late. In that case (block autoplay in non-visited-tab), we need to
|
|
||||||
// create a connection before decoding, because we don't want user hearing
|
|
||||||
// any sound.
|
|
||||||
AudioPlaybackConfig config;
|
|
||||||
nsresult rv = mAudioChannelAgent->NotifyStartedPlaying(&config,
|
|
||||||
IsAudible());
|
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
WindowVolumeChanged(config.mVolume, config.mMuted);
|
|
||||||
WindowSuspendChanged(config.mSuspend);
|
|
||||||
} else {
|
|
||||||
mAudioChannelAgent->NotifyStoppedPlaying();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
HTMLMediaElement::WindowVolumeChanged(float aVolume, bool aMuted)
|
|
||||||
{
|
|
||||||
MOZ_LOG(AudioChannelService::GetAudioChannelLog(), LogLevel::Debug,
|
|
||||||
("HTMLMediaElement, WindowVolumeChanged, this = %p, "
|
|
||||||
"aVolume = %f, aMuted = %d\n", this, aVolume, aMuted));
|
|
||||||
|
|
||||||
if (mAudioChannelVolume != aVolume) {
|
|
||||||
mAudioChannelVolume = aVolume;
|
|
||||||
SetVolumeInternal();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aMuted && !ComputedMuted()) {
|
|
||||||
SetMutedInternal(mMuted | MUTED_BY_AUDIO_CHANNEL);
|
|
||||||
} else if (!aMuted && ComputedMuted()) {
|
|
||||||
SetMutedInternal(mMuted & ~MUTED_BY_AUDIO_CHANNEL);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
HTMLMediaElement::WindowSuspendChanged(SuspendTypes aSuspend)
|
|
||||||
{
|
|
||||||
MOZ_LOG(AudioChannelService::GetAudioChannelLog(), LogLevel::Debug,
|
|
||||||
("HTMLMediaElement, WindowSuspendChanged, this = %p, "
|
|
||||||
"aSuspend = %d\n", this, aSuspend));
|
|
||||||
|
|
||||||
switch (aSuspend) {
|
|
||||||
case nsISuspendedTypes::NONE_SUSPENDED:
|
|
||||||
ResumeFromAudioChannel();
|
|
||||||
break;
|
|
||||||
case nsISuspendedTypes::SUSPENDED_PAUSE:
|
|
||||||
case nsISuspendedTypes::SUSPENDED_PAUSE_DISPOSABLE:
|
|
||||||
PauseByAudioChannel(aSuspend);
|
|
||||||
break;
|
|
||||||
case nsISuspendedTypes::SUSPENDED_BLOCK:
|
|
||||||
BlockByAudioChannel();
|
|
||||||
break;
|
|
||||||
case nsISuspendedTypes::SUSPENDED_STOP_DISPOSABLE:
|
|
||||||
SetAudioChannelSuspended(nsISuspendedTypes::NONE_SUSPENDED);
|
|
||||||
Pause();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
MOZ_LOG(AudioChannelService::GetAudioChannelLog(), LogLevel::Debug,
|
|
||||||
("HTMLMediaElement, WindowSuspendChanged, this = %p, "
|
|
||||||
"Error : unknown suspended type!\n", this));
|
|
||||||
}
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
HTMLMediaElement::ResumeFromAudioChannel()
|
|
||||||
{
|
|
||||||
if (!IsSuspendedByAudioChannel()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (mAudioChannelSuspended) {
|
|
||||||
case nsISuspendedTypes::SUSPENDED_PAUSE:
|
|
||||||
case nsISuspendedTypes::SUSPENDED_PAUSE_DISPOSABLE:
|
|
||||||
ResumeFromAudioChannelPaused(mAudioChannelSuspended);
|
|
||||||
break;
|
|
||||||
case nsISuspendedTypes::SUSPENDED_BLOCK:
|
|
||||||
ResumeFromAudioChannelBlocked();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
MOZ_LOG(AudioChannelService::GetAudioChannelLog(), LogLevel::Debug,
|
|
||||||
("HTMLMediaElement, ResumeFromAudioChannel, this = %p, "
|
|
||||||
"Error : resume without suspended!\n", this));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
HTMLMediaElement::ResumeFromAudioChannelPaused(SuspendTypes aSuspend)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(mAudioChannelSuspended == nsISuspendedTypes::SUSPENDED_PAUSE ||
|
|
||||||
mAudioChannelSuspended == nsISuspendedTypes::SUSPENDED_PAUSE_DISPOSABLE);
|
|
||||||
|
|
||||||
SetAudioChannelSuspended(nsISuspendedTypes::NONE_SUSPENDED);
|
|
||||||
nsresult rv = Play();
|
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
DispatchAsyncEvent(NS_LITERAL_STRING("mozinterruptend"));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
HTMLMediaElement::ResumeFromAudioChannelBlocked()
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(mAudioChannelSuspended == nsISuspendedTypes::SUSPENDED_BLOCK);
|
|
||||||
|
|
||||||
SetAudioChannelSuspended(nsISuspendedTypes::NONE_SUSPENDED);
|
|
||||||
nsresult rv = Play();
|
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
HTMLMediaElement::PauseByAudioChannel(SuspendTypes aSuspend)
|
|
||||||
{
|
|
||||||
if (IsSuspendedByAudioChannel()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
SetAudioChannelSuspended(aSuspend);
|
|
||||||
Pause();
|
|
||||||
DispatchAsyncEvent(NS_LITERAL_STRING("mozinterruptbegin"));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
HTMLMediaElement::BlockByAudioChannel()
|
|
||||||
{
|
|
||||||
if (IsSuspendedByAudioChannel()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
SetAudioChannelSuspended(nsISuspendedTypes::SUSPENDED_BLOCK);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
HTMLMediaElement::SetAudioChannelSuspended(SuspendTypes aSuspend)
|
|
||||||
{
|
|
||||||
if (mAudioChannelSuspended == aSuspend) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
MaybeNotifyMediaResumed(aSuspend);
|
|
||||||
mAudioChannelSuspended = aSuspend;
|
|
||||||
MOZ_LOG(AudioChannelService::GetAudioChannelLog(), LogLevel::Debug,
|
|
||||||
("HTMLMediaElement, SetAudioChannelSuspended, this = %p, "
|
|
||||||
"aSuspend = %d\n", this, aSuspend));
|
|
||||||
|
|
||||||
NotifyAudioPlaybackChanged(
|
|
||||||
AudioChannelService::AudibleChangedReasons::ePauseStateChanged);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
HTMLMediaElement::IsSuspendedByAudioChannel() const
|
|
||||||
{
|
|
||||||
return (mAudioChannelSuspended == nsISuspendedTypes::SUSPENDED_PAUSE ||
|
|
||||||
mAudioChannelSuspended == nsISuspendedTypes::SUSPENDED_PAUSE_DISPOSABLE ||
|
|
||||||
mAudioChannelSuspended == nsISuspendedTypes::SUSPENDED_BLOCK);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
HTMLMediaElement::IsAllowedToPlay()
|
HTMLMediaElement::IsAllowedToPlay()
|
||||||
{
|
{
|
||||||
|
@ -6611,36 +6358,6 @@ HTMLMediaElement::IsAllowedToPlay()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
|
||||||
HTMLMediaElement::IsAllowedToPlayByAudioChannel()
|
|
||||||
{
|
|
||||||
// The media element has already been paused or blocked, so it can't start
|
|
||||||
// playback again by script or user's intend until resuming by audio channel.
|
|
||||||
if (mAudioChannelSuspended == nsISuspendedTypes::SUSPENDED_PAUSE ||
|
|
||||||
mAudioChannelSuspended == nsISuspendedTypes::SUSPENDED_BLOCK) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the tab hasn't been activated yet, the media element in that tab can't
|
|
||||||
// be playback now until the tab goes to foreground first time or user clicks
|
|
||||||
// the unblocking tab icon.
|
|
||||||
if (MaybeCreateAudioChannelAgent() && !IsTabActivated()) {
|
|
||||||
// Even we haven't start playing yet, we still need to notify the audio
|
|
||||||
// channe system because we need to receive the resume notification later.
|
|
||||||
UpdateAudioChannelPlayingState(true /* force to start */);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
HTMLMediaElement::IsTabActivated() const
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(mAudioChannelAgent);
|
|
||||||
return !mAudioChannelAgent->ShouldBlockMedia();
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char* VisibilityString(Visibility aVisibility) {
|
static const char* VisibilityString(Visibility aVisibility) {
|
||||||
switch(aVisibility) {
|
switch(aVisibility) {
|
||||||
case Visibility::UNTRACKED: {
|
case Visibility::UNTRACKED: {
|
||||||
|
@ -6922,17 +6639,6 @@ HTMLMediaElement::CannotDecryptWaitingForKey()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP HTMLMediaElement::WindowAudioCaptureChanged(bool aCapture)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(mAudioChannelAgent);
|
|
||||||
|
|
||||||
if (mAudioCapturedByWindow != aCapture) {
|
|
||||||
mAudioCapturedByWindow = aCapture;
|
|
||||||
AudioCaptureStreamChangeIfNeeded();
|
|
||||||
}
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
AudioTrackList*
|
AudioTrackList*
|
||||||
HTMLMediaElement::AudioTracks()
|
HTMLMediaElement::AudioTracks()
|
||||||
{
|
{
|
||||||
|
@ -7056,59 +6762,6 @@ HTMLMediaElement::NotifyAudioPlaybackChanged(AudibleChangedReasons 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
HTMLMediaElement::MaybeNotifyMediaResumed(SuspendTypes aSuspend)
|
|
||||||
{
|
|
||||||
// In fennec, we should send the notification when media is resumed from the
|
|
||||||
// pause-disposable which was called by media control.
|
|
||||||
if (mAudioChannelSuspended != nsISuspendedTypes::SUSPENDED_PAUSE_DISPOSABLE &&
|
|
||||||
aSuspend != nsISuspendedTypes::NONE_SUSPENDED) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
MOZ_ASSERT(mAudioChannelAgent);
|
|
||||||
uint64_t windowID = mAudioChannelAgent->WindowID();
|
|
||||||
NS_DispatchToMainThread(NS_NewRunnableFunction([windowID]() -> void {
|
|
||||||
nsCOMPtr<nsIObserverService> observerService =
|
|
||||||
services::GetObserverService();
|
|
||||||
if (NS_WARN_IF(!observerService)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsCOMPtr<nsISupportsPRUint64> wrapper =
|
|
||||||
do_CreateInstance(NS_SUPPORTS_PRUINT64_CONTRACTID);
|
|
||||||
if (NS_WARN_IF(!wrapper)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
wrapper->SetData(windowID);
|
|
||||||
observerService->NotifyObservers(wrapper,
|
|
||||||
"media-playback-resumed",
|
|
||||||
u"active");
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
HTMLMediaElement::ShouldElementBePaused()
|
HTMLMediaElement::ShouldElementBePaused()
|
||||||
{
|
{
|
||||||
|
|
|
@ -48,7 +48,6 @@ class MediaResource;
|
||||||
class MediaDecoder;
|
class MediaDecoder;
|
||||||
class VideoFrameContainer;
|
class VideoFrameContainer;
|
||||||
namespace dom {
|
namespace dom {
|
||||||
class AudioChannelAgent;
|
|
||||||
class MediaKeys;
|
class MediaKeys;
|
||||||
class TextTrack;
|
class TextTrack;
|
||||||
class TimeRanges;
|
class TimeRanges;
|
||||||
|
@ -1204,9 +1203,6 @@ protected:
|
||||||
// next block of audio samples) preceeding seek target.
|
// next block of audio samples) preceeding seek target.
|
||||||
already_AddRefed<Promise> Seek(double aTime, SeekTarget::Type aSeekType, ErrorResult& aRv);
|
already_AddRefed<Promise> Seek(double aTime, SeekTarget::Type aSeekType, ErrorResult& aRv);
|
||||||
|
|
||||||
// A method to check if we are playing through the AudioChannel.
|
|
||||||
bool IsPlayingThroughTheAudioChannel() const;
|
|
||||||
|
|
||||||
// Update the audio channel playing state
|
// Update the audio channel playing state
|
||||||
void UpdateAudioChannelPlayingState(bool aForcePlaying = false);
|
void UpdateAudioChannelPlayingState(bool aForcePlaying = false);
|
||||||
|
|
||||||
|
@ -1222,68 +1218,18 @@ protected:
|
||||||
// Recomputes ready state and fires events as necessary based on current state.
|
// Recomputes ready state and fires events as necessary based on current state.
|
||||||
void UpdateReadyStateInternal();
|
void UpdateReadyStateInternal();
|
||||||
|
|
||||||
// Notifies the audio channel agent when the element starts or stops playing.
|
|
||||||
void NotifyAudioChannelAgent(bool aPlaying);
|
|
||||||
|
|
||||||
// True if we create the audio channel agent successfully or we already have
|
|
||||||
// one. The agent is used to communicate with the AudioChannelService. eg.
|
|
||||||
// notify we are playing/audible and receive muted/unmuted/suspend/resume
|
|
||||||
// commands from AudioChannelService.
|
|
||||||
bool MaybeCreateAudioChannelAgent();
|
|
||||||
|
|
||||||
// Determine if the element should be paused because of suspend conditions.
|
// Determine if the element should be paused because of suspend conditions.
|
||||||
bool ShouldElementBePaused();
|
bool ShouldElementBePaused();
|
||||||
|
|
||||||
// Create or destroy the captured stream.
|
// Create or destroy the captured stream.
|
||||||
void AudioCaptureStreamChange(bool aCapture);
|
void AudioCaptureStreamChange(bool aCapture);
|
||||||
|
|
||||||
/**
|
|
||||||
* We have different kinds of suspended cases,
|
|
||||||
* - SUSPENDED_PAUSE
|
|
||||||
* It's used when we temporary lost platform audio focus. MediaElement can
|
|
||||||
* only be resumed when we gain the audio focus again.
|
|
||||||
*
|
|
||||||
* - SUSPENDED_PAUSE_DISPOSABLE
|
|
||||||
* It's used when user press the pause botton on the remote media-control.
|
|
||||||
* MediaElement can be resumed by reomte media-control or via play().
|
|
||||||
*
|
|
||||||
* - SUSPENDED_BLOCK
|
|
||||||
* It's used to reduce the power comsuption, we won't play the auto-play
|
|
||||||
* audio/video in the page we have never visited before. MediaElement would
|
|
||||||
* be resumed when the page is active. See bug647429 for more details.
|
|
||||||
*
|
|
||||||
* - SUSPENDED_STOP_DISPOSABLE
|
|
||||||
* When we permanently lost platform audio focus, we shuold stop playing
|
|
||||||
* and stop the audio channel agent. MediaElement can only be restarted by
|
|
||||||
* play().
|
|
||||||
*/
|
|
||||||
void PauseByAudioChannel(SuspendTypes aSuspend);
|
|
||||||
void BlockByAudioChannel();
|
|
||||||
|
|
||||||
void ResumeFromAudioChannel();
|
|
||||||
void ResumeFromAudioChannelPaused(SuspendTypes aSuspend);
|
|
||||||
void ResumeFromAudioChannelBlocked();
|
|
||||||
|
|
||||||
bool IsSuspendedByAudioChannel() const;
|
|
||||||
void SetAudioChannelSuspended(SuspendTypes aSuspend);
|
|
||||||
|
|
||||||
// A method to check whether the media element is allowed to start playback.
|
// A method to check whether the media element is allowed to start playback.
|
||||||
bool IsAllowedToPlay();
|
bool IsAllowedToPlay();
|
||||||
bool IsAllowedToPlayByAudioChannel();
|
|
||||||
|
|
||||||
// If the network state is empty and then we would trigger DoLoad().
|
// If the network state is empty and then we would trigger DoLoad().
|
||||||
void MaybeDoLoad();
|
void MaybeDoLoad();
|
||||||
|
|
||||||
// True if the tab which media element belongs to has been to foreground at
|
|
||||||
// least once or activated by manually clicking the unblocking tab icon.
|
|
||||||
bool IsTabActivated() const;
|
|
||||||
|
|
||||||
bool IsAudible() const;
|
|
||||||
|
|
||||||
// It's used for fennec only, send the notification when the user resumes the
|
|
||||||
// media which was paused by media control.
|
|
||||||
void MaybeNotifyMediaResumed(SuspendTypes aSuspend);
|
|
||||||
|
|
||||||
class nsAsyncEventRunner;
|
class nsAsyncEventRunner;
|
||||||
using nsGenericHTMLElement::DispatchEvent;
|
using nsGenericHTMLElement::DispatchEvent;
|
||||||
// For nsAsyncEventRunner.
|
// For nsAsyncEventRunner.
|
||||||
|
@ -1504,7 +1450,6 @@ protected:
|
||||||
};
|
};
|
||||||
|
|
||||||
uint32_t mMuted;
|
uint32_t mMuted;
|
||||||
SuspendTypes mAudioChannelSuspended;
|
|
||||||
|
|
||||||
// True if the media statistics are currently being shown by the builtin
|
// True if the media statistics are currently being shown by the builtin
|
||||||
// video controls
|
// video controls
|
||||||
|
@ -1521,19 +1466,12 @@ protected:
|
||||||
// True if the sound is being captured.
|
// True if the sound is being captured.
|
||||||
bool mAudioCaptured;
|
bool mAudioCaptured;
|
||||||
|
|
||||||
// True if the sound is being captured by the window.
|
|
||||||
bool mAudioCapturedByWindow;
|
|
||||||
|
|
||||||
// If TRUE then the media element was actively playing before the currently
|
// If TRUE then the media element was actively playing before the currently
|
||||||
// in progress seeking. If FALSE then the media element is either not seeking
|
// in progress seeking. If FALSE then the media element is either not seeking
|
||||||
// or was not actively playing before the current seek. Used to decide whether
|
// or was not actively playing before the current seek. Used to decide whether
|
||||||
// to raise the 'waiting' event as per 4.7.1.8 in HTML 5 specification.
|
// to raise the 'waiting' event as per 4.7.1.8 in HTML 5 specification.
|
||||||
bool mPlayingBeforeSeek;
|
bool mPlayingBeforeSeek;
|
||||||
|
|
||||||
// if TRUE then the seek started while content was in active playing state
|
|
||||||
// if FALSE then the seek started while the content was not playing.
|
|
||||||
bool mPlayingThroughTheAudioChannelBeforeSeek;
|
|
||||||
|
|
||||||
// True iff this element is paused because the document is inactive or has
|
// True iff this element is paused because the document is inactive or has
|
||||||
// been suspended by the audio channel service.
|
// been suspended by the audio channel service.
|
||||||
bool mPausedForInactiveDocumentOrChannel;
|
bool mPausedForInactiveDocumentOrChannel;
|
||||||
|
@ -1629,21 +1567,11 @@ protected:
|
||||||
// Audio Channel.
|
// Audio Channel.
|
||||||
AudioChannel mAudioChannel;
|
AudioChannel mAudioChannel;
|
||||||
|
|
||||||
// The audio channel volume
|
|
||||||
float mAudioChannelVolume;
|
|
||||||
|
|
||||||
// Is this media element playing?
|
|
||||||
bool mPlayingThroughTheAudioChannel;
|
|
||||||
|
|
||||||
// Disable the video playback by track selection. This flag might not be
|
// Disable the video playback by track selection. This flag might not be
|
||||||
// enough if we ever expand the ability of supporting multi-tracks video
|
// enough if we ever expand the ability of supporting multi-tracks video
|
||||||
// playback.
|
// playback.
|
||||||
bool mDisableVideo;
|
bool mDisableVideo;
|
||||||
|
|
||||||
// An agent used to join audio channel service and its life cycle would equal
|
|
||||||
// to media element.
|
|
||||||
RefPtr<AudioChannelAgent> mAudioChannelAgent;
|
|
||||||
|
|
||||||
RefPtr<TextTrackManager> mTextTrackManager;
|
RefPtr<TextTrackManager> mTextTrackManager;
|
||||||
|
|
||||||
RefPtr<AudioTrackList> mAudioTrackList;
|
RefPtr<AudioTrackList> mAudioTrackList;
|
||||||
|
@ -1735,9 +1663,6 @@ private:
|
||||||
// True if the audio track is not silent.
|
// True if the audio track is not silent.
|
||||||
bool mIsAudioTrackAudible;
|
bool mIsAudioTrackAudible;
|
||||||
|
|
||||||
// True if media element is audible for users.
|
|
||||||
bool mAudible;
|
|
||||||
|
|
||||||
Visibility mVisibilityState;
|
Visibility mVisibilityState;
|
||||||
|
|
||||||
UniquePtr<ErrorSink> mErrorSink;
|
UniquePtr<ErrorSink> mErrorSink;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче