mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 14:30:27 +00:00
Re-land "Dispatch AudioSink notifications asynchronously"
Turns out that this is needed after all.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -1535,7 +1535,7 @@ void MediaDecoder::SetLoadInBackground(bool aLoadInBackground)
|
||||
|
||||
void MediaDecoder::UpdatePlaybackOffset(int64_t aOffset)
|
||||
{
|
||||
ReentrantMonitorAutoEnter mon(GetReentrantMonitor());
|
||||
GetReentrantMonitor().AssertCurrentThreadIn();
|
||||
mPlaybackPosition = aOffset;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user