blob: 5e024f315ae1e69b091025acc448e36fa2c060f6 [file] [log] [blame]
// Copyright 2016 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 MEDIA_BASE_AUDIO_LATENCY_H_
#define MEDIA_BASE_AUDIO_LATENCY_H_
#include "media/base/media_shmem_export.h"
namespace base {
class TimeDelta;
}
namespace media {
class MEDIA_SHMEM_EXPORT AudioLatency {
public:
// Categories of expected latencies for input/output audio. Do not change
// existing values, they are used for UMA histogram reporting.
enum LatencyType {
// Specific latency in milliseconds.
LATENCY_EXACT_MS = 0,
// Lowest possible latency which does not cause glitches.
LATENCY_INTERACTIVE = 1,
// Latency optimized for real time communication.
LATENCY_RTC = 2,
// Latency optimized for continuous playback and power saving.
LATENCY_PLAYBACK = 3,
// For validation only.
LATENCY_LAST = LATENCY_PLAYBACK,
LATENCY_COUNT = LATENCY_LAST + 1
};
// Indicates if the OS does not require resampling for playback.
static bool IsResamplingPassthroughSupported(LatencyType type);
// |preferred_buffer_size| should be set to 0 if a client has no preference.
static int GetHighLatencyBufferSize(int sample_rate,
int preferred_buffer_size);
// |hardware_buffer_size| should be set to 0 if unknown/invalid/not preferred.
static int GetRtcBufferSize(int sample_rate, int hardware_buffer_size);
static int GetInteractiveBufferSize(int hardware_buffer_size);
// Return the closest buffer size for this platform that will result in a
// latency not less than |duration| for the given |sample_rate|.
//
// Requirements:
// - |hardware_buffer_size| > 0 and |max_allowed_buffer_size| > 0.
// - If |min_hardware_buffer_size| and |max_hardware_buffer_size| are > 0 then
// the following must be true: |min_hardware_buffer_size| <=
// |hardware_buffer_size| <= |max_hardware_buffer_size| <=
// |max_allowed_buffer_size|.
//
// The returned buffer size is guaranteed to be between
// |min_hardware_buffer_size| and |max_allowed_buffer_size|.
// |max_hardware_buffer_size| is used to help determine a buffer size that
// won't cause the caller and the hardware to run at unsynchronized buffer
// sizes (e.g. hardware running at 4096 and caller running at 4224).
// |hardware_buffer_size| is the platform's preferred buffer size.
//
// It is valid for both the min and max to be zero in which case only
// |hardware_buffer_size| and multiples of it will be used.
static int GetExactBufferSize(base::TimeDelta duration,
int sample_rate,
int hardware_buffer_size,
int min_hardware_buffer_size,
int max_hardware_buffer_size,
int max_allowed_buffer_size);
};
} // namespace media
#endif // MEDIA_BASE_AUDIO_LATENCY_H_