diff Plugins/Input/adplug/core/rix.cpp @ 1376:c71e2ef2dcf4 trunk

[svn] Security fixes from AdPlug CVS (their July 7 commit shortly before the secunia announcement).
author chainsaw
date Sat, 08 Jul 2006 08:29:18 -0700
parents 6ad7eb96dd26
children f12d7e208b43
line wrap: on
line diff
--- a/Plugins/Input/adplug/core/rix.cpp	Fri Jul 07 12:42:32 2006 -0700
+++ b/Plugins/Input/adplug/core/rix.cpp	Sat Jul 08 08:29:18 2006 -0700
@@ -53,14 +53,14 @@
 }
 
 CrixPlayer::CrixPlayer(Copl *newopl)
-  : CPlayer(newopl), buf_addr(0)
+  : CPlayer(newopl), flag_mkf(0), file_buffer(0), buf_addr(0)
 {
 }
 
 CrixPlayer::~CrixPlayer()
 {
-  if(buf_addr)
-    delete [] buf_addr;
+  if(file_buffer)
+    delete [] file_buffer;
 }
 
 bool CrixPlayer::load(const std::string &filename, const CFileProvider &fp)
@@ -68,25 +68,28 @@
   binistream *f = fp.open(filename); if(!f) return false;
   unsigned long i=0;
 
-  if(f->readInt(2)!=0x55aa) { fp.close(f);return false; }
-  buf_addr = new unsigned char [fp.filesize(f) + 1];
-  buf_addr[i++]=0xaa;buf_addr[i++]=0x55;
+  if(stricmp(filename.substr(filename.length()-4,4).c_str(),".mkf")==0)
+  {
+	  flag_mkf=1;
+	  f->seek(0);
+	  int offset=f->readInt(4);
+	  f->seek(offset);
+  }
+  if(f->readInt(4)!=0x55aa){ fp.close(f);return false; }
+  file_buffer = new unsigned char [fp.filesize(f) + 1];
+  f->seek(0);
   while(!f->eof())
-    buf_addr[i++]=f->readInt(1);
+	file_buffer[i++]=f->readInt(1);
   length=i;
   fp.close(f);
-
+  if(!flag_mkf)
+	  buf_addr=file_buffer;
   rewind(0);
   return true;
 }
 
 bool CrixPlayer::update()
 {
-	if (delay>100) {
-		delay-=100;   
-    return true;
-  } else delay=1;
-
 	int_08h_entry();
 	return !dro_end;
 }
@@ -104,7 +107,6 @@
   band_low = 0;
   e0_reg_flag = 0;
   bd_modify = 0;
-  delay = 1;
   sustain = 0;
   dro_end = 0;
   pos = index = 0; 
@@ -119,16 +121,37 @@
   memset(displace, 0, 11 * sizeof(unsigned short));
   memset(reg_bufs, 0, 18 * sizeof(ADDT));
 
+  if(flag_mkf)
+  {
+	  unsigned int *buf_index=(unsigned int *)file_buffer;
+	  int offset1=buf_index[subsong],offset2;
+	  while((offset2=buf_index[++subsong])==offset1);
+	  length=offset2-offset1+1;
+	  buf_addr=file_buffer+offset1;
+  }
   opl->init(); 
   opl->write(1,32);	// go to OPL2 mode
   set_new_int();
   data_initial();
 }
+unsigned int CrixPlayer::getsubsongs()
+{
+	if(flag_mkf)
+	{
+		unsigned int *buf_index=(unsigned int *)file_buffer;
+		int songs=buf_index[0]/4,i=0;
+		for(i=0;i<songs;i++)
+			if(buf_index[i+1]==buf_index[i])
+				songs--;
+		return songs;
+	}
+	else
+		return 1;
+}
 
 float CrixPlayer::getrefresh()
 {
-  if (delay > 100) return 1000 / 100;
-  else return 1000.0 / (double)delay;
+	return 70.0f;
 }
 
 /*------------------Implemention----------------------------*/
@@ -239,7 +262,6 @@
 	  mutex++;
 	  band_sus = rix_proc();
 	  if(band_sus) sustain += band_sus;
-			delay=sustain;
 	  mutex--;
 	  if(band_sus == 0)
 	    {
@@ -249,7 +271,7 @@
 	}
       else
 	{
-            if(band_sus) sustain -= 9; /* aging */   
+            if(band_sus) sustain -= 14; /* aging */   
 	  break;
 	}
     }