+namespace {
+
+void apply_gain(float db, float last_db, vector<float> *samples)
+{
+ if (fabs(db - last_db) < 1e-3) {
+ // Constant over this frame.
+ const float gain = from_db(db);
+ for (size_t i = 0; i < samples->size(); ++i) {
+ (*samples)[i] *= gain;
+ }
+ } else {
+ // We need to do a fade.
+ unsigned num_samples = samples->size() / 2;
+ float gain = from_db(last_db);
+ const float gain_inc = pow(from_db(db - last_db), 1.0 / num_samples);
+ for (size_t i = 0; i < num_samples; ++i) {
+ (*samples)[i * 2 + 0] *= gain;
+ (*samples)[i * 2 + 1] *= gain;
+ gain *= gain_inc;
+ }
+ }
+}
+
+} // namespace
+