From 30917d2b566fdc94b30f824e358a42544e443a29 Mon Sep 17 00:00:00 2001 From: tudnai Date: Thu, 25 May 2023 20:23:41 -0700 Subject: [PATCH] Speaker Fade Out --- A2Mac/ViewController.swift | 3 +++ src/dev/audio/speaker.c | 21 ++++++++++++++------- src/dev/audio/speaker.h | 2 +- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/A2Mac/ViewController.swift b/A2Mac/ViewController.swift index f406b87..cf0e00e 100644 --- a/A2Mac/ViewController.swift +++ b/A2Mac/ViewController.swift @@ -1849,6 +1849,7 @@ class ViewController: NSViewController { fps = DEFAULT_FPS video_fps_divider = ECO_VIDEO_DIV + spkr_fps_divider = DEF_SPKR_DIV break case "Game": @@ -1857,6 +1858,7 @@ class ViewController: NSViewController { fps = GAME_FPS video_fps_divider = GAME_VIDEO_DIV + spkr_fps_divider = GAME_SPKR_DIV break default: @@ -1865,6 +1867,7 @@ class ViewController: NSViewController { fps = DEFAULT_FPS video_fps_divider = DEF_VIDEO_DIV + spkr_fps_divider = DEF_SPKR_DIV break } diff --git a/src/dev/audio/speaker.c b/src/dev/audio/speaker.c index a6b0674..bafd2f7 100644 --- a/src/dev/audio/speaker.c +++ b/src/dev/audio/speaker.c @@ -125,7 +125,7 @@ float spkr_vol = 0.5; unsigned spkr_fps = DEFAULT_FPS; -//unsigned spkr_fps_divider = 1; +unsigned spkr_fps_divider = DEF_SPKR_DIV; unsigned spkr_frame_cntr = 0; unsigned spkr_clk = 0; @@ -498,14 +498,17 @@ char spkr_state = 0; #define _NO_SPKR_EARLY_ZERO_LEVEL 500 +const float SPKR_FADE_TRAILING_SLOPE = 0.2; INLINE void spkr_finish_square(const int new_idx) { + float level = spkr_level; + const float slope = spkr_level >= 0 ? SPKR_FADE_TRAILING_SLOPE : -SPKR_FADE_TRAILING_SLOPE; + // avoid buffer under/over runs if ( (new_idx < 0) || (new_idx >= SPKR_BUF_SLOT_SIZE(BUFFER_COUNT)) ) { return; } - // only fill small enough gaps and larger ones will go back to 0 #ifdef SPKR_EARLY_ZERO_LEVEL @@ -513,6 +516,10 @@ INLINE void spkr_finish_square(const int new_idx) { #endif // finish the aquare wave while ( spkr_sample_last_idx < new_idx ) { + if ( fabs(level) > SPKR_FADE_TRAILING_SLOPE ) { + level -= slope; + spkr_level = level; + } spkr_samples[ spkr_sample_last_idx++ ] = spkr_level; spkr_samples[ spkr_sample_last_idx++ ] = spkr_level; // stereo } @@ -1156,7 +1163,7 @@ void spkr_buffer_with_prebuf(void) { void spkr_update() { -// if ( ++spkr_frame_cntr >= spkr_fps_divider ) { + if ( ++spkr_frame_cntr >= spkr_fps_divider ) { spkr_frame_cntr = 0; // Fix: Unqueue was not working properly some cases, so we need to monitor @@ -1248,10 +1255,10 @@ void spkr_update() { spkr_clk = 0; -// } -// else { -// spkr_clk += m6502.clkfrm; -// } + } + else { + spkr_clk += m6502.clkfrm; + } // free up unused buffers spkr_unqueue( spkr_src[SPKR_SRC_GAME_SFX] ); diff --git a/src/dev/audio/speaker.h b/src/dev/audio/speaker.h index dfe674c..d824031 100644 --- a/src/dev/audio/speaker.h +++ b/src/dev/audio/speaker.h @@ -85,7 +85,7 @@ extern const double spkr_sample_rate; extern const unsigned spkr_buf_alloc_size; extern const unsigned spkr_buf_size; extern unsigned spkr_fps; -//extern unsigned spkr_fps_divider; +extern unsigned spkr_fps_divider; extern spkr_sample_t * spkr_samples; extern int spkr_sample_idx; extern int spkr_level;