Re-land "Dispatch AudioSink notifications asynchronously"

Turns out that this is needed after all.
This commit is contained in:
trav90
2017-04-15 20:56:57 -05:00
committed by roytam1
parent 3ce769dbfb
commit 6fa240db4e
4 changed files with 31 additions and 4 deletions
+3 -3
View File
@@ -202,7 +202,7 @@ AudioSink::AudioLoop()
}
int64_t endTime = GetEndTime();
if (endTime != -1) {
mStateMachine->OnAudioEndTimeUpdate(endTime);
mStateMachine->DispatchOnAudioEndTimeUpdate(endTime);
}
}
ReentrantMonitorAutoEnter mon(GetReentrantMonitor());
@@ -256,7 +256,7 @@ AudioSink::Cleanup()
AssertCurrentThreadInMonitor();
nsRefPtr<AudioStream> audioStream;
audioStream.swap(mAudioStream);
mStateMachine->OnAudioSinkComplete();
mStateMachine->DispatchOnAudioSinkComplete();
ReentrantMonitorAutoExit exit(GetReentrantMonitor());
audioStream->Shutdown();
@@ -340,7 +340,7 @@ AudioSink::PlayFromAudioQueue()
StartAudioStreamPlaybackIfNeeded();
if (audio->mOffset != -1) {
mStateMachine->OnPlaybackOffsetUpdate(audio->mOffset);
mStateMachine->DispatchOnPlaybackOffsetUpdate(audio->mOffset);
}
return audio->mFrames;
}
+1 -1
View File
@@ -1535,7 +1535,7 @@ void MediaDecoder::SetLoadInBackground(bool aLoadInBackground)
void MediaDecoder::UpdatePlaybackOffset(int64_t aOffset)
{
ReentrantMonitorAutoEnter mon(GetReentrantMonitor());
GetReentrantMonitor().AssertCurrentThreadIn();
mPlaybackPosition = aOffset;
}
+5
View File
@@ -3417,6 +3417,7 @@ void MediaDecoderStateMachine::QueueMetadata(int64_t aPublishTime,
void MediaDecoderStateMachine::OnAudioEndTimeUpdate(int64_t aAudioEndTime)
{
MOZ_ASSERT(OnTaskQueue());
ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
MOZ_ASSERT(aAudioEndTime >= mAudioEndTime);
mAudioEndTime = aAudioEndTime;
@@ -3424,11 +3425,15 @@ void MediaDecoderStateMachine::OnAudioEndTimeUpdate(int64_t aAudioEndTime)
void MediaDecoderStateMachine::OnPlaybackOffsetUpdate(int64_t aPlaybackOffset)
{
MOZ_ASSERT(OnTaskQueue());
ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
mDecoder->UpdatePlaybackOffset(aPlaybackOffset);
}
void MediaDecoderStateMachine::OnAudioSinkComplete()
{
MOZ_ASSERT(OnTaskQueue());
ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
if (mAudioCaptured) {
return;
}
+22
View File
@@ -728,15 +728,37 @@ protected:
// Can only be called on the state machine thread.
void SetPlayStartTime(const TimeStamp& aTimeStamp);
private:
// Update mAudioEndTime.
void OnAudioEndTimeUpdate(int64_t aAudioEndTime);
public:
void DispatchOnAudioEndTimeUpdate(int64_t aAudioEndTime)
{
RefPtr<nsRunnable> r =
NS_NewRunnableMethodWithArg<int64_t>(this, &MediaDecoderStateMachine::OnAudioEndTimeUpdate, aAudioEndTime);
TaskQueue()->Dispatch(r.forget());
}
private:
// Update mDecoder's playback offset.
void OnPlaybackOffsetUpdate(int64_t aPlaybackOffset);
public:
void DispatchOnPlaybackOffsetUpdate(int64_t aPlaybackOffset)
{
RefPtr<nsRunnable> r =
NS_NewRunnableMethodWithArg<int64_t>(this, &MediaDecoderStateMachine::OnPlaybackOffsetUpdate, aPlaybackOffset);
TaskQueue()->Dispatch(r.forget());
}
private:
// Called by the AudioSink to signal that all outstanding work is complete
// and the sink is shutting down.
void OnAudioSinkComplete();
public:
void DispatchOnAudioSinkComplete()
{
TaskQueue()->Dispatch(NS_NewRunnableMethod(this, &MediaDecoderStateMachine::OnAudioSinkComplete));
}
// Called by the AudioSink to signal errors.
void OnAudioSinkError();