chip8

Unnamed repository; edit this file 'description' to name the repository.
git clone git://git.vgx.fr/chip8
Log | Files | Refs

commit 9e2576c23ce5be167f71d74abba55c89cf2e2d86
parent 3651261430c0bf2512b45438288bb72b562e52d7
Author: Léo Villeveygoux <l@vgx.fr>
Date:   Sat,  4 May 2019 03:00:03 +0200

Add sound support

440Hz unsigned 8bit saw waves using plain SDL audio.

Diffstat:
Mchip8.c | 2++
Mmedia-sdl.c | 39+++++++++++++++++++++++++++++++++++++++
Mmedia.h | 1+
3 files changed, 42 insertions(+), 0 deletions(-)

diff --git a/chip8.c b/chip8.c @@ -383,6 +383,8 @@ int main(int argc, char **argv){ if(ST) ST--; } + set_buzzer_state(ST ? 1 : 0); + printf("i=%5d, DT=%3d, K=[", i, (int)DT); for(int k=0 ; k<16;k++) printf("%s", KEYBOARD & 1<<k ? "1":"0"); diff --git a/media-sdl.c b/media-sdl.c @@ -13,6 +13,12 @@ #define WINDOW_NAME "CHIP-8 emulator" #define NUM_PIXELS (SCREEN_WIDTH*SCREEN_HEIGHT) + +#define SOUND_DEV_FREQ 48000 +#define SOUND_SAMPLES 1024 +#define BUZZER_FREQ 440 +#define BUZZER_VOL .05 + unsigned char *pixels; SDL_Window *window; @@ -20,6 +26,10 @@ SDL_Renderer *renderer; SDL_Texture *texture; SDL_Rect rect = {.x=0,.y=0,.w=SCREEN_WIDTH,.h=SCREEN_HEIGHT}; +/* sound state*/ +int buzzer_state = 0; +long sample_num = 0; + unsigned clock; /* @@ -43,6 +53,18 @@ SDL_Keycode keys[16] = { SDLK_6, SDLK_y, SDLK_h, SDLK_n }; +static void buzzer_callback(void* userdata, Uint8* stream, int len){ + (void) userdata; + for(int i=0 ; i<len ; i++){ + if(buzzer_state == 0) + stream[i] = 0; + else /* saw waves at the moment */ + stream[i] = + ((sample_num++*256*BUZZER_FREQ/SOUND_DEV_FREQ) + %256)*BUZZER_VOL; + } +} + int m_init(int argc, char **argv){ (void)argc, (void)argv; /*TODO: check every init */ @@ -67,6 +89,16 @@ int m_init(int argc, char **argv){ SDL_RenderClear(renderer); + SDL_OpenAudio(&(SDL_AudioSpec){ + .freq = SOUND_DEV_FREQ, + .format = AUDIO_U8, + .channels = 1, + .samples = SOUND_SAMPLES, + .callback = buzzer_callback, + }, NULL); + + SDL_PauseAudio(0); + clock = SDL_GetTicks(); return 0; @@ -76,6 +108,9 @@ void m_quit(void){ SDL_DestroyTexture(texture); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); + + SDL_CloseAudio(); + SDL_Quit(); free(pixels); @@ -142,6 +177,10 @@ void send_draw(void){ SDL_RenderClear(renderer); } +void set_buzzer_state(int state){ + buzzer_state = state; +} + void wait_tick(void){ /* TODO: tunable frequency */ unsigned new_clock = SDL_GetTicks(); diff --git a/media.h b/media.h @@ -11,6 +11,7 @@ unsigned short wait_input(unsigned short input); void clear_screen(void); void draw(int x, int y, int value); void send_draw(void); +void set_buzzer_state(int state); void wait_tick(void);