diff --git a/content/html/content/src/nsHTMLAudioElement.cpp b/content/html/content/src/nsHTMLAudioElement.cpp
index 098e0fd97773..c3014cc220ee 100644
--- a/content/html/content/src/nsHTMLAudioElement.cpp
+++ b/content/html/content/src/nsHTMLAudioElement.cpp
@@ -176,9 +176,6 @@ nsHTMLAudioElement::MozWriteAudio(const JS::Value& aData, JSContext* aCx, uint32
// AudioDataValue is 'float', but it's not worth it for this deprecated API.
nsAutoArrayPtr audioData(new AudioDataValue[writeLen * mChannels]);
ConvertAudioSamples(frames, audioData.get(), writeLen * mChannels);
- if (!mAudioStream->IsStarted()) {
- mAudioStream->Start();
- }
nsresult rv = mAudioStream->Write(audioData.get(), writeLen);
if (NS_FAILED(rv)) {
diff --git a/content/media/AudioStream.cpp b/content/media/AudioStream.cpp
index ecb54710c13d..b2a535a628a2 100644
--- a/content/media/AudioStream.cpp
+++ b/content/media/AudioStream.cpp
@@ -59,8 +59,6 @@ class NativeAudioStream : public AudioStream
uint32_t Available();
void SetVolume(double aVolume);
void Drain();
- nsresult Start();
- bool IsStarted();
void Pause();
void Resume();
int64_t GetPosition();
@@ -183,7 +181,6 @@ AudioStream::AudioStream()
: mInRate(0),
mOutRate(0),
mChannels(0),
- mWritten(0),
mAudioClock(this)
{}
@@ -279,11 +276,6 @@ nsresult AudioStream::SetPreservesPitch(bool aPreservesPitch)
return NS_OK;
}
-int64_t AudioStream::GetWritten()
-{
- return mWritten;
-}
-
NativeAudioStream::NativeAudioStream() :
mVolume(1.0),
mAudioHandle(0),
@@ -394,8 +386,6 @@ nsresult NativeAudioStream::Write(const AudioDataValue* aBuf, uint32_t aFrames)
written = WriteToBackend(aBuf, samples);
}
- mWritten += aFrames;
-
if (written == -1) {
PR_LOG(gAudioStreamLog, PR_LOG_ERROR, ("NativeAudioStream: sa_stream_write error"));
mInError = true;
@@ -465,19 +455,6 @@ void NativeAudioStream::Drain()
}
}
-nsresult NativeAudioStream::Start()
-{
- // Since sydneyaudio is a push API, the playback is started when enough frames
- // have been written. Hence, Start() is a noop.
- return NS_OK;
-}
-
-bool NativeAudioStream::IsStarted()
-{
- // See the comment for the |Start()| method.
- return true;
-}
-
void NativeAudioStream::Pause()
{
if (mInError)
@@ -620,8 +597,6 @@ class BufferedAudioStream : public AudioStream
uint32_t Available();
void SetVolume(double aVolume);
void Drain();
- nsresult Start();
- bool IsStarted();
void Pause();
void Resume();
int64_t GetPosition();
@@ -807,19 +782,24 @@ BufferedAudioStream::Write(const AudioDataValue* aBuf, uint32_t aFrames)
src += available;
bytesToCopy -= available;
- if (bytesToCopy > 0) {
- // If we are not playing, but our buffer is full, start playing to make
- // room for soon-to-be-decoded data.
- if (!IsStarted()) {
+ if (mState != STARTED) {
+ int r;
+ {
MonitorAutoUnlock mon(mMonitor);
- Start();
+ r = cubeb_stream_start(mCubebStream);
}
+ mState = r == CUBEB_OK ? STARTED : ERRORED;
+ }
+
+ if (mState != STARTED) {
+ return NS_ERROR_FAILURE;
+ }
+
+ if (bytesToCopy > 0) {
mon.Wait();
}
}
- mWritten += aFrames;
-
return NS_OK;
}
@@ -858,26 +838,6 @@ BufferedAudioStream::Drain()
}
}
-nsresult
-BufferedAudioStream::Start()
-{
- if (!mCubebStream) {
- return NS_ERROR_FAILURE;
- }
- if (mState != STARTED) {
- int r = cubeb_stream_start(mCubebStream);
- mState = r == CUBEB_OK ? STARTED : ERRORED;
- return mState == STARTED ? NS_OK : NS_ERROR_FAILURE;
- }
- return NS_OK;
-}
-
-bool
-BufferedAudioStream::IsStarted()
-{
- return mState == STARTED ? true : false;
-}
-
void
BufferedAudioStream::Pause()
{
diff --git a/content/media/AudioStream.h b/content/media/AudioStream.h
index 522936cd5975..35bfce031af2 100644
--- a/content/media/AudioStream.h
+++ b/content/media/AudioStream.h
@@ -44,8 +44,6 @@ class AudioClock
// Get the current pitch preservation state.
// Called on the audio thread.
bool GetPreservesPitch();
- // Get the number of frames written to the backend.
- int64_t GetWritten();
private:
// This AudioStream holds a strong reference to this AudioClock. This
// pointer is garanteed to always be valid.
@@ -130,20 +128,10 @@ public:
// Block until buffered audio data has been consumed.
virtual void Drain() = 0;
- // Start the stream.
- virtual nsresult Start() = 0;
-
- // Check if the stream is started.
- virtual bool IsStarted() = 0;
-
- // Return the number of frames written so far in the stream. This allow the
- // caller to check if it is safe to start the stream, if needed.
- virtual int64_t GetWritten();
-
- // Pause audio playback.
+ // Pause audio playback
virtual void Pause() = 0;
- // Resume audio playback.
+ // Resume audio playback
virtual void Resume() = 0;
// Return the position in microseconds of the audio frame being played by
@@ -183,8 +171,6 @@ protected:
// Output rate in Hz (characteristic of the playback rate)
int mOutRate;
int mChannels;
- // Number of frames written to the buffers.
- int64_t mWritten;
AudioClock mAudioClock;
nsAutoPtr mTimeStretcher;
};
diff --git a/content/media/MediaDecoderStateMachine.cpp b/content/media/MediaDecoderStateMachine.cpp
index f5684b3ac9e7..8c7bd22f1d09 100644
--- a/content/media/MediaDecoderStateMachine.cpp
+++ b/content/media/MediaDecoderStateMachine.cpp
@@ -109,9 +109,6 @@ static const uint32_t QUICK_BUFFERING_LOW_DATA_USECS = 1000000;
// QUICK_BUFFERING_LOW_DATA_USECS.
PR_STATIC_ASSERT(QUICK_BUFFERING_LOW_DATA_USECS <= AMPLE_AUDIO_USECS);
-// This value has been chosen empirically.
-static const uint32_t AUDIOSTREAM_MIN_WRITE_BEFORE_START_USECS = 200000;
-
static TimeDuration UsecsToDuration(int64_t aUsecs) {
return TimeDuration::FromMilliseconds(static_cast(aUsecs) / USECS_PER_MS);
}
@@ -955,19 +952,6 @@ bool MediaDecoderStateMachine::IsPlaying()
return !mPlayStartTime.IsNull();
}
-// If we have already written enough frames to the AudioStream, start the
-// playback.
-static void
-StartAudioStreamPlaybackIfNeeded(AudioStream* aStream)
-{
- // We want to have enough data in the buffer to start the stream.
- if (!aStream->IsStarted() &&
- static_cast(aStream->GetWritten()) / aStream->GetRate() >=
- static_cast(AUDIOSTREAM_MIN_WRITE_BEFORE_START_USECS) / USECS_PER_S) {
- aStream->Start();
- }
-}
-
static void WriteSilence(AudioStream* aStream, uint32_t aFrames)
{
uint32_t numSamples = aFrames * aStream->GetChannels();
@@ -975,8 +959,6 @@ static void WriteSilence(AudioStream* aStream, uint32_t aFrames)
buf.SetLength(numSamples);
memset(buf.Elements(), 0, numSamples * sizeof(AudioDataValue));
aStream->Write(buf.Elements(), aFrames);
-
- StartAudioStreamPlaybackIfNeeded(aStream);
}
void MediaDecoderStateMachine::AudioLoop()
@@ -1126,11 +1108,6 @@ void MediaDecoderStateMachine::AudioLoop()
mState != DECODER_STATE_SHUTDOWN &&
!mStopAudioThread)
{
- // If the media was too short to trigger the start of the audio stream,
- // start it now.
- if (!mAudioStream->IsStarted()) {
- mAudioStream->Start();
- }
// Last frame pushed to audio hardware, wait for the audio to finish,
// before the audio thread terminates.
bool seeking = false;
@@ -1235,8 +1212,6 @@ uint32_t MediaDecoderStateMachine::PlayFromAudioQueue(uint64_t aFrameOffset,
mAudioStream->Write(audio->mAudioData,
audio->mFrames);
- StartAudioStreamPlaybackIfNeeded(mAudioStream);
-
offset = audio->mOffset;
frames = audio->mFrames;