diff --git a/Makefile b/Makefile index 9ed28b2..db6f425 100644 --- a/Makefile +++ b/Makefile @@ -46,8 +46,8 @@ run: all all: $(EXE) -$(EXE): prebuild build/main.o build/vect.o build/logger.o build/game.o build/garbo.o build/draw.o build/controlscheme.o build/environment.o build/colours.o build/datatypes.o - cd build && $(CC) -o $(EXE) main.o vect.o game.o logger.o draw.o garbo.o environment.o controlscheme.o colours.o datatypes.o $(CCFLAGS) +$(EXE): prebuild build/main.o build/vect.o build/logger.o build/game.o build/garbo.o build/draw.o build/controlscheme.o build/environment.o build/colours.o build/datatypes.o build/audio.o + cd build && $(CC) -o $(EXE) main.o vect.o game.o logger.o draw.o garbo.o environment.o controlscheme.o colours.o datatypes.o audio.o $(CCFLAGS) build/colours.o: c-colours/colours.c c-colours/colours.h $(CC) -c c-colours/colours.c -o build/colours.o $(CCFLAGS) @@ -79,6 +79,9 @@ build/controlscheme.o: src/controlscheme.c src/controlscheme.h build/environment.o: src/environment.c src/environment.h $(CC) -c src/environment.c -o build/environment.o $(CCFLAGS) +build/audio.o: src/audio.c src/audio.h + $(CC) -c src/audio.c -o build/audio.o $(CCFLAGS) + clean: rm build/*.o diff --git a/src/audio.c b/src/audio.c new file mode 100644 index 0000000..558b1a4 --- /dev/null +++ b/src/audio.c @@ -0,0 +1,151 @@ +#include "audio.h" + +void generate_audio(void); +struct game_sounds game_sounds; + +Uint8 big_hum(unsigned int t); +Uint8 func0(int t); + + + void fill_audio(void *func, Uint8 *stream, int len) { + Uint8 (*wavegen)(int) = func; + + static int t = 1; + for(int i = 0; i < len; i++,t++) { + stream[i] = wavegen(t); + } +} + +void callbackfn3(void *unused, Uint8 *stream, int len) { + static int t = 1; + for(int i = 0; i < len; i++,t++) { + stream[i] = big_hum(t); + stream[i] = 0; + } +} + +void start_audio(void) { + + //audio_format.callback = callbackfn3; + /* just for playing background music + if (SDL_OpenAudio(&audio_format, NULL)) { + fprintf(stderr, "Unable to open audio: %s\n", SDL_GetError()); + exit(1); + } + */ + //SDL_PauseAudio(0); + if (Mix_OpenAudio(G_AUDIO_SFREQ,AUDIO_U8,1,G_AUDIO_BSIZE) < 0) { + fprintf(stderr, "Unable to open audio: %s\n", SDL_GetError()); + exit(1); + } + generate_audio(); + Mix_Resume(-1); +} + +void play_game_sound(Mix_Chunk *chunk, int len, int channel) { + if (Mix_Playing(channel)) { + return; + } + Mix_FadeInChannelTimed(channel, chunk, -1, 1, len); +} + +void synthplay_now(Uint8 (*bbgen)(unsigned int t), int len) { + static Mix_Chunk *new_chunk = NULL; + + if (Mix_Playing(1)) { + return; + } + + if (new_chunk) + Mix_FreeChunk(new_chunk); + + int generate_len = len * (512) * 8; + + Uint8 raw_data[generate_len]; + fill_audio(bbgen, raw_data, generate_len); + + new_chunk = Mix_QuickLoad_RAW(raw_data, generate_len); + Mix_PlayChannelTimed(1, new_chunk, -1, -1); +} + + + +void callbackfn2(void *unused, Uint8 *stream, int len) { + static int t = 1; + int i; + int yeet = rand(); + for(i=0; i < len; i++,t++) { + stream[i] = func0(t); + } +} + + +void callbackfn(void *unused, Uint8 *stream, int len) +{ + static int t = 0; + int i; + int yeet = rand(); + for( i=0; i < len; i++,t++) { + /* + stream[i] = (t*5&(t>>7))|(t*3&(t>>8)); + */ + //stream[i] = (( t >> 10 ) & 42) * t; + stream[i] = (t & yeet) % 73; + } +} + +/* Waveform Generators */ + +Uint8 big_hum(unsigned int t) { + return ( (sin(t*2*3.14159265/16000*200)+1) * 20) + ( (sin(t*2*3.14159265/16000*110)+1) * 20) + ( (sin(t*2*3.14159265/16000*230)+1) * 20) + ( (sin((t % 80)*2*3.14159265/16000 * 6)+1) * 12); +} + +unsigned int sine_wave_sound(int t) { + const double R=8000; // sample rate (samples per second) + const double C=261.625565; // frequency of middle-C (hertz) + const double F=R/256; // bytebeat frequency of 1*t due to 8-bit truncation (hertz) + const double V=127; // a volume constant + return (sin(t*2*M_PI/R*C)+1)*V; +} + +unsigned int winch_sound(int t) { + return (t % 80) | (t % 36) | (6 * (t % 6)); +} + +unsigned int beat_2(int t) { + return ((((t % 250) / 2)) | (t % 129)) % 110; +} + +Uint8 func0(int t) { + int note = 18; + if (t % 1240) { + note = (1 + rand()) % 18 + 1; + } + + fflush(stdout); + return (t % note); +} + +unsigned int func1(int t) { + int note = 10; + if (!(t % 8000)) { + note = (1 + rand()) % 10 + 5; + printf("%d %d\n", t, note); + } + return ((t & 110) % 73 | (t % 1711)); +} + + +void generate_audio(void) { + + const int sfx_len_ms = 2000; + unsigned int sfx_len = (G_AUDIO_SFREQ/1000) * G_AUDIO_BSIZE * sfx_len_ms; + Uint8 raw_data[sfx_len]; // 10 seconds + + fill_audio(winch_sound, raw_data, sfx_len); + game_sounds.rope_pull = Mix_QuickLoad_RAW(raw_data, sfx_len); + fill_audio(beat_2, raw_data, sfx_len); + game_sounds.collision = Mix_QuickLoad_RAW(raw_data, sfx_len); +} + + diff --git a/src/audio.h b/src/audio.h new file mode 100644 index 0000000..fff0f6c --- /dev/null +++ b/src/audio.h @@ -0,0 +1,26 @@ + +#ifndef AUDIO_H +#define AUDIO_H + +#include +#include "types.h" +#include +#include + +#define G_AUDIO_SFREQ 8000 +#define G_AUDIO_BSIZE 512 + +struct game_sounds { + unsigned int t; + Mix_Chunk *collision; + Mix_Chunk *rope_attach; + Mix_Chunk *rope_pull; + /* Looping samples (need backbuffer to fill while playing ) */ + Mix_Chunk *menu; +}; + +extern struct game_sounds game_sounds; + +void play_game_sound(Mix_Chunk *chunk, int len, int channel); +void start_audio(void); +#endif diff --git a/src/draw.h b/src/draw.h index c695b4a..a8f5af4 100644 --- a/src/draw.h +++ b/src/draw.h @@ -7,8 +7,8 @@ #include "garbo.h" #include "c-colours/colours.h" #include "vect.h" -#include "game.h" #include "environment.h" +#include "game.h" #define SHOWCOLLISION 0 #define SHOWFORCES 0 diff --git a/src/main.c b/src/main.c index b0943d5..6e9d326 100644 --- a/src/main.c +++ b/src/main.c @@ -1,5 +1,5 @@ -#include #include +#include #include #include #include @@ -11,6 +11,7 @@ #include #include +#include "audio.h" // only for mkdirat lol #include #include @@ -23,24 +24,10 @@ const int screen_width = 800; const int screen_height = 600; -SDL_AudioSpec audio_format = {.freq = 8000, .format = AUDIO_U8,.channels = 2, .samples=128}; -#define G_AUDIO_SFREQ 8000 -#define G_AUDIO_BSIZE 512 SDL_sem *resume; -struct game_sounds { - unsigned int t; - Mix_Chunk *collision; - Mix_Chunk *rope_attach; - Mix_Chunk *rope_pull; - /* Looping samples (need backbuffer to fill while playing ) */ - Mix_Chunk *menu; -}; - -struct game_sounds game_sounds; - struct SDL_Window* make_window(void) { if (SDL_Init(SDL_INIT_EVERYTHING) != 0) { @@ -55,133 +42,6 @@ struct SDL_Window* make_window(void) { SDL_WINDOW_FULLSCREEN_DESKTOP); } -void callbackfn(void *unused, Uint8 *stream, int len); -void callbackfn2(void *unused, Uint8 *stream, int len); -void callbackfn3(void *unused, Uint8 *stream, int len); - - -unsigned int func1(int t) { - int note = 10; - if (!(t % 8000)) { - note = (1 + rand()) % 10 + 5; - printf("%d %d\n", t, note); - } - return ((t & 110) % 73 | (t % 1711)); -} - - -Uint8 big_hum(unsigned int t) { - return ( (sin(t*2*3.14159265/16000*200)+1) * 20) + ( (sin(t*2*3.14159265/16000*110)+1) * 20) + ( (sin(t*2*3.14159265/16000*230)+1) * 20) + ( (sin((t % 80)*2*3.14159265/16000 * 6)+1) * 12); -} - -unsigned int sine_wave_sound(int t) { - const double R=8000; // sample rate (samples per second) - const double C=261.625565; // frequency of middle-C (hertz) - const double F=R/256; // bytebeat frequency of 1*t due to 8-bit truncation (hertz) - const double V=127; // a volume constant - return (sin(t*2*M_PI/R*C)+1)*V; -} - -unsigned int winch_sound(int t) { - return (t % 80) | (t % 36) | (6 * (t % 6)); -} - -unsigned int beat_2(int t) { - return ((((t % 250) / 2)) | (t % 129)) % 110; -} - -Uint8 func0(int t) { - int note = 18; - if (t % 1240) { - note = (1 + rand()) % 18 + 1; - } - - fflush(stdout); - return (t % note); -} - - void fill_audio(void *func, Uint8 *stream, int len) { - Uint8 (*wavegen)(int) = func; - - static int t = 1; - for(int i = 0; i < len; i++,t++) { - stream[i] = wavegen(t); - } -} - - - -void generate_audio(void) { - - const int sfx_len_ms = 2000; - unsigned int sfx_len = (G_AUDIO_SFREQ/1000) * G_AUDIO_BSIZE * sfx_len_ms; - Uint8 raw_data[sfx_len]; // 10 seconds - - fill_audio(winch_sound, raw_data, sfx_len); - game_sounds.rope_pull = Mix_QuickLoad_RAW(raw_data, sfx_len); - fill_audio(beat_2, raw_data, sfx_len); - game_sounds.collision = Mix_QuickLoad_RAW(raw_data, sfx_len); -} - -void play_sound(Mix_Chunk *chunk, int times) { - Mix_PlayChannel(-1, chunk, times - 1); -} - - -void callbackfn3(void *unused, Uint8 *stream, int len) { - static int t = 1; - for(int i = 0; i < len; i++,t++) { - stream[i] = big_hum(t); - stream[i] = 0; - } -} - -void start_audio(void) { - - audio_format.callback = callbackfn3; - /* just for playing background music - if (SDL_OpenAudio(&audio_format, NULL)) { - fprintf(stderr, "Unable to open audio: %s\n", SDL_GetError()); - exit(1); - } - */ - //SDL_PauseAudio(0); - if (Mix_OpenAudio(G_AUDIO_SFREQ,AUDIO_U8,1,G_AUDIO_BSIZE) < 0) { - fprintf(stderr, "Unable to open audio: %s\n", SDL_GetError()); - exit(1); - } - generate_audio(); - Mix_Resume(-1); -} - -void stop_audio(void) { - SDL_CloseAudio(); -} - - -void callbackfn2(void *unused, Uint8 *stream, int len) { - static int t = 1; - int i; - int yeet = rand(); - for(i=0; i < len; i++,t++) { - stream[i] = func0(t); - } -} - - -void callbackfn(void *unused, Uint8 *stream, int len) -{ - static int t = 0; - int i; - int yeet = rand(); - for( i=0; i < len; i++,t++) { - /* - stream[i] = (t*5&(t>>7))|(t*3&(t>>8)); - */ - //stream[i] = (( t >> 10 ) & 42) * t; - stream[i] = (t & yeet) % 73; - } -} void redraw(struct SDL_Renderer * ren) { SDL_RenderClear(ren); @@ -215,32 +75,6 @@ int physics_loop(void *ptr) { } } -void play_game_sound(Mix_Chunk *chunk, int len, int channel) { - if (Mix_Playing(channel)) { - return; - } - Mix_FadeInChannelTimed(channel, chunk, -1, 1, len); -} - -void synthplay_now(Uint8 (*bbgen)(unsigned int t), int len) { - static Mix_Chunk *new_chunk = NULL; - - if (Mix_Playing(1)) { - return; - } - - if (new_chunk) - Mix_FreeChunk(new_chunk); - - int generate_len = len * (512) * 8; - - Uint8 raw_data[generate_len]; - fill_audio(bbgen, raw_data, generate_len); - - new_chunk = Mix_QuickLoad_RAW(raw_data, generate_len); - Mix_PlayChannelTimed(1, new_chunk, -1, -1); -} - int game(void) { LOGLEVEL = DEBUG; STDOUTLEVEL = DEBUG; diff --git a/src/types.h b/src/types.h index 1190f6d..d78ce9e 100644 --- a/src/types.h +++ b/src/types.h @@ -2,11 +2,18 @@ #ifndef PTYPES_H #define PTYPES_H +#include +#include +#include +#include +#include +#include +#include #include +#include +#include #include -#include #include -#include #include "c-colours/colours.h" #include "datastructures/datatypes.h"