From 9e6aebeaa86b5b513203e3e053b74bca7a5167a1 Mon Sep 17 00:00:00 2001 From: tudnai Date: Thu, 11 Jun 2020 18:29:26 -0700 Subject: [PATCH] Floppy Disk Drive Sound Effects --- A2Mac.xcodeproj/project.pbxproj | 34 ++- .../xcdebugger/Expressions.xcexplist | 83 ++++--- A2Mac/ViewController.swift | 2 + Resources/sfx/disk/diskarm.raw | Bin 0 -> 36456 bytes Resources/sfx/disk/diskioerr.raw | Bin 0 -> 3970 bytes Resources/sfx/disk/diskmotor.raw | Bin 0 -> 18376 bytes src/cpu/6502.c | 2 + src/dev/audio/speaker.c | 235 +++++++++++++++--- src/dev/audio/speaker.h | 28 ++- src/dev/disk/disk.c | 15 ++ src/dev/disk/disk.h | 3 + src/dev/mem/mmio.h | 2 + 12 files changed, 332 insertions(+), 72 deletions(-) create mode 100644 Resources/sfx/disk/diskarm.raw create mode 100644 Resources/sfx/disk/diskioerr.raw create mode 100644 Resources/sfx/disk/diskmotor.raw diff --git a/A2Mac.xcodeproj/project.pbxproj b/A2Mac.xcodeproj/project.pbxproj index 8fe457d..1877dae 100644 --- a/A2Mac.xcodeproj/project.pbxproj +++ b/A2Mac.xcodeproj/project.pbxproj @@ -14,6 +14,11 @@ 323D043024898AB70086A901 /* PreferencesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 323D042F24898AB70086A901 /* PreferencesViewController.swift */; }; 323D04332489BFD80086A901 /* PreferencesWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 323D04312489BFD80086A901 /* PreferencesWindowController.swift */; }; 323D0437248B6BEA0086A901 /* 6502.c in Sources */ = {isa = PBXBuildFile; fileRef = 32439F7422ECD8AD0077AAE0 /* 6502.c */; }; + 323D043E248F70930086A901 /* diskmotor.raw in Resources */ = {isa = PBXBuildFile; fileRef = 323D043D248F70930086A901 /* diskmotor.raw */; }; + 323D0440248F70A10086A901 /* diskioerr.raw in Resources */ = {isa = PBXBuildFile; fileRef = 323D043F248F70A10086A901 /* diskioerr.raw */; }; + 323D0442248F711F0086A901 /* diskarm.raw in Resources */ = {isa = PBXBuildFile; fileRef = 323D0441248F711F0086A901 /* diskarm.raw */; }; + 323D04442490B3930086A901 /* dotmatrix_effect.png in Resources */ = {isa = PBXBuildFile; fileRef = 323D04432490B3930086A901 /* dotmatrix_effect.png */; }; + 323D04462490BA1E0086A901 /* scanlines.png in Resources */ = {isa = PBXBuildFile; fileRef = 323D04452490BA1E0086A901 /* scanlines.png */; }; 323E2DCE245531E600156805 /* Apple2e_Enhanced.rom in Resources */ = {isa = PBXBuildFile; fileRef = 323E2DCC245531E500156805 /* Apple2e_Enhanced.rom */; }; 323E2DCF245531E600156805 /* Apple2e_Enhanced.rom in Resources */ = {isa = PBXBuildFile; fileRef = 323E2DCC245531E500156805 /* Apple2e_Enhanced.rom */; }; 323E2DD0245531E600156805 /* Apple2e.rom in Resources */ = {isa = PBXBuildFile; fileRef = 323E2DCD245531E500156805 /* Apple2e.rom */; }; @@ -91,8 +96,6 @@ 325EB6AA2401118300C6B4A4 /* Sneakers.woz in Resources */ = {isa = PBXBuildFile; fileRef = 325EB69A2401118300C6B4A4 /* Sneakers.woz */; }; 325EB6AB2401118300C6B4A4 /* Xonix.woz in Resources */ = {isa = PBXBuildFile; fileRef = 325EB69B2401118300C6B4A4 /* Xonix.woz */; }; 325EB6AC2401118300C6B4A4 /* Xonix.woz in Resources */ = {isa = PBXBuildFile; fileRef = 325EB69B2401118300C6B4A4 /* Xonix.woz */; }; - 32A9F72C24668D26004902A1 /* apple-rainbow.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 32A9F72B24668D26004902A1 /* apple-rainbow.jpg */; }; - 32A9F72D24668D26004902A1 /* apple-rainbow.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 32A9F72B24668D26004902A1 /* apple-rainbow.jpg */; }; 32A9F74A2467B60B004902A1 /* speaker.c in Sources */ = {isa = PBXBuildFile; fileRef = 32A9F7492467B60B004902A1 /* speaker.c */; }; 32A9F74B2467B60B004902A1 /* speaker.c in Sources */ = {isa = PBXBuildFile; fileRef = 32A9F7492467B60B004902A1 /* speaker.c */; }; 32BFFB5B22EACC630003B53F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32BFFB5A22EACC630003B53F /* AppDelegate.swift */; }; @@ -116,6 +119,8 @@ 32C4532E233345430000EBA1 /* MonitorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32C4532D233345420000EBA1 /* MonitorView.swift */; }; 32C4532F233345820000EBA1 /* MonitorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32C4532D233345420000EBA1 /* MonitorView.swift */; }; 32C45330233345820000EBA1 /* MonitorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32C4532D233345420000EBA1 /* MonitorView.swift */; }; + 32E21BE72491BF8C006C0C72 /* apple-rainbow.png in Resources */ = {isa = PBXBuildFile; fileRef = 32E21BE62491BF8B006C0C72 /* apple-rainbow.png */; }; + 32F2C145249218A400FDC61B /* locksmith_v6.0.woz in Resources */ = {isa = PBXBuildFile; fileRef = 32F2C144249218A400FDC61B /* locksmith_v6.0.woz */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -155,6 +160,11 @@ 323D042F24898AB70086A901 /* PreferencesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesViewController.swift; sourceTree = ""; }; 323D04312489BFD80086A901 /* PreferencesWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesWindowController.swift; sourceTree = ""; }; 323D0435248B20F20086A901 /* 6502_instr_undoc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 6502_instr_undoc.h; sourceTree = ""; }; + 323D043D248F70930086A901 /* diskmotor.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = diskmotor.raw; sourceTree = ""; }; + 323D043F248F70A10086A901 /* diskioerr.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = diskioerr.raw; sourceTree = ""; }; + 323D0441248F711F0086A901 /* diskarm.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = diskarm.raw; sourceTree = ""; }; + 323D04432490B3930086A901 /* dotmatrix_effect.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = dotmatrix_effect.png; sourceTree = ""; }; + 323D04452490BA1E0086A901 /* scanlines.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = scanlines.png; sourceTree = ""; }; 323E2DCC245531E500156805 /* Apple2e_Enhanced.rom */ = {isa = PBXFileReference; lastKnownFileType = file; path = Apple2e_Enhanced.rom; sourceTree = ""; }; 323E2DCD245531E500156805 /* Apple2e.rom */ = {isa = PBXFileReference; lastKnownFileType = file; path = Apple2e.rom; sourceTree = ""; }; 32439F7222ECD8AC0077AAE0 /* A2Mac-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "A2Mac-Bridging-Header.h"; sourceTree = ""; }; @@ -242,7 +252,6 @@ 326426112328ADF4008B615F /* Apple_II_ROM.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = Apple_II_ROM.s; sourceTree = ""; }; 3268E68E2474E24900047474 /* paddle.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = paddle.h; sourceTree = ""; }; 326ED2EE232D7A0000A41337 /* 6502_functional_test.bin */ = {isa = PBXFileReference; lastKnownFileType = archive.macbinary; path = 6502_functional_test.bin; sourceTree = SOURCE_ROOT; }; - 32A9F72B24668D26004902A1 /* apple-rainbow.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "apple-rainbow.jpg"; sourceTree = ""; }; 32A9F7482467B60B004902A1 /* speaker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = speaker.h; sourceTree = ""; }; 32A9F7492467B60B004902A1 /* speaker.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = speaker.c; sourceTree = ""; }; 32B18435233F10BC00DBB4AB /* Shaders.metal */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.metal; path = Shaders.metal; sourceTree = ""; }; @@ -269,7 +278,9 @@ 32C4532D233345420000EBA1 /* MonitorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MonitorView.swift; sourceTree = ""; }; 32DBF7632334657900DD50E7 /* HiRes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HiRes.swift; sourceTree = ""; }; 32DBF76723373FB400DD50E7 /* disassembler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = disassembler.h; sourceTree = ""; }; + 32E21BE62491BF8B006C0C72 /* apple-rainbow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "apple-rainbow.png"; sourceTree = ""; }; 32EDB7A123272CA80073AF2D /* fail1.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = fail1.txt; sourceTree = ""; }; + 32F2C144249218A400FDC61B /* locksmith_v6.0.woz */ = {isa = PBXFileReference; lastKnownFileType = file; path = locksmith_v6.0.woz; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -343,6 +354,9 @@ 323D0439248F6E670086A901 /* disk */ = { isa = PBXGroup; children = ( + 323D043D248F70930086A901 /* diskmotor.raw */, + 323D0441248F711F0086A901 /* diskarm.raw */, + 323D043F248F70A10086A901 /* diskioerr.raw */, ); path = disk; sourceTree = ""; @@ -385,6 +399,7 @@ 32440B87247F86D5000F9DA1 /* XPS Diagnostic IIe 1.0.5.woz */, 32440B8B247F86D5000F9DA1 /* XPS Diagnostic IIe.woz */, 32440BA0247F9F99000F9DA1 /* LOCKSMITH_V7_REV_B.woz */, + 32F2C144249218A400FDC61B /* locksmith_v6.0.woz */, ); path = dsk; sourceTree = ""; @@ -536,7 +551,9 @@ 323D043A248F6E840086A901 /* dsk */, 323D043B248F6EBE0086A901 /* rom */, 323D0438248F6E560086A901 /* sfx */, - 32A9F72B24668D26004902A1 /* apple-rainbow.jpg */, + 32E21BE62491BF8B006C0C72 /* apple-rainbow.png */, + 323D04432490B3930086A901 /* dotmatrix_effect.png */, + 323D04452490BA1E0086A901 /* scanlines.png */, ); path = Resources; sourceTree = ""; @@ -859,7 +876,6 @@ 325EB68D23FDDFD200C6B4A4 /* Merlin-8 v2.48 (DOS 3.3).woz in Resources */, 325EB6A62401118300C6B4A4 /* ProDOS_312.woz in Resources */, 325EB6AC2401118300C6B4A4 /* Xonix.woz in Resources */, - 32A9F72D24668D26004902A1 /* apple-rainbow.jpg in Resources */, 323E2DCF245531E600156805 /* Apple2e_Enhanced.rom in Resources */, 325EB67D23FBD43800C6B4A4 /* PrintChar21.ttf in Resources */, 325EB6A42401118300C6B4A4 /* Qbit.woz in Resources */, @@ -889,8 +905,10 @@ 3213936624079C30007F5C4A /* Main.storyboard in Resources */, 32440B8F247F86D6000F9DA1 /* Apple II+ Dealer Diagnostics.woz in Resources */, 325EB6A12401118300C6B4A4 /* Wavy Navy.woz in Resources */, + 323D04462490BA1E0086A901 /* scanlines.png in Resources */, 32440B90247F86D6000F9DA1 /* XPS Diagnostic IIe 1.0.5.woz in Resources */, 32440B75247CAA00000F9DA1 /* Merlin Pro v2.23 DOS3.3 (The Yegg-Men Crack).woz in Resources */, + 323D04442490B3930086A901 /* dotmatrix_effect.png in Resources */, 32440B66247C9C9C000F9DA1 /* merlin_assembler_3.woz in Resources */, 32440B7C247CB649000F9DA1 /* Merlin Macroassembler Side 2 (SDS, 1983).woz in Resources */, 325EB68023FBDF8F00C6B4A4 /* Apple2Plus.rom in Resources */, @@ -903,10 +921,11 @@ 32440B76247CAA00000F9DA1 /* Merlin Pro 2.45 (DOS) Disk 1-2.woz in Resources */, 32089E4824556DBD0036E667 /* PRNumber3.ttf in Resources */, 32440B94247F86D6000F9DA1 /* XPS Diagnostic IIe.woz in Resources */, + 32F2C145249218A400FDC61B /* locksmith_v6.0.woz in Resources */, 325EB6A92401118300C6B4A4 /* Sneakers.woz in Resources */, - 32A9F72C24668D26004902A1 /* apple-rainbow.jpg in Resources */, 325EB6A72401118300C6B4A4 /* ProDOS_402_System.woz in Resources */, 32440B96247F86D6000F9DA1 /* Apple II+ Products diagnostic 652-0334.woz in Resources */, + 323D0440248F70A10086A901 /* diskioerr.raw in Resources */, 325EB69023FE028800C6B4A4 /* Donkey Kong.woz in Resources */, 325EB68923FDDF6200C6B4A4 /* Hard Hat Mack - Disk 1, Side A.woz in Resources */, 325EB69F2401118300C6B4A4 /* Crossfire.woz in Resources */, @@ -920,8 +939,11 @@ 32440B65247C9C9C000F9DA1 /* merlin_assembler_2.woz in Resources */, 32440B92247F86D6000F9DA1 /* Apple IIc - Diagnostic diskette Program service 077-8125-A.woz in Resources */, 32440B79247CB2B2000F9DA1 /* Merlin Pro v1.34.woz in Resources */, + 32E21BE72491BF8C006C0C72 /* apple-rainbow.png in Resources */, 325EB68C23FDDFD200C6B4A4 /* Merlin-8 v2.48 (DOS 3.3).woz in Resources */, + 323D043E248F70930086A901 /* diskmotor.raw in Resources */, 32440B91247F86D6000F9DA1 /* COMPUTER_CHECKUP.woz in Resources */, + 323D0442248F711F0086A901 /* diskarm.raw in Resources */, 325EB6A52401118300C6B4A4 /* ProDOS_312.woz in Resources */, 325EB6AB2401118300C6B4A4 /* Xonix.woz in Resources */, 323E2DCE245531E600156805 /* Apple2e_Enhanced.rom in Resources */, diff --git a/A2Mac.xcodeproj/project.xcworkspace/xcuserdata/trudnai.xcuserdatad/xcdebugger/Expressions.xcexplist b/A2Mac.xcodeproj/project.xcworkspace/xcuserdata/trudnai.xcuserdatad/xcdebugger/Expressions.xcexplist index bc11d7e..54242f7 100644 --- a/A2Mac.xcodeproj/project.xcworkspace/xcuserdata/trudnai.xcuserdatad/xcdebugger/Expressions.xcexplist +++ b/A2Mac.xcodeproj/project.xcworkspace/xcuserdata/trudnai.xcuserdatad/xcdebugger/Expressions.xcexplist @@ -14,10 +14,13 @@ + contextName = "BRA:6502_instr_branch.h"> + value = ""> + + @@ -64,7 +67,7 @@ contextName = "closure #1 in ViewController.Update():ViewController.swift"> + value = "MEMcfg.is_80STORE"> @@ -76,7 +79,7 @@ value = "MEMcfg.txt_page_2"> + value = "txtArr"> @@ -114,6 +117,14 @@ + + + + + + @@ -210,13 +221,13 @@ contextName = "spkr_update:speaker.c"> + value = "(uint8_t)spkr_samples[452]"> + value = "(uint8_t)spkr_samples[455]"> @@ -264,7 +275,7 @@ value = "pdl_value[pdl]"> + value = "normalized_time"> @@ -276,7 +287,7 @@ value = "1 * 512 * (1 - ( 3300 / 3300.0 ))"> + value = "normalized_time >= pdl_value[pdl] ? 255 : 0"> @@ -293,13 +304,13 @@ value = "textLines"> + value = "hires.frame"> + value = "hires.layer"> @@ -315,7 +326,7 @@ contextName = "LoRes.Update():LoRes.swift"> + value = "UInt8( (block >> 4) & 0x0F )"> @@ -324,7 +335,7 @@ value = "UInt8(block & 4)"> + value = "blockChanged[ screenIdx ]"> @@ -343,10 +354,10 @@ contextName = "set_flags_NZC:common.h"> + value = "(unsigned)0xFF"> + value = "(unsigned)test "> @@ -388,6 +399,9 @@ + + + value = "HiRes.blockCols"> + value = "ctx?.data"> + + @@ -505,24 +522,21 @@ - - + + + + - - - - + value = "UnsafeRawBufferPointer(result)"> + value = "computePipelineState.maxTotalThreadsPerThreadgroup"> @@ -569,10 +583,10 @@ value = "mouseLocation"> + value = "txtArr"> + value = "clkfrm"> @@ -633,10 +647,10 @@ value = "Apple2_64K_AUX + 0xC600"> + value = "Apple2_64K_RAM + 0xC600"> + value = "(void*)rom"> @@ -661,13 +675,10 @@ + contextName = "specialized closure #1 in ViewController.Update():ViewController.swift"> - - + value = "self.HiRes.frame"> diff --git a/A2Mac/ViewController.swift b/A2Mac/ViewController.swift index c4e1f68..c585e59 100644 --- a/A2Mac/ViewController.swift +++ b/A2Mac/ViewController.swift @@ -779,6 +779,8 @@ class ViewController: NSViewController { hires.clearScreen(); + spkr_load_sfx( Bundle.main.resourcePath! ) + let woz_err = woz_loadFile( Bundle.main.resourcePath! + "/Apple DOS 3.3 January 1983.woz" ) chk_woz_load(err: woz_err) diff --git a/Resources/sfx/disk/diskarm.raw b/Resources/sfx/disk/diskarm.raw new file mode 100644 index 0000000000000000000000000000000000000000..41ad727d9a628a64912f6fd6c8334f620649475f GIT binary patch literal 36456 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 L){_5DHOBt}Kd_40 literal 0 HcmV?d00001 diff --git a/Resources/sfx/disk/diskioerr.raw b/Resources/sfx/disk/diskioerr.raw new file mode 100644 index 0000000000000000000000000000000000000000..b8b5c58690655550fa08fdbc96619d1f2ac2a378 GIT binary patch literal 3970 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 literal 0 HcmV?d00001 diff --git a/Resources/sfx/disk/diskmotor.raw b/Resources/sfx/disk/diskmotor.raw new file mode 100644 index 0000000000000000000000000000000000000000..4401c46b40b3b6a0831fa143e633286b5dd3bd0d GIT binary patch literal 18376 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 NR`;64W!}{z`9DYj&bR;o literal 0 HcmV?d00001 diff --git a/src/cpu/6502.c b/src/cpu/6502.c index ef76684..810b3ca 100644 --- a/src/cpu/6502.c +++ b/src/cpu/6502.c @@ -598,6 +598,8 @@ void m6502_Run() { // play the entire sound buffer for this frame spkr_update(); + // this will take care of turning off disk motor sound when time is up + spkr_update_disk_sfx(); } void read_rom( const char * bundlePath, const char * filename, uint8_t * rom, const uint16_t addr ) { diff --git a/src/dev/audio/speaker.c b/src/dev/audio/speaker.c index 4b2220f..9589850 100644 --- a/src/dev/audio/speaker.c +++ b/src/dev/audio/speaker.c @@ -11,8 +11,6 @@ #include #include #include -#include -#include #include "speaker.h" #include "6502.h" @@ -54,7 +52,7 @@ const char* al_err_str(ALenum err) { ALCdevice *dev = NULL; ALCcontext *ctx = NULL; ALuint spkr_buf = 0; -ALuint spkr_src = 0; +ALuint spkr_src [4] = { 0, 0, 0, 0 }; int spkr_level = SPKR_LEVEL_ZERO; @@ -64,11 +62,15 @@ int spkr_level = SPKR_LEVEL_ZERO; #define SOURCES_COUNT 1 ALuint spkr_buffers[BUFFER_COUNT]; +ALuint spkr_disk_motor_buf = 0; +ALuint spkr_disk_arm_buf = 0; +ALuint spkr_disk_ioerr_buf = 0; const int spkr_fps = fps; const int spkr_seconds = 1; const unsigned spkr_sample_rate = 44100; +const unsigned sfx_sample_rate = 22050; unsigned spkr_extra_buf = 800 / spkr_fps; const unsigned spkr_buf_size = spkr_seconds * spkr_sample_rate * 2 / spkr_fps; int16_t spkr_samples [ spkr_buf_size * spkr_fps * BUFFER_COUNT * 2]; // stereo @@ -76,9 +78,19 @@ unsigned spkr_sample_idx = 0; const unsigned spkr_play_timeout = 8; // increase to 32 for 240 fps unsigned spkr_play_time = 0; +unsigned spkr_play_disk_motor_time = 0; +unsigned spkr_play_disk_arm_time = 0; +unsigned spkr_play_disk_ioerr_time = 0; + +uint8_t * diskmotor_sfx = NULL; +int diskmotor_sfx_len = 0; +uint8_t * diskarm_sfx = NULL; +int diskarm_sfx_len = 0; +uint8_t * diskioerr_sfx = NULL; +int diskioerr_sfx_len = 0; -static uint8_t* load_sfx( const char * bundlePath, const char * filename ) { +static int load_sfx( const char * bundlePath, const char * filename, uint8_t ** buf ) { char fullPath[256]; strcpy( fullPath, bundlePath ); @@ -88,7 +100,7 @@ static uint8_t* load_sfx( const char * bundlePath, const char * filename ) { FILE * f = fopen(fullPath, "rb"); if (f == NULL) { perror("Failed to read SFX: "); - return NULL; + return -1; } fseek(f, 0L, SEEK_END); @@ -97,32 +109,34 @@ static uint8_t* load_sfx( const char * bundlePath, const char * filename ) { if (flen <= 0) { printf("Failed to read SFX or 0 size\n"); - return NULL; + return -1; } - uint8_t * buffer = malloc(flen); + *buf = malloc(flen); - if (buffer == NULL) { + if ( *buf == NULL ) { printf("Not enough memory for SFX\n"); - return NULL; + return -1; } - fread( buffer, 1, flen, f); + fread( *buf, 1, flen, f); fclose(f); if ( flen == 0 ) { printf("Error loading SFX file\n"); - free(buffer); - return NULL; // there was an error + free( *buf ); + return -1; // there was an error } // everything seems to be ok - return buffer; + return flen; } void spkr_load_sfx( const char * bundlePath ) { - + diskmotor_sfx_len = load_sfx(bundlePath, "diskmotor.raw", &diskmotor_sfx); + diskarm_sfx_len = load_sfx(bundlePath, "diskarm.raw", &diskarm_sfx); + diskioerr_sfx_len = load_sfx(bundlePath, "diskioerr.raw", &diskioerr_sfx); } @@ -143,22 +157,65 @@ void spkr_init() { // Create buffer to store samples alGenBuffers(BUFFER_COUNT, spkr_buffers); + alGenBuffers(1, &spkr_disk_motor_buf); + alGenBuffers(1, &spkr_disk_arm_buf); + alGenBuffers(1, &spkr_disk_ioerr_buf); al_check_error(); // Set-up sound source and play buffer - alGenSources(1, &spkr_src); + alGenSources(4, spkr_src); al_check_error(); - alSourcei(spkr_src, AL_LOOPING, AL_FALSE); + alSourcei(spkr_src[0], AL_LOOPING, AL_FALSE); al_check_error(); - alSourcef(spkr_src, AL_ROLLOFF_FACTOR, 0); + alSourcef(spkr_src[0], AL_ROLLOFF_FACTOR, 0); al_check_error(); - alSource3f(spkr_src, AL_POSITION, 0.0, 8.0, 0.0); + alSource3f(spkr_src[0], AL_POSITION, 0.0, 8.0, 0.0); al_check_error(); alListener3f(AL_POSITION, 0.0, 0.0, 0.0); al_check_error(); alListener3f(AL_ORIENTATION, 0.0, -16.0, 0.0); al_check_error(); + + // Set-up disk motor sound source and play buffer + alSourcei(spkr_src[1], AL_LOOPING, AL_TRUE); + al_check_error(); + alSourcef(spkr_src[1], AL_ROLLOFF_FACTOR, 0); + al_check_error(); + alSource3f(spkr_src[1], AL_POSITION, 0.0, 8.0, 0.0); + al_check_error(); + alListener3f(AL_POSITION, 0.0, 0.0, 0.0); + al_check_error(); + alListener3f(AL_ORIENTATION, 0.0, -16.0, 0.0); + al_check_error(); + + + // Set-up disk arm sound source and play buffer + alSourcei(spkr_src[2], AL_LOOPING, AL_TRUE); + al_check_error(); + alSourcef(spkr_src[2], AL_ROLLOFF_FACTOR, 0); + al_check_error(); + alSource3f(spkr_src[2], AL_POSITION, 0.0, 8.0, 0.0); + al_check_error(); + alListener3f(AL_POSITION, 0.0, 0.0, 0.0); + al_check_error(); + alListener3f(AL_ORIENTATION, 0.0, -16.0, 0.0); + al_check_error(); + + + // Set-up disk io error sound source and play buffer + alSourcei(spkr_src[3], AL_LOOPING, AL_FALSE); + al_check_error(); + alSourcef(spkr_src[3], AL_ROLLOFF_FACTOR, 0); + al_check_error(); + alSource3f(spkr_src[3], AL_POSITION, 0.0, 8.0, 0.0); + al_check_error(); + alListener3f(AL_POSITION, 0.0, 0.0, 0.0); + al_check_error(); + alListener3f(AL_ORIENTATION, 0.0, -16.0, 0.0); + al_check_error(); + + // start from the beginning spkr_sample_idx = 0; @@ -168,7 +225,7 @@ void spkr_init() { // Dealloc OpenAL void spkr_exit() { - if ( spkr_src ) { + if ( spkr_src[0] ) { ALCdevice *dev = NULL; ALCcontext *ctx = NULL; ctx = alcGetCurrentContext(); @@ -180,7 +237,7 @@ void spkr_exit() { al_check_error(); - spkr_src = 0; + spkr_src[0] = 0; } } @@ -264,11 +321,11 @@ void spkr_update() { // printf("freeBuffers:%d queued:%d processed:%d\n", freeBuffers, queued,processed); do { - alGetSourcei (spkr_src, AL_BUFFERS_PROCESSED, &processed); + alGetSourcei (spkr_src[0], AL_BUFFERS_PROCESSED, &processed); // al_check_error(); if ( processed ) { - alSourceUnqueueBuffers( spkr_src, processed, &spkr_buffers[freeBuffers]); + alSourceUnqueueBuffers( spkr_src[0], processed, &spkr_buffers[freeBuffers]); // al_check_error(); freeBuffers += processed; } @@ -280,7 +337,7 @@ void spkr_update() { // printf("freeBuffers2: %d processed: %d\n", freeBuffers, processed); ALenum state; - alGetSourcei( spkr_src, AL_SOURCE_STATE, &state ); + alGetSourcei( spkr_src[0], AL_SOURCE_STATE, &state ); // al_check_error(); ////////// check if there is no sound generated for long time, and fade out speaker level to avoid pops and crackles @@ -310,7 +367,7 @@ void spkr_update() { freeBuffers--; alBufferData(spkr_buffers[freeBuffers], AL_FORMAT_STEREO16, spkr_samples, spkr_sample_idx * sizeof(spkr_samples[0]), spkr_sample_rate); al_check_error(); - alSourceQueueBuffers(spkr_src, 1, &spkr_buffers[freeBuffers]); + alSourceQueueBuffers(spkr_src[0], 1, &spkr_buffers[freeBuffers]); al_check_error(); } } @@ -318,13 +375,13 @@ void spkr_update() { freeBuffers--; alBufferData(spkr_buffers[freeBuffers], AL_FORMAT_STEREO16, spkr_samples, (spkr_buf_size + spkr_extra_buf) * sizeof(spkr_samples[0]), spkr_sample_rate); al_check_error(); - alSourceQueueBuffers(spkr_src, 1, &spkr_buffers[freeBuffers]); + alSourceQueueBuffers(spkr_src[0], 1, &spkr_buffers[freeBuffers]); al_check_error(); } switch (state) { case AL_PAUSED: - alSourcePlay(spkr_src); + alSourcePlay(spkr_src[0]); break; case AL_PLAYING: @@ -332,8 +389,8 @@ void spkr_update() { break; default: - alSourcePlay(spkr_src); - alSourcePause(spkr_src); + alSourcePlay(spkr_src[0]); + alSourcePause(spkr_src[0]); break; } @@ -347,6 +404,128 @@ void spkr_update() { spkr_sample_idx = 0; } + + } +void spkr_playqueue_sfx( ALuint src, ALuint * buf, uint8_t * sfx, int len ) { + + alBufferData( *buf, AL_FORMAT_STEREO16, sfx, len, sfx_sample_rate ); + al_check_error(); + alSourceQueueBuffers( src, 1, buf ); + al_check_error(); + + ALenum state; + alGetSourcei( src, AL_SOURCE_STATE, &state ); +// al_check_error(); + + switch (state) { + case AL_PLAYING: + // already playing + break; + + default: + alSourcePlay( src ); + break; + } +} + + +void spkr_play_sfx( ALuint src, ALuint * buf, uint8_t * sfx, int len ) { + + ALenum state; + alGetSourcei( src, AL_SOURCE_STATE, &state ); +// al_check_error(); + + switch (state) { + case AL_PAUSED: + alSourcePlay( src ); + break; + + case AL_PLAYING: + // already playing + break; + + default: + alBufferData( *buf, AL_FORMAT_STEREO16, sfx, len, sfx_sample_rate ); + al_check_error(); + alSourceQueueBuffers( src, 1, buf ); + al_check_error(); + + alSourcePlay( src ); + break; + } +} + + +void spkr_stop_sfx( ALuint src, ALuint * buf ) { + + ALenum state; + alGetSourcei( src, AL_SOURCE_STATE, &state ); +// al_check_error(); + + switch (state) { + case AL_PAUSED: + case AL_PLAYING: + alSourceStop( src ); + alSourceUnqueueBuffers( src, 1, buf ); + break; + + default: + break; + } +} + + +void spkr_play_disk_motor() { + if ( diskAccelerator_count == 0 ) { + spkr_play_sfx( spkr_src[1], &spkr_disk_motor_buf, diskmotor_sfx, diskmotor_sfx_len ); + } +} + +void spkr_stop_disk_motor( int time ) { + if ( diskAccelerator_count == 0 ) { + spkr_play_disk_motor_time = time; + } +} + + +void spkr_play_disk_arm() { + if ( diskAccelerator_count == 0 ) { + if ( spkr_play_disk_ioerr_time == 0 ) { + spkr_play_sfx( spkr_src[2], &spkr_disk_arm_buf, diskarm_sfx, diskarm_sfx_len ); + spkr_play_disk_arm_time = 2; +// spkr_play_disk_ioerr_time = 2; + } + } +} + + +void spkr_play_disk_ioerr() { +// spkr_stop_sfx( spkr_src[3], &spkr_disk_ioerr_buf ); + if ( diskAccelerator_count == 0 ) { + spkr_playqueue_sfx( spkr_src[3], &spkr_disk_ioerr_buf, diskioerr_sfx, diskioerr_sfx_len ); + spkr_play_disk_ioerr_time = 6; + } +} + + +void update_disk_sfx( unsigned * time, ALuint src, ALuint * buf ) { + if ( diskAccelerator_count == 0 ) { + if ( *time ) { + if ( --*time == 0 ) { + spkr_stop_sfx( src, buf ); + } + } + } +} + +void spkr_update_disk_sfx() { + if ( diskAccelerator_count == 0 ) { + update_disk_sfx( &spkr_play_disk_motor_time, spkr_src[1], &spkr_disk_motor_buf ); + update_disk_sfx( &spkr_play_disk_arm_time, spkr_src[2], &spkr_disk_arm_buf ); + update_disk_sfx( &spkr_play_disk_ioerr_time, spkr_src[3], &spkr_disk_ioerr_buf ); + } +} + diff --git a/src/dev/audio/speaker.h b/src/dev/audio/speaker.h index 82541e0..08b629a 100644 --- a/src/dev/audio/speaker.h +++ b/src/dev/audio/speaker.h @@ -10,9 +10,25 @@ #define speaker_h #include +#include +#include + +// very loud +//#define SPKR_LEVEL_MIN (-28000) +//#define SPKR_LEVEL_MAX (+28000) + +// loud +//#define SPKR_LEVEL_MIN (-5000) +//#define SPKR_LEVEL_MAX (+5000) + +// medium +#define SPKR_LEVEL_MIN (-3000) +#define SPKR_LEVEL_MAX (+3000) + +// quiet +//#define SPKR_LEVEL_MIN (-1000) +//#define SPKR_LEVEL_MAX (+1000) -#define SPKR_LEVEL_MIN (-28000) -#define SPKR_LEVEL_MAX (+28000) #define SPKR_LEVEL_ZERO 0 // as defined in OpenAL documentation for 8bit PCM @@ -34,5 +50,13 @@ extern void spkr_exit(void); extern void spkr_update(void); extern void spkr_toggle(void); +extern void spkr_load_sfx( const char * bundlePath ); + +extern void spkr_play_disk_motor(void); +extern void spkr_stop_disk_motor( int time ); +extern void spkr_update_disk_sfx(void); + +extern void spkr_play_disk_arm(void); +extern void spkr_play_disk_ioerr(void); #endif /* speaker_h */ diff --git a/src/dev/disk/disk.c b/src/dev/disk/disk.c index 2968dc0..7cbdb1d 100644 --- a/src/dev/disk/disk.c +++ b/src/dev/disk/disk.c @@ -85,10 +85,15 @@ void disk_phase() { disk.phase.count += direction; if( disk.phase.count < minDiskPhaseNum ) { disk.phase.count = minDiskPhaseNum; + spkr_play_disk_ioerr(); } else if( disk.phase.count > maxDiskPhaseNum ) { disk.phase.count = maxDiskPhaseNum; + spkr_play_disk_ioerr(); + } + else { + spkr_play_disk_arm(); } // TODO: Add track positioning sfx @@ -103,6 +108,8 @@ void disk_phase() { // invalid magnet config } + + // printf("\n"); } @@ -118,6 +125,14 @@ void disk_phase_off( uint8_t currentMagnet ) { disk_phase(); } +void disk_motor_on() { + spkr_play_disk_motor(); + spkr_stop_disk_motor( -1 ); +} + +void disk_motor_off() { + spkr_stop_disk_motor( 3 * fps ); // 3 second delay +} uint8_t disk_read() { dbgPrintf("io_DISK_READ (S%u)\n", 6); diff --git a/src/dev/disk/disk.h b/src/dev/disk/disk.h index 5ea4009..5d6e178 100644 --- a/src/dev/disk/disk.h +++ b/src/dev/disk/disk.h @@ -68,5 +68,8 @@ extern void disk_phase_on( uint8_t currentMagnet ); extern void disk_phase_off( uint8_t currentMagnet ); extern uint8_t disk_read(void); +extern void disk_motor_on(void); +extern void disk_motor_off(void); + #endif /* disk_h */ diff --git a/src/dev/mem/mmio.h b/src/dev/mem/mmio.h index 14bf13f..997e5a1 100644 --- a/src/dev/mem/mmio.h +++ b/src/dev/mem/mmio.h @@ -720,10 +720,12 @@ INLINE uint8_t ioRead( uint16_t addr ) { case (uint8_t)io_DISK_POWER_OFF + SLOT6: dbgPrintf2("io_DISK_POWER_OFF (S%u)\n", 6); + disk_motor_off(); return 0; case (uint8_t)io_DISK_POWER_ON + SLOT6: dbgPrintf2("io_DISK_POWER_ON (S%u)\n", 6); + disk_motor_on(); return 0; case (uint8_t)io_DISK_SELECT_1 + SLOT6: