From 0a9200fa59018ce04c96047a9bd0b358dda5737b Mon Sep 17 00:00:00 2001 From: CasualPokePlayer <50538166+CasualPokePlayer@users.noreply.github.com> Date: Thu, 17 Feb 2022 00:30:38 -0800 Subject: [PATCH] Sameboy blip buf (#3154) * blip buf experiment * do this without needing to modify core * Delete blip_buf.os * dont bother keeping a sbuf in biz_t * darn space/tabbing --- Assets/dll/libsameboy.dll | Bin 273408 -> 276992 bytes Assets/dll/libsameboy.so | Bin 232984 -> 233048 bytes .../Consoles/Nintendo/SameBoy/LibSameBoy.cs | 8 +- .../Nintendo/SameBoy/SameBoy.IEmulator.cs | 2 +- .../SameBoy/SameBoy.ISoundProvider.cs | 8 - .../Consoles/Nintendo/SameBoy/SameBoy.cs | 3 - submodules/sameboy/.gitignore | 1 + submodules/sameboy/BizInterface.c | 47 ++- submodules/sameboy/SConstruct | 2 +- submodules/sameboy/blip_buf.c | 344 ++++++++++++++++++ submodules/sameboy/blip_buf.h | 72 ++++ 11 files changed, 460 insertions(+), 27 deletions(-) create mode 100644 submodules/sameboy/blip_buf.c create mode 100644 submodules/sameboy/blip_buf.h diff --git a/Assets/dll/libsameboy.dll b/Assets/dll/libsameboy.dll index f5b96c40a849748a8c14fd8fe7807fd1cd77e80c..1fa20ff8b70e8e85678888320c969089a1b682af 100644 GIT binary patch delta 24526 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 delta 21261 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 DxoQJP diff --git a/Assets/dll/libsameboy.so b/Assets/dll/libsameboy.so index f58a8101a1d00a8d10f6e98b3713f3229e3ac975..cc6e53d5eca1c3b0231cbb0594bd0489a9752789 100755 GIT binary patch delta 52258 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 LibSameboy.sameboy_iscgbdmg(SameboyState); - private readonly LibSameboy.SampleCallback _samplecb; private readonly LibSameboy.InputCallback _inputcb; [CoreConstructor(VSystemID.Raw.GB)] @@ -80,8 +79,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.Sameboy InitMemoryDomains(); InitMemoryCallbacks(); - _samplecb = QueueSample; - LibSameboy.sameboy_setsamplecallback(SameboyState, _samplecb); _inputcb = InputCallback; LibSameboy.sameboy_setinputcallback(SameboyState, _inputcb); _tracecb = MakeTrace; diff --git a/submodules/sameboy/.gitignore b/submodules/sameboy/.gitignore index c0f5fd20ae..e6e61f31d1 100644 --- a/submodules/sameboy/.gitignore +++ b/submodules/sameboy/.gitignore @@ -1,5 +1,6 @@ .sconsign.dblite BizInterface.os +blip_buf.os config.log libsameboy.dll.a .sconf_temp diff --git a/submodules/sameboy/BizInterface.c b/submodules/sameboy/BizInterface.c index 91cf061c19..67dbaa3b8d 100644 --- a/submodules/sameboy/BizInterface.c +++ b/submodules/sameboy/BizInterface.c @@ -1,4 +1,5 @@ #include "gb.h" +#include "blip_buf.h" #include "stdio.h" #ifdef _WIN32 @@ -7,6 +8,8 @@ #define EXPORT __attribute__((visibility("default"))) #endif +typedef int16_t s16; + typedef uint8_t u8; typedef uint16_t u16; typedef uint32_t u32; @@ -29,6 +32,10 @@ typedef void (*scanline_callback_t)(u32); typedef struct { GB_gameboy_t gb; + blip_t* blip_l; + blip_t* blip_r; + GB_sample_t latch; + GB_sample_t sample; u32 vbuf[256 * 224]; u32 bg_pal[0x20]; u32 obj_pal[0x20]; @@ -50,6 +57,13 @@ static u8 PeekIO(biz_t* biz, u8 addr) return io[addr]; } +static void sample_cb(GB_gameboy_t *gb, GB_sample_t* sample) +{ + biz_t* biz = (biz_t*)gb; + biz->sample.left = sample->left; + biz->sample.right = sample->right; +} + static u32 rgb_cb(GB_gameboy_t *gb, u8 r, u8 g, u8 b) { return (0xFF << 24) | (r << 16) | (g << 8) | b; @@ -106,25 +120,27 @@ EXPORT biz_t* sameboy_create(u8* romdata, u32 romlen, u8* biosdata, u32 bioslen, GB_init(&biz->gb, model); GB_load_rom_from_buffer(&biz->gb, romdata, romlen); GB_load_boot_rom_from_buffer(&biz->gb, biosdata, bioslen); - GB_set_sample_rate(&biz->gb, 44100); + GB_set_sample_rate(&biz->gb, GB_get_clock_rate(&biz->gb) / 2); + GB_apu_set_sample_callback(&biz->gb, sample_cb); GB_set_rgb_encode_callback(&biz->gb, rgb_cb); GB_set_vblank_callback(&biz->gb, vblank_cb); GB_set_rtc_mode(&biz->gb, realtime ? GB_RTC_MODE_SYNC_TO_HOST : GB_RTC_MODE_ACCURATE); GB_set_allow_illegal_inputs(&biz->gb, true); + biz->blip_l = blip_new(1024); + biz->blip_r = blip_new(1024); + blip_set_rates(biz->blip_l, GB_get_clock_rate(&biz->gb) / 2, 44100); + blip_set_rates(biz->blip_r, GB_get_clock_rate(&biz->gb) / 2, 44100); return biz; } EXPORT void sameboy_destroy(biz_t* biz) { GB_free(&biz->gb); + blip_delete(biz->blip_l); + blip_delete(biz->blip_r); free(biz); } -EXPORT void sameboy_setsamplecallback(biz_t* biz, GB_sample_callback_t callback) -{ - GB_apu_set_sample_callback(&biz->gb, callback); -} - EXPORT void sameboy_setinputcallback(biz_t* biz, input_callback_t callback) { biz->input_cb = callback; @@ -135,7 +151,7 @@ static double FromRawToG(u16 raw) return (raw - 0x81D0) / (0x70 * 1.0); } -EXPORT void sameboy_frameadvance(biz_t* biz, GB_key_mask_t keys, u16 x, u16 y, u32* vbuf, bool render, bool border) +EXPORT void sameboy_frameadvance(biz_t* biz, GB_key_mask_t keys, u16 x, u16 y, s16* sbuf, u32* nsamp, u32* vbuf, bool render, bool border) { GB_set_key_mask(&biz->gb, keys); if (GB_has_accelerometer(&biz->gb)) @@ -165,9 +181,26 @@ EXPORT void sameboy_frameadvance(biz_t* biz, GB_key_mask_t keys, u16 x, u16 y, u { biz->input_cb(); } + if (biz->latch.left != biz->sample.left) + { + blip_add_delta(biz->blip_l, cycles, biz->latch.left - biz->sample.left); + biz->latch.left = biz->sample.left; + } + if (biz->latch.right != biz->sample.right) + { + blip_add_delta(biz->blip_r, cycles, biz->latch.right - biz->sample.right); + biz->latch.right = biz->sample.right; + } } while (!biz->vblank_occured && cycles < 35112); + blip_end_frame(biz->blip_l, cycles); + blip_end_frame(biz->blip_r, cycles); + u32 samps = blip_samples_avail(biz->blip_l); + blip_read_samples(biz->blip_l, sbuf + 0, samps, 1); + blip_read_samples(biz->blip_r, sbuf + 1, samps, 1); + *nsamp = samps; + if (biz->vblank_occured && render) { memcpy(vbuf, biz->vbuf, sizeof biz->vbuf); diff --git a/submodules/sameboy/SConstruct b/submodules/sameboy/SConstruct index c50a8385b2..1c563a218d 100644 --- a/submodules/sameboy/SConstruct +++ b/submodules/sameboy/SConstruct @@ -31,7 +31,7 @@ conf = env.Configure() conf.Finish() -shlib = env.SharedLibrary('sameboy', sourceFiles + ['BizInterface.c'], +shlib = env.SharedLibrary('sameboy', sourceFiles + ['BizInterface.c'] + ['blip_buf.c'], LINKFLAGS = env['LINKFLAGS'] + ' -s -Wno-attributes', SHLIBPREFIX = "lib") diff --git a/submodules/sameboy/blip_buf.c b/submodules/sameboy/blip_buf.c new file mode 100644 index 0000000000..362eede49a --- /dev/null +++ b/submodules/sameboy/blip_buf.c @@ -0,0 +1,344 @@ +/* blip_buf 1.1.0. http://www.slack.net/~ant/ */ + +#include "blip_buf.h" + +#include +#include +#include +#include + +/* Library Copyright (C) 2003-2009 Shay Green. This library is free software; +you can redistribute it and/or modify it under the terms of the GNU Lesser +General Public License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. This +library is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. You should have received a copy of the GNU Lesser General Public +License along with this module; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +#if defined (BLARGG_TEST) && BLARGG_TEST + #include "blargg_test.h" +#endif + +/* Equivalent to ULONG_MAX >= 0xFFFFFFFF00000000. +Avoids constants that don't fit in 32 bits. */ +#if ULONG_MAX/0xFFFFFFFF > 0xFFFFFFFF + typedef unsigned long fixed_t; + enum { pre_shift = 32 }; + +#elif defined(ULLONG_MAX) + typedef unsigned long long fixed_t; + enum { pre_shift = 32 }; + +#else + typedef unsigned fixed_t; + enum { pre_shift = 0 }; + +#endif + +enum { time_bits = pre_shift + 20 }; + +static fixed_t const time_unit = (fixed_t) 1 << time_bits; + +enum { bass_shift = 9 }; /* affects high-pass filter breakpoint frequency */ +enum { end_frame_extra = 2 }; /* allows deltas slightly after frame length */ + +enum { half_width = 8 }; +enum { buf_extra = half_width*2 + end_frame_extra }; +enum { phase_bits = 5 }; +enum { phase_count = 1 << phase_bits }; +enum { delta_bits = 15 }; +enum { delta_unit = 1 << delta_bits }; +enum { frac_bits = time_bits - pre_shift }; + +/* We could eliminate avail and encode whole samples in offset, but that would +limit the total buffered samples to blip_max_frame. That could only be +increased by decreasing time_bits, which would reduce resample ratio accuracy. +*/ + +/** Sample buffer that resamples to output rate and accumulates samples +until they're read out */ +struct blip_t +{ + fixed_t factor; + fixed_t offset; + int avail; + int size; + int integrator; +}; + +typedef int buf_t; + +/* probably not totally portable */ +#define SAMPLES( buf ) ((buf_t*) ((buf) + 1)) + +/* Arithmetic (sign-preserving) right shift */ +#define ARITH_SHIFT( n, shift ) \ + ((n) >> (shift)) + +enum { max_sample = +32767 }; +enum { min_sample = -32768 }; + +#define CLAMP( n ) \ + {\ + if ( (short) n != n )\ + n = ARITH_SHIFT( n, 16 ) ^ max_sample;\ + } + +static void check_assumptions( void ) +{ + int n; + + #if INT_MAX < 0x7FFFFFFF || UINT_MAX < 0xFFFFFFFF + #error "int must be at least 32 bits" + #endif + + assert( (-3 >> 1) == -2 ); /* right shift must preserve sign */ + + n = max_sample * 2; + CLAMP( n ); + assert( n == max_sample ); + + n = min_sample * 2; + CLAMP( n ); + assert( n == min_sample ); + + assert( blip_max_ratio <= time_unit ); + assert( blip_max_frame <= (fixed_t) -1 >> time_bits ); +} + +blip_t* blip_new( int size ) +{ + blip_t* m; + assert( size >= 0 ); + + m = (blip_t*) malloc( sizeof *m + (size + buf_extra) * sizeof (buf_t) ); + if ( m ) + { + m->factor = time_unit / blip_max_ratio; + m->size = size; + blip_clear( m ); + check_assumptions(); + } + return m; +} + +void blip_delete( blip_t* m ) +{ + if ( m != NULL ) + { + /* Clear fields in case user tries to use after freeing */ + memset( m, 0, sizeof *m ); + free( m ); + } +} + +void blip_set_rates( blip_t* m, double clock_rate, double sample_rate ) +{ + double factor = time_unit * sample_rate / clock_rate; + m->factor = (fixed_t) factor; + + /* Fails if clock_rate exceeds maximum, relative to sample_rate */ + assert( 0 <= factor - m->factor && factor - m->factor < 1 ); + + /* Avoid requiring math.h. Equivalent to + m->factor = (int) ceil( factor ) */ + if ( m->factor < factor ) + m->factor++; + + /* At this point, factor is most likely rounded up, but could still + have been rounded down in the floating-point calculation. */ +} + +void blip_clear( blip_t* m ) +{ + /* We could set offset to 0, factor/2, or factor-1. 0 is suitable if + factor is rounded up. factor-1 is suitable if factor is rounded down. + Since we don't know rounding direction, factor/2 accommodates either, + with the slight loss of showing an error in half the time. Since for + a 64-bit factor this is years, the halving isn't a problem. */ + + m->offset = m->factor / 2; + m->avail = 0; + m->integrator = 0; + memset( SAMPLES( m ), 0, (m->size + buf_extra) * sizeof (buf_t) ); +} + +int blip_clocks_needed( const blip_t* m, int samples ) +{ + fixed_t needed; + + /* Fails if buffer can't hold that many more samples */ + assert( samples >= 0 && m->avail + samples <= m->size ); + + needed = (fixed_t) samples * time_unit; + if ( needed < m->offset ) + return 0; + + return (needed - m->offset + m->factor - 1) / m->factor; +} + +void blip_end_frame( blip_t* m, unsigned t ) +{ + fixed_t off = t * m->factor + m->offset; + m->avail += off >> time_bits; + m->offset = off & (time_unit - 1); + + /* Fails if buffer size was exceeded */ + assert( m->avail <= m->size ); +} + +int blip_samples_avail( const blip_t* m ) +{ + return m->avail; +} + +static void remove_samples( blip_t* m, int count ) +{ + buf_t* buf = SAMPLES( m ); + int remain = m->avail + buf_extra - count; + m->avail -= count; + + memmove( &buf [0], &buf [count], remain * sizeof buf [0] ); + memset( &buf [remain], 0, count * sizeof buf [0] ); +} + +int blip_read_samples( blip_t* m, short out [], int count, int stereo ) +{ + assert( count >= 0 ); + + if ( count > m->avail ) + count = m->avail; + + if ( count ) + { + int const step = stereo ? 2 : 1; + buf_t const* in = SAMPLES( m ); + buf_t const* end = in + count; + int sum = m->integrator; + do + { + /* Eliminate fraction */ + int s = ARITH_SHIFT( sum, delta_bits ); + + sum += *in++; + + CLAMP( s ); + + *out = s; + out += step; + + /* High-pass filter */ + sum -= s << (delta_bits - bass_shift); + } + while ( in != end ); + m->integrator = sum; + + remove_samples( m, count ); + } + + return count; +} + +/* Things that didn't help performance on x86: + __attribute__((aligned(128))) + #define short int + restrict +*/ + +/* Sinc_Generator( 0.9, 0.55, 4.5 ) */ +static short const bl_step [phase_count + 1] [half_width] = +{ +{ 43, -115, 350, -488, 1136, -914, 5861,21022}, +{ 44, -118, 348, -473, 1076, -799, 5274,21001}, +{ 45, -121, 344, -454, 1011, -677, 4706,20936}, +{ 46, -122, 336, -431, 942, -549, 4156,20829}, +{ 47, -123, 327, -404, 868, -418, 3629,20679}, +{ 47, -122, 316, -375, 792, -285, 3124,20488}, +{ 47, -120, 303, -344, 714, -151, 2644,20256}, +{ 46, -117, 289, -310, 634, -17, 2188,19985}, +{ 46, -114, 273, -275, 553, 117, 1758,19675}, +{ 44, -108, 255, -237, 471, 247, 1356,19327}, +{ 43, -103, 237, -199, 390, 373, 981,18944}, +{ 42, -98, 218, -160, 310, 495, 633,18527}, +{ 40, -91, 198, -121, 231, 611, 314,18078}, +{ 38, -84, 178, -81, 153, 722, 22,17599}, +{ 36, -76, 157, -43, 80, 824, -241,17092}, +{ 34, -68, 135, -3, 8, 919, -476,16558}, +{ 32, -61, 115, 34, -60, 1006, -683,16001}, +{ 29, -52, 94, 70, -123, 1083, -862,15422}, +{ 27, -44, 73, 106, -184, 1152,-1015,14824}, +{ 25, -36, 53, 139, -239, 1211,-1142,14210}, +{ 22, -27, 34, 170, -290, 1261,-1244,13582}, +{ 20, -20, 16, 199, -335, 1301,-1322,12942}, +{ 18, -12, -3, 226, -375, 1331,-1376,12293}, +{ 15, -4, -19, 250, -410, 1351,-1408,11638}, +{ 13, 3, -35, 272, -439, 1361,-1419,10979}, +{ 11, 9, -49, 292, -464, 1362,-1410,10319}, +{ 9, 16, -63, 309, -483, 1354,-1383, 9660}, +{ 7, 22, -75, 322, -496, 1337,-1339, 9005}, +{ 6, 26, -85, 333, -504, 1312,-1280, 8355}, +{ 4, 31, -94, 341, -507, 1278,-1205, 7713}, +{ 3, 35, -102, 347, -506, 1238,-1119, 7082}, +{ 1, 40, -110, 350, -499, 1190,-1021, 6464}, +{ 0, 43, -115, 350, -488, 1136, -914, 5861} +}; + +/* Shifting by pre_shift allows calculation using unsigned int rather than +possibly-wider fixed_t. On 32-bit platforms, this is likely more efficient. +And by having pre_shift 32, a 32-bit platform can easily do the shift by +simply ignoring the low half. */ + +void blip_add_delta( blip_t* m, unsigned time, int delta ) +{ + unsigned fixed = (unsigned) ((time * m->factor + m->offset) >> pre_shift); + buf_t* out = SAMPLES( m ) + m->avail + (fixed >> frac_bits); + + int const phase_shift = frac_bits - phase_bits; + int phase = fixed >> phase_shift & (phase_count - 1); + short const* in = bl_step [phase]; + short const* rev = bl_step [phase_count - phase]; + + int interp = fixed >> (phase_shift - delta_bits) & (delta_unit - 1); + int delta2 = (delta * interp) >> delta_bits; + delta -= delta2; + + /* Fails if buffer size was exceeded */ + assert( out <= &SAMPLES( m ) [m->size + end_frame_extra] ); + + out [0] += in[0]*delta + in[half_width+0]*delta2; + out [1] += in[1]*delta + in[half_width+1]*delta2; + out [2] += in[2]*delta + in[half_width+2]*delta2; + out [3] += in[3]*delta + in[half_width+3]*delta2; + out [4] += in[4]*delta + in[half_width+4]*delta2; + out [5] += in[5]*delta + in[half_width+5]*delta2; + out [6] += in[6]*delta + in[half_width+6]*delta2; + out [7] += in[7]*delta + in[half_width+7]*delta2; + + in = rev; + out [ 8] += in[7]*delta + in[7-half_width]*delta2; + out [ 9] += in[6]*delta + in[6-half_width]*delta2; + out [10] += in[5]*delta + in[5-half_width]*delta2; + out [11] += in[4]*delta + in[4-half_width]*delta2; + out [12] += in[3]*delta + in[3-half_width]*delta2; + out [13] += in[2]*delta + in[2-half_width]*delta2; + out [14] += in[1]*delta + in[1-half_width]*delta2; + out [15] += in[0]*delta + in[0-half_width]*delta2; +} + +void blip_add_delta_fast( blip_t* m, unsigned time, int delta ) +{ + unsigned fixed = (unsigned) ((time * m->factor + m->offset) >> pre_shift); + buf_t* out = SAMPLES( m ) + m->avail + (fixed >> frac_bits); + + int interp = fixed >> (frac_bits - delta_bits) & (delta_unit - 1); + int delta2 = delta * interp; + + /* Fails if buffer size was exceeded */ + assert( out <= &SAMPLES( m ) [m->size + end_frame_extra] ); + + out [7] += delta * delta_unit - delta2; + out [8] += delta2; +} diff --git a/submodules/sameboy/blip_buf.h b/submodules/sameboy/blip_buf.h new file mode 100644 index 0000000000..52703643c4 --- /dev/null +++ b/submodules/sameboy/blip_buf.h @@ -0,0 +1,72 @@ +/** \file +Sample buffer that resamples from input clock rate to output sample rate */ + +/* blip_buf 1.1.0 */ +#ifndef BLIP_BUF_H +#define BLIP_BUF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/** First parameter of most functions is blip_t*, or const blip_t* if nothing +is changed. */ +typedef struct blip_t blip_t; + +/** Creates new buffer that can hold at most sample_count samples. Sets rates +so that there are blip_max_ratio clocks per sample. Returns pointer to new +buffer, or NULL if insufficient memory. */ +blip_t* blip_new( int sample_count ); + +/** Sets approximate input clock rate and output sample rate. For every +clock_rate input clocks, approximately sample_rate samples are generated. */ +void blip_set_rates( blip_t*, double clock_rate, double sample_rate ); + +enum { /** Maximum clock_rate/sample_rate ratio. For a given sample_rate, +clock_rate must not be greater than sample_rate*blip_max_ratio. */ +blip_max_ratio = 1 << 20 }; + +/** Clears entire buffer. Afterwards, blip_samples_avail() == 0. */ +void blip_clear( blip_t* ); + +/** Adds positive/negative delta into buffer at specified clock time. */ +void blip_add_delta( blip_t*, unsigned int clock_time, int delta ); + +/** Same as blip_add_delta(), but uses faster, lower-quality synthesis. */ +void blip_add_delta_fast( blip_t*, unsigned int clock_time, int delta ); + +/** Length of time frame, in clocks, needed to make sample_count additional +samples available. */ +int blip_clocks_needed( const blip_t*, int sample_count ); + +enum { /** Maximum number of samples that can be generated from one time frame. */ +blip_max_frame = 4000 }; + +/** Makes input clocks before clock_duration available for reading as output +samples. Also begins new time frame at clock_duration, so that clock time 0 in +the new time frame specifies the same clock as clock_duration in the old time +frame specified. Deltas can have been added slightly past clock_duration (up to +however many clocks there are in two output samples). */ +void blip_end_frame( blip_t*, unsigned int clock_duration ); + +/** Number of buffered samples available for reading. */ +int blip_samples_avail( const blip_t* ); + +/** Reads and removes at most 'count' samples and writes them to 'out'. If +'stereo' is true, writes output to every other element of 'out', allowing easy +interleaving of two buffers into a stereo sample stream. Outputs 16-bit signed +samples. Returns number of samples actually read. */ +int blip_read_samples( blip_t*, short out [], int count, int stereo ); + +/** Frees buffer. No effect if NULL is passed. */ +void blip_delete( blip_t* ); + + +/* Deprecated */ +typedef blip_t blip_buffer_t; + +#ifdef __cplusplus + } +#endif + +#endif