summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrtoy@google.com <rtoy@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-15 05:29:18 +0000
committerrtoy@google.com <rtoy@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-15 05:29:18 +0000
commit441ec4dc183c1c6c4f303855aaeea75cb60074fe (patch)
tree712e21b89b7b15c0c9a8cd31b5fb962179c06c66
parent5fa278c10430a00706d0e296216b4c9543bacbc7 (diff)
downloadchromium_src-441ec4dc183c1c6c4f303855aaeea75cb60074fe.zip
chromium_src-441ec4dc183c1c6c4f303855aaeea75cb60074fe.tar.gz
chromium_src-441ec4dc183c1c6c4f303855aaeea75cb60074fe.tar.bz2
Add API to query for the audio buffer size.
This is essentially identical to the GetAudioHardwareSampleRate API, except we get the "optimal" hardware buffer size to be used. BUG=None TEST=None Review URL: http://codereview.chromium.org/7837030 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@101249 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--content/renderer/media/audio_device.cc10
-rw-r--r--content/renderer/media/audio_device.h1
-rw-r--r--content/renderer/renderer_webkitplatformsupport_impl.cc4
-rw-r--r--content/renderer/renderer_webkitplatformsupport_impl.h1
-rw-r--r--media/audio/audio_util.cc17
-rw-r--r--media/audio/audio_util.h5
6 files changed, 38 insertions, 0 deletions
diff --git a/content/renderer/media/audio_device.cc b/content/renderer/media/audio_device.cc
index 7b2843f..68a8756 100644
--- a/content/renderer/media/audio_device.cc
+++ b/content/renderer/media/audio_device.cc
@@ -243,3 +243,13 @@ double AudioDevice::GetAudioHardwareSampleRate() {
}
return hardware_sample_rate;
}
+
+size_t AudioDevice::GetAudioHardwareBufferSize() {
+ // Uses cached value if possible.
+ static size_t buffer_size = 0;
+
+ if (!buffer_size)
+ buffer_size = media::GetAudioHardwareBufferSize();
+
+ return buffer_size;
+}
diff --git a/content/renderer/media/audio_device.h b/content/renderer/media/audio_device.h
index eee2513..54f5dc7 100644
--- a/content/renderer/media/audio_device.h
+++ b/content/renderer/media/audio_device.h
@@ -101,6 +101,7 @@ class AudioDevice
size_t buffer_size() const { return buffer_size_; }
static double GetAudioHardwareSampleRate();
+ static size_t GetAudioHardwareBufferSize();
// Methods called on IO thread ----------------------------------------------
// AudioMessageFilter::Delegate methods, called by AudioMessageFilter.
diff --git a/content/renderer/renderer_webkitplatformsupport_impl.cc b/content/renderer/renderer_webkitplatformsupport_impl.cc
index b4eb45f..6d459e9 100644
--- a/content/renderer/renderer_webkitplatformsupport_impl.cc
+++ b/content/renderer/renderer_webkitplatformsupport_impl.cc
@@ -567,6 +567,10 @@ double RendererWebKitPlatformSupportImpl::audioHardwareSampleRate() {
return AudioDevice::GetAudioHardwareSampleRate();
}
+size_t RendererWebKitPlatformSupportImpl::audioHardwareBufferSize() {
+ return AudioDevice::GetAudioHardwareBufferSize();
+}
+
WebAudioDevice*
RendererWebKitPlatformSupportImpl::createAudioDevice(
size_t buffer_size,
diff --git a/content/renderer/renderer_webkitplatformsupport_impl.h b/content/renderer/renderer_webkitplatformsupport_impl.h
index 83b3235..9517693 100644
--- a/content/renderer/renderer_webkitplatformsupport_impl.h
+++ b/content/renderer/renderer_webkitplatformsupport_impl.h
@@ -78,6 +78,7 @@ class RendererWebKitPlatformSupportImpl
virtual WebKit::WebSharedWorkerRepository* sharedWorkerRepository();
virtual WebKit::WebGraphicsContext3D* createGraphicsContext3D();
virtual double audioHardwareSampleRate();
+ virtual size_t audioHardwareBufferSize();
virtual WebKit::WebAudioDevice* createAudioDevice(
size_t buffer_size, unsigned channels, double sample_rate,
WebKit::WebAudioDevice::RenderCallback* callback);
diff --git a/media/audio/audio_util.cc b/media/audio/audio_util.cc
index 2b790d8..120e2ed 100644
--- a/media/audio/audio_util.cc
+++ b/media/audio/audio_util.cc
@@ -242,6 +242,23 @@ double GetAudioHardwareSampleRate()
#endif
}
+size_t GetAudioHardwareBufferSize() {
+ // The sizes here were determined by experimentation and are roughly
+ // the lowest value (for low latency) that still allowed glitch-free
+ // audio under high loads.
+ //
+ // For Mac OS X the chromium audio backend uses a low-latency
+ // CoreAudio API, so a low buffer size is possible. For other OSes,
+ // further tuning may be needed.
+#if defined(OS_MACOSX)
+ return 128;
+#elif defined(OS_LINUX)
+ return 2048;
+#else
+ return 2048;
+#endif
+}
+
// When transferring data in the shared memory, first word is size of data
// in bytes. Actual data starts immediately after it.
diff --git a/media/audio/audio_util.h b/media/audio/audio_util.h
index e9452b2..6ea697b 100644
--- a/media/audio/audio_util.h
+++ b/media/audio/audio_util.h
@@ -82,6 +82,11 @@ MEDIA_EXPORT void InterleaveFloatToInt16(const std::vector<float*>& source,
// Returns the default audio hardware sample-rate.
MEDIA_EXPORT double GetAudioHardwareSampleRate();
+// Returns the optimal low-latency buffer size for the audio hardware.
+// This is the smallest buffer size the system can comfortably render
+// at without glitches. The buffer size is in sample-frames.
+MEDIA_EXPORT size_t GetAudioHardwareBufferSize();
+
// Functions that handle data buffer passed between processes in the shared
// memory. Called on both IPC sides.