summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorcrogers@google.com <crogers@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-01-15 00:18:39 +0000
committercrogers@google.com <crogers@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-01-15 00:18:39 +0000
commitec8962ca7de01eb5685b32a4361dd7be8f7e6293 (patch)
treef26945b2e47fb967427b831ec3d4b1b962be3964 /media
parent521b248f7ce021f99932c9150461744b3edf3067 (diff)
downloadchromium_src-ec8962ca7de01eb5685b32a4361dd7be8f7e6293.zip
chromium_src-ec8962ca7de01eb5685b32a4361dd7be8f7e6293.tar.gz
chromium_src-ec8962ca7de01eb5685b32a4361dd7be8f7e6293.tar.bz2
Implement renderer AudioDevice API for low-latency audio output
BUG=none TEST=none (I tested locally for Mac OS X, but we'll need further testing for Windows and Linux as we add real-time threads, etc.) Review URL: http://codereview.chromium.org/6002005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@71521 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r--media/audio/audio_util.cc19
-rw-r--r--media/audio/audio_util.h12
2 files changed, 31 insertions, 0 deletions
diff --git a/media/audio/audio_util.cc b/media/audio/audio_util.cc
index 6d80c87..ed84bc1 100644
--- a/media/audio/audio_util.cc
+++ b/media/audio/audio_util.cc
@@ -206,4 +206,23 @@ bool DeinterleaveAudioChannel(void* source,
return false;
}
+void InterleaveFloatToInt16(const std::vector<float*>& source,
+ int16* destination,
+ size_t number_of_frames) {
+ const float kScale = 32768.0f;
+ int channels = source.size();
+ for (int i = 0; i < channels; ++i) {
+ float* channel_data = source[i];
+ for (size_t j = 0; j < number_of_frames; ++j) {
+ float sample = kScale * channel_data[j];
+ if (sample < -32768.0)
+ sample = -32768.0;
+ else if (sample > 32767.0)
+ sample = 32767.0;
+
+ destination[j * channels + i] = static_cast<int16>(sample);
+ }
+ }
+}
+
} // namespace media
diff --git a/media/audio/audio_util.h b/media/audio/audio_util.h
index 669b4fa..a6ba75f 100644
--- a/media/audio/audio_util.h
+++ b/media/audio/audio_util.h
@@ -5,6 +5,8 @@
#ifndef MEDIA_AUDIO_AUDIO_UTIL_H_
#define MEDIA_AUDIO_AUDIO_UTIL_H_
+#include <vector>
+
#include "base/basictypes.h"
namespace media {
@@ -62,6 +64,16 @@ bool DeinterleaveAudioChannel(void* source,
int bytes_per_sample,
size_t number_of_frames);
+// InterleaveFloatToInt16 scales, clips, and interleaves the planar
+// floating-point audio contained in |source| to the int16 |destination|.
+// The floating-point data is in a canonical range of -1.0 -> +1.0.
+// The size of the |source| vector determines the number of channels.
+// The |destination| buffer is assumed to be large enough to hold the
+// result. Thus it must be at least size: number_of_frames * source.size()
+void InterleaveFloatToInt16(const std::vector<float*>& source,
+ int16* destination,
+ size_t number_of_frames);
+
} // namespace media
#endif // MEDIA_AUDIO_AUDIO_UTIL_H_