| // Copyright (c) 2021 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. |
| |
| #include "media/audio/win/volume_range_util.h" |
| |
| #include "base/logging.h" |
| #include "base/metrics/histogram_functions.h" |
| |
| namespace media { |
| namespace { |
| |
| constexpr int CountVolumeRangeIntervals(VolumeRange range) { |
| DCHECK_LT(range.min_volume_db, range.max_volume_db); |
| DCHECK_GT(range.volume_step_db, 0.0f); |
| return (range.max_volume_db - range.min_volume_db) / range.volume_step_db; |
| } |
| |
| } // namespace |
| |
| void LogVolumeRangeUmaHistograms(absl::optional<VolumeRange> range) { |
| base::UmaHistogramBoolean("Media.Audio.Capture.Win.VolumeRangeAvailable", |
| range.has_value()); |
| if (!range.has_value()) { |
| return; |
| } |
| // Count the number of steps before the range is modified. |
| constexpr int kMaxVolumeSteps = 2000; |
| const int num_steps = |
| std::min(CountVolumeRangeIntervals(*range), kMaxVolumeSteps); |
| // Approximate `range` to an integer interval since UMA histograms do not log |
| // floating point values. |
| range->min_volume_db = std::floor(range->min_volume_db); |
| range->max_volume_db = std::ceil(range->max_volume_db); |
| // `range` is expected to be fully included in [`kMinDb`, `kMaxDb`]. |
| constexpr int kMinDb = -60; |
| constexpr int kMaxDb = 60; |
| static_assert(kMinDb < kMaxDb, ""); |
| // UMA histograms only accept non-negative values; however, a volume range is |
| // expected to include negative values (if `kMinDb` is negative). Therefore, |
| // `max(0, -kMinDb)` is added as offset. |
| constexpr int kVolumeOffsetDb = kMinDb < 0 ? -kMinDb : 0; |
| range->min_volume_db += kVolumeOffsetDb; |
| range->max_volume_db += kVolumeOffsetDb; |
| // Log the modified volume range. |
| constexpr int kExclusiveMaxVolumeDb = kMaxDb + kVolumeOffsetDb + 1; |
| DCHECK_LE(range->min_volume_db, range->max_volume_db); |
| base::UmaHistogramExactLinear("Media.Audio.Capture.Win.VolumeRangeMin2", |
| static_cast<int>(range->min_volume_db), |
| kExclusiveMaxVolumeDb); |
| DCHECK_GE(range->max_volume_db, 0); |
| base::UmaHistogramExactLinear("Media.Audio.Capture.Win.VolumeRangeMax2", |
| static_cast<int>(range->max_volume_db), |
| kExclusiveMaxVolumeDb); |
| // Log the number of volume range steps. |
| DCHECK_GT(num_steps, 0); |
| constexpr int kStepsNumBuckets = 100; |
| base::UmaHistogramCustomCounts("Media.Audio.Capture.Win.VolumeRangeNumSteps", |
| /*sample=*/num_steps, |
| /*min=*/1, /*max=*/kMaxVolumeSteps, |
| kStepsNumBuckets); |
| } |
| |
| } // namespace media |