Browse Source

Try a rix fix

louyihua 8 years ago
parent
commit
6a4577ed0e
4 changed files with 59 additions and 43 deletions
  1. 49 37
      adplug/rix.cpp
  2. 8 3
      adplug/rix.h
  3. 1 2
      rixplay.cpp
  4. 1 1
      sdlpal.vcxproj

+ 49 - 37
adplug/rix.cpp

@@ -74,7 +74,9 @@ CPlayer *CrixPlayer::factory(Copl *newopl)
 
 CrixPlayer::CrixPlayer(Copl *newopl)
   : CPlayer(newopl), flag_mkf(0), file_buffer(0), rix_buf(0)
+#if USE_RIX_EXTRA_INIT
 	, extra_regs(NULL), extra_vals(NULL), extra_length(0)
+#endif
 {
 }
 
@@ -82,8 +84,10 @@ CrixPlayer::~CrixPlayer()
 {
   if(file_buffer)
     delete [] file_buffer;
+#if USE_RIX_EXTRA_INIT
   if (extra_regs) delete[] extra_regs;
   if (extra_vals) delete[] extra_vals;
+#endif
 }
 
 #if USE_RIX_EXTRA_INIT
@@ -139,45 +143,53 @@ bool CrixPlayer::update()
 	return !play_end;
 }
 
-void CrixPlayer::rewind(int subsong)
-{
-  I = 0; T = 0;
-  mus_block = 0;
-  ins_block = 0;
-  rhythm = 0;
-  music_on = 0;
-  pause_flag = 0;
-  band = 0;
-  band_low = 0;
-  e0_reg_flag = 0;
-  bd_modify = 0;
-  sustain = 0;
-  play_end = 0;
-  pos = index = 0; 
+void CrixPlayer::rewind(int subsong, bool reinit)
+{
+	play_end = 0;
+	pos = 0;
 
-  memset(f_buffer,   0,     sizeof(f_buffer));
-  memset(a0b0_data2, 0,     sizeof(a0b0_data2));
-  memset(a0b0_data3, 0,     sizeof(a0b0_data3));
-  memset(a0b0_data4, 0,     sizeof(a0b0_data4));
-  memset(a0b0_data5, 0,     sizeof(a0b0_data5));
-  memset(addrs_head, 0,     sizeof(addrs_head));
-  memset(insbuf,     0,     sizeof(insbuf));
-  memset(displace,   0,     sizeof(displace));
-  memset(reg_bufs,   0,     sizeof(reg_bufs));
-  memset(for40reg,   0x7F,  sizeof(for40reg));
+	if (reinit)
+	{
+		I = 0; T = 0;
+		mus_block = 0;
+		ins_block = 0;
+		rhythm = 0;
+		music_on = 0;
+		pause_flag = 0;
+		band = 0;
+		band_low = 0;
+		e0_reg_flag = 0;
+		bd_modify = 0;
+		sustain = 0;
 
-  if(flag_mkf)
-  {
-	  uint32_t *buf_index=(uint32_t *)file_buffer;
-	  int offset1=RIX_SWAP32(buf_index[subsong]),offset2;
-	  while((offset2=RIX_SWAP32(buf_index[++subsong]))==offset1);
-	  length=offset2-offset1+1;
-	  rix_buf=file_buffer+offset1;
-  }
-  //opl->init();	// disable for seamless continuance
-  opl->write(1,32);	// go to OPL2 mode
-  set_new_int();
-  data_initial();
+		memset(f_buffer, 0, sizeof(f_buffer));
+		memset(a0b0_data2, 0, sizeof(a0b0_data2));
+		memset(a0b0_data3, 0, sizeof(a0b0_data3));
+		memset(a0b0_data4, 0, sizeof(a0b0_data4));
+		memset(a0b0_data5, 0, sizeof(a0b0_data5));
+		memset(addrs_head, 0, sizeof(addrs_head));
+		memset(insbuf, 0, sizeof(insbuf));
+		memset(displace, 0, sizeof(displace));
+		memset(reg_bufs, 0, sizeof(reg_bufs));
+		memset(for40reg, 0x7F, sizeof(for40reg));
+	}
+
+	if (flag_mkf)
+	{
+		uint32_t *buf_index = (uint32_t *)file_buffer;
+		int offset1 = RIX_SWAP32(buf_index[subsong]), offset2;
+		while ((offset2 = RIX_SWAP32(buf_index[++subsong])) == offset1);
+		length = offset2 - offset1 + 1;
+		rix_buf = file_buffer + offset1;
+	}
+
+	if (reinit)
+	{
+		opl->init();
+		opl->write(1, 32);	// go to OPL2 mode
+		set_new_int();
+		data_initial();
+	}
 }
 
 unsigned int CrixPlayer::getsubsongs()

+ 8 - 3
adplug/rix.h

@@ -41,7 +41,8 @@ class CrixPlayer: public CPlayer
 
   bool load(const std::string &filename, const CFileProvider &fp);
   bool update();
-  void rewind(int subsong);
+  void rewind(int subsong) { rewind(subsong, true); }
+  void rewind(int subsong, bool reinit); /* For seamless continous */
   float getrefresh();
   unsigned int getsubsongs();
 
@@ -58,8 +59,10 @@ class CrixPlayer: public CPlayer
   } ADDT;
 
   int flag_mkf;
+#if USE_RIX_EXTRA_INIT
   uint32_t *extra_regs;
   uint8_t *extra_vals;
+#endif
   uint8_t *file_buffer;
   uint8_t *rix_buf;  /* rix files' f_buffer */
   uint16_t f_buffer[300];//9C0h-C18h
@@ -71,8 +74,10 @@ class CrixPlayer: public CPlayer
   uint16_t insbuf[28];
   uint16_t displace[11];
   ADDT reg_bufs[18];
-  uint32_t pos,length, extra_length;
-  uint8_t index;
+  uint32_t pos, length;
+#if USE_RIX_EXTRA_INIT
+  uint32_t extra_length;
+#endif
 
   static const uint8_t adflag[18];
   static const uint8_t reg_data[18];

+ 1 - 2
rixplay.cpp

@@ -135,7 +135,6 @@ RIX_FillBuffer(
 						pRixPlayer->dwStartFadeTime = SDL_GetTicks();
 					pRixPlayer->iTotalFadeOutSamples = 0;
 					pRixPlayer->iRemainingFadeSamples = pRixPlayer->iTotalFadeInSamples;
-					pRixPlayer->opl->init();
 					pRixPlayer->rix->rewind(pRixPlayer->iCurrentMusic);
 					if (pRixPlayer->resampler[0]) resampler_clear(pRixPlayer->resampler[0]);
 					if (pRixPlayer->resampler[1]) resampler_clear(pRixPlayer->resampler[1]);
@@ -192,7 +191,7 @@ RIX_FillBuffer(
 						}
 						return;
 					}
-					pRixPlayer->rix->rewind(pRixPlayer->iCurrentMusic);
+					pRixPlayer->rix->rewind(pRixPlayer->iCurrentMusic, false);
 					if (!pRixPlayer->rix->update())
 					{
 						//

+ 1 - 1
sdlpal.vcxproj

@@ -54,7 +54,7 @@
     </Midl>
     <ClCompile>
       <AdditionalIncludeDirectories>..\SDL2-2.0.3\include;.\liboggvorbis\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>USE_RIX_EXTRA_INIT;WIN32;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WIN32;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <FunctionLevelLinking>true</FunctionLevelLinking>
       <WarningLevel>Level3</WarningLevel>