test/loopwavequeue.c
author Sam Lantinga <slouken@libsdl.org>
Thu, 07 Dec 2017 16:08:09 -0800
changeset 11730 ac6c607e065c
parent 10981 15455a660688
child 11811 5d94cb6b24d3
permissions -rw-r--r--
Enable building the Metal renderer by default, and weak link the Metal framework so the SDL library is safe to use on older Macs
Also generate iOS versions of the Metal shaders
     1 /*
     2   Copyright (C) 1997-2017 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 queueing */
    14 
    15 #include <stdio.h>
    16 #include <stdlib.h>
    17 
    18 #ifdef __EMSCRIPTEN__
    19 #include <emscripten/emscripten.h>
    20 #endif
    21 
    22 #include "SDL.h"
    23 
    24 #if HAVE_SIGNAL_H
    25 #include <signal.h>
    26 #endif
    27 
    28 static struct
    29 {
    30     SDL_AudioSpec spec;
    31     Uint8 *sound;               /* Pointer to wave data */
    32     Uint32 soundlen;            /* Length of wave data */
    33 } wave;
    34 
    35 
    36 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
    37 static void
    38 quit(int rc)
    39 {
    40     SDL_Quit();
    41     exit(rc);
    42 }
    43 
    44 static int done = 0;
    45 void
    46 poked(int sig)
    47 {
    48     done = 1;
    49 }
    50 
    51 void
    52 loop()
    53 {
    54 #ifdef __EMSCRIPTEN__
    55     if (done || (SDL_GetAudioStatus() != SDL_AUDIO_PLAYING)) {
    56         emscripten_cancel_main_loop();
    57     }
    58     else
    59 #endif
    60     {
    61         /* The device from SDL_OpenAudio() is always device #1. */
    62         const Uint32 queued = SDL_GetQueuedAudioSize(1);
    63         SDL_Log("Device has %u bytes queued.\n", (unsigned int) queued);
    64         if (queued <= 8192) {  /* time to requeue the whole thing? */
    65             if (SDL_QueueAudio(1, wave.sound, wave.soundlen) == 0) {
    66                 SDL_Log("Device queued %u more bytes.\n", (unsigned int) wave.soundlen);
    67             } else {
    68                 SDL_Log("Device FAILED to queue %u more bytes: %s\n", (unsigned int) wave.soundlen, SDL_GetError());
    69             }
    70         }
    71     }
    72 }
    73 
    74 int
    75 main(int argc, char *argv[])
    76 {
    77     char filename[4096];
    78 
    79     /* Enable standard application logging */
    80     SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
    81 
    82     /* Load the SDL library */
    83     if (SDL_Init(SDL_INIT_AUDIO) < 0) {
    84         SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n", SDL_GetError());
    85         return (1);
    86     }
    87 
    88     if (argc > 1) {
    89         SDL_strlcpy(filename, argv[1], sizeof(filename));
    90     } else {
    91         SDL_strlcpy(filename, "sample.wav", sizeof(filename));
    92     }
    93     /* Load the wave file into memory */
    94     if (SDL_LoadWAV(filename, &wave.spec, &wave.sound, &wave.soundlen) == NULL) {
    95         SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't load %s: %s\n", filename, SDL_GetError());
    96         quit(1);
    97     }
    98 
    99     wave.spec.callback = NULL;  /* we'll push audio. */
   100 
   101 #if HAVE_SIGNAL_H
   102     /* Set the signals */
   103 #ifdef SIGHUP
   104     signal(SIGHUP, poked);
   105 #endif
   106     signal(SIGINT, poked);
   107 #ifdef SIGQUIT
   108     signal(SIGQUIT, poked);
   109 #endif
   110     signal(SIGTERM, poked);
   111 #endif /* HAVE_SIGNAL_H */
   112 
   113     /* Initialize fillerup() variables */
   114     if (SDL_OpenAudio(&wave.spec, NULL) < 0) {
   115         SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't open audio: %s\n", SDL_GetError());
   116         SDL_FreeWAV(wave.sound);
   117         quit(2);
   118     }
   119 
   120     /*static x[99999]; SDL_QueueAudio(1, x, sizeof (x));*/
   121 
   122     /* Let the audio run */
   123     SDL_PauseAudio(0);
   124 
   125     done = 0;
   126 
   127     /* Note that we stuff the entire audio buffer into the queue in one
   128        shot. Most apps would want to feed it a little at a time, as it
   129        plays, but we're going for simplicity here. */
   130     
   131 #ifdef __EMSCRIPTEN__
   132     emscripten_set_main_loop(loop, 0, 1);
   133 #else
   134     while (!done && (SDL_GetAudioStatus() == SDL_AUDIO_PLAYING))
   135     {
   136         loop();
   137 
   138         SDL_Delay(100);  /* let it play for awhile. */
   139     }
   140 #endif
   141 
   142     /* Clean up on signal */
   143     SDL_CloseAudio();
   144     SDL_FreeWAV(wave.sound);
   145     SDL_Quit();
   146     return 0;
   147 }
   148 
   149 /* vi: set ts=4 sw=4 expandtab: */