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

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: 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/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..f9972b264a631b346127a37d93ba514c69d8464b
--- /dev/null
+++ b/services/media/audio/platform/generic/mixer.h
@@ -0,0 +1,108 @@
+// 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,
jeffbrown 2015/11/04 23:43:34 This is looking much cleaner than the first patch.
johngro 2015/11/06 02:20:26 Acknowledged.
+ 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 offset (in destination frames) at which we should start to mix
+ // destination frames.
+ //
+ // @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
jeffbrown 2015/11/04 23:43:34 Is this actually a fraction? Like a fixed point v
johngro 2015/11/06 02:20:26 yes, that is exactly what it is.
+ // 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_

Powered by Google App Engine
This is Rietveld 408576698