 Chromium Code Reviews
 Chromium Code Reviews Issue 1424933002:
  Add an initial revision of an audio server.  (Closed) 
  Base URL: https://github.com/domokit/mojo.git@change4
    
  
    Issue 1424933002:
  Add an initial revision of an audio server.  (Closed) 
  Base URL: https://github.com/domokit/mojo.git@change4| Index: services/media/audio/audio_pipe.h | 
| diff --git a/services/media/audio/audio_pipe.h b/services/media/audio/audio_pipe.h | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..7d080f07080432f8deb2da5959eb6964bfe88a95 | 
| --- /dev/null | 
| +++ b/services/media/audio/audio_pipe.h | 
| @@ -0,0 +1,101 @@ | 
| +// 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_PIPE_H_ | 
| +#define SERVICES_MEDIA_AUDIO_AUDIO_PIPE_H_ | 
| + | 
| +#include <memory> | 
| +#include <vector> | 
| + | 
| +#include "mojo/services/media/common/cpp/linear_transform.h" | 
| +#include "services/media/audio/fwd_decls.h" | 
| +#include "services/media/common/media_pipe_base.h" | 
| + | 
| +namespace mojo { | 
| +namespace media { | 
| +namespace audio { | 
| + | 
| +class AudioPipe : public MediaPipeBase { | 
| + public: | 
| + class AudioPacketRef; | 
| + using AudioPacketRefPtr = std::shared_ptr<AudioPacketRef>; | 
| + using MediaPacketStatePtr = MediaPipeBase::MediaPacketStatePtr; | 
| + | 
| + class AudioPacketRef { | 
| + public: | 
| + struct Region { | 
| + Region(const void* b, uint32_t ffl) : base(b), frac_frame_len(ffl) {} | 
| + const void* base; | 
| + uint32_t frac_frame_len; | 
| + }; | 
| + | 
| + ~AudioPacketRef(); | 
| + | 
| + const MediaPacketPtr& GetPacket() const { return state_->GetPacket(); } | 
| + void SetResult(MediaResult result) { return state_->SetResult(result); } | 
| + | 
| + // Accessors for starting and ending presentation time stamps expressed in | 
| + // units of audio frames (note, not media time), as signed 51.12 fixed point | 
| + // integers (see AudioTrackImpl:PTS_FRACTIONAL_BITS). At 192KHz, this | 
| + // allows for ~372.7 years of usable range when starting from a media time | 
| + // of 0. | 
| 
jeffbrown
2015/11/04 23:43:33
Might be good to define a struct for manipulating
 
johngro
2015/11/06 02:20:25
I'm not sure that a struct is what you want here (
 | 
| + // | 
| + // AudioPackets consumed by the AudioServer are all expected to have | 
| + // explicit presentation time stamps. If packets sent by the user are | 
| + // missing timestamps, appropriate timestamps will be synthesized at this | 
| + // point in the pipeline. | 
| + // | 
| + // Note, the start pts is the time at which the first frame of audio in the | 
| + // packet should be presented. The end_pts is the time at which the frame | 
| + // after the final frame in the packet would be presented. | 
| + // | 
| + // TODO(johngro): Reconsider this. It may be best to keep things expressed | 
| + // simply in media time instead of converting to fractional units of track | 
| + // frames. If/when outputs move away from a single fixed step size for | 
| + // output sampling, it will probably be best to just convert this back to | 
| + // media time. | 
| + const int64_t& start_pts() const { return start_pts_; } | 
| + const int64_t& end_pts() const { return end_pts_; } | 
| + | 
| + // Accessor for the regions in the shared buffer which contain the actual | 
| + // sample data. | 
| + const std::vector<Region>& regions() const { return regions_; } | 
| + | 
| + private: | 
| + friend class AudioPipe; | 
| + AudioPacketRef(MediaPacketStatePtr state, | 
| + AudioServerImpl* server, | 
| + std::vector<Region>&& regions, | 
| + int64_t start_pts, | 
| + int64_t end_pts); | 
| + | 
| + MediaPacketStatePtr state_; | 
| + AudioServerImpl* server_; | 
| + | 
| + std::vector<Region> regions_; | 
| + int64_t start_pts_; | 
| + int64_t end_pts_; | 
| + }; | 
| + | 
| + AudioPipe(AudioTrackImpl* owner, AudioServerImpl* server); | 
| + ~AudioPipe() override; | 
| + | 
| + protected: | 
| + void OnPacketReceived(MediaPacketStatePtr state) override; | 
| + void OnFlushRequested(const FlushCallback& cbk) override; | 
| + | 
| + private: | 
| + AudioTrackImpl* owner_; | 
| + AudioServerImpl* server_; | 
| + | 
| + // State used for timestamp interpolation | 
| + bool next_pts_known_ = 0; | 
| + int64_t next_pts_; | 
| +}; | 
| + | 
| +} // namespace audio | 
| +} // namespace media | 
| +} // namespace mojo | 
| + | 
| +#endif // SERVICES_MEDIA_AUDIO_AUDIO_PIPE_H_ |