| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 142 initialized_ = true; | 142 initialized_ = true; |
| 143 return 0; | 143 return 0; |
| 144 } | 144 } |
| 145 | 145 |
| 146 // Reset tone generator to uninitialized state. | 146 // Reset tone generator to uninitialized state. |
| 147 void DtmfToneGenerator::Reset() { | 147 void DtmfToneGenerator::Reset() { |
| 148 initialized_ = false; | 148 initialized_ = false; |
| 149 } | 149 } |
| 150 | 150 |
| 151 // Generate num_samples of DTMF signal and write to |output|. | 151 // Generate num_samples of DTMF signal and write to |output|. |
| 152 int DtmfToneGenerator::Generate(int num_samples, | 152 int DtmfToneGenerator::Generate(size_t num_samples, |
| 153 AudioMultiVector* output) { | 153 AudioMultiVector* output) { |
| 154 if (!initialized_) { | 154 if (!initialized_) { |
| 155 return kNotInitialized; | 155 return kNotInitialized; |
| 156 } | 156 } |
| 157 | 157 |
| 158 if (num_samples < 0 || !output) { | 158 if (!output) { |
| 159 return kParameterError; | 159 return kParameterError; |
| 160 } | 160 } |
| 161 | 161 |
| 162 output->AssertSize(num_samples); | 162 output->AssertSize(num_samples); |
| 163 for (int i = 0; i < num_samples; ++i) { | 163 for (size_t i = 0; i < num_samples; ++i) { |
| 164 // Use recursion formula y[n] = a * y[n - 1] - y[n - 2]. | 164 // Use recursion formula y[n] = a * y[n - 1] - y[n - 2]. |
| 165 int16_t temp_val_low = ((coeff1_ * sample_history1_[1] + 8192) >> 14) | 165 int16_t temp_val_low = ((coeff1_ * sample_history1_[1] + 8192) >> 14) |
| 166 - sample_history1_[0]; | 166 - sample_history1_[0]; |
| 167 int16_t temp_val_high = ((coeff2_ * sample_history2_[1] + 8192) >> 14) | 167 int16_t temp_val_high = ((coeff2_ * sample_history2_[1] + 8192) >> 14) |
| 168 - sample_history2_[0]; | 168 - sample_history2_[0]; |
| 169 | 169 |
| 170 // Update recursion memory. | 170 // Update recursion memory. |
| 171 sample_history1_[0] = sample_history1_[1]; | 171 sample_history1_[0] = sample_history1_[1]; |
| 172 sample_history1_[1] = temp_val_low; | 172 sample_history1_[1] = temp_val_low; |
| 173 sample_history2_[0] = sample_history2_[1]; | 173 sample_history2_[0] = sample_history2_[1]; |
| 174 sample_history2_[1] = temp_val_high; | 174 sample_history2_[1] = temp_val_high; |
| 175 | 175 |
| 176 // Attenuate the low frequency tone 3 dB. | 176 // Attenuate the low frequency tone 3 dB. |
| 177 int32_t temp_val = kAmpMultiplier * temp_val_low + (temp_val_high << 15); | 177 int32_t temp_val = kAmpMultiplier * temp_val_low + (temp_val_high << 15); |
| 178 // Normalize the signal to Q14 with proper rounding. | 178 // Normalize the signal to Q14 with proper rounding. |
| 179 temp_val = (temp_val + 16384) >> 15; | 179 temp_val = (temp_val + 16384) >> 15; |
| 180 // Scale the signal to correct volume. | 180 // Scale the signal to correct volume. |
| 181 (*output)[0][i] = | 181 (*output)[0][i] = |
| 182 static_cast<int16_t>((temp_val * amplitude_ + 8192) >> 14); | 182 static_cast<int16_t>((temp_val * amplitude_ + 8192) >> 14); |
| 183 } | 183 } |
| 184 // Copy first channel to all other channels. | 184 // Copy first channel to all other channels. |
| 185 for (size_t channel = 1; channel < output->Channels(); ++channel) { | 185 for (size_t channel = 1; channel < output->Channels(); ++channel) { |
| 186 output->CopyChannel(0, channel); | 186 output->CopyChannel(0, channel); |
| 187 } | 187 } |
| 188 | 188 |
| 189 return num_samples; | 189 return static_cast<int>(num_samples); |
| 190 } | 190 } |
| 191 | 191 |
| 192 bool DtmfToneGenerator::initialized() const { | 192 bool DtmfToneGenerator::initialized() const { |
| 193 return initialized_; | 193 return initialized_; |
| 194 } | 194 } |
| 195 | 195 |
| 196 } // namespace webrtc | 196 } // namespace webrtc |
| OLD | NEW |