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

Side by Side Diff: chromecast/media/cma/backend/alsa/slew_volume.cc

Issue 2738873002: [Chromecast] Implement new volume control API (Closed)
Patch Set: no need for ALSA volume control Created 3 years, 9 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chromecast/media/cma/backend/alsa/slew_volume.h" 5 #include "chromecast/media/cma/backend/alsa/slew_volume.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "media/base/vector_math.h" 10 #include "media/base/vector_math.h"
(...skipping 20 matching lines...) Expand all
31 } 31 }
32 32
33 void SlewVolume::SetSampleRate(int sample_rate) { 33 void SlewVolume::SetSampleRate(int sample_rate) {
34 sample_rate_ = sample_rate; 34 sample_rate_ = sample_rate;
35 SetVolume(volume_scale_); 35 SetVolume(volume_scale_);
36 } 36 }
37 37
38 // Slew rate should be volume_to_slew / slew_time / sample_rate 38 // Slew rate should be volume_to_slew / slew_time / sample_rate
39 void SlewVolume::SetVolume(double volume_scale) { 39 void SlewVolume::SetVolume(double volume_scale) {
40 volume_scale_ = volume_scale; 40 volume_scale_ = volume_scale;
41 if (interrupted_) {
42 current_volume_ = volume_scale_;
43 }
41 if (volume_scale_ > current_volume_) { 44 if (volume_scale_ > current_volume_) {
42 max_slew_up_ = (volume_scale_ - current_volume_) * 1000.0 / 45 max_slew_up_ = (volume_scale_ - current_volume_) * 1000.0 /
43 (max_slew_time_up_ms_ * sample_rate_); 46 (max_slew_time_up_ms_ * sample_rate_);
44 } else { 47 } else {
45 max_slew_down_ = (current_volume_ - volume_scale_) * 1000.0 / 48 max_slew_down_ = (current_volume_ - volume_scale_) * 1000.0 /
46 (max_slew_time_down_ms_ * sample_rate_); 49 (max_slew_time_down_ms_ * sample_rate_);
47 } 50 }
48 } 51 }
49 52
53 void SlewVolume::Interrupted() {
54 interrupted_ = true;
55 current_volume_ = volume_scale_;
56 }
57
50 void SlewVolume::ProcessFMAC(bool repeat_transition, 58 void SlewVolume::ProcessFMAC(bool repeat_transition,
51 const float* src, 59 const float* src,
52 int frames, 60 int frames,
53 float* dest) { 61 float* dest) {
54 DCHECK(src); 62 DCHECK(src);
55 DCHECK(dest); 63 DCHECK(dest);
56 // Ensure |src| and |dest| are 16-byte aligned. 64 // Ensure |src| and |dest| are 16-byte aligned.
57 DCHECK_EQ(0u, reinterpret_cast<uintptr_t>(src) & 65 DCHECK_EQ(0u, reinterpret_cast<uintptr_t>(src) &
58 (::media::vector_math::kRequiredAlignment - 1)); 66 (::media::vector_math::kRequiredAlignment - 1));
59 DCHECK_EQ(0u, reinterpret_cast<uintptr_t>(dest) & 67 DCHECK_EQ(0u, reinterpret_cast<uintptr_t>(dest) &
60 (::media::vector_math::kRequiredAlignment - 1)); 68 (::media::vector_math::kRequiredAlignment - 1));
61 69
62 if (!frames) { 70 if (!frames) {
63 return; 71 return;
64 } 72 }
65 73
74 interrupted_ = false;
66 if (repeat_transition) { 75 if (repeat_transition) {
67 current_volume_ = last_starting_volume_; 76 current_volume_ = last_starting_volume_;
68 } else { 77 } else {
69 last_starting_volume_ = current_volume_; 78 last_starting_volume_ = current_volume_;
70 } 79 }
71 80
72 if (current_volume_ == volume_scale_) { 81 if (current_volume_ == volume_scale_) {
73 if (current_volume_ == 0.0) { 82 if (current_volume_ == 0.0) {
74 return; 83 return;
75 } 84 }
(...skipping 29 matching lines...) Expand all
105 // Scaling samples naively like this takes 0.2% of the CPU's time @ 44100hz 114 // Scaling samples naively like this takes 0.2% of the CPU's time @ 44100hz
106 // on pineapple. 115 // on pineapple.
107 // Assumes 2 channel audio. 116 // Assumes 2 channel audio.
108 bool SlewVolume::ProcessInterleaved(int32_t* data, int frames) { 117 bool SlewVolume::ProcessInterleaved(int32_t* data, int frames) {
109 DCHECK(data); 118 DCHECK(data);
110 119
111 if (!frames) { 120 if (!frames) {
112 return true; 121 return true;
113 } 122 }
114 123
124 interrupted_ = false;
115 if (current_volume_ == volume_scale_) { 125 if (current_volume_ == volume_scale_) {
116 if (current_volume_ == 1.0) { 126 if (current_volume_ == 1.0) {
117 return true; 127 return true;
118 } 128 }
119 for (int i = 0; i < 2 * frames; ++i) { 129 for (int i = 0; i < 2 * frames; ++i) {
120 data[i] *= current_volume_; 130 data[i] *= current_volume_;
121 } 131 }
122 return true; 132 return true;
123 } else if (current_volume_ < volume_scale_) { 133 } else if (current_volume_ < volume_scale_) {
124 do { 134 do {
(...skipping 27 matching lines...) Expand all
152 } 162 }
153 163
154 for (int i = 0; i < 2 * frames; ++i) { 164 for (int i = 0; i < 2 * frames; ++i) {
155 data[i] *= current_volume_; 165 data[i] *= current_volume_;
156 } 166 }
157 return true; 167 return true;
158 } 168 }
159 169
160 } // namespace media 170 } // namespace media
161 } // namespace chromecast 171 } // namespace chromecast
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698