| 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 | 
|  |