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