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 "content/renderer/media/webrtc_audio_renderer.h" | 5 #include "content/renderer/media/webrtc_audio_renderer.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
9 #include "base/strings/string_util.h" | 9 #include "base/strings/string_util.h" |
10 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
(...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
415 | 415 |
416 DCHECK_EQ(state_, PLAYING); | 416 DCHECK_EQ(state_, PLAYING); |
417 DCHECK_GT(play_ref_count_, 0); | 417 DCHECK_GT(play_ref_count_, 0); |
418 if (!--play_ref_count_) | 418 if (!--play_ref_count_) |
419 state_ = PAUSED; | 419 state_ = PAUSED; |
420 } | 420 } |
421 | 421 |
422 void WebRtcAudioRenderer::Stop() { | 422 void WebRtcAudioRenderer::Stop() { |
423 DVLOG(1) << "WebRtcAudioRenderer::Stop()"; | 423 DVLOG(1) << "WebRtcAudioRenderer::Stop()"; |
424 DCHECK(thread_checker_.CalledOnValidThread()); | 424 DCHECK(thread_checker_.CalledOnValidThread()); |
| 425 // Make sure to stop the sink while _not_ holding the lock since the Render() |
| 426 // callback may currently be executing and try to grab the lock while we're |
| 427 // stopping the thread on which it runs. |
| 428 // Stop the sink before calling RemoveAudioRenderer() to make sure that no |
| 429 // more callbacks will be made while the renderer is being removed. |
| 430 sink_->Stop(); |
| 431 |
425 { | 432 { |
426 base::AutoLock auto_lock(lock_); | 433 base::AutoLock auto_lock(lock_); |
427 if (state_ == UNINITIALIZED) | 434 if (state_ == UNINITIALIZED) |
428 return; | 435 return; |
429 | 436 |
430 if (--start_ref_count_) | 437 if (--start_ref_count_) |
431 return; | 438 return; |
432 | 439 |
433 DVLOG(1) << "Calling RemoveAudioRenderer and Stop()."; | 440 DVLOG(1) << "Calling RemoveAudioRenderer and Stop()."; |
434 | 441 |
435 source_->RemoveAudioRenderer(this); | 442 source_->RemoveAudioRenderer(this); |
436 source_ = NULL; | 443 source_ = NULL; |
437 state_ = UNINITIALIZED; | 444 state_ = UNINITIALIZED; |
438 } | 445 } |
439 | |
440 // Make sure to stop the sink while _not_ holding the lock since the Render() | |
441 // callback may currently be executing and try to grab the lock while we're | |
442 // stopping the thread on which it runs. | |
443 sink_->Stop(); | |
444 } | 446 } |
445 | 447 |
446 void WebRtcAudioRenderer::SetVolume(float volume) { | 448 void WebRtcAudioRenderer::SetVolume(float volume) { |
447 DCHECK(thread_checker_.CalledOnValidThread()); | 449 DCHECK(thread_checker_.CalledOnValidThread()); |
448 DCHECK(volume >= 0.0f && volume <= 1.0f); | 450 DCHECK(volume >= 0.0f && volume <= 1.0f); |
449 | 451 |
450 playing_state_.set_volume(volume); | 452 playing_state_.set_volume(volume); |
451 OnPlayStateChanged(media_stream_, &playing_state_); | 453 OnPlayStateChanged(media_stream_, &playing_state_); |
452 } | 454 } |
453 | 455 |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
583 if (RemovePlayingState(source, state)) | 585 if (RemovePlayingState(source, state)) |
584 EnterPauseState(); | 586 EnterPauseState(); |
585 } else if (AddPlayingState(source, state)) { | 587 } else if (AddPlayingState(source, state)) { |
586 EnterPlayState(); | 588 EnterPlayState(); |
587 } | 589 } |
588 UpdateSourceVolume(source); | 590 UpdateSourceVolume(source); |
589 } | 591 } |
590 } | 592 } |
591 | 593 |
592 } // namespace content | 594 } // namespace content |
OLD | NEW |