| 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/win/audio_low_latency_output_win.h" | 5 #include "media/audio/win/audio_low_latency_output_win.h" |
| 6 | 6 |
| 7 #include <Functiondiscoverykeys_devpkey.h> | 7 #include <Functiondiscoverykeys_devpkey.h> |
| 8 | 8 |
| 9 #include <climits> | 9 #include <climits> |
| 10 | 10 |
| (...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 } | 274 } |
| 275 } | 275 } |
| 276 num_written_frames_ = endpoint_buffer_size_frames_; | 276 num_written_frames_ = endpoint_buffer_size_frames_; |
| 277 | 277 |
| 278 // Create and start the thread that will drive the rendering by waiting for | 278 // Create and start the thread that will drive the rendering by waiting for |
| 279 // render events. | 279 // render events. |
| 280 render_thread_.reset(new base::DelegateSimpleThread( | 280 render_thread_.reset(new base::DelegateSimpleThread( |
| 281 this, "wasapi_render_thread", | 281 this, "wasapi_render_thread", |
| 282 base::SimpleThread::Options(base::ThreadPriority::REALTIME_AUDIO))); | 282 base::SimpleThread::Options(base::ThreadPriority::REALTIME_AUDIO))); |
| 283 render_thread_->Start(); | 283 render_thread_->Start(); |
| 284 if (!render_thread_->HasBeenStarted()) { | |
| 285 LOG(ERROR) << "Failed to start WASAPI render thread."; | |
| 286 StopThread(); | |
| 287 callback->OnError(this); | |
| 288 return; | |
| 289 } | |
| 290 | 284 |
| 291 // Start streaming data between the endpoint buffer and the audio engine. | 285 // Start streaming data between the endpoint buffer and the audio engine. |
| 292 HRESULT hr = audio_client_->Start(); | 286 HRESULT hr = audio_client_->Start(); |
| 293 if (FAILED(hr)) { | 287 if (FAILED(hr)) { |
| 294 PLOG(ERROR) << "Failed to start output streaming: " << std::hex << hr; | 288 PLOG(ERROR) << "Failed to start output streaming: " << std::hex << hr; |
| 295 StopThread(); | 289 StopThread(); |
| 296 callback->OnError(this); | 290 callback->OnError(this); |
| 297 } | 291 } |
| 298 } | 292 } |
| 299 | 293 |
| (...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 627 return hr; | 621 return hr; |
| 628 } | 622 } |
| 629 | 623 |
| 630 *endpoint_buffer_size = buffer_size_in_frames; | 624 *endpoint_buffer_size = buffer_size_in_frames; |
| 631 DVLOG(2) << "endpoint buffer size: " << buffer_size_in_frames; | 625 DVLOG(2) << "endpoint buffer size: " << buffer_size_in_frames; |
| 632 return hr; | 626 return hr; |
| 633 } | 627 } |
| 634 | 628 |
| 635 void WASAPIAudioOutputStream::StopThread() { | 629 void WASAPIAudioOutputStream::StopThread() { |
| 636 if (render_thread_) { | 630 if (render_thread_) { |
| 637 if (render_thread_->HasBeenStarted()) { | 631 // Wait until the thread completes and perform cleanup. |
| 638 // Wait until the thread completes and perform cleanup. | 632 SetEvent(stop_render_event_.Get()); |
| 639 SetEvent(stop_render_event_.Get()); | 633 render_thread_->Join(); |
| 640 render_thread_->Join(); | |
| 641 } | |
| 642 | 634 |
| 643 render_thread_.reset(); | 635 render_thread_.reset(); |
| 644 | 636 |
| 645 // Ensure that we don't quit the main thread loop immediately next | 637 // Ensure that we don't quit the main thread loop immediately next |
| 646 // time Start() is called. | 638 // time Start() is called. |
| 647 ResetEvent(stop_render_event_.Get()); | 639 ResetEvent(stop_render_event_.Get()); |
| 648 } | 640 } |
| 649 | 641 |
| 650 source_ = NULL; | 642 source_ = NULL; |
| 651 } | 643 } |
| 652 | 644 |
| 653 } // namespace media | 645 } // namespace media |
| OLD | NEW |