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