fake_audio_consumer.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. // Copyright 2020 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. #ifndef MEDIA_FUCHSIA_AUDIO_FAKE_AUDIO_CONSUMER_H_
  5. #define MEDIA_FUCHSIA_AUDIO_FAKE_AUDIO_CONSUMER_H_
  6. #include <fuchsia/media/audio/cpp/fidl.h>
  7. #include <fuchsia/media/audio/cpp/fidl_test_base.h>
  8. #include <fuchsia/media/cpp/fidl.h>
  9. #include <fuchsia/media/cpp/fidl_test_base.h>
  10. #include <lib/fidl/cpp/binding.h>
  11. #include <list>
  12. #include <vector>
  13. #include "base/fuchsia/scoped_service_binding.h"
  14. #include "base/time/time.h"
  15. #include "base/timer/timer.h"
  16. namespace vfs {
  17. class PseudoDir;
  18. } // namespace vfs
  19. namespace media {
  20. // Fake implementation of fuchsia::media::AudioConsumer interface. Used for
  21. // tests.
  22. class FakeAudioConsumer final
  23. : public fuchsia::media::testing::AudioConsumer_TestBase,
  24. public fuchsia::media::testing::StreamSink_TestBase,
  25. public fuchsia::media::audio::testing::VolumeControl_TestBase {
  26. public:
  27. // Lead time range returned from WatchStatus().
  28. static const base::TimeDelta kMinLeadTime;
  29. static const base::TimeDelta kMaxLeadTime;
  30. FakeAudioConsumer(
  31. uint64_t session_id,
  32. fidl::InterfaceRequest<fuchsia::media::AudioConsumer> request);
  33. ~FakeAudioConsumer() override;
  34. FakeAudioConsumer(const FakeAudioConsumer&) = delete;
  35. FakeAudioConsumer& operator=(const FakeAudioConsumer&) = delete;
  36. uint64_t session_id() { return session_id_; }
  37. float volume() const { return volume_; }
  38. bool is_muted() const { return is_muted_; }
  39. base::TimeDelta GetMediaPosition();
  40. private:
  41. enum class State {
  42. kStopped,
  43. kPlaying,
  44. kEndOfStream,
  45. };
  46. struct Packet {
  47. base::TimeDelta pts;
  48. bool is_eos = false;
  49. };
  50. // fuchsia::media::AudioConsumer interface;
  51. void CreateStreamSink(
  52. std::vector<zx::vmo> buffers,
  53. fuchsia::media::AudioStreamType stream_type,
  54. std::unique_ptr<fuchsia::media::Compression> compression,
  55. fidl::InterfaceRequest<fuchsia::media::StreamSink> stream_sink_request)
  56. final;
  57. void Start(fuchsia::media::AudioConsumerStartFlags flags,
  58. int64_t reference_time,
  59. int64_t media_time) override;
  60. void Stop() override;
  61. void WatchStatus(WatchStatusCallback callback) override;
  62. void SetRate(float rate) override;
  63. void BindVolumeControl(
  64. fidl::InterfaceRequest<fuchsia::media::audio::VolumeControl>
  65. volume_control_request) override;
  66. // fuchsia::media::StreamSink interface.
  67. void SendPacket(fuchsia::media::StreamPacket packet,
  68. SendPacketCallback callback) override;
  69. void SendPacketNoReply(fuchsia::media::StreamPacket packet) override;
  70. void EndOfStream() override;
  71. void DiscardAllPackets(DiscardAllPacketsCallback callback) override;
  72. void DiscardAllPacketsNoReply() override;
  73. // fuchsia::media::audio::VolumeControl interface.
  74. void SetVolume(float volume) override;
  75. void SetMute(bool mute) override;
  76. // Not-implemented handler for _TestBase parents.
  77. void NotImplemented_(const std::string& name) override;
  78. void ScheduleNextStreamPosUpdate();
  79. // Updates stream position and drops old packets from the stream.
  80. void UpdateStreamPos();
  81. void OnStatusUpdate();
  82. void CallStatusCallback();
  83. const uint64_t session_id_;
  84. fidl::Binding<fuchsia::media::AudioConsumer> audio_consumer_binding_;
  85. fidl::Binding<fuchsia::media::StreamSink> stream_sink_binding_;
  86. fidl::Binding<fuchsia::media::audio::VolumeControl> volume_control_binding_;
  87. size_t num_buffers_ = 0;
  88. State state_ = State::kStopped;
  89. bool have_status_update_ = true;
  90. WatchStatusCallback status_callback_;
  91. base::TimeTicks reference_time_;
  92. // Numerator and denumerator for current playback rate.
  93. uint32_t media_delta_ = 1;
  94. uint32_t reference_delta_ = 1;
  95. // Last known media position. Min value indicates that the stream position
  96. // hasn't been set. If stream is playing then value corresponds to
  97. // |reference_time_|.
  98. base::TimeDelta media_pos_ = base::TimeDelta::Min();
  99. std::list<Packet> pending_packets_;
  100. // Timer to call UpdateStreamPos() for the next packet.
  101. base::OneShotTimer update_timer_;
  102. float volume_ = 1.0;
  103. bool is_muted_ = false;
  104. };
  105. class FakeAudioConsumerService final
  106. : public fuchsia::media::testing::SessionAudioConsumerFactory_TestBase {
  107. public:
  108. explicit FakeAudioConsumerService(vfs::PseudoDir* pseudo_dir);
  109. ~FakeAudioConsumerService() override;
  110. FakeAudioConsumerService(const FakeAudioConsumerService&) = delete;
  111. FakeAudioConsumerService& operator=(const FakeAudioConsumerService&) = delete;
  112. size_t num_instances() { return audio_consumers_.size(); }
  113. FakeAudioConsumer* instance(size_t index) {
  114. return audio_consumers_[index].get();
  115. }
  116. private:
  117. // fuchsia::media::SessionAudioConsumerFactory implementation.
  118. void CreateAudioConsumer(uint64_t session_id,
  119. fidl::InterfaceRequest<fuchsia::media::AudioConsumer>
  120. audio_consumer_request) override;
  121. // Not-implemented handler for SessionAudioConsumerFactory_TestBase.
  122. void NotImplemented_(const std::string& name) override;
  123. base::ScopedServiceBinding<fuchsia::media::SessionAudioConsumerFactory>
  124. binding_;
  125. std::vector<std::unique_ptr<FakeAudioConsumer>> audio_consumers_;
  126. };
  127. } // namespace media
  128. #endif // MEDIA_FUCHSIA_AUDIO_FAKE_AUDIO_CONSUMER_H_