singe/thirdparty/SDL2_mixer/external/libxmp/examples/player-sdl.c
2023-10-23 19:38:18 -05:00

99 lines
1.7 KiB
C

/* A simple frontend for libxmp */
/* This file is in public domain */
#include <stdio.h>
#include <stdlib.h>
#include "SDL.h"
#include <xmp.h>
static int playing;
static void fill_audio(void *udata, Uint8 *stream, int len)
{
if (xmp_play_buffer((xmp_context)udata, stream, len, 0) < 0)
playing = 0;
}
static int sdl_init(xmp_context ctx)
{
SDL_AudioSpec a;
if (SDL_Init(SDL_INIT_AUDIO) < 0) {
fprintf(stderr, "sdl: can't initialize: %s\n", SDL_GetError());
return -1;
}
a.freq = 44100;
a.format = AUDIO_S16;
a.channels = 2;
a.samples = 2048;
a.callback = fill_audio;
a.userdata = ctx;
if (SDL_OpenAudio(&a, NULL) < 0) {
fprintf(stderr, "%s\n", SDL_GetError());
return -1;
}
return 0;
}
static void sdl_deinit()
{
SDL_CloseAudio();
}
int main(int argc, char **argv)
{
xmp_context ctx;
struct xmp_module_info mi;
struct xmp_frame_info fi;
int i;
ctx = xmp_create_context();
if (sdl_init(ctx) < 0) {
fprintf(stderr, "%s: can't initialize sound\n", argv[0]);
exit(1);
}
for (i = 1; i < argc; i++) {
if (xmp_load_module(ctx, argv[i]) < 0) {
fprintf(stderr, "%s: error loading %s\n", argv[0],
argv[i]);
continue;
}
if (xmp_start_player(ctx, 44100, 0) == 0) {
/* Show module data */
xmp_get_module_info(ctx, &mi);
printf("%s (%s)\n", mi.mod->name, mi.mod->type);
/* Play module */
playing = 1;
SDL_PauseAudio(0);
while (playing) {
SDL_Delay(10);
xmp_get_frame_info(ctx, &fi);
printf("%3d/%3d %3d/%3d\r", fi.pos,
mi.mod->len, fi.row, fi.num_rows);
fflush(stdout);
}
xmp_end_player(ctx);
}
xmp_release_module(ctx);
printf("\n");
}
xmp_free_context(ctx);
sdl_deinit();
return 0;
}