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:
Alastor Wu 2016-11-26 02:34:42 +08:00
Родитель b32367de75
Коммит 59b85ce47d
2 изменённых файлов: 0 добавлений и 422 удалений

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

@ -2519,10 +2519,6 @@ HTMLMediaElement::Seek(double aTime,
// MediaDecoderReaders.
mPlayingBeforeSeek = IsPotentiallyPlaying();
// Set the Variable if the Seekstarted while active playing
if (mPlayingThroughTheAudioChannel) {
mPlayingThroughTheAudioChannelBeforeSeek = true;
}
// The media backend is responsible for dispatching the timeupdate
// 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),
mPaused(true),
mMuted(0),
mAudioChannelSuspended(nsISuspendedTypes::NONE_SUSPENDED),
mStatsShowing(false),
mAllowCasting(false),
mIsCasting(false),
mAudioCaptured(false),
mAudioCapturedByWindow(false),
mPlayingBeforeSeek(false),
mPlayingThroughTheAudioChannelBeforeSeek(false),
mPausedForInactiveDocumentOrChannel(false),
mEventDeliveryPaused(false),
mIsRunningLoadMethod(false),
@ -3487,14 +3480,11 @@ HTMLMediaElement::HTMLMediaElement(already_AddRefed<mozilla::dom::NodeInfo>& aNo
mWaitingForKey(NOT_WAITING_FOR_KEY),
mDownloadSuspendedByCache(false, "HTMLMediaElement::mDownloadSuspendedByCache"),
mAudioChannel(AudioChannelService::GetDefaultAudioChannel()),
mAudioChannelVolume(1.0),
mPlayingThroughTheAudioChannel(false),
mDisableVideo(false),
mHasUserInteraction(false),
mFirstFrameLoaded(false),
mDefaultPlaybackStartPosition(0.0),
mIsAudioTrackAudible(false),
mAudible(IsAudible()),
mVisibilityState(Visibility::APPROXIMATELY_NONVISIBLE),
mErrorSink(new ErrorSink(this)),
mAudioChannelWrapper(new AudioChannelAgentCallback(this, mAudioChannel))
@ -3516,7 +3506,6 @@ HTMLMediaElement::HTMLMediaElement(already_AddRefed<mozilla::dom::NodeInfo>& aNo
mWatchManager.Watch(mReadyState, &HTMLMediaElement::UpdateReadyStateInternal);
mShutdownObserver->Subscribe(this);
MaybeCreateAudioChannelAgent();
}
HTMLMediaElement::~HTMLMediaElement()
@ -3557,7 +3546,6 @@ HTMLMediaElement::~HTMLMediaElement()
}
WakeLockRelease();
mAudioChannelAgent = nullptr;
}
void HTMLMediaElement::StopSuspendingAfterFirstFrame()
@ -5093,8 +5081,6 @@ void HTMLMediaElement::SeekCompleted()
if (mCurrentPlayRangeStart == -1.0) {
mCurrentPlayRangeStart = CurrentTime();
}
// Unset the variable on seekend
mPlayingThroughTheAudioChannelBeforeSeek = false;
}
void HTMLMediaElement::NotifySuspendedByCache(bool aIsSuspended)
@ -6337,74 +6323,6 @@ ImageContainer* HTMLMediaElement::GetImageContainer()
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
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
HTMLMediaElement::IsAllowedToPlay()
{
@ -6611,36 +6358,6 @@ HTMLMediaElement::IsAllowedToPlay()
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) {
switch(aVisibility) {
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*
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
HTMLMediaElement::ShouldElementBePaused()
{

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

@ -48,7 +48,6 @@ class MediaResource;
class MediaDecoder;
class VideoFrameContainer;
namespace dom {
class AudioChannelAgent;
class MediaKeys;
class TextTrack;
class TimeRanges;
@ -1204,9 +1203,6 @@ protected:
// next block of audio samples) preceeding seek target.
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
void UpdateAudioChannelPlayingState(bool aForcePlaying = false);
@ -1222,68 +1218,18 @@ protected:
// Recomputes ready state and fires events as necessary based on current state.
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.
bool ShouldElementBePaused();
// Create or destroy the captured stream.
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.
bool IsAllowedToPlay();
bool IsAllowedToPlayByAudioChannel();
// If the network state is empty and then we would trigger DoLoad().
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;
using nsGenericHTMLElement::DispatchEvent;
// For nsAsyncEventRunner.
@ -1504,7 +1450,6 @@ protected:
};
uint32_t mMuted;
SuspendTypes mAudioChannelSuspended;
// True if the media statistics are currently being shown by the builtin
// video controls
@ -1521,19 +1466,12 @@ protected:
// True if the sound is being captured.
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
// 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
// to raise the 'waiting' event as per 4.7.1.8 in HTML 5 specification.
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
// been suspended by the audio channel service.
bool mPausedForInactiveDocumentOrChannel;
@ -1629,21 +1567,11 @@ protected:
// Audio Channel.
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
// enough if we ever expand the ability of supporting multi-tracks video
// playback.
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<AudioTrackList> mAudioTrackList;
@ -1735,9 +1663,6 @@ private:
// True if the audio track is not silent.
bool mIsAudioTrackAudible;
// True if media element is audible for users.
bool mAudible;
Visibility mVisibilityState;
UniquePtr<ErrorSink> mErrorSink;