1
0
Fork 0
forked from len0rd/rockbox

It's now possible to select the crossfading mode: "Off, Crossfade,

Mix". If set to mix, no fading is applied but tracks are mixed up.


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7224 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Miika Pekkarinen 2005-07-22 16:46:27 +00:00
parent 4f6375ca17
commit 90161c92dd
9 changed files with 82 additions and 18 deletions

View file

@ -69,6 +69,7 @@ static bool boost_mode;
*/
enum {
CFM_CROSSFADE,
CFM_MIX,
CFM_FLUSH
};
@ -221,7 +222,7 @@ bool pcmbuf_is_lowdata(void)
return false;
}
bool pcmbuf_crossfade_init(void)
bool pcmbuf_crossfade_init(int type)
{
if (pcmbuf_size - audiobuffer_free < CHUNK_SIZE * 8 || !crossfade_enabled
|| crossfade_active || crossfade_init) {
@ -230,7 +231,18 @@ bool pcmbuf_crossfade_init(void)
}
logf("pcmbuf_crossfade_init");
pcmbuf_boost(true);
crossfade_mode = CFM_CROSSFADE;
switch (type) {
case CROSSFADE_MODE_CROSSFADE:
crossfade_mode = CFM_CROSSFADE;
break;
case CROSSFADE_MODE_MIX:
crossfade_mode = CFM_MIX;
break;
default:
return false;
}
crossfade_init = true;
return true;
@ -330,6 +342,7 @@ static void crossfade_start(void)
crossfade_pos = audiobuffer_pos;
switch (crossfade_mode) {
case CFM_MIX:
case CFM_CROSSFADE:
crossfade_amount = (bytesleft - (CHUNK_SIZE * 2))/2;
crossfade_rem = crossfade_amount;
@ -354,6 +367,15 @@ int crossfade(short *buf, const short *buf2, int length)
size = MIN(length, crossfade_rem);
switch (crossfade_mode) {
/* Mix two streams. */
case CFM_MIX:
/* Bias & add & clip. */
for (i = 0; i < size; i++) {
buf[i] = MIN(MAX(buf[i] + buf2[i], -32768), 32767);
}
break ;
/* Fade two streams. */
case CFM_CROSSFADE:
val1 = (crossfade_rem<<10)/crossfade_amount;
val2 = ((crossfade_amount-crossfade_rem)<<10)/crossfade_amount;
@ -363,6 +385,7 @@ int crossfade(short *buf, const short *buf2, int length)
}
break ;
/* Join two streams. */
case CFM_FLUSH:
for (i = 0; i < size; i++) {
buf[i] = buf2[i];