Index: chrome/renderer/pepper_plugin_delegate_impl.cc |
=================================================================== |
--- chrome/renderer/pepper_plugin_delegate_impl.cc (revision 66651) |
+++ chrome/renderer/pepper_plugin_delegate_impl.cc (working copy) |
@@ -123,10 +123,12 @@ |
class PlatformAudioImpl |
: public pepper::PluginDelegate::PlatformAudio, |
- public AudioMessageFilter::Delegate { |
+ public AudioMessageFilter::Delegate, |
+ public base::RefCountedThreadSafe<PlatformAudioImpl> { |
public: |
explicit PlatformAudioImpl(scoped_refptr<AudioMessageFilter> filter) |
- : client_(NULL), filter_(filter), stream_id_(0) { |
+ : client_(NULL), filter_(filter), stream_id_(0), |
+ main_message_loop_(MessageLoop::current()) { |
DCHECK(filter_); |
} |
@@ -177,6 +179,8 @@ |
// Our ID on the MessageFilter. |
int32 stream_id_; |
+ MessageLoop* main_message_loop_; |
+ |
DISALLOW_COPY_AND_ASSIGN(PlatformAudioImpl); |
}; |
@@ -281,6 +285,8 @@ |
params.params.samples_per_packet = sample_count; |
stream_id_ = filter_->AddDelegate(this); |
+ AddRef(); // Take a reference for the filter. |
+ |
return filter_->Send(new ViewHostMsg_CreateAudioStream(0, stream_id_, params, |
true)); |
} |
@@ -297,7 +303,15 @@ |
#endif |
DCHECK(length); |
- client_->StreamCreated(handle, length, socket_handle); |
+ if (MessageLoop::current() == main_message_loop_) { |
+ if (client_) { |
+ client_->StreamCreated(handle, length, socket_handle); |
+ } |
+ } else { |
+ main_message_loop_->PostTask(FROM_HERE, |
+ NewRunnableMethod(this, &PlatformAudioImpl::OnLowLatencyCreated, |
+ handle, socket_handle, length)); |
+ } |
} |
void PlatformAudioImpl::ShutDown() { |
@@ -307,8 +321,14 @@ |
} |
filter_->Send(new ViewHostMsg_CloseAudioStream(0, stream_id_)); |
filter_->RemoveDelegate(stream_id_); |
+ // Release reference taken for the filter on the IO thread so that |
+ // we avoid race problems with OnLowLatencyCreated. |
+ filter_->message_loop()->ReleaseSoon(FROM_HERE, this); |
brettw
2010/11/23 07:10:19
I'm confused about this since it looks like you're
nfullagar
2010/11/23 21:51:17
After talking with Darin, we removed one AddRef an
|
+ |
stream_id_ = 0; |
client_ = NULL; |
+ |
+ Release(); // May end up deleting ourselves. |
} |
// Implements the VideoDecoder. |
@@ -560,7 +580,7 @@ |
pepper::PluginDelegate::PlatformAudio* PepperPluginDelegateImpl::CreateAudio( |
uint32_t sample_rate, uint32_t sample_count, |
pepper::PluginDelegate::PlatformAudio::Client* client) { |
- scoped_ptr<PlatformAudioImpl> audio( |
+ scoped_refptr<PlatformAudioImpl> audio( |
new PlatformAudioImpl(render_view_->audio_message_filter())); |
if (audio->Initialize(sample_rate, sample_count, client)) { |
return audio.release(); |