From 05d533f3db08e9c1ec206da9b5e3c6edea94e808 Mon Sep 17 00:00:00 2001 From: lenn Date: Tue, 23 Sep 2025 23:12:01 +0800 Subject: [PATCH] add source code --- CMakeLists.txt | 8 ++++++++ main.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 main.c diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..cdcfaae --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(3.10) +project(sdl-pcm LANGUAGE C) + +find_package(SDL2 REQUIRED) + +add_executable(${PROJECT_NAME} main.c) + +target_link_libraries(${PROJECT_NAME} PRIVATE SDL2::SDL2) \ No newline at end of file diff --git a/main.c b/main.c new file mode 100644 index 0000000..d7b3421 --- /dev/null +++ b/main.c @@ -0,0 +1,45 @@ +#include +#include +#include +#include +#include + +#define PCM_BUF_SIZE (1024*2*2*2) + +static Uint8 *s_audio_buf = NULL; +static Uint8 *s_audio_pos = NULL; +static Uint8 *s_audio_end = NULL; + +void audo_pcm_callback(void *data, Uint8 *stream, int len) { + SDL_memset(stream, 0, len); + + if (s_audio_pos >= s_audio_end) { + return; + } + + int remain_buffer_len = s_audio_end - s_audio_pos; + len = (len < remain_buffer_len) ? len : remain_buffer_len; + + SDL_MixAudio(stream, s_audio_pos, len, SDL_MIX_MAXVOLUME/8); + s_audio_pos += len; +} + +#undef main +int main(int argc, char* argv[]) { + int ret = -1; + FILE *audio_fd = NULL; + SDL_AudioSpec spec; + const char *path = "44100_16bit_2ch.pcm"; + size_t read_buffer_len = 0; + + if (SDL_Init(SDL_INIT_AUDIO)) { + fprintf(stderr, "SDL_Init(SDL_INIT_AUDIO) failed: %s\n", SDL_GetError()); + return ret; + } + + audio_fd = fopen(path, "rb"); + if (!audio_fd) { + fprintf(stderr, "fopen(path, \"rb\")\n"); + goto fail; + } +}