From 015a32c444841ceb91e6ae6cd5bdb57720313d58 Mon Sep 17 00:00:00 2001 From: tudnai Date: Wed, 13 May 2020 20:40:54 -0700 Subject: [PATCH] Exponential signal edges for speaker --- A2Mac/Base.lproj/Main.storyboard | 12 ++++++++++++ src/cpu/6502.c | 6 +++--- src/dev/audio/speaker.c | 22 ++++++++++++++++++++++ src/dev/audio/speaker.h | 6 ++++-- src/dev/mem/mmio.h | 6 +++--- 5 files changed, 44 insertions(+), 8 deletions(-) diff --git a/A2Mac/Base.lproj/Main.storyboard b/A2Mac/Base.lproj/Main.storyboard index 6a9b6df..224ddcb 100644 --- a/A2Mac/Base.lproj/Main.storyboard +++ b/A2Mac/Base.lproj/Main.storyboard @@ -675,6 +675,18 @@ + + + + + + + + + + + + diff --git a/src/cpu/6502.c b/src/cpu/6502.c index defd951..096c75b 100644 --- a/src/cpu/6502.c +++ b/src/cpu/6502.c @@ -772,10 +772,9 @@ void m6502_Run() { clk_6502_per_frm = clk_6502_per_frm_set; } } - + + // play the entire sound buffer for this frame spkr_play(); - - } @@ -851,6 +850,7 @@ void m6502_ColdReset( const char * bundlePath, const char * romFileName ) { mhz = (double)MHz_6502 / M; spkr_init(); +// spkr_play(); unsigned long long saved_frm_set = clk_6502_per_frm_set; clk_6502_per_frm = diff --git a/src/dev/audio/speaker.c b/src/dev/audio/speaker.c index 333f6de..90fd98e 100644 --- a/src/dev/audio/speaker.c +++ b/src/dev/audio/speaker.c @@ -119,6 +119,8 @@ void spkr_play() { alSourcei(spkr_src, AL_BUFFER, spkr_buf); alSourcei(spkr_src, AL_LOOPING, 0); + alSourcei( spkr_src, AL_BYTE_OFFSET, 0 ); + al_check_error(); alSourcePlay(spkr_src); ALint secoffset = 0; @@ -136,3 +138,23 @@ void spkr_play() { alSourceStop(spkr_src); } } + + +void spkr_Update() { + if ( spkr_src && spkr_buf ) { + if ( spkr_src ) { + alSourcePause(spkr_src); + al_check_error(); + alSourcei(spkr_src, AL_BUFFER, 0); + al_check_error(); + } + + // Download buffer to OpenAL + alBufferData(spkr_buf, AL_FORMAT_MONO8, spkr_samples, spkr_buf_size / spkr_fps, spkr_sample_rate); + al_check_error(); + + alSourcei( spkr_src, AL_BYTE_OFFSET, 0 ); + al_check_error(); + alSourcePlay(spkr_src); + } +} diff --git a/src/dev/audio/speaker.h b/src/dev/audio/speaker.h index 20c8c68..0839ec4 100644 --- a/src/dev/audio/speaker.h +++ b/src/dev/audio/speaker.h @@ -11,13 +11,15 @@ #include -#define SPKR_LEVEL_MIN 0 -#define SPKR_LEVEL_MAX 255 +#define SPKR_LEVEL_MIN 25 +#define SPKR_LEVEL_MAX 200 extern void spkr_init(void); extern void spkr_exit(void); extern void spkr_play(void); +extern void spkr_Update(void); +extern const unsigned spkr_sample_rate; extern const unsigned spkr_buf_size; extern char spkr_samples []; extern unsigned spkr_sample_idx; diff --git a/src/dev/mem/mmio.h b/src/dev/mem/mmio.h index 2befa44..de73825 100644 --- a/src/dev/mem/mmio.h +++ b/src/dev/mem/mmio.h @@ -406,18 +406,18 @@ INLINE void spkr_switch() { // push a click into the speaker buffer // (we will play the entire buffer at the end of the frame) - spkr_sample_idx = clkfrm / 22; + spkr_sample_idx = clkfrm / (default_MHz_6502 / spkr_sample_rate); if ( spkr_level > SPKR_LEVEL_MIN ) { // down edge - while( (spkr_level -= 16) > SPKR_LEVEL_MIN ) { + while( (spkr_level -= (spkr_level - SPKR_LEVEL_MIN) / 2 ) > SPKR_LEVEL_MIN + 1 ) { spkr_samples[ spkr_sample_idx++ ] = spkr_level; } spkr_level = SPKR_LEVEL_MIN; } else { // up edge - while( (spkr_level += 16) < SPKR_LEVEL_MAX ) { + while( (spkr_level += (SPKR_LEVEL_MAX - spkr_level) / 2 ) < SPKR_LEVEL_MAX - 1 ) { spkr_samples[ spkr_sample_idx++ ] = spkr_level; } spkr_level = SPKR_LEVEL_MAX;