This commit is contained in:
Simon Gellis 2024-10-21 20:52:51 -04:00
parent 7ace73c587
commit 24b957fc53
5 changed files with 69 additions and 7 deletions

37
audio.c Normal file
View File

@ -0,0 +1,37 @@
#include <audio.h>
#include <stdio.h>
int audioInit(AudioContext *aud) {
SDL_AudioSpec spec;
spec.freq = 41700;
spec.format = AUDIO_S16;
spec.channels = 2;
spec.samples = 1024;
spec.callback = NULL;
spec.userdata = NULL;
aud->id = SDL_OpenAudioDevice(NULL, 0, &spec, NULL, 0);
aud->paused = true;
if (!aud->id) {
fprintf(stderr, "could not open audio device: %s\n", SDL_GetError());
return -1;
}
aud->output = fopen("output.bin", "w");
return 0;
}
int audioUpdate(AudioContext *aud, void *data, uint32_t bytes) {
if (!aud->id) return -1;
if (SDL_QueueAudio(aud->id, data, bytes)) {
fprintf(stderr, "could not write audio: %s\n", SDL_GetError());
return -1;
}
if (aud->paused) {
SDL_PauseAudioDevice(aud->id, false);
aud->paused = false;
}
return 0;
}

16
audio.h Normal file
View File

@ -0,0 +1,16 @@
#ifndef SHROOMS_VB_NATIVE_AUDIO_
#define SHROOMS_VB_NATIVE_AUDIO_
#include <SDL2/SDL.h>
#include <stdbool.h>
typedef struct {
SDL_AudioDeviceID id;
bool paused;
FILE *output;
} AudioContext;
int audioInit(AudioContext *aud);
int audioUpdate(AudioContext *aud, void *data, uint32_t bytes);
#endif

19
game.c
View File

@ -1,3 +1,4 @@
#include <audio.h>
#include <assets.h> #include <assets.h>
#include <controller.h> #include <controller.h>
#include <game.h> #include <game.h>
@ -20,21 +21,27 @@ long int tickNs() {
typedef struct { typedef struct {
GraphicsContext *gfx; GraphicsContext *gfx;
AudioContext aud;
int16_t audioBuffer[834 * 2];
} GameState; } GameState;
int onFrame(VB *sim) { int onFrame(VB *sim) {
static uint8_t leftEye[384*224]; static uint8_t leftEye[384*224];
static uint8_t rightEye[384*224]; static uint8_t rightEye[384*224];
GameState *state; GameState *state;
GraphicsContext *gfx; void *samples;
uint32_t samplePairs;
state = vbGetUserData(sim); state = vbGetUserData(sim);
gfx = state->gfx;
vbGetPixels(sim, leftEye, 1, 384, rightEye, 1, 384); vbGetPixels(sim, leftEye, 1, 384, rightEye, 1, 384);
gfxUpdateLeftEye(gfx, leftEye); gfxUpdateLeftEye(state->gfx, leftEye);
gfxUpdateRightEye(gfx, rightEye); gfxUpdateRightEye(state->gfx, rightEye);
gfxRender(gfx);
samples = vbGetSamples(sim, NULL, &samplePairs);
audioUpdate(&state->aud, samples, samplePairs * 4);
vbSetSamples(sim, samples, 834);
gfxRender(state->gfx);
return 1; return 1;
} }
@ -48,6 +55,8 @@ int runGame(VB *sim, GraphicsContext *gfx) {
uint64_t ticks, prevTicks; uint64_t ticks, prevTicks;
state.gfx = gfx; state.gfx = gfx;
audioInit(&state.aud);
vbSetSamples(sim, &state.audioBuffer, 834);
vbSetUserData(sim, &state); vbSetUserData(sim, &state);
vbSetFrameCallback(sim, &onFrame); vbSetFrameCallback(sim, &onFrame);

View File

@ -11,7 +11,7 @@ else
endif endif
build: build:
@$(CC) cli.c controller.c game.c graphics.c main.c assets/assets.s -I . \ @$(CC) audio.c cli.c controller.c game.c graphics.c main.c assets/assets.s -I . \
$(SHROOMSFLAGS) $(SDL2FLAGS) \ $(SHROOMSFLAGS) $(SDL2FLAGS) \
-D POSIX_C_SOURCE=199309L \ -D POSIX_C_SOURCE=199309L \
-o shrooms-vb \ -o shrooms-vb \

@ -1 +1 @@
Subproject commit 50903c7513b00cc62cb20a1578e7f6484914a9da Subproject commit c06da323218071719c1500379e84008c369169d7