On another note, did you get a chance to try those config.ini settings to see if they help out with the loudness of the music in relation to the ttsd output? If it's really a problem and we need to scale down the ttsd samples, we'll have to find someone on the board who's comfortable tweaking the ARM assembly code that does that dirty work. None of the obvious tweaks I tried seemed to work. Any takers?

__asm__ (
"stmfd r13!, {r0-r12,r14}\n\t"

// initialize registers
"ldr r1, %0\n\t" // r1 = audio_overlay_bg_volume
"ldr r4, %1\n\t" // r4 = pDstSample
"ldr r5, %2\n\t" // r5 = pSrcSample
"mov r6, #2304\n\t" // r6 = loop counter
"sub r6, r6, #1\n\t" // r6 -= 1
"mov r7, #65280\n\t" // r7 = ...
"add r7, r7, #255\n\t" // r7 = 0xFFFF
"mov r8, #32512\n\t" // r8 = ...
"add r8, r8, #255\n\t" // r8 = 32767

".MixLoopStart:\n\t"

// scale destination sample down by fixed-point multiplier
"ldrsh r0, [r4]\n\t" // r0 = *pDstSample
"mov r0, r0, lsl#16\n\t" // r0 <<= 16
"smull r2, r3, r1, r0\n\t" // r2 = lo(r1 * r0), r3 = hi(r1 * r0)
"adc r2, r2, #32768\n\t" // r2 += 32768 + carry
"mov r2, r2, lsr#16\n\t" // r2 >>= 16
"and r3, r3, r7\n\t" // r3 &= r7
"orr r0, r2, r3, lsl#16\n\t" // r0 = r2 | (r3 << 16)

// add source sample to scaled destination sample
"ldrsh r2, [r5]\n\t" // r2 = *pSrcSample
"add r2, r2, r0, asr#16\n\t" // r2 += (r0 >> 16)
// clamp destination sample up
"cmp r2, r8\n\t" // if( r2 > 32767 )
"movgt r2, r8\n\t" // r2 = 32767

// clamp destination sample down
"cmn r2, r8\n\t" // if( r2 < -32768 )
"mvnlt r2, r8\n\t" // r2 = -32768

// put processed sample back to memory
"strh r2, [r4]\n\t" // *pDstSample = r2

"add r4, r4, #2\n\t" // r4 += 2 (get next dst sample pointer)
"add r5, r5, #2\n\t" // r5 += 2 (get next src sample pointer)

// loop back
"subs r6, r6, #1\n\t" // r6 -= 1
"bpl .MixLoopStart\n\t"

"ldmfd r13!, {r0-r12,r14}\n\t"
: // no outputs
: "m" (audio_overlay_bg_volume), "m" (pDstSample), "m" (pSrcSample) );
}

.
_________________________
- Tony C
my empeg stuff