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

Unified Diff: services/media/audio/platform/generic/mixer.h

Issue 1424933002: Add an initial revision of an audio server. (Closed) Base URL: https://github.com/domokit/mojo.git@change4
Patch Set: fix issues discovered with initial preflight 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
« no previous file with comments | « services/media/audio/fwd_decls.h ('k') | services/media/audio/platform/generic/mixer.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: services/media/audio/platform/generic/mixer.h
diff --git a/services/media/audio/platform/generic/mixer.h b/services/media/audio/platform/generic/mixer.h
new file mode 100644
index 0000000000000000000000000000000000000000..323e75af578b7b0c93aaa44d72c93be458b956ee
--- /dev/null
+++ b/services/media/audio/platform/generic/mixer.h
@@ -0,0 +1,110 @@
+// 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_PLATFORM_GENERIC_MIXER_H_
+#define SERVICES_MEDIA_AUDIO_PLATFORM_GENERIC_MIXER_H_
+
+#include <memory>
+
+#include "mojo/services/media/common/interfaces/media_types.mojom.h"
+
+namespace mojo {
+namespace media {
+namespace audio {
+
+class Mixer;
+using MixerPtr = std::unique_ptr<Mixer>;
+
+class Mixer {
+ public:
+ virtual ~Mixer();
+
+ // Select
+ //
+ // Select an appropriate instance of a mixer based on the properties of the
+ // source and destination formats.
+ //
+ // TODO(johngro): Come back here and add a way to indicate user preference
+ // where appropriate. For example, where we might chose a linear
+ // interpolation sampler, the user may actually prefer cubic interpolation, or
+ // perhaps just a point sampler.
+ static MixerPtr Select(const LpcmMediaTypeDetailsPtr& src_format,
+ const LpcmMediaTypeDetailsPtr& dst_format);
+
+ // Mix
+ //
+ // Perform a mixing operation from the source buffer into the destination
+ // buffer.
+ //
+ // @param dst
+ // The pointer to the destination buffer into which frames will be mixed.
+ //
+ // @param dst_frames
+ // The total number of frames of audio which comprise the destination buffer.
+ //
+ // @param dst_offset
+ // The pointer to the offset (in destination frames) at which we should start
+ // to mix destination frames. When Mix has finished, dst_offset will be
+ // updated to indicate the offset into the destination buffer of the next
+ // frame to be mixed.
+ //
+ // @param src
+ // The pointer the the source buffer containing the frames to be mixed into
+ // the destination buffer.
+ //
+ // @param frac_src_frames
+ // The total number of fractional track frames contained by the source buffer.
+ //
+ // @param frac_src_offset
+ // A pointer to the offset (expressed in fractional track frames) at which the
+ // first frame to be mixed with the destination buffer should be sampled.
+ // When Mix has finished, frac_src_offset will be updated to indicate the
+ // offset of the sampling position of the next frame to be mixed with the
+ // output buffer.
+ //
+ // @param frac_step_size
+ // How much to increment the fractional sampling position for each output
+ // frame produced.
+ //
+ // TODO(johngro): Right now, this number may have some amount of rounding
+ // error which will accumulate as sampling position error as we produce more
+ // output samples for a single call to Mix. This error will reset when we
+ // swtich to the next source buffer, but could (in theory) be the source of
+ // distortion. If this becomes a problem, we should consider switching to
+ // some form of (N,M) stepping system where we count by frac_step_size for N
+ // output samples, then frac_step_size+1 for M samples, etc...
+ //
+ // @param accumulate
+ // When true, the mixer will accumulate into the destination buffer (read,
+ // sum, clip, write-back). When false, the mixer will simply replace the
+ // destination buffer with its output.
+ //
+ // @return True if the mixer is finished with this source data and will not
+ // need it in the future. False if the mixer has not consumed the entire
+ // source buffer and will need more of it in the future.
+ virtual bool Mix(void* dst,
+ uint32_t dst_frames,
+ uint32_t* dst_offset,
+ const void* src,
+ uint32_t frac_src_frames,
+ uint32_t* frac_src_offset,
+ uint32_t frac_step_size,
+ bool accumulate) = 0;
+
+ // Reset
+ //
+ // Reset the internal state of the mixer. Will be called every time there is
+ // a discontinuity in the source stream. Mixer implementations should reset
+ // anything related to their internal filter state.
+ virtual void Reset() {}
+
+ protected:
+ Mixer();
+};
+
+} // namespace audio
+} // namespace media
+} // namespace mojo
+
+#endif // SERVICES_MEDIA_AUDIO_PLATFORM_GENERIC_MIXER_H_
« no previous file with comments | « services/media/audio/fwd_decls.h ('k') | services/media/audio/platform/generic/mixer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698