/* * Copyright (c) 2024 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree.
*/
// This file contains 3 types of view classes: // // * MonoView<>: A single channel contiguous buffer of samples. // // * InterleavedView<>: Channel samples are interleaved (side-by-side) in // the buffer. A single channel InterleavedView<> is the same thing as a // MonoView<> // // * DeinterleavedView<>: Each channel's samples are contiguous within the // buffer. Channels can be enumerated and accessing the individual channel // data is done via MonoView<>. // // The views are comparable to and built on rtc::ArrayView<> but add // audio specific properties for the dimensions of the buffer and the above // specialized [de]interleaved support. // // There are also a few generic utility functions that can simplify // generic code for supporting more than one type of view.
// MonoView<> represents a view over a single contiguous, audio buffer. This // can be either an single channel (mono) interleaved buffer (e.g. AudioFrame), // or a de-interleaved channel (e.g. from AudioBuffer). template <typename T> using MonoView = rtc::ArrayView<T>;
// InterleavedView<> is a view over an interleaved audio buffer (e.g. from // AudioFrame). template <typename T> class InterleavedView { public: using value_type = T;
// Construct an InterleavedView from a C-style array. Samples per channels // is calculated based on the array size / num_channels. template <typename U, size_t N>
InterleavedView(U (&array)[N], // NOLINT
size_t num_channels)
: InterleavedView(array, N / num_channels, num_channels) {
RTC_DCHECK_EQ(N % num_channels, 0u);
}
// A simple wrapper around memcpy that includes checks for properties. // TODO(tommi): Consider if this can be utility function for both interleaved // and deinterleaved views. template <typename U> void CopyFrom(const InterleavedView<U>& source) {
static_assert(sizeof(T) == sizeof(U), "");
RTC_DCHECK_EQ(num_channels(), source.num_channels());
RTC_DCHECK_EQ(samples_per_channel(), source.samples_per_channel());
RTC_DCHECK_GE(data_.size(), source.data().size()); constauto data = source.data();
memcpy(&data_[0], &data[0], data.size() * sizeof(U));
}
private: // TODO(tommi): Consider having these both be stored as uint16_t to // save a few bytes per view. Use `dchecked_cast` to support size_t during // construction.
size_t num_channels_ = 0u;
size_t samples_per_channel_ = 0u;
rtc::ArrayView<T> data_;
};
template <typename T> class DeinterleavedView { public: using value_type = T;
// Returns a deinterleaved channel where `idx` is the zero based index, // in the range [0 .. num_channels()-1].
MonoView<T> operator[](size_t idx) const {
RTC_DCHECK_LT(idx, num_channels_); return MonoView<T>(&data_[idx * samples_per_channel_],
samples_per_channel_);
}
// Returns the first (and possibly only) channel.
MonoView<T> AsMono() const {
RTC_DCHECK_GE(num_channels(), 1u); return (*this)[0];
}
private: // TODO(tommi): Consider having these be stored as uint16_t to save a few // bytes per view. Use `dchecked_cast` to support size_t during construction.
size_t num_channels_ = 0u;
size_t samples_per_channel_ = 0u;
rtc::ArrayView<T> data_;
};
template <typename T>
size_t SamplesPerChannel(const DeinterleavedView<T>& view) { return view.samples_per_channel();
} // A simple wrapper around memcpy that includes checks for properties. // The parameter order is the same as for memcpy(), first destination then // source. template <typename D, typename S> void CopySamples(D& destination, const S& source) {
static_assert( sizeof(typename D::value_type) == sizeof(typename S::value_type), ""); // Here we'd really like to do // static_assert(IsInterleavedView(destination) == IsInterleavedView(source), // ""); // but the compiler doesn't like it inside this template function for // some reason. The following check is an approximation but unfortunately // means that copying between a MonoView and single channel interleaved or // deinterleaved views wouldn't work. // static_assert(sizeof(destination) == sizeof(source), // "Incompatible view types");
RTC_DCHECK_EQ(NumChannels(destination), NumChannels(source));
RTC_DCHECK_EQ(SamplesPerChannel(destination), SamplesPerChannel(source));
RTC_DCHECK_GE(destination.size(), source.size());
memcpy(&destination[0], &source[0],
source.size() * sizeof(typename S::value_type));
}
// Sets all the samples in a view to 0. This template function is a simple // wrapper around `memset()` but adds the benefit of automatically calculating // the byte size from the number of samples and sample type. template <typename T> void ClearSamples(T& view) {
memset(&view[0], 0, view.size() * sizeof(typename T::value_type));
}
// Same as `ClearSamples()` above but allows for clearing only the first // `sample_count` number of samples. template <typename T> void ClearSamples(T& view, size_t sample_count) {
RTC_DCHECK_LE(sample_count, view.size());
memset(&view[0], 0, sample_count * sizeof(typename T::value_type));
}
} // namespace webrtc
#endif// API_AUDIO_AUDIO_VIEW_H_
Messung V0.5
¤ Dauer der Verarbeitung: 0.1 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.