diff options
Diffstat (limited to 'source/apu_blargg.c')
-rw-r--r-- | source/apu_blargg.c | 73 |
1 files changed, 51 insertions, 22 deletions
diff --git a/source/apu_blargg.c b/source/apu_blargg.c index d87d8d3..2976580 100644 --- a/source/apu_blargg.c +++ b/source/apu_blargg.c @@ -761,7 +761,8 @@ V(V9_V6_V3,2) -> V(V9,2) V(V6,3) V(V3,4) */ static void dsp_run( int32_t clocks_remain ) { int32_t phase; - + if (Settings.HardDisableAudio) + return; phase = dsp_m.phase; dsp_m.phase = (phase + clocks_remain) & 31; @@ -2891,7 +2892,6 @@ static int32_t r_left[4], r_right[4]; #define SPACE_EMPTY() (rb_buffer_size - rb_size) #define SPACE_FILLED() (rb_size) #define MAX_WRITE() (SPACE_EMPTY() >> 1) -#define AVAIL() (((((uint32_t) rb_size) << 14) - r_frac) / r_step * 2) #define RESAMPLER_MIN(a, b) ((a) < (b) ? (a) : (b)) #define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) @@ -2934,6 +2934,34 @@ static void resampler_time_ratio(double ratio) static void resampler_read(int16_t *data, int32_t num_samples) { + if (r_step == 65536) + { + //direct copy if we are not resampling + int bytesUntilBufferEnd = rb_buffer_size - rb_start; + while (num_samples > 0) + { + int bytesToConsume = num_samples * sizeof(int16_t); + if (bytesToConsume >= bytesUntilBufferEnd) + { + bytesToConsume = bytesUntilBufferEnd; + } + if (rb_start >= rb_buffer_size) + { + rb_start = 0; + } + memcpy(data, &rb_buffer[rb_start], bytesToConsume); + data += bytesToConsume / sizeof(int16_t); + rb_start += bytesToConsume; + rb_size -= bytesToConsume; + num_samples -= bytesToConsume / sizeof(int16_t); + if (rb_start >= rb_buffer_size) + { + rb_start = 0; + } + } + return; + } + int32_t i_position, o_position, consumed; int16_t *internal_buffer; @@ -2944,16 +2972,13 @@ static void resampler_read(int16_t *data, int32_t num_samples) while (o_position < num_samples && consumed < rb_buffer_size) { - int32_t s_left, s_right, max_samples; - int32_t hermite_val; - - s_left = internal_buffer[i_position]; - s_right = internal_buffer[i_position + 1]; - max_samples = rb_buffer_size >> 1; + int32_t s_left = internal_buffer[i_position]; + int32_t s_right = internal_buffer[i_position + 1]; + int32_t max_samples = rb_buffer_size >> 1; while (r_frac <= 65536 && o_position < num_samples) { - hermite_val = hermite(r_frac >> 1, r_left [0], r_left [1], r_left [2], r_left [3]); + int32_t hermite_val = hermite(r_frac >> 1, r_left [0], r_left [1], r_left [2], r_left [3]); data[o_position] = SHORT_CLAMP (hermite_val); hermite_val = hermite(r_frac >> 1, r_right[0], r_right[1], r_right[2], r_right[3]); data[o_position + 1] = SHORT_CLAMP (hermite_val); @@ -3005,10 +3030,9 @@ static void resampler_new(int32_t num_samples) static INLINE bool resampler_push(int16_t *src, int32_t num_samples) { - int32_t bytes, end, first_write_size; - uint8_t *src_ring; - - bytes = num_samples << 1; + int32_t end, first_write_size; + uint8_t *src_ring; + int32_t bytes = num_samples << 1; if (MAX_WRITE() < num_samples || SPACE_EMPTY() < bytes) return false; @@ -3045,7 +3069,7 @@ static INLINE void resampler_resize (int32_t num_samples) bool S9xMixSamples (int16_t *buffer, uint32_t sample_count) { - if (AVAIL() >= (sample_count + lag)) + if (S9xGetSampleCount() >= (sample_count + lag)) { resampler_read(buffer, sample_count); if (lag == lag_master) @@ -3065,16 +3089,18 @@ bool S9xMixSamples (int16_t *buffer, uint32_t sample_count) int32_t S9xGetSampleCount() { - return AVAIL(); + if (r_step == 65536) + return rb_size / sizeof(int16_t); + return (((((uint32_t)rb_size) << 14) - r_frac) / r_step * 2); } /* Sets destination for output samples */ static void spc_set_output( int16_t* out, int32_t size ) { - int16_t *out_end, *in; + int16_t *in; + int16_t *out_end = out + size; - out_end = out + size; m.buf_begin = out; m.buf_end = out_end; @@ -3098,11 +3124,9 @@ static void spc_set_output( int16_t* out, int32_t size ) dsp_set_output( out, out_end - out ); } -void S9xFinalizeSamples() +void S9xFinalizeSamples(void) { - bool ret; - - ret = resampler_push(landing_buffer, SPC_SAMPLE_COUNT()); + bool ret = resampler_push(landing_buffer, SPC_SAMPLE_COUNT()); sound_in_sync = false; /* We weren't able to process the entire buffer. Potential overrun. */ @@ -3116,7 +3140,7 @@ void S9xFinalizeSamples() spc_set_output(landing_buffer, buffer_size); } -void S9xClearSamples() +void S9xClearSamples(void) { resampler_clear(); lag = lag_master; @@ -3236,6 +3260,11 @@ static int8_t const reg_times_ [256] = 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, }; +void S9xSetSoundMute(bool mute) +{ + Settings.Mute = mute; +} + bool S9xInitAPU() { int32_t i; |