audio_output_proxy.cc 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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
  3. // found in the LICENSE file.
  4. #include "media/audio/audio_output_proxy.h"
  5. #include "base/check_op.h"
  6. #include "media/audio/audio_manager.h"
  7. #include "media/audio/audio_output_dispatcher.h"
  8. namespace media {
  9. AudioOutputProxy::AudioOutputProxy(
  10. base::WeakPtr<AudioOutputDispatcher> dispatcher)
  11. : dispatcher_(std::move(dispatcher)), state_(kCreated), volume_(1.0) {
  12. DCHECK(dispatcher_);
  13. }
  14. AudioOutputProxy::~AudioOutputProxy() {
  15. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  16. DCHECK(state_ == kCreated || state_ == kClosed) << "State is: " << state_;
  17. }
  18. bool AudioOutputProxy::Open() {
  19. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  20. DCHECK_EQ(state_, kCreated);
  21. if (!dispatcher_ || !dispatcher_->OpenStream()) {
  22. state_ = kOpenError;
  23. return false;
  24. }
  25. state_ = kOpened;
  26. return true;
  27. }
  28. void AudioOutputProxy::Start(AudioSourceCallback* callback) {
  29. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  30. // We need to support both states since the callback may not handle OnError()
  31. // immediately (or at all). It's also possible for subsequent StartStream()
  32. // calls to succeed after failing, so we allow it to be called again.
  33. DCHECK(state_ == kOpened || state_ == kStartError);
  34. if (!dispatcher_ || !dispatcher_->StartStream(callback, this)) {
  35. state_ = kStartError;
  36. callback->OnError(AudioSourceCallback::ErrorType::kUnknown);
  37. return;
  38. }
  39. state_ = kPlaying;
  40. }
  41. void AudioOutputProxy::Stop() {
  42. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  43. if (state_ != kPlaying)
  44. return;
  45. if (dispatcher_)
  46. dispatcher_->StopStream(this);
  47. state_ = kOpened;
  48. }
  49. void AudioOutputProxy::SetVolume(double volume) {
  50. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  51. volume_ = volume;
  52. if (dispatcher_)
  53. dispatcher_->StreamVolumeSet(this, volume);
  54. }
  55. void AudioOutputProxy::GetVolume(double* volume) {
  56. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  57. *volume = volume_;
  58. }
  59. void AudioOutputProxy::Close() {
  60. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  61. DCHECK(state_ == kCreated || state_ == kOpenError || state_ == kOpened ||
  62. state_ == kStartError);
  63. // kStartError means OpenStream() succeeded and the stream must be closed
  64. // before destruction.
  65. if (state_ != kCreated && state_ != kOpenError && dispatcher_)
  66. dispatcher_->CloseStream(this);
  67. state_ = kClosed;
  68. // Delete the object now like is done in the Close() implementation of
  69. // physical stream objects. If we delete the object via DeleteSoon, we
  70. // unnecessarily complicate the Shutdown procedure of the
  71. // dispatcher+audio manager.
  72. delete this;
  73. }
  74. void AudioOutputProxy::Flush() {
  75. DCHECK(state_ != kPlaying);
  76. if (dispatcher_)
  77. dispatcher_->FlushStream(this);
  78. }
  79. } // namespace media