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

Unified Diff: media/base/audio_bus.h

Issue 2024993004: AudioBus: Add a ToInterleavedFloat() method to AudioBus (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Revise comments/names in code Created 4 years, 7 months 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: media/base/audio_bus.h
diff --git a/media/base/audio_bus.h b/media/base/audio_bus.h
index f827f9db87d396667e39d3105f10a33f85e39d11..e4a56f755f2c418e1d9e63b6c37427257c3470f8 100644
--- a/media/base/audio_bus.h
+++ b/media/base/audio_bus.h
@@ -18,11 +18,15 @@
namespace media {
class AudioParameters;
-// Scoped container for "busing" audio channel data around. Each channel is
-// stored in planar format and guaranteed to be aligned by kChannelAlignment.
-// AudioBus objects can be created normally or via wrapping. Normally, AudioBus
-// will dice up a contiguous memory block for channel data. When wrapped,
-// AudioBus instead routes requests for channel data to the wrapped object.
+// Represents a sequence of audio frames containing frames() audio samples for
+// each of channels() channels. The data is stored as a set of contiguous
+// float arrays with one array per channel. The memory for the arrays is either
+// allocated and owned by the AudioBus or it is provided to one of the factory
+// methods. AudioBus guarantees that it allocates memory such that float array
+// for each channel is aligned by AudioBus::kChannelAlignment bytes and it
+// requires the same for memory passed to its Wrap...() factory methods.
+// TODO(chfremer: When can SetChannelData be used? There are currently no unit
+// tests involving CreateWrapper and SetChannelData, so we need to add them.
class MEDIA_EXPORT AudioBus {
public:
// Guaranteed alignment of each channel's data; use 16-byte alignment for easy
@@ -35,8 +39,8 @@ class MEDIA_EXPORT AudioBus {
static std::unique_ptr<AudioBus> Create(const AudioParameters& params);
// Creates a new AudioBus with the given number of channels, but zero length.
- // It's expected to be used with SetChannelData() and set_frames() to
- // wrap externally allocated memory.
+ // Clients are expected to subsequently call SetChannelData() and set_frames()
+ // to wrap externally allocated memory.
static std::unique_ptr<AudioBus> CreateWrapper(int channels);
// Creates a new AudioBus from an existing channel vector. Does not transfer
@@ -54,21 +58,35 @@ class MEDIA_EXPORT AudioBus {
void* data);
static std::unique_ptr<AudioBus> WrapMemory(const AudioParameters& params,
void* data);
- static int CalculateMemorySize(const AudioParameters& params);
- // Calculates the required size for an AudioBus given the number of channels
- // and frames.
+ // Based on the given number of channels and frames, calculates the minimum
+ // required size in bytes of a contiguous block of memory to be passed to
+ // AudioBus for storage of the audio data.
+ // Uses channels() and frames_per_buffer() from AudioParameters if given.
static int CalculateMemorySize(int channels, int frames);
+ static int CalculateMemorySize(const AudioParameters& params);
+
+ // Methods that are expected to be called after AudioBus::CreateWrapper() in
+ // order to wrap externally allocated memory. Note: It is illegal to call
+ // these methods when using a factory method other than CreateWrapper().
+ void SetChannelData(int channel, float* data);
+ void set_frames(int frames);
// Helper methods for converting an AudioBus from and to interleaved integer
// data. Expects interleaving to be [ch0, ch1, ..., chN, ch0, ch1, ...] with
// |bytes_per_sample| per value. Values are scaled and bias corrected during
// conversion. ToInterleaved() will also clip values to format range.
// Handles uint8_t, int16_t, and int32_t currently. FromInterleaved() will
- // zero out
- // any unfilled frames when |frames| is less than frames().
+ // zero out any unfilled frames when |frames| is less than frames().
void FromInterleaved(const void* source, int frames, int bytes_per_sample);
void ToInterleaved(int frames, int bytes_per_sample, void* dest) const;
+ // TODO(chfremer): Instead of adding extra functions for float, it may be
+ // nicer to reuse the existing methods and replace |int bytes_per_sample" with
miu 2016/06/02 20:40:21 FYI--We're actually trying to get rid of |bytes_pe
+ // an enum indicating the frame type.
+ void ToInterleavedFloat(int source_offset,
miu 2016/06/02 20:40:21 I agree with Miguel here, but realize it's a much
chfremer 2016/06/07 21:21:39 Done.
+ int destination_offset,
miu 2016/06/02 20:40:21 nit: Please remove the |destination_offset| argume
+ int num_channels,
miu 2016/06/02 20:40:21 This argument should be named |frames| (it's defin
+ float* buffer) const;
void ToInterleavedPartial(int start_frame, int frames, int bytes_per_sample,
void* dest) const;
@@ -97,11 +115,11 @@ class MEDIA_EXPORT AudioBus {
// inf, nan, or between [-1.0, 1.0]) values in the channel data.
float* channel(int channel) { return channel_data_[channel]; }
const float* channel(int channel) const { return channel_data_[channel]; }
- void SetChannelData(int channel, float* data);
+ // Returns the number of channels.
int channels() const { return static_cast<int>(channel_data_.size()); }
+ // Returns the number of frames.
int frames() const { return frames_; }
- void set_frames(int frames);
// Helper method for zeroing out all channels of audio data.
void Zero();
@@ -129,12 +147,16 @@ class MEDIA_EXPORT AudioBus {
private:
// Helper method for building |channel_data_| from a block of memory. |data|
- // must be at least BlockSize() bytes in size.
+ // must be at least CalculateMemorySize(...) bytes in size.
void BuildChannelData(int channels, int aligned_frame, float* data);
// Contiguous block of channel memory.
std::unique_ptr<float, base::AlignedFreeDeleter> data_;
+ // One float pointer per channel pointing to a contiguous block of memory for
+ // that channel. If the memory is owned by this instance, this will
+ // point to the memory in |data_|. Otherwise, it may point to memory provided
+ // by the client.
std::vector<float*> channel_data_;
int frames_;

Powered by Google App Engine
This is Rietveld 408576698