OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/audio/linux/alsa_input.h" | 5 #include "media/audio/linux/alsa_input.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 HandleError("PcmStart", error); | 112 HandleError("PcmStart", error); |
113 } | 113 } |
114 | 114 |
115 if (error < 0) { | 115 if (error < 0) { |
116 callback_ = NULL; | 116 callback_ = NULL; |
117 } else { | 117 } else { |
118 // We start reading data half |buffer_duration_| later than when the | 118 // We start reading data half |buffer_duration_| later than when the |
119 // buffer might have got filled, to accommodate some delays in the audio | 119 // buffer might have got filled, to accommodate some delays in the audio |
120 // driver. This could also give us a smooth read sequence going forward. | 120 // driver. This could also give us a smooth read sequence going forward. |
121 base::TimeDelta delay = buffer_duration_ + buffer_duration_ / 2; | 121 base::TimeDelta delay = buffer_duration_ + buffer_duration_ / 2; |
122 next_read_time_ = base::Time::Now() + delay; | 122 next_read_time_ = base::TimeTicks::Now() + delay; |
123 base::MessageLoop::current()->PostDelayedTask( | 123 base::MessageLoop::current()->PostDelayedTask( |
124 FROM_HERE, | 124 FROM_HERE, |
125 base::Bind(&AlsaPcmInputStream::ReadAudio, weak_factory_.GetWeakPtr()), | 125 base::Bind(&AlsaPcmInputStream::ReadAudio, weak_factory_.GetWeakPtr()), |
126 delay); | 126 delay); |
127 } | 127 } |
128 } | 128 } |
129 | 129 |
130 bool AlsaPcmInputStream::Recover(int original_error) { | 130 bool AlsaPcmInputStream::Recover(int original_error) { |
131 int error = wrapper_->PcmRecover(device_handle_, original_error, 1); | 131 int error = wrapper_->PcmRecover(device_handle_, original_error, 1); |
132 if (error < 0) { | 132 if (error < 0) { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
175 LOG(WARNING) << "PcmAvailUpdate(): " << wrapper_->StrError(frames); | 175 LOG(WARNING) << "PcmAvailUpdate(): " << wrapper_->StrError(frames); |
176 Recover(frames); | 176 Recover(frames); |
177 } | 177 } |
178 | 178 |
179 if (frames < params_.frames_per_buffer()) { | 179 if (frames < params_.frames_per_buffer()) { |
180 // Not enough data yet or error happened. In both cases wait for a very | 180 // Not enough data yet or error happened. In both cases wait for a very |
181 // small duration before checking again. | 181 // small duration before checking again. |
182 // Even Though read callback was behind schedule, there is no data, so | 182 // Even Though read callback was behind schedule, there is no data, so |
183 // reset the next_read_time_. | 183 // reset the next_read_time_. |
184 if (read_callback_behind_schedule_) { | 184 if (read_callback_behind_schedule_) { |
185 next_read_time_ = base::Time::Now(); | 185 next_read_time_ = base::TimeTicks::Now(); |
186 read_callback_behind_schedule_ = false; | 186 read_callback_behind_schedule_ = false; |
187 } | 187 } |
188 | 188 |
189 base::TimeDelta next_check_time = buffer_duration_ / 2; | 189 base::TimeDelta next_check_time = buffer_duration_ / 2; |
190 base::MessageLoop::current()->PostDelayedTask( | 190 base::MessageLoop::current()->PostDelayedTask( |
191 FROM_HERE, | 191 FROM_HERE, |
192 base::Bind(&AlsaPcmInputStream::ReadAudio, weak_factory_.GetWeakPtr()), | 192 base::Bind(&AlsaPcmInputStream::ReadAudio, weak_factory_.GetWeakPtr()), |
193 next_check_time); | 193 next_check_time); |
194 return; | 194 return; |
195 } | 195 } |
(...skipping 15 matching lines...) Expand all Loading... |
211 callback_->OnData(this, audio_buffer_.get(), bytes_per_buffer_, | 211 callback_->OnData(this, audio_buffer_.get(), bytes_per_buffer_, |
212 hardware_delay_bytes, normalized_volume); | 212 hardware_delay_bytes, normalized_volume); |
213 } else { | 213 } else { |
214 LOG(WARNING) << "PcmReadi returning less than expected frames: " | 214 LOG(WARNING) << "PcmReadi returning less than expected frames: " |
215 << frames_read << " vs. " << params_.frames_per_buffer() | 215 << frames_read << " vs. " << params_.frames_per_buffer() |
216 << ". Dropping this buffer."; | 216 << ". Dropping this buffer."; |
217 } | 217 } |
218 } | 218 } |
219 | 219 |
220 next_read_time_ += buffer_duration_; | 220 next_read_time_ += buffer_duration_; |
221 base::TimeDelta delay = next_read_time_ - base::Time::Now(); | 221 base::TimeDelta delay = next_read_time_ - base::TimeTicks::Now(); |
222 if (delay < base::TimeDelta()) { | 222 if (delay < base::TimeDelta()) { |
223 DVLOG(1) << "Audio read callback behind schedule by " | 223 DVLOG(1) << "Audio read callback behind schedule by " |
224 << (buffer_duration_ - delay).InMicroseconds() | 224 << (buffer_duration_ - delay).InMicroseconds() |
225 << " (us)."; | 225 << " (us)."; |
226 // Read callback is behind schedule. Assuming there is data pending in | 226 // Read callback is behind schedule. Assuming there is data pending in |
227 // the soundcard, invoke the read callback immediate in order to catch up. | 227 // the soundcard, invoke the read callback immediate in order to catch up. |
228 read_callback_behind_schedule_ = true; | 228 read_callback_behind_schedule_ = true; |
229 delay = base::TimeDelta(); | 229 delay = base::TimeDelta(); |
230 } | 230 } |
231 | 231 |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
331 | 331 |
332 return static_cast<double>(current_volume); | 332 return static_cast<double>(current_volume); |
333 } | 333 } |
334 | 334 |
335 void AlsaPcmInputStream::HandleError(const char* method, int error) { | 335 void AlsaPcmInputStream::HandleError(const char* method, int error) { |
336 LOG(WARNING) << method << ": " << wrapper_->StrError(error); | 336 LOG(WARNING) << method << ": " << wrapper_->StrError(error); |
337 callback_->OnError(this); | 337 callback_->OnError(this); |
338 } | 338 } |
339 | 339 |
340 } // namespace media | 340 } // namespace media |
OLD | NEW |