| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SERVICES_MEDIA_AUDIO_AUDIO_TRACK_IMPL_H_ |
| #define SERVICES_MEDIA_AUDIO_AUDIO_TRACK_IMPL_H_ |
| |
| #include <deque> |
| #include <set> |
| |
| #include "base/synchronization/lock.h" |
| #include "mojo/public/cpp/bindings/binding.h" |
| #include "mojo/public/cpp/bindings/callback.h" |
| #include "mojo/services/media/audio/interfaces/audio_track.mojom.h" |
| #include "mojo/services/media/common/cpp/linear_transform.h" |
| #include "services/media/audio/audio_pipe.h" |
| #include "services/media/audio/fwd_decls.h" |
| #include "services/media/common/timeline_control_site.h" |
| |
| namespace mojo { |
| namespace media { |
| namespace audio { |
| |
| class AudioTrackImpl : public AudioTrack { |
| public: |
| // TODO(johngro): Find a better place for this constant. It affects the |
| // behavior of more than just the Audio Track implementation. |
| static constexpr size_t PTS_FRACTIONAL_BITS = 12; |
| |
| ~AudioTrackImpl() override; |
| static AudioTrackImplPtr Create(InterfaceRequest<AudioTrack> iface, |
| AudioServerImpl* owner); |
| |
| // Shutdown the audio track, unlinking it from all outputs, closing |
| // connections to all clients and removing it from its owner server's list. |
| void Shutdown(); |
| |
| // Methods used by the output manager to link this track to different outputs. |
| void AddOutput(AudioTrackToOutputLinkPtr link); |
| void RemoveOutput(AudioTrackToOutputLinkPtr link); |
| |
| // Accessors used by AudioOutputs during mixing to access parameters which are |
| // important for the mixing process. |
| void SnapshotRateTrans(LinearTransform* out, uint32_t* generation = nullptr); |
| |
| const LinearTransform::Ratio& FractionalFrameToMediaTimeRatio() const { |
| return frame_to_media_ratio_; |
| } |
| |
| uint32_t BytesPerFrame() const { return bytes_per_frame_; } |
| const AudioMediaTypeDetailsPtr& Format() const { return format_; } |
| float DbGain() const { return db_gain_; } |
| |
| private: |
| friend class AudioPipe; |
| |
| AudioTrackImpl(InterfaceRequest<AudioTrack> track, |
| AudioServerImpl* owner); |
| |
| // Implementation of AudioTrack interface. |
| void Describe(const DescribeCallback& cbk) override; |
| void Configure(AudioTrackConfigurationPtr configuration, |
| InterfaceRequest<MediaConsumer> req) override; |
| void GetTimelineControlSite(InterfaceRequest<MediaTimelineControlSite> req) |
| override; |
| void SetGain(float db_gain) override; |
| |
| // Methods called by our AudioPipe. |
| // |
| // TODO(johngro): MI is banned by style, but multiple interface inheritance |
| // (inheriting for one or more base classes consisting only of pure virtual |
| // methods) is allowed. Consider defining an interface for AudioPipe |
| // encapsulation so that AudioPipe does not have to know that we are an |
| // AudioTrackImpl (just that we implement its interface). |
| void OnPacketReceived(AudioPipe::AudioPacketRefPtr packet); |
| bool OnFlushRequested(const MediaConsumer::FlushCallback& cbk); |
| |
| AudioTrackImplWeakPtr weak_this_; |
| AudioServerImpl* owner_; |
| Binding<AudioTrack> binding_; |
| AudioPipe pipe_; |
| TimelineControlSite timeline_control_site_; |
| TimelineRate frames_per_ns_; |
| LinearTransform::Ratio frame_to_media_ratio_; |
| uint32_t bytes_per_frame_ = 1; |
| AudioMediaTypeDetailsPtr format_; |
| AudioTrackToOutputLinkSet outputs_; |
| float db_gain_ = 0.0; |
| }; |
| |
| } // namespace audio |
| } // namespace media |
| } // namespace mojo |
| |
| #endif // SERVICES_MEDIA_AUDIO_AUDIO_TRACK_IMPL_H_ |