cscg22-gearboy

CSCG 2022 Challenge 'Gearboy'
git clone https://git.sinitax.com/sinitax/cscg22-gearboy
Log | Files | Refs | sfeed.txt

loopwave.c (3533B)


      1/*
      2  Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
      3
      4  This software is provided 'as-is', without any express or implied
      5  warranty.  In no event will the authors be held liable for any damages
      6  arising from the use of this software.
      7
      8  Permission is granted to anyone to use this software for any purpose,
      9  including commercial applications, and to alter it and redistribute it
     10  freely.
     11*/
     12
     13/* Program to load a wave file and loop playing it using SDL sound */
     14
     15/* loopwaves.c is much more robust in handling WAVE files --
     16    This is only for simple WAVEs
     17*/
     18#include "SDL_config.h"
     19
     20#include <stdio.h>
     21#include <stdlib.h>
     22
     23#if HAVE_SIGNAL_H
     24#include <signal.h>
     25#endif
     26
     27#include "SDL.h"
     28#include "SDL_audio.h"
     29
     30struct
     31{
     32    SDL_AudioSpec spec;
     33    Uint8 *sound;               /* Pointer to wave data */
     34    Uint32 soundlen;            /* Length of wave data */
     35    int soundpos;               /* Current play position */
     36} wave;
     37
     38
     39/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
     40static void
     41quit(int rc)
     42{
     43    SDL_Quit();
     44    exit(rc);
     45}
     46
     47
     48void SDLCALL
     49fillerup(void *unused, Uint8 * stream, int len)
     50{
     51    Uint8 *waveptr;
     52    int waveleft;
     53
     54    /* Set up the pointers */
     55    waveptr = wave.sound + wave.soundpos;
     56    waveleft = wave.soundlen - wave.soundpos;
     57
     58    /* Go! */
     59    while (waveleft <= len) {
     60        SDL_memcpy(stream, waveptr, waveleft);
     61        stream += waveleft;
     62        len -= waveleft;
     63        waveptr = wave.sound;
     64        waveleft = wave.soundlen;
     65        wave.soundpos = 0;
     66    }
     67    SDL_memcpy(stream, waveptr, len);
     68    wave.soundpos += len;
     69}
     70
     71static int done = 0;
     72void
     73poked(int sig)
     74{
     75    done = 1;
     76}
     77
     78int
     79main(int argc, char *argv[])
     80{
     81    int i;
     82    char filename[4096];
     83
     84	/* Enable standard application logging */
     85	SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
     86
     87    /* Load the SDL library */
     88    if (SDL_Init(SDL_INIT_AUDIO) < 0) {
     89        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n", SDL_GetError());
     90        return (1);
     91    }
     92
     93    if (argc > 1) {
     94        SDL_strlcpy(filename, argv[1], sizeof(filename));
     95    } else {
     96        SDL_strlcpy(filename, "sample.wav", sizeof(filename));
     97    }
     98    /* Load the wave file into memory */
     99    if (SDL_LoadWAV(filename, &wave.spec, &wave.sound, &wave.soundlen) == NULL) {
    100        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't load %s: %s\n", filename, SDL_GetError());
    101        quit(1);
    102    }
    103
    104    wave.spec.callback = fillerup;
    105#if HAVE_SIGNAL_H
    106    /* Set the signals */
    107#ifdef SIGHUP
    108    signal(SIGHUP, poked);
    109#endif
    110    signal(SIGINT, poked);
    111#ifdef SIGQUIT
    112    signal(SIGQUIT, poked);
    113#endif
    114    signal(SIGTERM, poked);
    115#endif /* HAVE_SIGNAL_H */
    116
    117    /* Show the list of available drivers */
    118    SDL_Log("Available audio drivers:");
    119    for (i = 0; i < SDL_GetNumAudioDrivers(); ++i) {
    120		SDL_Log("%i: %s", i, SDL_GetAudioDriver(i));
    121    }
    122
    123    /* Initialize fillerup() variables */
    124    if (SDL_OpenAudio(&wave.spec, NULL) < 0) {
    125        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't open audio: %s\n", SDL_GetError());
    126        SDL_FreeWAV(wave.sound);
    127        quit(2);
    128    }
    129
    130    SDL_Log("Using audio driver: %s\n", SDL_GetCurrentAudioDriver());
    131
    132    /* Let the audio run */
    133    SDL_PauseAudio(0);
    134    while (!done && (SDL_GetAudioStatus() == SDL_AUDIO_PLAYING))
    135        SDL_Delay(1000);
    136
    137    /* Clean up on signal */
    138    SDL_CloseAudio();
    139    SDL_FreeWAV(wave.sound);
    140    SDL_Quit();
    141    return (0);
    142}
    143
    144/* vi: set ts=4 sw=4 expandtab: */