OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2011, Google Inc. All rights reserved. | 2 * Copyright (C) 2011, Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 23 matching lines...) Expand all Loading... | |
34 #include "public/platform/Platform.h" | 34 #include "public/platform/Platform.h" |
35 #include "wtf/ArrayBuffer.h" | 35 #include "wtf/ArrayBuffer.h" |
36 #include "wtf/MainThread.h" | 36 #include "wtf/MainThread.h" |
37 #include "wtf/PassOwnPtr.h" | 37 #include "wtf/PassOwnPtr.h" |
38 | 38 |
39 namespace WebCore { | 39 namespace WebCore { |
40 | 40 |
41 AsyncAudioDecoder::AsyncAudioDecoder() | 41 AsyncAudioDecoder::AsyncAudioDecoder() |
42 : m_thread(adoptPtr(blink::Platform::current()->createThread("Audio Decoder" ))) | 42 : m_thread(adoptPtr(blink::Platform::current()->createThread("Audio Decoder" ))) |
43 { | 43 { |
44 m_thread->postTask(new Task(WTF::bind(&AsyncAudioDecoder::setupAudioDecoderT hread))); | |
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
| |
44 } | 45 } |
45 | 46 |
46 AsyncAudioDecoder::~AsyncAudioDecoder() | 47 AsyncAudioDecoder::~AsyncAudioDecoder() |
47 { | 48 { |
49 m_thread->postTask(new Task(WTF::bind(&AsyncAudioDecoder::cleanupAudioDecode rThread))); | |
50 } | |
51 | |
52 void AsyncAudioDecoder::setupAudioDecoderThread() | |
53 { | |
54 ThreadState::attach(); | |
55 } | |
56 | |
57 void AsyncAudioDecoder::cleanupAudioDecoderThread() | |
58 { | |
59 ThreadState::detach(); | |
48 } | 60 } |
49 | 61 |
50 void AsyncAudioDecoder::decodeAsync(ArrayBuffer* audioData, float sampleRate, Pa ssOwnPtr<AudioBufferCallback> successCallback, PassOwnPtr<AudioBufferCallback> e rrorCallback) | 62 void AsyncAudioDecoder::decodeAsync(ArrayBuffer* audioData, float sampleRate, Pa ssOwnPtr<AudioBufferCallback> successCallback, PassOwnPtr<AudioBufferCallback> e rrorCallback) |
51 { | 63 { |
52 ASSERT(isMainThread()); | 64 ASSERT(isMainThread()); |
53 ASSERT(audioData); | 65 ASSERT(audioData); |
54 if (!audioData) | 66 if (!audioData) |
55 return; | 67 return; |
56 | 68 |
57 // Add a ref to keep audioData alive until completion of decoding. | 69 // Add a ref to keep audioData alive until completion of decoding. |
58 RefPtr<ArrayBuffer> audioDataRef(audioData); | 70 RefPtr<ArrayBuffer> audioDataRef(audioData); |
59 | 71 |
60 // The leak references to successCallback and errorCallback are picked up on notifyComplete. | 72 // The leak references to successCallback and errorCallback are picked up on notifyComplete. |
61 m_thread->postTask(new Task(WTF::bind(&AsyncAudioDecoder::decode, audioDataR ef.release().leakRef(), sampleRate, successCallback.leakPtr(), errorCallback.lea kPtr()))); | 73 m_thread->postTask(new Task(WTF::bind(&AsyncAudioDecoder::decode, audioDataR ef.release().leakRef(), sampleRate, successCallback.leakPtr(), errorCallback.lea kPtr()))); |
62 } | 74 } |
63 | 75 |
64 void AsyncAudioDecoder::decode(ArrayBuffer* audioData, float sampleRate, AudioBu fferCallback* successCallback, AudioBufferCallback* errorCallback) | 76 void AsyncAudioDecoder::decode(ArrayBuffer* audioData, float sampleRate, AudioBu fferCallback* successCallback, AudioBufferCallback* errorCallback) |
65 { | 77 { |
66 // Do the actual decoding and invoke the callback. | 78 // Do the actual decoding and invoke the callback. |
67 RefPtr<AudioBuffer> audioBuffer = AudioBuffer::createFromAudioFileData(audio Data->data(), audioData->byteLength(), false, sampleRate); | 79 RefPtrWillBeRawPtr<AudioBuffer> audioBuffer = AudioBuffer::createFromAudioFi leData(audioData->data(), audioData->byteLength(), false, sampleRate); |
68 | 80 |
69 // Decoding is finished, but we need to do the callbacks on the main thread. | 81 // Decoding is finished, but we need to do the callbacks on the main thread. |
70 // The leaked reference to audioBuffer is picked up in notifyComplete. | 82 // The leaked reference to audioBuffer is picked up in notifyComplete. |
71 callOnMainThread(WTF::bind(&AsyncAudioDecoder::notifyComplete, audioData, su ccessCallback, errorCallback, audioBuffer.release().leakRef())); | 83 callOnMainThread(WTF::bind(&AsyncAudioDecoder::notifyComplete, audioData, su ccessCallback, errorCallback, audioBuffer.release().leakRef())); |
72 } | 84 } |
73 | 85 |
74 void AsyncAudioDecoder::notifyComplete(ArrayBuffer* audioData, AudioBufferCallba ck* successCallback, AudioBufferCallback* errorCallback, AudioBuffer* audioBuffe r) | 86 void AsyncAudioDecoder::notifyComplete(ArrayBuffer* audioData, AudioBufferCallba ck* successCallback, AudioBufferCallback* errorCallback, AudioBuffer* audioBuffe r) |
75 { | 87 { |
76 // Adopt references, so everything gets correctly dereffed. | 88 // Adopt references, so everything gets correctly dereffed. |
77 RefPtr<ArrayBuffer> audioDataRef = adoptRef(audioData); | 89 RefPtr<ArrayBuffer> audioDataRef = adoptRef(audioData); |
78 OwnPtr<AudioBufferCallback> successCallbackPtr = adoptPtr(successCallback); | 90 OwnPtr<AudioBufferCallback> successCallbackPtr = adoptPtr(successCallback); |
79 OwnPtr<AudioBufferCallback> errorCallbackPtr = adoptPtr(errorCallback); | 91 OwnPtr<AudioBufferCallback> errorCallbackPtr = adoptPtr(errorCallback); |
80 RefPtr<AudioBuffer> audioBufferRef = adoptRef(audioBuffer); | 92 #if !ENABLE(OILPAN) |
93 RefPtrWillBeRawPtr<AudioBuffer> audioBufferRef = adoptRefWillBeNoop(audioBuf fer); | |
94 #endif | |
81 | 95 |
82 if (audioBuffer && successCallback) | 96 if (audioBuffer && successCallback) |
83 successCallback->handleEvent(audioBuffer); | 97 successCallback->handleEvent(audioBuffer); |
84 else if (errorCallback) | 98 else if (errorCallback) |
85 errorCallback->handleEvent(audioBuffer); | 99 errorCallback->handleEvent(audioBuffer); |
86 } | 100 } |
87 | 101 |
88 } // namespace WebCore | 102 } // namespace WebCore |
89 | 103 |
90 #endif // ENABLE(WEB_AUDIO) | 104 #endif // ENABLE(WEB_AUDIO) |
OLD | NEW |