allStreamsReady = false;
}
+ bool needClamp = false;
for (it = m_streams.begin(); it != m_streams.end() && allStreamsReady; ++it)
{
if ((*it)->m_paused || !(*it)->m_resampleBuffers)
#else
float* fbuffer = (float*) out->pkt->data[j]+i*nb_floats;
for (int k = 0; k < nb_floats; ++k)
- *fbuffer++ *= m_muted ? 0.0 : volume;
+ {
+ fbuffer[k] *= m_muted ? 0.0 : volume;
+ }
#endif
}
}
float *src = (float*)mix->pkt->data[j]+i*nb_floats;
#ifdef __SSE__
CAEUtil::SSEMulAddArray(dst, src, m_muted ? 0.0 : volume, nb_floats);
+ for (int k = 0; k < nb_floats; ++k)
+ {
+ if (fabs(dst[k]) > 1.0f)
+ {
+ needClamp = true;
+ break;
+ }
+ }
#else
for (int k = 0; k < nb_floats; ++k)
- *dst++ += *src++ * m_muted ? 0.0 : volume;
+ {
+ dst[k] += src[k] * m_muted ? 0.0 : volume;
+ if (fabs(dst[k]) > 1.0f)
+ needClamp = true;
+ }
#endif
}
}
}
busy = true;
}
+ }// for
+
+ // finally clamp samples
+ if(out && needClamp)
+ {
+ int nb_floats = out->pkt->nb_samples * out->pkt->config.channels / out->pkt->planes;
+ for(int i=0; i<out->pkt->planes; i++)
+ {
+ CAEUtil::ClampArray((float*)out->pkt->data[i], nb_floats);
+ }
}
// process output buffer, gui sounds, encode, viz