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;