1 /*--------------------------------------------------------------------------*
2   Project:  Revolution Audio sound file converter
3   File:     soundformat.c
4 
5   Copyright (C)1998-2006 Nintendo  All Rights Reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Log: soundformat.c,v $
14   Revision 1.2  02/09/2006 06:26:26  aka
15   Changed copyright.
16 
17 
18  *--------------------------------------------------------------------------*/
19 #include <stdlib.h>
20 #include "soundconv.h"
21 
22 
23 /*--------------------------------------------------------------------------*
24     export from dsptool.dll
25  *--------------------------------------------------------------------------*/
26 typedef void (*FUNCTION1)(s16*, s8*, ADPCMINFO*, u32);
27 typedef void (*FUNCTION2)(u8 *src, ADPCMINFO *cxt, u32 samples);
28 
29 extern FUNCTION1 encode;
30 extern FUNCTION2 getLoopContext;
31 
32 
33 /*--------------------------------------------------------------------------*
34     combine 8 bit stereo samples
35  *--------------------------------------------------------------------------*/
soundStereoCombine8Bit(s8 * dest,s8 * source,u32 samples)36 void soundStereoCombine8Bit(s8 *dest, s8 *source, u32 samples)
37 {
38     u32 i;
39 
40     for (i = 0; i < samples; i++)
41     {
42         s16 sample;
43 
44         sample = *source;
45         source++;
46         sample += *source;
47         source++;
48 
49         *dest = (u8)((sample >> 1) & 0xFF);
50         dest++;
51     }
52 }
53 
54 
55 /*--------------------------------------------------------------------------*
56     combine 16 bit stereo samples
57  *--------------------------------------------------------------------------*/
soundStereoCombine16Bit(s16 * dest,s16 * source,u32 samples)58 void soundStereoCombine16Bit(s16 *dest, s16 *source, u32 samples)
59 {
60     u32 i;
61 
62     for (i = 0; i < samples; i++)
63     {
64         *dest = *source >> 1;
65 
66         source++;
67 
68         *dest += *source >> 1;
69 
70         dest++;
71         source++;
72     }
73 }
74 
75 
76 /*--------------------------------------------------------------------------*
77     left 8 bit stereo samples
78  *--------------------------------------------------------------------------*/
soundStereoLeft8Bit(s8 * dest,s8 * source,u32 samples)79 void soundStereoLeft8Bit(s8 *dest, s8 *source, u32 samples)
80 {
81     u32 i;
82 
83     for (i = 0; i < samples; i++)
84     {
85         *dest = *source;
86 
87         source++;
88 
89         dest++;
90         source++;
91     }
92 }
93 
94 
95 /*--------------------------------------------------------------------------*
96     left 16 bit stereo samples
97  *--------------------------------------------------------------------------*/
soundStereoLeft16Bit(s16 * dest,s16 * source,u32 samples)98 void soundStereoLeft16Bit(s16 *dest, s16 *source, u32 samples)
99 {
100     u32 i;
101 
102     for (i = 0; i < samples; i++)
103     {
104         *dest = *source;
105 
106         source++;
107 
108         dest++;
109         source++;
110     }
111 }
112 
113 
114 /*--------------------------------------------------------------------------*
115     right 8 bit stereo samples
116  *--------------------------------------------------------------------------*/
soundStereoRight8Bit(s8 * dest,s8 * source,u32 samples)117 void soundStereoRight8Bit(s8 *dest, s8 *source, u32 samples)
118 {
119     u32 i;
120 
121     for (i = 0; i < samples; i++)
122     {
123         source++;
124 
125         *dest = *source;
126 
127         dest++;
128         source++;
129     }
130 }
131 
132 
133 /*--------------------------------------------------------------------------*
134     right 16 bit stereo samples
135  *--------------------------------------------------------------------------*/
soundStereoRight16Bit(s16 * dest,s16 * source,u32 samples)136 void soundStereoRight16Bit(s16 *dest, s16 *source, u32 samples)
137 {
138     u32 i;
139 
140     for (i = 0; i < samples; i++)
141     {
142         source++;
143 
144         *dest = *source;
145 
146         dest++;
147         source++;
148     }
149 }
150 
151 
152 /*--------------------------------------------------------------------------*
153     convert 8 bit to 16 bit
154  *--------------------------------------------------------------------------*/
soundConvert8to16Bit(s16 * dest,s8 * source,u32 samples)155 void soundConvert8to16Bit(s16 *dest, s8 *source, u32 samples)
156 {
157     u32 i;
158 
159     for (i = 0; i < samples; i++)
160     {
161         *dest = (s16)(*source << 8);
162 
163         dest++;
164         source++;
165     }
166 }
167 
168 
169 /*--------------------------------------------------------------------------*
170     convert 16 bit to 8 bit
171  *--------------------------------------------------------------------------*/
soundConvert16to8Bit(s8 * dest,s16 * source,u32 samples)172 void soundConvert16to8Bit(s8 *dest, s16 *source, u32 samples)
173 {
174     u32 i;
175 
176     for (i = 0; i < samples; i++)
177     {
178         *dest = (s8)((*source >> 8) & 0xFF);
179 
180         dest++;
181         source++;
182     }
183 }
184 
185 
186 /*--------------------------------------------------------------------------*
187     convert 16 bit to ADPCM
188  *--------------------------------------------------------------------------*/
soundConvert16BitToAdpcm(void * dest,s16 * source,ADPCMINFO * adpcminfo,u32 samples)189 void soundConvert16BitToAdpcm(void *dest, s16 *source, ADPCMINFO *adpcminfo,
190                               u32 samples)
191 {
192     encode(source, dest, adpcminfo, samples);
193 }
194 
195 
196 /*--------------------------------------------------------------------------*
197     convert 16 bit to ADPCM with loop context
198  *--------------------------------------------------------------------------*/
soundConvert16BitToAdpcmLoop(void * dest,s16 * source,ADPCMINFO * adpcminfo,u32 samples,u32 loopStart)199 void soundConvert16BitToAdpcmLoop(void *dest, s16 *source, ADPCMINFO *adpcminfo,
200                               u32 samples, u32 loopStart)
201 {
202     encode(source, dest, adpcminfo, samples);
203     getLoopContext(dest, adpcminfo, loopStart);
204 }
205 
206 
207 /*--------------------------------------------------------------------------*
208     convert 8 bit to ADPCM
209  *--------------------------------------------------------------------------*/
soundConvert8BitToAdpcm(void * dest,s8 * source,ADPCMINFO * adpcminfo,u32 samples)210 void soundConvert8BitToAdpcm(void *dest, s8 *source, ADPCMINFO *adpcminfo,
211                              u32 samples)
212 {
213     void *p;
214 
215     if (p = malloc(samples * 2))
216     {
217         soundConvert8to16Bit(p, source, samples);
218         soundConvert16BitToAdpcm(dest, p, adpcminfo, samples);
219 
220         free(p);
221     }
222 }
223 
224 
225 /*--------------------------------------------------------------------------*
226     convert 8 bit to ADPCM with loop
227  *--------------------------------------------------------------------------*/
soundConvert8BitToAdpcmLoop(void * dest,s8 * source,ADPCMINFO * adpcminfo,u32 samples,u32 loopStart)228 void soundConvert8BitToAdpcmLoop(void *dest, s8 *source, ADPCMINFO *adpcminfo,
229                              u32 samples, u32 loopStart)
230 {
231     void *p;
232 
233     if (p = malloc(samples * 2))
234     {
235         soundConvert8to16Bit(p, source, samples);
236         soundConvert16BitToAdpcmLoop(dest, p, adpcminfo, samples, loopStart);
237 
238         free(p);
239     }
240 }
241