| Index: media/audio/linux/alsa_output.cc | 
| diff --git a/media/audio/linux/alsa_output.cc b/media/audio/linux/alsa_output.cc | 
| index 410ed15fc0444f48cac42b0e0ae3fee4958ec936..6df30b45ae6972c766cbf4d28e8a3e9f7969ae4f 100644 | 
| --- a/media/audio/linux/alsa_output.cc | 
| +++ b/media/audio/linux/alsa_output.cc | 
| @@ -232,15 +232,18 @@ AlsaPcmOutputStream::AlsaPcmOutputStream(const std::string& device_name, | 
| bytes_per_sample_(params.bits_per_sample / 8), | 
| bytes_per_frame_(channels_ * params.bits_per_sample / 8), | 
| should_downmix_(false), | 
| -      latency_micros_(0), | 
| -      micros_per_packet_(0), | 
| +      packet_size_(params.GetPacketSize()), | 
| +      micros_per_packet_(FramesToMicros( | 
| +          params.samples_per_packet, sample_rate_)), | 
| +      latency_micros_(std::max(AlsaPcmOutputStream::kMinLatencyMicros, | 
| +                               micros_per_packet_ * 2)), | 
| bytes_per_output_frame_(bytes_per_frame_), | 
| alsa_buffer_frames_(0), | 
| stop_stream_(false), | 
| wrapper_(wrapper), | 
| manager_(manager), | 
| playback_handle_(NULL), | 
| -      frames_per_packet_(0), | 
| +      frames_per_packet_(packet_size_ / bytes_per_frame_), | 
| client_thread_loop_(MessageLoop::current()), | 
| message_loop_(message_loop) { | 
|  | 
| @@ -271,13 +274,9 @@ AlsaPcmOutputStream::~AlsaPcmOutputStream() { | 
| // where the stream is not always stopped and closed, causing this to fail. | 
| } | 
|  | 
| -bool AlsaPcmOutputStream::Open(uint32 packet_size) { | 
| +bool AlsaPcmOutputStream::Open() { | 
| DCHECK_EQ(MessageLoop::current(), client_thread_loop_); | 
|  | 
| -  DCHECK_EQ(0U, packet_size % bytes_per_frame_) | 
| -      << "Buffers should end on a frame boundary. Frame size: " | 
| -      << bytes_per_frame_; | 
| - | 
| if (shared_data_.state() == kInError) { | 
| return false; | 
| } | 
| @@ -294,7 +293,7 @@ bool AlsaPcmOutputStream::Open(uint32 packet_size) { | 
| shared_data_.TransitionTo(kIsOpened); | 
| message_loop_->PostTask( | 
| FROM_HERE, | 
| -      NewRunnableMethod(this, &AlsaPcmOutputStream::OpenTask, packet_size)); | 
| +      NewRunnableMethod(this, &AlsaPcmOutputStream::OpenTask)); | 
|  | 
| return true; | 
| } | 
| @@ -308,10 +307,6 @@ void AlsaPcmOutputStream::Close() { | 
| NOTREACHED() << "Unable to transition Closed."; | 
| } | 
|  | 
| -  // Signal our successful close, and disassociate the source callback. | 
| -  shared_data_.OnClose(this); | 
| -  shared_data_.set_source_callback(NULL); | 
| - | 
| message_loop_->PostTask( | 
| FROM_HERE, | 
| NewRunnableMethod(this, &AlsaPcmOutputStream::CloseTask)); | 
| @@ -340,6 +335,9 @@ void AlsaPcmOutputStream::Start(AudioSourceCallback* callback) { | 
| void AlsaPcmOutputStream::Stop() { | 
| DCHECK_EQ(MessageLoop::current(), client_thread_loop_); | 
|  | 
| +  // Reset the callback, so that it is not called anymore. | 
| +  shared_data_.set_source_callback(NULL); | 
| + | 
| shared_data_.TransitionTo(kIsStopped); | 
| } | 
|  | 
| @@ -355,18 +353,10 @@ void AlsaPcmOutputStream::GetVolume(double* volume) { | 
| *volume = shared_data_.volume(); | 
| } | 
|  | 
| -void AlsaPcmOutputStream::OpenTask(uint32 packet_size) { | 
| +void AlsaPcmOutputStream::OpenTask() { | 
| DCHECK_EQ(message_loop_, MessageLoop::current()); | 
|  | 
| -  // Initialize the configuration variables. | 
| -  packet_size_ = packet_size; | 
| -  frames_per_packet_ = packet_size_ / bytes_per_frame_; | 
| - | 
| // Try to open the device. | 
| -  micros_per_packet_ = | 
| -      FramesToMicros(packet_size / bytes_per_frame_, sample_rate_); | 
| -  latency_micros_ = std::max(AlsaPcmOutputStream::kMinLatencyMicros, | 
| -                             micros_per_packet_ * 2); | 
| if (requested_device_name_ == kAutoSelectDevice) { | 
| playback_handle_ = AutoSelectDevice(latency_micros_); | 
| if (playback_handle_) | 
| @@ -920,13 +910,6 @@ uint32 AlsaPcmOutputStream::SharedData::OnMoreData( | 
| return 0; | 
| } | 
|  | 
| -void AlsaPcmOutputStream::SharedData::OnClose(AudioOutputStream* stream) { | 
| -  AutoLock l(lock_); | 
| -  if (source_callback_) { | 
| -    source_callback_->OnClose(stream); | 
| -  } | 
| -} | 
| - | 
| void AlsaPcmOutputStream::SharedData::OnError(AudioOutputStream* stream, | 
| int code) { | 
| AutoLock l(lock_); | 
|  |