| 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 // THREAD SAFETY | 5 // THREAD SAFETY |
| 6 // | 6 // |
| 7 // AlsaPcmOutputStream object is *not* thread-safe and should only be used | 7 // AlsaPcmOutputStream object is *not* thread-safe and should only be used |
| 8 // from the audio thread. We DCHECK on this assumption whenever we can. | 8 // from the audio thread. We DCHECK on this assumption whenever we can. |
| 9 // | 9 // |
| 10 // SEMANTICS OF Close() | 10 // SEMANTICS OF Close() |
| (...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 288 alsa_buffer_frames_ = buffer_size; | 288 alsa_buffer_frames_ = buffer_size; |
| 289 } | 289 } |
| 290 } | 290 } |
| 291 | 291 |
| 292 return true; | 292 return true; |
| 293 } | 293 } |
| 294 | 294 |
| 295 void AlsaPcmOutputStream::Close() { | 295 void AlsaPcmOutputStream::Close() { |
| 296 DCHECK(IsOnAudioThread()); | 296 DCHECK(IsOnAudioThread()); |
| 297 | 297 |
| 298 // Sanity check that the transition occurs correctly. It is safe to | 298 if (state() != kIsClosed) |
| 299 // continue anyways because all operations for closing are idempotent. | 299 TransitionTo(kIsClosed); |
| 300 if (TransitionTo(kIsClosed) != kIsClosed) { | 300 |
| 301 NOTREACHED() << "Unable to transition Closed."; | 301 // Shutdown the audio device. |
| 302 } else { | 302 if (playback_handle_) { |
| 303 // Shutdown the audio device. | 303 if (alsa_util::CloseDevice(wrapper_, playback_handle_) < 0) { |
| 304 if (playback_handle_ && | |
| 305 alsa_util::CloseDevice(wrapper_, playback_handle_) < 0) { | |
| 306 LOG(WARNING) << "Unable to close audio device. Leaking handle."; | 304 LOG(WARNING) << "Unable to close audio device. Leaking handle."; |
| 307 } | 305 } |
| 308 playback_handle_ = NULL; | 306 playback_handle_ = NULL; |
| 309 | 307 |
| 310 // Release the buffer. | 308 // Release the buffer. |
| 311 buffer_.reset(); | 309 buffer_.reset(); |
| 312 | 310 |
| 313 // Signal anything that might already be scheduled to stop. | 311 // Signal anything that might already be scheduled to stop. |
| 314 stop_stream_ = true; // Not necessary in production, but unit tests | 312 stop_stream_ = true; // Not necessary in production, but unit tests |
| 315 // uses the flag to verify that stream was closed. | 313 // uses the flag to verify that stream was closed. |
| 316 weak_factory_.InvalidateWeakPtrs(); | 314 } |
| 317 | 315 |
| 318 // Signal to the manager that we're closed and can be removed. | 316 weak_factory_.InvalidateWeakPtrs(); |
| 319 // Should be last call in the method as it deletes "this". | 317 |
| 320 manager_->ReleaseOutputStream(this); | 318 // Signal to the manager that we're closed and can be removed. |
| 321 } | 319 // Should be last call in the method as it deletes "this". |
| 320 manager_->ReleaseOutputStream(this); |
| 322 } | 321 } |
| 323 | 322 |
| 324 void AlsaPcmOutputStream::Start(AudioSourceCallback* callback) { | 323 void AlsaPcmOutputStream::Start(AudioSourceCallback* callback) { |
| 325 DCHECK(IsOnAudioThread()); | 324 DCHECK(IsOnAudioThread()); |
| 326 | 325 |
| 327 CHECK(callback); | 326 CHECK(callback); |
| 328 | 327 |
| 329 if (stop_stream_) | 328 if (stop_stream_) |
| 330 return; | 329 return; |
| 331 | 330 |
| (...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 845 if (source_callback_) | 844 if (source_callback_) |
| 846 source_callback_->OnError(this, code); | 845 source_callback_->OnError(this, code); |
| 847 } | 846 } |
| 848 | 847 |
| 849 // Changes the AudioSourceCallback to proxy calls to. Pass in NULL to | 848 // Changes the AudioSourceCallback to proxy calls to. Pass in NULL to |
| 850 // release ownership of the currently registered callback. | 849 // release ownership of the currently registered callback. |
| 851 void AlsaPcmOutputStream::set_source_callback(AudioSourceCallback* callback) { | 850 void AlsaPcmOutputStream::set_source_callback(AudioSourceCallback* callback) { |
| 852 DCHECK(IsOnAudioThread()); | 851 DCHECK(IsOnAudioThread()); |
| 853 source_callback_ = callback; | 852 source_callback_ = callback; |
| 854 } | 853 } |
| OLD | NEW |