sdl

FORK: Simple Directmedia Layer
git clone https://git.neptards.moe/neptards/sdl.git
Log | Files | Refs

testresample.c (3818B)


      1 /*
      2   Copyright (C) 1997-2020 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 #include "SDL.h"
     14 
     15 int
     16 main(int argc, char **argv)
     17 {
     18     SDL_AudioSpec spec;
     19     SDL_AudioCVT cvt;
     20     Uint32 len = 0;
     21     Uint8 *data = NULL;
     22     int cvtfreq = 0;
     23     int cvtchans = 0;
     24     int bitsize = 0;
     25     int blockalign = 0;
     26     int avgbytes = 0;
     27     SDL_RWops *io = NULL;
     28 
     29     /* Enable standard application logging */
     30     SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
     31 
     32     if (argc != 5) {
     33         SDL_Log("USAGE: %s in.wav out.wav newfreq newchans\n", argv[0]);
     34         return 1;
     35     }
     36 
     37     cvtfreq = SDL_atoi(argv[3]);
     38     cvtchans = SDL_atoi(argv[4]);
     39 
     40     if (SDL_Init(SDL_INIT_AUDIO) == -1) {
     41         SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL_Init() failed: %s\n", SDL_GetError());
     42         return 2;
     43     }
     44 
     45     if (SDL_LoadWAV(argv[1], &spec, &data, &len) == NULL) {
     46         SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "failed to load %s: %s\n", argv[1], SDL_GetError());
     47         SDL_Quit();
     48         return 3;
     49     }
     50 
     51     if (SDL_BuildAudioCVT(&cvt, spec.format, spec.channels, spec.freq,
     52                           spec.format, cvtchans, cvtfreq) == -1) {
     53         SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "failed to build CVT: %s\n", SDL_GetError());
     54         SDL_FreeWAV(data);
     55         SDL_Quit();
     56         return 4;
     57     }
     58 
     59     cvt.len = len;
     60     cvt.buf = (Uint8 *) SDL_malloc(len * cvt.len_mult);
     61     if (cvt.buf == NULL) {
     62         SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Out of memory.\n");
     63         SDL_FreeWAV(data);
     64         SDL_Quit();
     65         return 5;
     66     }
     67     SDL_memcpy(cvt.buf, data, len);
     68 
     69     if (SDL_ConvertAudio(&cvt) == -1) {
     70         SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Conversion failed: %s\n", SDL_GetError());
     71         SDL_free(cvt.buf);
     72         SDL_FreeWAV(data);
     73         SDL_Quit();
     74         return 6;
     75     }
     76 
     77     /* write out a WAV header... */
     78     io = SDL_RWFromFile(argv[2], "wb");
     79     if (io == NULL) {
     80         SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "fopen('%s') failed: %s\n", argv[2], SDL_GetError());
     81         SDL_free(cvt.buf);
     82         SDL_FreeWAV(data);
     83         SDL_Quit();
     84         return 7;
     85     }
     86 
     87     bitsize = SDL_AUDIO_BITSIZE(spec.format);
     88     blockalign = (bitsize / 8) * cvtchans;
     89     avgbytes = cvtfreq * blockalign;
     90 
     91     SDL_WriteLE32(io, 0x46464952);      /* RIFF */
     92     SDL_WriteLE32(io, cvt.len_cvt + 36);
     93     SDL_WriteLE32(io, 0x45564157);      /* WAVE */
     94     SDL_WriteLE32(io, 0x20746D66);      /* fmt */
     95     SDL_WriteLE32(io, 16);      /* chunk size */
     96     SDL_WriteLE16(io, SDL_AUDIO_ISFLOAT(spec.format) ? 3 : 1);       /* uncompressed */
     97     SDL_WriteLE16(io, cvtchans);   /* channels */
     98     SDL_WriteLE32(io, cvtfreq); /* sample rate */
     99     SDL_WriteLE32(io, avgbytes);        /* average bytes per second */
    100     SDL_WriteLE16(io, blockalign);      /* block align */
    101     SDL_WriteLE16(io, bitsize); /* significant bits per sample */
    102     SDL_WriteLE32(io, 0x61746164);      /* data */
    103     SDL_WriteLE32(io, cvt.len_cvt);     /* size */
    104     SDL_RWwrite(io, cvt.buf, cvt.len_cvt, 1);
    105 
    106     if (SDL_RWclose(io) == -1) {
    107         SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "fclose('%s') failed: %s\n", argv[2], SDL_GetError());
    108         SDL_free(cvt.buf);
    109         SDL_FreeWAV(data);
    110         SDL_Quit();
    111         return 8;
    112     }                           /* if */
    113 
    114     SDL_free(cvt.buf);
    115     SDL_FreeWAV(data);
    116     SDL_Quit();
    117     return 0;
    118 }                               /* main */
    119 
    120 /* end of testresample.c ... */