Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(305)

Unified Diff: services/media/audio/audio_pipe.h

Issue 1424933002: Add an initial revision of an audio server. (Closed) Base URL: https://github.com/domokit/mojo.git@change4
Patch Set: refactor MixerKernel into a class to prepare for the addition of a linear interpolation sampler Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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_

Powered by Google App Engine
This is Rietveld 408576698