sdl-audio/example-test-code/main.c.bak2

99 lines
2.4 KiB
Plaintext
Raw Normal View History

2024-10-10 20:11:57 +08:00
#include <SDL2/SDL.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct {
Uint8* data;
int current_pos;
int max_length;
} BufferType;
SDL_AudioDeviceID dev;
void audio_callback(void* userdata, Uint8* stream, int len)
{
BufferType* buffer = (BufferType*)userdata;
printf("callback: %u %u\n", *stream, len);
int space_left = buffer->max_length - buffer->current_pos;
if (space_left <= 0) {
// Buffer is full; stop the device
SDL_PauseAudioDevice(dev, 1);
printf("Buffer full, stopping recording.\n");
return;
}
if (len > space_left) {
len = space_left;
}
memcpy(buffer->data + buffer->current_pos, stream, len);
buffer->current_pos += len;
}
int main(int argc, char* argv[])
{
if (SDL_Init(SDL_INIT_AUDIO) < 0) {
fprintf(stderr, "Failed to initialize SDL: %s\n", SDL_GetError());
return 1;
}
BufferType audio_buffer;
audio_buffer.max_length = 44100 * 5 * sizeof(float) * 2; // 5 seconds of stereo float audio
audio_buffer.data = (Uint8*)malloc(audio_buffer.max_length);
if (audio_buffer.data == NULL) {
fprintf(stderr, "Failed to allocate audio buffer\n");
SDL_Quit();
return 1;
}
audio_buffer.current_pos = 0;
SDL_AudioSpec desired_spec, obtained_spec;
SDL_zero(desired_spec);
desired_spec.freq = 44100;
desired_spec.format = AUDIO_F32SYS;
desired_spec.channels = 2;
desired_spec.samples = 512;
desired_spec.callback = audio_callback;
desired_spec.userdata = &audio_buffer;
dev = SDL_OpenAudioDevice(NULL, 1, &desired_spec, &obtained_spec, 0);
if (dev == 0) {
fprintf(stderr, "Failed to open audio device: %s\n", SDL_GetError());
free(audio_buffer.data);
SDL_Quit();
return 1;
}
printf("Audio device opened successfully.\n");
printf("Obtained Spec:\n");
printf(" Frequency: %d\n", obtained_spec.freq);
printf(" Format: 0x%X\n", obtained_spec.format);
printf(" Channels: %d\n", obtained_spec.channels);
printf(" Samples: %d\n", obtained_spec.samples);
SDL_PauseAudioDevice(dev, 0); // Start recording
printf("Recording started.\n");
SDL_Event event;
while (audio_buffer.current_pos < audio_buffer.max_length) {
while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {
printf("Quit event received.\n");
goto cleanup;
}
}
SDL_Delay(100);
}
printf("Recording complete. Total bytes recorded: %d\n", audio_buffer.current_pos);
cleanup:
SDL_PauseAudioDevice(dev, 1); // Stop recording
SDL_CloseAudioDevice(dev);
free(audio_buffer.data);
SDL_Quit();
return 0;
}