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_); |