summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSND\shalma_cp <SND\shalma_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-11-28 19:48:39 +0000
committerSND\shalma_cp <SND\shalma_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-11-28 19:48:39 +0000
commit6b4d831db0b4c9f64c63d1ce6db05f0abbdb063a (patch)
tree7230d94c1a1fd83e8666c965783fac046fe67458
parent988aa3bbfbc3079ca8f977fad8fadcc729aa5009 (diff)
downloadpcsxr-6b4d831db0b4c9f64c63d1ce6db05f0abbdb063a.tar.gz
Smurf Racer - cdrom.c
- separate left-right attenuation - fix movie volume - eternal compatibility hack - fixme later git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@60309 e17a0e51-4ae3-4d35-97c3-1a29b211df97
-rw-r--r--libpcsxcore/cdrom.c48
1 files changed, 36 insertions, 12 deletions
diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c
index fbba9a4f..3848b8ae 100644
--- a/libpcsxcore/cdrom.c
+++ b/libpcsxcore/cdrom.c
@@ -1977,18 +1977,42 @@ void cdrWrite3(unsigned char rt) {
cdr.LeftVol |= (rt << 0);
}
else if( (cdr.Ctrl & 3) == 3 && rt == 0x20 ) {
-#ifdef CDR_LOG
- CDR_LOG( "CD-XA Volume: %X %X\n", cdr.LeftVol, cdr.RightVol );
-#endif
-
- /*
- Eternal SPU: scale volume from [0-ffff] -> [0,8000]
- - Destruction Derby Raw movies (ff00)
- */
-
- // write CD-XA volumes
- SPU_writeRegister( H_CDLeft, cdr.LeftVol / 2 );
- SPU_writeRegister( H_CDRight, cdr.RightVol / 2 );
+ u16 cdleft, cdright;
+ u8 l1,l2,r1,r2;
+
+#ifdef CDR_LOG
+ CDR_LOG( "CD-XA Volume: %X %X\n", cdr.LeftVol, cdr.RightVol );
+#endif
+
+ // TODO: Use real attenuation (left - right mixer)
+
+ /*
+ Eternal SPU: scale volume from [0-ffff] -> [0,8000]
+ - Destruction Derby Raw - movies (ff00 ff00)
+ - Smurf Racer - movies (00ff 00ff)
+ */
+
+ // Fake attenuation volume hack for Eternal
+ l1 = (cdr.LeftVol >> 8) & 0xff;
+ l2 = (cdr.LeftVol >> 0) & 0xff;
+ r1 = (cdr.RightVol >> 8) & 0xff;
+ r2 = (cdr.RightVol >> 0) & 0xff;
+
+ if( l1 > 0x80 ) l1 = 0x80;
+ if( l2 > 0x80 ) l2 = 0x80;
+ if( r1 > 0x80 ) r1 = 0x80;
+ if( r2 > 0x80 ) r2 = 0x80;
+
+ // spu compatibility volume hack
+ if( l1 == 0 && l2 > 0 ) { l1 = l2; l2 = 0; }
+ if( r1 == 0 && r2 > 0 ) { r1 = r2; r2 = 0; }
+
+ cdleft = (l1 << 8) | l2;
+ cdright = (r1 << 8) | r2;
+
+ // write CD-XA volumes
+ SPU_writeRegister( H_CDLeft, cdleft );
+ SPU_writeRegister( H_CDRight, cdright );
}