Index: media/audio/audio_manager_base.cc |
=================================================================== |
--- media/audio/audio_manager_base.cc (revision 240452) |
+++ media/audio/audio_manager_base.cc (working copy) |
@@ -434,4 +434,32 @@ |
return 0; |
} |
+void AudioManagerBase::FixWedgedAudio() { |
+ DCHECK(message_loop_->BelongsToCurrentThread()); |
+#if defined(OS_MACOSX) |
+ // Through trial and error, we've found that one way to restore audio after a |
+ // hang is to close all outstanding audio streams. Once all streams have been |
+ // closed, new streams appear to work correctly. |
+ // |
+ // In Chrome terms, this means we need to ask all AudioOutputDispatchers to |
+ // close all Open()'d streams. Once all streams across all dispatchers have |
+ // been closed, we ask for all previously Start()'d streams to be recreated |
+ // using the same AudioSourceCallback they had before. |
+ // |
+ // Since this operation takes place on the audio thread we can be sure that no |
+ // other state-changing stream operations will take place while the fix is in |
+ // progress. |
+ // |
+ // See http://crbug.com/160920 for additional details. |
+ for (AudioOutputDispatchers::iterator it = output_dispatchers_.begin(); |
+ it != output_dispatchers_.end(); ++it) { |
+ (*it)->dispatcher->CloseStreamsForWedgeFix(); |
+ } |
+ for (AudioOutputDispatchers::iterator it = output_dispatchers_.begin(); |
+ it != output_dispatchers_.end(); ++it) { |
+ (*it)->dispatcher->RestartStreamsForWedgeFix(); |
+ } |
+#endif |
+} |
+ |
} // namespace media |