From 6f78b92344d6c7370455c8383e05a11a919f01dc Mon Sep 17 00:00:00 2001 From: tudnai Date: Thu, 11 Jun 2020 23:16:26 -0700 Subject: [PATCH] Disk Sound Effect enable button --- A2Mac/Base.lproj/Main.storyboard | 28 ++++++++++++++++++++-------- A2Mac/ViewController.swift | 13 ++++++++++--- src/dev/audio/speaker.c | 16 ++++++++++------ src/dev/disk/disk.c | 1 + src/dev/disk/disk.h | 1 + 5 files changed, 42 insertions(+), 17 deletions(-) diff --git a/A2Mac/Base.lproj/Main.storyboard b/A2Mac/Base.lproj/Main.storyboard index 4327279..fa8244b 100644 --- a/A2Mac/Base.lproj/Main.storyboard +++ b/A2Mac/Base.lproj/Main.storyboard @@ -1394,13 +1394,13 @@ - + - + - + + diff --git a/A2Mac/ViewController.swift b/A2Mac/ViewController.swift index 6ceaca1..58d45a8 100644 --- a/A2Mac/ViewController.swift +++ b/A2Mac/ViewController.swift @@ -891,15 +891,22 @@ class ViewController: NSViewController { @IBAction func QuickDisk(_ sender: NSButton) { if sender.state == .on { -// diskAccelerator_speed = Int32( 25 * M / Double(fps) ) diskAccelerator_enabled = 1; } else { -// diskAccelerator_speed = 0 diskAccelerator_enabled = 0; } } - + + @IBAction func DiskSound(_ sender: NSButton) { + if sender.state == .on { + disk_sfx_enabled = 1; + } + else { + disk_sfx_enabled = 0; + } + } + @objc func openDiskImage() { let openPanel = NSOpenPanel() diff --git a/src/dev/audio/speaker.c b/src/dev/audio/speaker.c index 0a4f336..416a8af 100644 --- a/src/dev/audio/speaker.c +++ b/src/dev/audio/speaker.c @@ -225,6 +225,8 @@ void spkr_init() { // Dealloc OpenAL void spkr_exit() { if ( spkr_src[0] ) { + alSourceStop( spkr_src[0] ); + ALCdevice *dev = NULL; ALCcontext *ctx = NULL; ctx = alcGetCurrentContext(); @@ -238,6 +240,8 @@ void spkr_exit() { memset(spkr_src, 0, sizeof(spkr_src)); memset(spkr_buffers, 0, sizeof(spkr_buffers)); + spkr_disk_motor_buf = 0; + spkr_disk_arm_buf = 0; } } @@ -486,20 +490,20 @@ void spkr_stop_sfx( ALuint src ) { void spkr_play_disk_motor() { - if ( clk_6502_per_frm <= iicplus_MHz_6502 / fps ) { + if ( ( disk_sfx_enabled ) && ( clk_6502_per_frm <= iicplus_MHz_6502 / fps ) ) { spkr_play_sfx( spkr_src[1], diskmotor_sfx, diskmotor_sfx_len ); } } void spkr_stop_disk_motor( int time ) { - if ( clk_6502_per_frm <= iicplus_MHz_6502 / fps ) { + if ( ( disk_sfx_enabled ) && ( clk_6502_per_frm <= iicplus_MHz_6502 / fps ) ) { spkr_play_disk_motor_time = time; } } void spkr_play_disk_arm() { - if ( clk_6502_per_frm <= iicplus_MHz_6502 / fps ) { + if ( ( disk_sfx_enabled ) && ( clk_6502_per_frm <= iicplus_MHz_6502 / fps ) ) { if ( spkr_play_disk_ioerr_time == 0 ) { spkr_play_sfx( spkr_src[2], diskarm_sfx, diskarm_sfx_len ); spkr_play_disk_arm_time = 2; @@ -509,8 +513,8 @@ void spkr_play_disk_arm() { void spkr_play_disk_ioerr() { - if ( clk_6502_per_frm <= iicplus_MHz_6502 / fps ) { - spkr_playqueue_sfx( spkr_src[3], diskioerr_sfx, diskioerr_sfx_len - 512); + if ( ( disk_sfx_enabled ) && ( clk_6502_per_frm <= iicplus_MHz_6502 / fps ) ) { + spkr_playqueue_sfx( spkr_src[3], diskioerr_sfx, diskioerr_sfx_len); spkr_play_disk_ioerr_time = 4; } } @@ -526,7 +530,7 @@ void update_disk_sfx( unsigned * time, ALuint src ) { void spkr_update_disk_sfx() { // is user speeds up the machine, disk sfx needs to be stopped - if ( clk_6502_per_frm > iicplus_MHz_6502 / fps ) { + if ( ( ! disk_sfx_enabled ) || ( clk_6502_per_frm > iicplus_MHz_6502 / fps ) ) { if ( spkr_play_disk_motor_time ) { spkr_play_disk_motor_time = 1; // rest will be taken care below } diff --git a/src/dev/disk/disk.c b/src/dev/disk/disk.c index a2791e6..536b734 100644 --- a/src/dev/disk/disk.c +++ b/src/dev/disk/disk.c @@ -22,6 +22,7 @@ const int diskAccelerator_frames = 2; int diskAccelerator_count = 0; int diskAccelerator_speed = 25 * M / fps; // if less than actual CPU speed means no acceleration int diskAccelerator_enabled = 1; +int disk_sfx_enabled = 1; // motor position from the magnet state // -1 means invalid, not supported diff --git a/src/dev/disk/disk.h b/src/dev/disk/disk.h index 37a27f5..ff655c1 100644 --- a/src/dev/disk/disk.h +++ b/src/dev/disk/disk.h @@ -57,6 +57,7 @@ extern const int diskAccelerator_frames; // number of frames disk acceleratio extern int diskAccelerator_count; // counter for the disk acceleration frames extern int diskAccelerator_speed; // if less than the actual CPU speed, no acceleration extern int diskAccelerator_enabled; +extern int disk_sfx_enabled; extern void disk_phase(void); extern void disk_phase_on( uint8_t currentMagnet );