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:
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);