mirror of
https://github.com/trudnai/Steve2.git
synced 2024-06-13 09:29:36 +00:00
- Fixed Game Mode Speaker Simulation
This commit is contained in:
parent
ec2617c7ae
commit
72930227f4
|
@ -976,9 +976,7 @@ class ViewController: NSViewController {
|
||||||
cpuMode = cpuMode_eco
|
cpuMode = cpuMode_eco
|
||||||
|
|
||||||
fps = DEFAULT_FPS
|
fps = DEFAULT_FPS
|
||||||
spkr_fps = DEFAULT_FPS
|
|
||||||
video_fps_divider = DEF_VIDEO_DIV
|
video_fps_divider = DEF_VIDEO_DIV
|
||||||
|
|
||||||
break
|
break
|
||||||
|
|
||||||
case "Game":
|
case "Game":
|
||||||
|
@ -986,9 +984,7 @@ class ViewController: NSViewController {
|
||||||
cpuState = cpuState_running
|
cpuState = cpuState_running
|
||||||
|
|
||||||
fps = GAME_FPS
|
fps = GAME_FPS
|
||||||
spkr_fps = GAME_FPS
|
|
||||||
video_fps_divider = GAME_VIDEO_DIV
|
video_fps_divider = GAME_VIDEO_DIV
|
||||||
|
|
||||||
break
|
break
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -996,13 +992,14 @@ class ViewController: NSViewController {
|
||||||
cpuState = cpuState_running
|
cpuState = cpuState_running
|
||||||
|
|
||||||
fps = DEFAULT_FPS
|
fps = DEFAULT_FPS
|
||||||
spkr_fps = DEFAULT_FPS
|
|
||||||
video_fps_divider = DEF_VIDEO_DIV
|
video_fps_divider = DEF_VIDEO_DIV
|
||||||
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
spkr_buf_size = spkr_sample_rate * 2 / spkr_fps
|
spkr_fps_divider = fps / spkr_fps
|
||||||
|
spkr_play_timeout = 8 * spkr_fps_divider
|
||||||
|
|
||||||
|
// spkr_buf_size = spkr_sample_rate * 2 / spkr_fps
|
||||||
newUpdateTimer( timeInterval: 1 / Double(fps) )
|
newUpdateTimer( timeInterval: 1 / Double(fps) )
|
||||||
setCPUClockSpeed(freq: MHz_6502)
|
setCPUClockSpeed(freq: MHz_6502)
|
||||||
|
|
||||||
|
|
|
@ -179,6 +179,7 @@ extern double mhz;
|
||||||
|
|
||||||
#define DEFAULT_FPS 30U
|
#define DEFAULT_FPS 30U
|
||||||
#define DEF_VIDEO_DIV 1U
|
#define DEF_VIDEO_DIV 1U
|
||||||
|
#define DEF_SPKR_DIV 1U
|
||||||
|
|
||||||
#define GAME_FPS 600U
|
#define GAME_FPS 600U
|
||||||
#define GAME_VIDEO_DIV 10U
|
#define GAME_VIDEO_DIV 10U
|
||||||
|
|
|
@ -74,7 +74,11 @@ ALuint spkr_disk_arm_buf = 0;
|
||||||
ALuint spkr_disk_ioerr_buf = 0;
|
ALuint spkr_disk_ioerr_buf = 0;
|
||||||
|
|
||||||
|
|
||||||
unsigned spkr_fps = DEFAULT_FPS;
|
const unsigned spkr_fps = DEFAULT_FPS;
|
||||||
|
unsigned spkr_fps_divider = 1;
|
||||||
|
unsigned spkr_frame_cntr = 0;
|
||||||
|
unsigned spkr_clk = 0;
|
||||||
|
|
||||||
const unsigned spkr_seconds = 1;
|
const unsigned spkr_seconds = 1;
|
||||||
const unsigned spkr_sample_rate = 44100;
|
const unsigned spkr_sample_rate = 44100;
|
||||||
const unsigned sfx_sample_rate = 22050; // original sample rate
|
const unsigned sfx_sample_rate = 22050; // original sample rate
|
||||||
|
@ -274,7 +278,7 @@ void spkr_toggle() {
|
||||||
|
|
||||||
// push a click into the speaker buffer
|
// push a click into the speaker buffer
|
||||||
// (we will play the entire buffer at the end of the frame)
|
// (we will play the entire buffer at the end of the frame)
|
||||||
spkr_sample_idx = (clkfrm / ( MHZ(default_MHz_6502) / spkr_sample_rate)) * 2;
|
spkr_sample_idx = ( (spkr_clk + clkfrm) / ( MHZ(default_MHz_6502) / spkr_sample_rate)) * 2;
|
||||||
|
|
||||||
if ( spkr_state ) {
|
if ( spkr_state ) {
|
||||||
// down edge
|
// down edge
|
||||||
|
@ -316,7 +320,7 @@ void spkr_toggle() {
|
||||||
for ( int i = spkr_sample_idx; i < spkr_buf_size + spkr_extra_buf; i++ ) {
|
for ( int i = spkr_sample_idx; i < spkr_buf_size + spkr_extra_buf; i++ ) {
|
||||||
spkr_samples[i] = spkr_level;
|
spkr_samples[i] = spkr_level;
|
||||||
}
|
}
|
||||||
// memset(spkr_samples + spkr_sample_idx, spkr_level, spkr_buf_size * sizeof(spkr_samples[0]));
|
// memset(spkr_samples + spkr_sample_idx, spkr_level, spkr_buf_size * sizeof(spkr_samples[0]));
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -342,82 +346,90 @@ int spkr_unqueue( ALuint src ) {
|
||||||
|
|
||||||
int playDelay = 4;
|
int playDelay = 4;
|
||||||
|
|
||||||
|
|
||||||
void spkr_update() {
|
void spkr_update() {
|
||||||
if ( spkr_play_time ) {
|
if ( ++spkr_frame_cntr >= spkr_fps_divider ) {
|
||||||
// free up unused buffers
|
spkr_frame_cntr = 0;
|
||||||
freeBuffers += spkr_unqueue( spkr_src[SPKR_SRC_GAME_SFX] );
|
|
||||||
freeBuffers = clamp( 1, freeBuffers, BUFFER_COUNT );
|
|
||||||
|
|
||||||
if ( freeBuffers ) {
|
|
||||||
|
|
||||||
|
if ( spkr_play_time ) {
|
||||||
|
// free up unused buffers
|
||||||
|
freeBuffers += spkr_unqueue( spkr_src[SPKR_SRC_GAME_SFX] );
|
||||||
|
freeBuffers = clamp( 1, freeBuffers, BUFFER_COUNT );
|
||||||
|
|
||||||
if ( --spkr_play_time == 0 ) {
|
if ( freeBuffers ) {
|
||||||
float fadeLevel = spkr_level - SPKR_LEVEL_ZERO;
|
|
||||||
|
|
||||||
if ( spkr_level != SPKR_LEVEL_ZERO ) {
|
|
||||||
spkr_sample_idx = 0;
|
|
||||||
|
|
||||||
while ( ( fadeLevel < -1 ) || ( fadeLevel > 1 ) ) {
|
if ( --spkr_play_time == 0 ) {
|
||||||
spkr_samples[ spkr_sample_idx++ ] = SPKR_LEVEL_ZERO + fadeLevel;
|
float fadeLevel = spkr_level - SPKR_LEVEL_ZERO;
|
||||||
spkr_samples[ spkr_sample_idx++ ] = SPKR_LEVEL_ZERO + fadeLevel;
|
|
||||||
|
if ( spkr_level != SPKR_LEVEL_ZERO ) {
|
||||||
// how smooth we want the speeker to decay, so we will hear no pops and crackles
|
spkr_sample_idx = 0;
|
||||||
fadeLevel *= 0.999;
|
|
||||||
|
while ( ( fadeLevel < -1 ) || ( fadeLevel > 1 ) ) {
|
||||||
|
spkr_samples[ spkr_sample_idx++ ] = SPKR_LEVEL_ZERO + fadeLevel;
|
||||||
|
spkr_samples[ spkr_sample_idx++ ] = SPKR_LEVEL_ZERO + fadeLevel;
|
||||||
|
|
||||||
|
// how smooth we want the speeker to decay, so we will hear no pops and crackles
|
||||||
|
fadeLevel *= 0.999;
|
||||||
|
}
|
||||||
|
spkr_level = SPKR_LEVEL_ZERO;
|
||||||
|
|
||||||
|
//spkr_samples[sample_idx] = spkr_level;
|
||||||
|
memset(spkr_samples + spkr_sample_idx, SPKR_LEVEL_ZERO, spkr_extra_buf * sizeof(spkr_samples[0]));
|
||||||
|
|
||||||
|
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[SPKR_SRC_GAME_SFX], 1, &spkr_buffers[freeBuffers]);
|
||||||
|
al_check_error();
|
||||||
}
|
}
|
||||||
spkr_level = SPKR_LEVEL_ZERO;
|
}
|
||||||
|
else {
|
||||||
//spkr_samples[sample_idx] = spkr_level;
|
|
||||||
memset(spkr_samples + spkr_sample_idx, SPKR_LEVEL_ZERO, spkr_extra_buf * sizeof(spkr_samples[0]));
|
|
||||||
|
|
||||||
freeBuffers--;
|
freeBuffers--;
|
||||||
alBufferData(spkr_buffers[freeBuffers], AL_FORMAT_STEREO16, spkr_samples, spkr_sample_idx * sizeof(spkr_samples[0]), spkr_sample_rate);
|
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();
|
al_check_error();
|
||||||
alSourceQueueBuffers(spkr_src[SPKR_SRC_GAME_SFX], 1, &spkr_buffers[freeBuffers]);
|
alSourceQueueBuffers(spkr_src[SPKR_SRC_GAME_SFX], 1, &spkr_buffers[freeBuffers]);
|
||||||
al_check_error();
|
al_check_error();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else {
|
ALenum state;
|
||||||
freeBuffers--;
|
alGetSourcei( spkr_src[SPKR_SRC_GAME_SFX], AL_SOURCE_STATE, &state );
|
||||||
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();
|
||||||
al_check_error();
|
|
||||||
alSourceQueueBuffers(spkr_src[SPKR_SRC_GAME_SFX], 1, &spkr_buffers[freeBuffers]);
|
switch (state) {
|
||||||
al_check_error();
|
case AL_PAUSED:
|
||||||
}
|
if ( --playDelay <= 0 ) {
|
||||||
|
alSourcePlay(spkr_src[SPKR_SRC_GAME_SFX]);
|
||||||
ALenum state;
|
playDelay = 4;
|
||||||
alGetSourcei( spkr_src[SPKR_SRC_GAME_SFX], AL_SOURCE_STATE, &state );
|
}
|
||||||
// al_check_error();
|
break;
|
||||||
|
|
||||||
switch (state) {
|
|
||||||
case AL_PAUSED:
|
|
||||||
if ( --playDelay <= 0 ) {
|
|
||||||
alSourcePlay(spkr_src[SPKR_SRC_GAME_SFX]);
|
|
||||||
playDelay = 4;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AL_PLAYING:
|
case AL_PLAYING:
|
||||||
// already playing
|
// already playing
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
alSourcePlay(spkr_src[SPKR_SRC_GAME_SFX]);
|
alSourcePlay(spkr_src[SPKR_SRC_GAME_SFX]);
|
||||||
alSourcePause(spkr_src[SPKR_SRC_GAME_SFX]);
|
alSourcePause(spkr_src[SPKR_SRC_GAME_SFX]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// clear the slack buffer , so we can fill it up by new data
|
// clear the slack buffer , so we can fill it up by new data
|
||||||
for ( int i = 0; i < spkr_buf_size + spkr_extra_buf; i++ ) {
|
for ( int i = 0; i < spkr_buf_size + spkr_extra_buf; i++ ) {
|
||||||
spkr_samples[i] = spkr_level;
|
spkr_samples[i] = spkr_level;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// start from the beginning
|
||||||
|
// spkr_sample_idx = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// start from the beginning
|
spkr_clk = 0;
|
||||||
// spkr_sample_idx = 0;
|
}
|
||||||
|
else {
|
||||||
|
spkr_clk += clkfrm;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,8 @@
|
||||||
extern const unsigned spkr_sample_rate;
|
extern const unsigned spkr_sample_rate;
|
||||||
extern const unsigned spkr_buf_alloc_size;
|
extern const unsigned spkr_buf_alloc_size;
|
||||||
extern unsigned spkr_buf_size;
|
extern unsigned spkr_buf_size;
|
||||||
extern unsigned spkr_fps;
|
extern const unsigned spkr_fps;
|
||||||
|
extern unsigned spkr_fps_divider;
|
||||||
extern int16_t spkr_samples [];
|
extern int16_t spkr_samples [];
|
||||||
extern unsigned spkr_sample_idx;
|
extern unsigned spkr_sample_idx;
|
||||||
extern int spkr_level;
|
extern int spkr_level;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user