Chromium Code Reviews| Index: Source/modules/webaudio/AsyncAudioDecoder.cpp |
| diff --git a/Source/modules/webaudio/AsyncAudioDecoder.cpp b/Source/modules/webaudio/AsyncAudioDecoder.cpp |
| index f1ea34f4c71456fad2716838e7c95099aba78e67..44dc7317176adcd0f5c5a1c80fe1ecc396a28005 100644 |
| --- a/Source/modules/webaudio/AsyncAudioDecoder.cpp |
| +++ b/Source/modules/webaudio/AsyncAudioDecoder.cpp |
| @@ -41,10 +41,22 @@ namespace WebCore { |
| AsyncAudioDecoder::AsyncAudioDecoder() |
| : m_thread(adoptPtr(blink::Platform::current()->createThread("Audio Decoder"))) |
| { |
| + m_thread->postTask(new Task(WTF::bind(&AsyncAudioDecoder::setupAudioDecoderThread))); |
|
keishi
2014/03/19 20:33:45
Adding this line fixes an assertion failure but ca
haraken
2014/03/19 21:03:47
Looks like you're hitting dead lock.
Isn't there
|
| } |
| AsyncAudioDecoder::~AsyncAudioDecoder() |
| { |
| + m_thread->postTask(new Task(WTF::bind(&AsyncAudioDecoder::cleanupAudioDecoderThread))); |
| +} |
| + |
| +void AsyncAudioDecoder::setupAudioDecoderThread() |
| +{ |
| + ThreadState::attach(); |
| +} |
| + |
| +void AsyncAudioDecoder::cleanupAudioDecoderThread() |
| +{ |
| + ThreadState::detach(); |
| } |
| void AsyncAudioDecoder::decodeAsync(ArrayBuffer* audioData, float sampleRate, PassOwnPtr<AudioBufferCallback> successCallback, PassOwnPtr<AudioBufferCallback> errorCallback) |
| @@ -64,7 +76,7 @@ void AsyncAudioDecoder::decodeAsync(ArrayBuffer* audioData, float sampleRate, Pa |
| void AsyncAudioDecoder::decode(ArrayBuffer* audioData, float sampleRate, AudioBufferCallback* successCallback, AudioBufferCallback* errorCallback) |
| { |
| // Do the actual decoding and invoke the callback. |
| - RefPtr<AudioBuffer> audioBuffer = AudioBuffer::createFromAudioFileData(audioData->data(), audioData->byteLength(), false, sampleRate); |
| + RefPtrWillBeRawPtr<AudioBuffer> audioBuffer = AudioBuffer::createFromAudioFileData(audioData->data(), audioData->byteLength(), false, sampleRate); |
| // Decoding is finished, but we need to do the callbacks on the main thread. |
| // The leaked reference to audioBuffer is picked up in notifyComplete. |
| @@ -77,7 +89,9 @@ void AsyncAudioDecoder::notifyComplete(ArrayBuffer* audioData, AudioBufferCallba |
| RefPtr<ArrayBuffer> audioDataRef = adoptRef(audioData); |
| OwnPtr<AudioBufferCallback> successCallbackPtr = adoptPtr(successCallback); |
| OwnPtr<AudioBufferCallback> errorCallbackPtr = adoptPtr(errorCallback); |
| - RefPtr<AudioBuffer> audioBufferRef = adoptRef(audioBuffer); |
| +#if !ENABLE(OILPAN) |
| + RefPtrWillBeRawPtr<AudioBuffer> audioBufferRef = adoptRefWillBeNoop(audioBuffer); |
| +#endif |
| if (audioBuffer && successCallback) |
| successCallback->handleEvent(audioBuffer); |