Browse Source

Fix rix play

louyihua 8 years ago
parent
commit
2c3f1ef5d4
3 changed files with 21 additions and 6 deletions
  1. 13 0
      resampler.c
  2. 2 0
      resampler.h
  3. 6 6
      rixplay.cpp

+ 13 - 0
resampler.c

@@ -943,3 +943,16 @@ void resampler_remove_sample(void *_r)
         r->read_pos = ( r->read_pos + 1 ) % resampler_buffer_size;
     }
 }
+
+/* Get a 16-bit sample without overflow */
+short resampler_get_and_remove_sample(void *_r)
+{
+	int sample = (int)round(resampler_get_sample(_r) / 256.0);
+	resampler_remove_sample(_r);
+	if (sample >= 32767)
+		return 32767;
+	else if (sample <= -32767)
+		return -32767;
+	else
+		return (short)sample;
+}

+ 2 - 0
resampler.h

@@ -56,6 +56,8 @@ int resampler_get_sample_count(void *);
 int resampler_get_sample(void *);
 void resampler_remove_sample(void *);
 
+short resampler_get_and_remove_sample(void *_r);
+
 #ifdef __cplusplus
 }
 #endif

+ 6 - 6
rixplay.cpp

@@ -226,13 +226,13 @@ RIX_FillBuffer(
                   
                   /* if ( !lanczos_resampler_ready( m_resampler ) ) break; */ /* We assume that by filling the input buffer completely every pass, there will always be samples ready. */
                   
-                  int ls = resampler_get_sample( gpRixPlayer->resampler[0] );
-                  int rs = resampler_get_sample( gpRixPlayer->resampler[1] );
-                  resampler_remove_sample( gpRixPlayer->resampler[0] );
-                  resampler_remove_sample( gpRixPlayer->resampler[1] );
+                  //int ls = resampler_get_sample( gpRixPlayer->resampler[0] );
+                  //int rs = resampler_get_sample( gpRixPlayer->resampler[1] );
+                  //resampler_remove_sample( gpRixPlayer->resampler[0] );
+                  //resampler_remove_sample( gpRixPlayer->resampler[1] );
                   
-                  finalBuf[ samples_written++ ] = ls/256.0;
-                  finalBuf[ samples_written++ ] = rs/256.0;
+                  finalBuf[samples_written++] = resampler_get_and_remove_sample(gpRixPlayer->resampler[0]);
+                  finalBuf[samples_written++] = resampler_get_and_remove_sample(gpRixPlayer->resampler[1]);
                   --sample_count;
               }