| Index: media/audio/audio_output_controller.cc
 | 
| diff --git a/media/audio/audio_output_controller.cc b/media/audio/audio_output_controller.cc
 | 
| index 69b77976df9f737f841262a2182d40b52baca5d3..efc86e4cd9a9fcd6f3947faaf29a1153a9cbd4e4 100644
 | 
| --- a/media/audio/audio_output_controller.cc
 | 
| +++ b/media/audio/audio_output_controller.cc
 | 
| @@ -24,7 +24,8 @@ const int AudioOutputController::kPollNumAttempts = 3;
 | 
|  const int AudioOutputController::kPollPauseInMilliseconds = 3;
 | 
|  
 | 
|  AudioOutputController::AudioOutputController(EventHandler* handler,
 | 
| -                                             SyncReader* sync_reader)
 | 
| +                                             SyncReader* sync_reader,
 | 
| +                                             const AudioParameters& params)
 | 
|      : handler_(handler),
 | 
|        stream_(NULL),
 | 
|        volume_(1.0),
 | 
| @@ -32,6 +33,7 @@ AudioOutputController::AudioOutputController(EventHandler* handler,
 | 
|        sync_reader_(sync_reader),
 | 
|        message_loop_(NULL),
 | 
|        number_polling_attempts_left_(0),
 | 
| +      params_(params),
 | 
|        ALLOW_THIS_IN_INITIALIZER_LIST(weak_this_(this)) {
 | 
|  }
 | 
|  
 | 
| @@ -68,12 +70,12 @@ scoped_refptr<AudioOutputController> AudioOutputController::Create(
 | 
|  
 | 
|    // Starts the audio controller thread.
 | 
|    scoped_refptr<AudioOutputController> controller(new AudioOutputController(
 | 
| -      event_handler, sync_reader));
 | 
| +      event_handler, sync_reader, params));
 | 
|  
 | 
|    controller->message_loop_ = audio_manager->GetMessageLoop();
 | 
|    controller->message_loop_->PostTask(FROM_HERE, base::Bind(
 | 
|        &AudioOutputController::DoCreate, controller,
 | 
| -      base::Unretained(audio_manager), params));
 | 
| +      base::Unretained(audio_manager)));
 | 
|    return controller;
 | 
|  }
 | 
|  
 | 
| @@ -108,8 +110,7 @@ void AudioOutputController::SetVolume(double volume) {
 | 
|        &AudioOutputController::DoSetVolume, this, volume));
 | 
|  }
 | 
|  
 | 
| -void AudioOutputController::DoCreate(AudioManager* audio_manager,
 | 
| -                                     const AudioParameters& params) {
 | 
| +void AudioOutputController::DoCreate(AudioManager* audio_manager) {
 | 
|    DCHECK(message_loop_->BelongsToCurrentThread());
 | 
|  
 | 
|    // Close() can be called before DoCreate() is executed.
 | 
| @@ -118,7 +119,7 @@ void AudioOutputController::DoCreate(AudioManager* audio_manager,
 | 
|    DCHECK_EQ(kEmpty, state_);
 | 
|  
 | 
|    DoStopCloseAndClearStream(NULL);
 | 
| -  stream_ = audio_manager->MakeAudioOutputStreamProxy(params);
 | 
| +  stream_ = audio_manager->MakeAudioOutputStreamProxy(params_);
 | 
|    if (!stream_) {
 | 
|      // TODO(hclam): Define error types.
 | 
|      handler_->OnError(this, 0);
 | 
| @@ -282,9 +283,8 @@ void AudioOutputController::DoReportError(int code) {
 | 
|      handler_->OnError(this, code);
 | 
|  }
 | 
|  
 | 
| -uint32 AudioOutputController::OnMoreData(uint8* dest,
 | 
| -                                         uint32 max_size,
 | 
| -                                         AudioBuffersState buffers_state) {
 | 
| +int AudioOutputController::OnMoreData(AudioBus* audio_bus,
 | 
| +                                      AudioBuffersState buffers_state) {
 | 
|    TRACE_EVENT0("audio", "AudioOutputController::OnMoreData");
 | 
|  
 | 
|    {
 | 
| @@ -295,9 +295,10 @@ uint32 AudioOutputController::OnMoreData(uint8* dest,
 | 
|        return 0;
 | 
|      }
 | 
|    }
 | 
| -  uint32 size = sync_reader_->Read(dest, max_size);
 | 
| -  sync_reader_->UpdatePendingBytes(buffers_state.total_bytes() + size);
 | 
| -  return size;
 | 
| +  int frames = sync_reader_->Read(audio_bus);
 | 
| +  sync_reader_->UpdatePendingBytes(
 | 
| +      buffers_state.total_bytes() + frames * params_.GetBytesPerFrame());
 | 
| +  return frames;
 | 
|  }
 | 
|  
 | 
|  void AudioOutputController::WaitTillDataReady() {
 | 
| 
 |