fake_audio_renderer_sink.cc 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. // Copyright 2013 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/base/fake_audio_renderer_sink.h"
  5. #include "base/bind.h"
  6. #include "base/location.h"
  7. #include "base/logging.h"
  8. #include "base/threading/sequenced_task_runner_handle.h"
  9. namespace media {
  10. FakeAudioRendererSink::FakeAudioRendererSink()
  11. : FakeAudioRendererSink(
  12. AudioParameters(AudioParameters::AUDIO_FAKE,
  13. CHANNEL_LAYOUT_STEREO,
  14. AudioParameters::kTelephoneSampleRate,
  15. 1)) {}
  16. FakeAudioRendererSink::FakeAudioRendererSink(
  17. const AudioParameters& hardware_params)
  18. : state_(kUninitialized),
  19. callback_(nullptr),
  20. output_device_info_(std::string(),
  21. OUTPUT_DEVICE_STATUS_OK,
  22. hardware_params),
  23. is_optimized_for_hw_params_(true) {}
  24. FakeAudioRendererSink::~FakeAudioRendererSink() {
  25. DCHECK(!callback_);
  26. }
  27. void FakeAudioRendererSink::Initialize(const AudioParameters& params,
  28. RenderCallback* callback) {
  29. DCHECK(state_ == kUninitialized || state_ == kStopped);
  30. DCHECK(!callback_);
  31. DCHECK(callback);
  32. callback_ = callback;
  33. ChangeState(kInitialized);
  34. }
  35. void FakeAudioRendererSink::Start() {
  36. DCHECK_EQ(state_, kInitialized);
  37. ChangeState(kStarted);
  38. }
  39. void FakeAudioRendererSink::Stop() {
  40. callback_ = nullptr;
  41. ChangeState(kStopped);
  42. }
  43. void FakeAudioRendererSink::Flush() {
  44. DCHECK_NE(state_, kPlaying);
  45. }
  46. void FakeAudioRendererSink::Pause() {
  47. DCHECK(state_ == kStarted || state_ == kPlaying) << "state_ " << state_;
  48. ChangeState(kPaused);
  49. }
  50. void FakeAudioRendererSink::Play() {
  51. DCHECK(state_ == kStarted || state_ == kPaused) << "state_ " << state_;
  52. ChangeState(kPlaying);
  53. }
  54. bool FakeAudioRendererSink::SetVolume(double volume) {
  55. return true;
  56. }
  57. OutputDeviceInfo FakeAudioRendererSink::GetOutputDeviceInfo() {
  58. return output_device_info_;
  59. }
  60. void FakeAudioRendererSink::GetOutputDeviceInfoAsync(
  61. OutputDeviceInfoCB info_cb) {
  62. base::SequencedTaskRunnerHandle::Get()->PostTask(
  63. FROM_HERE, base::BindOnce(std::move(info_cb), output_device_info_));
  64. }
  65. bool FakeAudioRendererSink::IsOptimizedForHardwareParameters() {
  66. return is_optimized_for_hw_params_;
  67. }
  68. bool FakeAudioRendererSink::CurrentThreadIsRenderingThread() {
  69. NOTIMPLEMENTED();
  70. return false;
  71. }
  72. bool FakeAudioRendererSink::Render(AudioBus* dest,
  73. base::TimeDelta delay,
  74. int* frames_written) {
  75. if (state_ != kPlaying)
  76. return false;
  77. *frames_written = callback_->Render(delay, base::TimeTicks::Now(), 0, dest);
  78. return true;
  79. }
  80. void FakeAudioRendererSink::OnRenderError() {
  81. DCHECK_NE(state_, kUninitialized);
  82. DCHECK_NE(state_, kStopped);
  83. callback_->OnRenderError();
  84. }
  85. void FakeAudioRendererSink::SetIsOptimizedForHardwareParameters(bool value) {
  86. is_optimized_for_hw_params_ = value;
  87. }
  88. void FakeAudioRendererSink::ChangeState(State new_state) {
  89. static const char* kStateNames[] = {
  90. "kUninitialized",
  91. "kInitialized",
  92. "kStarted",
  93. "kPaused",
  94. "kPlaying",
  95. "kStopped"
  96. };
  97. DVLOG(1) << __func__ << " : " << kStateNames[state_] << " -> "
  98. << kStateNames[new_state];
  99. state_ = new_state;
  100. }
  101. } // namespace media