From ae5d8211fb97cabf55a7b6f316e17c569901c297 Mon Sep 17 00:00:00 2001 From: tudnai Date: Sun, 17 May 2020 18:31:41 -0700 Subject: [PATCH] Fixed hang when Power On pressed multiple times --- src/cpu/6502.c | 2 +- src/dev/audio/speaker.c | 24 ++++++++++++++++-------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/cpu/6502.c b/src/cpu/6502.c index 9c85969..0d40619 100644 --- a/src/cpu/6502.c +++ b/src/cpu/6502.c @@ -859,7 +859,7 @@ void m6502_ColdReset( const char * bundlePath, const char * romFileName ) { // wait 100ms to be sure simulation has been halted usleep(100000); - printf("Bundlepath: %s", bundlePath); + printf("Bundlepath: %s\n", bundlePath); // epoch = rdtsc(); // sleep(1); diff --git a/src/dev/audio/speaker.c b/src/dev/audio/speaker.c index fc159dc..722ac14 100644 --- a/src/dev/audio/speaker.c +++ b/src/dev/audio/speaker.c @@ -89,7 +89,6 @@ void spkr_init() { // Fill buffer with zeros memset( spkr_samples, spkr_level, spkr_buf_size ); - // Create buffer to store samples alGenBuffers(BUFFER_COUNT, spkr_buffers); al_check_error(); @@ -111,6 +110,8 @@ void spkr_init() { // start from the beginning spkr_sample_idx = 0; + // make sure we have free buffers initialized here + freeBuffers = BUFFER_COUNT; } // Dealloc OpenAL @@ -154,12 +155,24 @@ void spkr_update() { // spkr_buf = 0; // } +// ALint queued = 0; ALint processed = 0; + +// alGetSourcei (spkr_src, AL_BUFFERS_QUEUED, &queued); +// alGetSourcei (spkr_src, AL_BUFFERS_PROCESSED, &processed); +// +// printf("freeBuffers:%d queued:%d processed:%d\n", freeBuffers, queued,processed); + do { alGetSourcei (spkr_src, AL_BUFFERS_PROCESSED, &processed); -// if ( processed ) - freeBuffers += processed; // al_check_error(); + + if ( processed ) { + alSourceUnqueueBuffers( spkr_src, processed, &spkr_buffers[freeBuffers]); +// al_check_error(); + freeBuffers += processed; + } + // usleep(100); // if ( freeBuffers <= 0 ) printf("No Free Buffer\n"); } while( freeBuffers <= 0 ); @@ -172,11 +185,6 @@ void spkr_update() { alGetSourcei( spkr_src, AL_SOURCE_STATE, &state ); // al_check_error(); - if ( processed ) { - alSourceUnqueueBuffers( spkr_src, processed, &spkr_buffers[freeBuffers - processed]); -// al_check_error(); - } - // spkr_samples[0] = 0; // spkr_samples[1] = 255; // spkr_samples[2] = 0;