mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-09 00:04:56 +01:00
don't apply inverse fades if a region is not acoustically opaque
git-svn-id: svn://localhost/ardour2/branches/3.0@12294 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
fc334a06b5
commit
2fb30ea54d
1 changed files with 55 additions and 45 deletions
|
|
@ -620,36 +620,42 @@ AudioRegion::read_at (Sample *buf, Sample *mixdown_buffer, float *gain_buffer,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (fade_in_limit != 0) {
|
if (fade_in_limit != 0) {
|
||||||
if (_inverse_fade_in) {
|
|
||||||
|
|
||||||
/* explicit inverse fade in curve (e.g. for constant
|
if (opaque()) {
|
||||||
* power), so we have to fetch it.
|
if (_inverse_fade_in) {
|
||||||
*/
|
|
||||||
|
|
||||||
_inverse_fade_in->curve().get_vector (internal_offset, internal_offset + fade_in_limit, gain_buffer, fade_in_limit);
|
/* explicit inverse fade in curve (e.g. for constant
|
||||||
|
* power), so we have to fetch it.
|
||||||
|
*/
|
||||||
|
|
||||||
/* Fade the data from lower layers out */
|
_inverse_fade_in->curve().get_vector (internal_offset, internal_offset + fade_in_limit, gain_buffer, fade_in_limit);
|
||||||
for (framecnt_t n = 0; n < fade_in_limit; ++n) {
|
|
||||||
buf[n] *= gain_buffer[n];
|
/* Fade the data from lower layers out */
|
||||||
|
for (framecnt_t n = 0; n < fade_in_limit; ++n) {
|
||||||
|
buf[n] *= gain_buffer[n];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* refill gain buffer with the fade in */
|
||||||
|
|
||||||
|
_fade_in->curve().get_vector (internal_offset, internal_offset + fade_in_limit, gain_buffer, fade_in_limit);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
/* no explicit inverse fade in, so just use (1 - fade
|
||||||
|
* in) for the fade out of lower layers
|
||||||
|
*/
|
||||||
|
|
||||||
|
_fade_in->curve().get_vector (internal_offset, internal_offset + fade_in_limit, gain_buffer, fade_in_limit);
|
||||||
|
|
||||||
|
for (framecnt_t n = 0; n < fade_in_limit; ++n) {
|
||||||
|
buf[n] *= 1 - gain_buffer[n];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* refill gain buffer with the fade in */
|
|
||||||
|
|
||||||
_fade_in->curve().get_vector (internal_offset, internal_offset + fade_in_limit, gain_buffer, fade_in_limit);
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
/* no explicit inverse fade in, so just use (1 - fade
|
|
||||||
* in) for the fade out of lower layers
|
|
||||||
*/
|
|
||||||
|
|
||||||
_fade_in->curve().get_vector (internal_offset, internal_offset + fade_in_limit, gain_buffer, fade_in_limit);
|
_fade_in->curve().get_vector (internal_offset, internal_offset + fade_in_limit, gain_buffer, fade_in_limit);
|
||||||
|
|
||||||
for (framecnt_t n = 0; n < fade_in_limit; ++n) {
|
|
||||||
buf[n] *= 1 - gain_buffer[n];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Mix our newly-read data in, with the fade */
|
/* Mix our newly-read data in, with the fade */
|
||||||
for (framecnt_t n = 0; n < fade_in_limit; ++n) {
|
for (framecnt_t n = 0; n < fade_in_limit; ++n) {
|
||||||
buf[n] += mixdown_buffer[n] * gain_buffer[n];
|
buf[n] += mixdown_buffer[n] * gain_buffer[n];
|
||||||
|
|
@ -660,30 +666,34 @@ AudioRegion::read_at (Sample *buf, Sample *mixdown_buffer, float *gain_buffer,
|
||||||
|
|
||||||
framecnt_t const curve_offset = fade_interval_start - (_length - _fade_out->back()->when);
|
framecnt_t const curve_offset = fade_interval_start - (_length - _fade_out->back()->when);
|
||||||
|
|
||||||
if (_inverse_fade_out) {
|
if (opaque()) {
|
||||||
|
if (_inverse_fade_out) {
|
||||||
|
|
||||||
_inverse_fade_out->curve().get_vector (curve_offset, curve_offset + fade_out_limit, gain_buffer, fade_out_limit);
|
_inverse_fade_out->curve().get_vector (curve_offset, curve_offset + fade_out_limit, gain_buffer, fade_out_limit);
|
||||||
|
|
||||||
/* Fade the data from lower levels out */
|
/* Fade the data from lower levels out */
|
||||||
for (framecnt_t n = 0, m = fade_out_offset; n < fade_out_limit; ++n, ++m) {
|
for (framecnt_t n = 0, m = fade_out_offset; n < fade_out_limit; ++n, ++m) {
|
||||||
buf[m] *= gain_buffer[n];
|
buf[m] *= gain_buffer[n];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* fetch the actual fade out */
|
||||||
|
|
||||||
|
_fade_out->curve().get_vector (curve_offset, curve_offset + fade_out_limit, gain_buffer, fade_out_limit);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
/* no explicit inverse fade out, so just use (1 - fade
|
||||||
|
* out) for the fade in of lower layers
|
||||||
|
*/
|
||||||
|
|
||||||
|
_fade_out->curve().get_vector (curve_offset, curve_offset + fade_out_limit, gain_buffer, fade_out_limit);
|
||||||
|
|
||||||
|
for (framecnt_t n = 0, m = fade_out_offset; n < fade_out_limit; ++n, ++m) {
|
||||||
|
buf[m] *= 1 - gain_buffer[n];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* fetch the actual fade out */
|
|
||||||
|
|
||||||
_fade_out->curve().get_vector (curve_offset, curve_offset + fade_out_limit, gain_buffer, fade_out_limit);
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
/* no explicit inverse fade out, so just use (1 - fade
|
|
||||||
* out) for the fade in of lower layers
|
|
||||||
*/
|
|
||||||
|
|
||||||
_fade_out->curve().get_vector (curve_offset, curve_offset + fade_out_limit, gain_buffer, fade_out_limit);
|
_fade_out->curve().get_vector (curve_offset, curve_offset + fade_out_limit, gain_buffer, fade_out_limit);
|
||||||
|
|
||||||
for (framecnt_t n = 0, m = fade_out_offset; n < fade_out_limit; ++n, ++m) {
|
|
||||||
buf[m] *= 1 - gain_buffer[n];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Mix our newly-read data out, with the fade */
|
/* Mix our newly-read data out, with the fade */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue