1*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
2*f81fb7c4SAndroid Build Coastguard Worker *
3*f81fb7c4SAndroid Build Coastguard Worker * File:
4*f81fb7c4SAndroid Build Coastguard Worker * eas_mdls.c
5*f81fb7c4SAndroid Build Coastguard Worker *
6*f81fb7c4SAndroid Build Coastguard Worker * Contents and purpose:
7*f81fb7c4SAndroid Build Coastguard Worker * This file contains DLS to EAS converter.
8*f81fb7c4SAndroid Build Coastguard Worker *
9*f81fb7c4SAndroid Build Coastguard Worker * Copyright (c) 2005 Sonic Network Inc.
10*f81fb7c4SAndroid Build Coastguard Worker
11*f81fb7c4SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
12*f81fb7c4SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
13*f81fb7c4SAndroid Build Coastguard Worker * You may obtain a copy of the License at
14*f81fb7c4SAndroid Build Coastguard Worker *
15*f81fb7c4SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
16*f81fb7c4SAndroid Build Coastguard Worker *
17*f81fb7c4SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
18*f81fb7c4SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
19*f81fb7c4SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20*f81fb7c4SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
21*f81fb7c4SAndroid Build Coastguard Worker * limitations under the License.
22*f81fb7c4SAndroid Build Coastguard Worker *
23*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
24*f81fb7c4SAndroid Build Coastguard Worker * Revision Control:
25*f81fb7c4SAndroid Build Coastguard Worker * $Revision: 818 $
26*f81fb7c4SAndroid Build Coastguard Worker * $Date: 2007-08-02 15:19:41 -0700 (Thu, 02 Aug 2007) $
27*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
28*f81fb7c4SAndroid Build Coastguard Worker */
29*f81fb7c4SAndroid Build Coastguard Worker
30*f81fb7c4SAndroid Build Coastguard Worker /*
31*f81fb7c4SAndroid Build Coastguard Worker * NOTES:
32*f81fb7c4SAndroid Build Coastguard Worker *
33*f81fb7c4SAndroid Build Coastguard Worker * Processor Endian-ness:
34*f81fb7c4SAndroid Build Coastguard Worker *
35*f81fb7c4SAndroid Build Coastguard Worker * We use the EAS_HWGetDWord() and EAS_HWGetWord () functions
36*f81fb7c4SAndroid Build Coastguard Worker * extensively in this module. It would probably be faster to read
37*f81fb7c4SAndroid Build Coastguard Worker * an entire data structure, but this introduces the problem of
38*f81fb7c4SAndroid Build Coastguard Worker * sensitivity to processor endian-ness to the parser. By utlilizing
39*f81fb7c4SAndroid Build Coastguard Worker * the host wrapper functions, we avoid having to flip bytes around
40*f81fb7c4SAndroid Build Coastguard Worker * for big-endian processors. The default host wrapper versions of
41*f81fb7c4SAndroid Build Coastguard Worker * these functions are insensitive to processor endian-ness due to
42*f81fb7c4SAndroid Build Coastguard Worker * the fact that they read the file as a byte stream.
43*f81fb7c4SAndroid Build Coastguard Worker *
44*f81fb7c4SAndroid Build Coastguard Worker * Dynamic Memory:
45*f81fb7c4SAndroid Build Coastguard Worker *
46*f81fb7c4SAndroid Build Coastguard Worker * Dynamic memory allocation is a risky proposition in a mobile
47*f81fb7c4SAndroid Build Coastguard Worker * device. The memory can become fragmented, resulting in an
48*f81fb7c4SAndroid Build Coastguard Worker * inability to allocate a memory block, or garbage collection
49*f81fb7c4SAndroid Build Coastguard Worker * routines can use many CPU cycles. Either can contribute to
50*f81fb7c4SAndroid Build Coastguard Worker * failures of critical systems. Therefore, we try to minimize the
51*f81fb7c4SAndroid Build Coastguard Worker * number of memory allocations we make.
52*f81fb7c4SAndroid Build Coastguard Worker *
53*f81fb7c4SAndroid Build Coastguard Worker * We allocate a single large block of memory for the entire
54*f81fb7c4SAndroid Build Coastguard Worker * converted DLS collection, including the articulation data and
55*f81fb7c4SAndroid Build Coastguard Worker * samples. This block is then sub-allocated for the various
56*f81fb7c4SAndroid Build Coastguard Worker * data structures.
57*f81fb7c4SAndroid Build Coastguard Worker *
58*f81fb7c4SAndroid Build Coastguard Worker * Parser Overview:
59*f81fb7c4SAndroid Build Coastguard Worker *
60*f81fb7c4SAndroid Build Coastguard Worker * We make two passes through the file, the first pass to count the
61*f81fb7c4SAndroid Build Coastguard Worker * number of instruments, regions, etc. and allocate memory for
62*f81fb7c4SAndroid Build Coastguard Worker * them. The second pass parses the data into the allocated data
63*f81fb7c4SAndroid Build Coastguard Worker * structures.
64*f81fb7c4SAndroid Build Coastguard Worker *
65*f81fb7c4SAndroid Build Coastguard Worker * Conditional chunks are challenging in that they can occur
66*f81fb7c4SAndroid Build Coastguard Worker * anywhere in the list chunk that contains them. To simplify, we
67*f81fb7c4SAndroid Build Coastguard Worker * parse the blocks in a list in specific order, no matter which
68*f81fb7c4SAndroid Build Coastguard Worker * order they appear in the file. This way we don't allocate memory
69*f81fb7c4SAndroid Build Coastguard Worker * and parse a block that we end up throwing away later due to
70*f81fb7c4SAndroid Build Coastguard Worker * a conditional chunk.
71*f81fb7c4SAndroid Build Coastguard Worker *
72*f81fb7c4SAndroid Build Coastguard Worker * Assumptions that may bite us in the future:
73*f81fb7c4SAndroid Build Coastguard Worker *
74*f81fb7c4SAndroid Build Coastguard Worker * We make some assumptions to simplify things. The most fundamental
75*f81fb7c4SAndroid Build Coastguard Worker * assumption is that there will be no more than one of any type of
76*f81fb7c4SAndroid Build Coastguard Worker * chunk in a list. While this is consistent with the block diagram
77*f81fb7c4SAndroid Build Coastguard Worker * of the file layout in the mDLS spec, there is nothing in the
78*f81fb7c4SAndroid Build Coastguard Worker * spec that precludes having mulitple lar2 or rgn2 chunks, with
79*f81fb7c4SAndroid Build Coastguard Worker * conditional blocks that dictate their usage.
80*f81fb7c4SAndroid Build Coastguard Worker *
81*f81fb7c4SAndroid Build Coastguard Worker * DLS -> EAS Conversion Process:
82*f81fb7c4SAndroid Build Coastguard Worker *
83*f81fb7c4SAndroid Build Coastguard Worker * Another challenge is that the DLS structure does not map well to
84*f81fb7c4SAndroid Build Coastguard Worker * the current EAS sound library structure. Not all DLS constructs
85*f81fb7c4SAndroid Build Coastguard Worker * are supported, and data from DLS structures must sometimes be
86*f81fb7c4SAndroid Build Coastguard Worker * mapped to multiple EAS data structures. To simplify the process,
87*f81fb7c4SAndroid Build Coastguard Worker * the EAS region, articulation, and envelopes are treated as a
88*f81fb7c4SAndroid Build Coastguard Worker * single combined unit. Thus for each region, there must be one
89*f81fb7c4SAndroid Build Coastguard Worker * articulation element and two envelope elements.
90*f81fb7c4SAndroid Build Coastguard Worker *
91*f81fb7c4SAndroid Build Coastguard Worker * The sample processing is also a multi-step process. First the
92*f81fb7c4SAndroid Build Coastguard Worker * ptbl chunk is pre-parsed to determine the number of samples
93*f81fb7c4SAndroid Build Coastguard Worker * in the collection. The next step is to parse the instrument data
94*f81fb7c4SAndroid Build Coastguard Worker * to determine which samples are actually used by instruments.
95*f81fb7c4SAndroid Build Coastguard Worker * Some samples may not be used because they are used only in
96*f81fb7c4SAndroid Build Coastguard Worker * conditional blocks that the synthesizer cannot parse, or the
97*f81fb7c4SAndroid Build Coastguard Worker * author neglected to remove unused samples from the collection.
98*f81fb7c4SAndroid Build Coastguard Worker * In the next step, the active samples are read into memory and
99*f81fb7c4SAndroid Build Coastguard Worker * converted to the appropriate playback format. Finally, as the
100*f81fb7c4SAndroid Build Coastguard Worker * instruments are processed, the links are made to the samples and
101*f81fb7c4SAndroid Build Coastguard Worker * wsmp data is extracted for the region and articulation data
102*f81fb7c4SAndroid Build Coastguard Worker * structures.
103*f81fb7c4SAndroid Build Coastguard Worker */
104*f81fb7c4SAndroid Build Coastguard Worker
105*f81fb7c4SAndroid Build Coastguard Worker #ifndef _FILTER_ENABLED
106*f81fb7c4SAndroid Build Coastguard Worker #error "Filter must be enabled if DLS_SYNTHESIZER is enabled"
107*f81fb7c4SAndroid Build Coastguard Worker #endif
108*f81fb7c4SAndroid Build Coastguard Worker
109*f81fb7c4SAndroid Build Coastguard Worker /*------------------------------------
110*f81fb7c4SAndroid Build Coastguard Worker * includes
111*f81fb7c4SAndroid Build Coastguard Worker *------------------------------------
112*f81fb7c4SAndroid Build Coastguard Worker */
113*f81fb7c4SAndroid Build Coastguard Worker
114*f81fb7c4SAndroid Build Coastguard Worker /* this define allows us to use the sndlib.h structures as RW memory */
115*f81fb7c4SAndroid Build Coastguard Worker #define SCNST
116*f81fb7c4SAndroid Build Coastguard Worker
117*f81fb7c4SAndroid Build Coastguard Worker #include "log/log.h"
118*f81fb7c4SAndroid Build Coastguard Worker
119*f81fb7c4SAndroid Build Coastguard Worker #include "eas_data.h"
120*f81fb7c4SAndroid Build Coastguard Worker #include "eas_host.h"
121*f81fb7c4SAndroid Build Coastguard Worker #include "eas_mdls.h"
122*f81fb7c4SAndroid Build Coastguard Worker #include "eas_math.h"
123*f81fb7c4SAndroid Build Coastguard Worker #include "dls.h"
124*f81fb7c4SAndroid Build Coastguard Worker #include "dls2.h"
125*f81fb7c4SAndroid Build Coastguard Worker #include "eas_report.h"
126*f81fb7c4SAndroid Build Coastguard Worker #include <string.h>
127*f81fb7c4SAndroid Build Coastguard Worker
128*f81fb7c4SAndroid Build Coastguard Worker //2 we should replace log10() function with fixed point routine in ConvertSampleRate()
129*f81fb7c4SAndroid Build Coastguard Worker /* lint is choking on the ARM math.h file, so we declare the log10 function here */
130*f81fb7c4SAndroid Build Coastguard Worker extern double log10(double x);
131*f81fb7c4SAndroid Build Coastguard Worker
132*f81fb7c4SAndroid Build Coastguard Worker /*------------------------------------
133*f81fb7c4SAndroid Build Coastguard Worker * defines
134*f81fb7c4SAndroid Build Coastguard Worker *------------------------------------
135*f81fb7c4SAndroid Build Coastguard Worker */
136*f81fb7c4SAndroid Build Coastguard Worker
137*f81fb7c4SAndroid Build Coastguard Worker // #define _DEBUG_DLS
138*f81fb7c4SAndroid Build Coastguard Worker
139*f81fb7c4SAndroid Build Coastguard Worker #define DLS_MAX_WAVE_COUNT 1024
140*f81fb7c4SAndroid Build Coastguard Worker #define DLS_MAX_ART_COUNT 2048
141*f81fb7c4SAndroid Build Coastguard Worker #define DLS_MAX_REGION_COUNT 2048
142*f81fb7c4SAndroid Build Coastguard Worker #define DLS_MAX_INST_COUNT 256
143*f81fb7c4SAndroid Build Coastguard Worker #define MAX_DLS_WAVE_SIZE (1024*1024)
144*f81fb7c4SAndroid Build Coastguard Worker
145*f81fb7c4SAndroid Build Coastguard Worker #ifndef EAS_U32_MAX
146*f81fb7c4SAndroid Build Coastguard Worker #define EAS_U32_MAX (4294967295U)
147*f81fb7c4SAndroid Build Coastguard Worker #endif
148*f81fb7c4SAndroid Build Coastguard Worker
149*f81fb7c4SAndroid Build Coastguard Worker #ifndef EAS_I32_MAX
150*f81fb7c4SAndroid Build Coastguard Worker #define EAS_I32_MAX (2147483647)
151*f81fb7c4SAndroid Build Coastguard Worker #endif
152*f81fb7c4SAndroid Build Coastguard Worker
153*f81fb7c4SAndroid Build Coastguard Worker /*------------------------------------
154*f81fb7c4SAndroid Build Coastguard Worker * typedefs
155*f81fb7c4SAndroid Build Coastguard Worker *------------------------------------
156*f81fb7c4SAndroid Build Coastguard Worker */
157*f81fb7c4SAndroid Build Coastguard Worker
158*f81fb7c4SAndroid Build Coastguard Worker /* offsets to articulation data */
159*f81fb7c4SAndroid Build Coastguard Worker typedef enum
160*f81fb7c4SAndroid Build Coastguard Worker {
161*f81fb7c4SAndroid Build Coastguard Worker PARAM_MODIFIED = 0,
162*f81fb7c4SAndroid Build Coastguard Worker PARAM_MOD_LFO_FREQ,
163*f81fb7c4SAndroid Build Coastguard Worker PARAM_MOD_LFO_DELAY,
164*f81fb7c4SAndroid Build Coastguard Worker
165*f81fb7c4SAndroid Build Coastguard Worker PARAM_VIB_LFO_FREQ,
166*f81fb7c4SAndroid Build Coastguard Worker PARAM_VIB_LFO_DELAY,
167*f81fb7c4SAndroid Build Coastguard Worker
168*f81fb7c4SAndroid Build Coastguard Worker PARAM_VOL_EG_DELAY,
169*f81fb7c4SAndroid Build Coastguard Worker PARAM_VOL_EG_ATTACK,
170*f81fb7c4SAndroid Build Coastguard Worker PARAM_VOL_EG_HOLD,
171*f81fb7c4SAndroid Build Coastguard Worker PARAM_VOL_EG_DECAY,
172*f81fb7c4SAndroid Build Coastguard Worker PARAM_VOL_EG_SUSTAIN,
173*f81fb7c4SAndroid Build Coastguard Worker PARAM_VOL_EG_RELEASE,
174*f81fb7c4SAndroid Build Coastguard Worker PARAM_VOL_EG_SHUTDOWN,
175*f81fb7c4SAndroid Build Coastguard Worker PARAM_VOL_EG_VEL_TO_ATTACK,
176*f81fb7c4SAndroid Build Coastguard Worker PARAM_VOL_EG_KEY_TO_DECAY,
177*f81fb7c4SAndroid Build Coastguard Worker PARAM_VOL_EG_KEY_TO_HOLD,
178*f81fb7c4SAndroid Build Coastguard Worker
179*f81fb7c4SAndroid Build Coastguard Worker PARAM_MOD_EG_DELAY,
180*f81fb7c4SAndroid Build Coastguard Worker PARAM_MOD_EG_ATTACK,
181*f81fb7c4SAndroid Build Coastguard Worker PARAM_MOD_EG_HOLD,
182*f81fb7c4SAndroid Build Coastguard Worker PARAM_MOD_EG_DECAY,
183*f81fb7c4SAndroid Build Coastguard Worker PARAM_MOD_EG_SUSTAIN,
184*f81fb7c4SAndroid Build Coastguard Worker PARAM_MOD_EG_RELEASE,
185*f81fb7c4SAndroid Build Coastguard Worker PARAM_MOD_EG_VEL_TO_ATTACK,
186*f81fb7c4SAndroid Build Coastguard Worker PARAM_MOD_EG_KEY_TO_DECAY,
187*f81fb7c4SAndroid Build Coastguard Worker PARAM_MOD_EG_KEY_TO_HOLD,
188*f81fb7c4SAndroid Build Coastguard Worker
189*f81fb7c4SAndroid Build Coastguard Worker PARAM_INITIAL_FC,
190*f81fb7c4SAndroid Build Coastguard Worker PARAM_INITIAL_Q,
191*f81fb7c4SAndroid Build Coastguard Worker PARAM_MOD_LFO_TO_FC,
192*f81fb7c4SAndroid Build Coastguard Worker PARAM_MOD_LFO_CC1_TO_FC,
193*f81fb7c4SAndroid Build Coastguard Worker PARAM_MOD_LFO_CHAN_PRESS_TO_FC,
194*f81fb7c4SAndroid Build Coastguard Worker PARAM_MOD_EG_TO_FC,
195*f81fb7c4SAndroid Build Coastguard Worker PARAM_VEL_TO_FC,
196*f81fb7c4SAndroid Build Coastguard Worker PARAM_KEYNUM_TO_FC,
197*f81fb7c4SAndroid Build Coastguard Worker
198*f81fb7c4SAndroid Build Coastguard Worker PARAM_MOD_LFO_TO_GAIN,
199*f81fb7c4SAndroid Build Coastguard Worker PARAM_MOD_LFO_CC1_TO_GAIN,
200*f81fb7c4SAndroid Build Coastguard Worker PARAM_MOD_LFO_CHAN_PRESS_TO_GAIN,
201*f81fb7c4SAndroid Build Coastguard Worker PARAM_VEL_TO_GAIN,
202*f81fb7c4SAndroid Build Coastguard Worker
203*f81fb7c4SAndroid Build Coastguard Worker PARAM_TUNING,
204*f81fb7c4SAndroid Build Coastguard Worker PARAM_KEYNUM_TO_PITCH,
205*f81fb7c4SAndroid Build Coastguard Worker PARAM_VIB_LFO_TO_PITCH,
206*f81fb7c4SAndroid Build Coastguard Worker PARAM_VIB_LFO_CC1_TO_PITCH,
207*f81fb7c4SAndroid Build Coastguard Worker PARAM_VIB_LFO_CHAN_PRESS_TO_PITCH,
208*f81fb7c4SAndroid Build Coastguard Worker PARAM_MOD_LFO_TO_PITCH,
209*f81fb7c4SAndroid Build Coastguard Worker PARAM_MOD_LFO_CC1_TO_PITCH,
210*f81fb7c4SAndroid Build Coastguard Worker PARAM_MOD_LFO_CHAN_PRESS_TO_PITCH,
211*f81fb7c4SAndroid Build Coastguard Worker PARAM_MOD_EG_TO_PITCH,
212*f81fb7c4SAndroid Build Coastguard Worker
213*f81fb7c4SAndroid Build Coastguard Worker PARAM_DEFAULT_PAN,
214*f81fb7c4SAndroid Build Coastguard Worker PARAM_MIDI_CC91_TO_REVERB_SEND,
215*f81fb7c4SAndroid Build Coastguard Worker PARAM_DEFAULT_REVERB_SEND,
216*f81fb7c4SAndroid Build Coastguard Worker PARAM_MIDI_CC93_TO_CHORUS_SEND,
217*f81fb7c4SAndroid Build Coastguard Worker PARAM_DEFAULT_CHORUS_SEND,
218*f81fb7c4SAndroid Build Coastguard Worker PARAM_TABLE_SIZE
219*f81fb7c4SAndroid Build Coastguard Worker } E_ART_INDEX;
220*f81fb7c4SAndroid Build Coastguard Worker
221*f81fb7c4SAndroid Build Coastguard Worker /* temporary data structure combining region, articulation, and envelope data */
222*f81fb7c4SAndroid Build Coastguard Worker typedef struct s_art_dls_tag
223*f81fb7c4SAndroid Build Coastguard Worker {
224*f81fb7c4SAndroid Build Coastguard Worker EAS_I16 values[PARAM_TABLE_SIZE];
225*f81fb7c4SAndroid Build Coastguard Worker } S_DLS_ART_VALUES;
226*f81fb7c4SAndroid Build Coastguard Worker
227*f81fb7c4SAndroid Build Coastguard Worker /* temporary data structure for wlnk chunk data */
228*f81fb7c4SAndroid Build Coastguard Worker typedef struct
229*f81fb7c4SAndroid Build Coastguard Worker {
230*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 gain;
231*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 loopStart;
232*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 loopLength;
233*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 sampleRate;
234*f81fb7c4SAndroid Build Coastguard Worker EAS_U16 bitsPerSample;
235*f81fb7c4SAndroid Build Coastguard Worker EAS_I16 fineTune;
236*f81fb7c4SAndroid Build Coastguard Worker EAS_U8 unityNote;
237*f81fb7c4SAndroid Build Coastguard Worker } S_WSMP_DATA;
238*f81fb7c4SAndroid Build Coastguard Worker
239*f81fb7c4SAndroid Build Coastguard Worker /* temporary data structure used while parsing a DLS file */
240*f81fb7c4SAndroid Build Coastguard Worker typedef struct
241*f81fb7c4SAndroid Build Coastguard Worker {
242*f81fb7c4SAndroid Build Coastguard Worker S_DLS *pDLS;
243*f81fb7c4SAndroid Build Coastguard Worker EAS_HW_DATA_HANDLE hwInstData;
244*f81fb7c4SAndroid Build Coastguard Worker EAS_FILE_HANDLE fileHandle;
245*f81fb7c4SAndroid Build Coastguard Worker S_WSMP_DATA *wsmpData;
246*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 instCount;
247*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 regionCount;
248*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 artCount;
249*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 waveCount;
250*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 wavePoolSize;
251*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 wavePoolOffset;
252*f81fb7c4SAndroid Build Coastguard Worker EAS_BOOL bigEndian;
253*f81fb7c4SAndroid Build Coastguard Worker EAS_BOOL filterUsed;
254*f81fb7c4SAndroid Build Coastguard Worker } SDLS_SYNTHESIZER_DATA;
255*f81fb7c4SAndroid Build Coastguard Worker
256*f81fb7c4SAndroid Build Coastguard Worker /* connection lookup table */
257*f81fb7c4SAndroid Build Coastguard Worker typedef struct s_connection_tag
258*f81fb7c4SAndroid Build Coastguard Worker {
259*f81fb7c4SAndroid Build Coastguard Worker EAS_U16 source;
260*f81fb7c4SAndroid Build Coastguard Worker EAS_U16 control;
261*f81fb7c4SAndroid Build Coastguard Worker EAS_U16 destination;
262*f81fb7c4SAndroid Build Coastguard Worker EAS_U16 connection;
263*f81fb7c4SAndroid Build Coastguard Worker } S_CONNECTION;
264*f81fb7c4SAndroid Build Coastguard Worker
265*f81fb7c4SAndroid Build Coastguard Worker static const S_CONNECTION connTable[] =
266*f81fb7c4SAndroid Build Coastguard Worker {
267*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_LFO_FREQUENCY, PARAM_MOD_LFO_FREQ },
268*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_LFO_STARTDELAY, PARAM_MOD_LFO_DELAY},
269*f81fb7c4SAndroid Build Coastguard Worker
270*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_VIB_FREQUENCY, PARAM_VIB_LFO_FREQ },
271*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_VIB_STARTDELAY, PARAM_VIB_LFO_DELAY },
272*f81fb7c4SAndroid Build Coastguard Worker
273*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_EG1_DELAYTIME, PARAM_VOL_EG_DELAY },
274*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_EG1_ATTACKTIME, PARAM_VOL_EG_ATTACK },
275*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_EG1_HOLDTIME, PARAM_VOL_EG_HOLD },
276*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_EG1_DECAYTIME, PARAM_VOL_EG_DECAY },
277*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_EG1_SUSTAINLEVEL, PARAM_VOL_EG_SUSTAIN },
278*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_EG1_RELEASETIME, PARAM_VOL_EG_RELEASE },
279*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_EG1_SHUTDOWNTIME, PARAM_VOL_EG_SHUTDOWN },
280*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_KEYONVELOCITY, CONN_SRC_NONE, CONN_DST_EG1_ATTACKTIME, PARAM_VOL_EG_VEL_TO_ATTACK },
281*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_KEYNUMBER, CONN_SRC_NONE, CONN_DST_EG1_DECAYTIME, PARAM_VOL_EG_KEY_TO_DECAY },
282*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_KEYNUMBER, CONN_SRC_NONE, CONN_DST_EG1_HOLDTIME, PARAM_VOL_EG_KEY_TO_HOLD },
283*f81fb7c4SAndroid Build Coastguard Worker
284*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_EG2_DELAYTIME, PARAM_MOD_EG_DELAY },
285*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_EG2_ATTACKTIME, PARAM_MOD_EG_ATTACK },
286*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_EG2_HOLDTIME, PARAM_MOD_EG_HOLD },
287*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_EG2_DECAYTIME, PARAM_MOD_EG_DECAY },
288*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_EG2_SUSTAINLEVEL, PARAM_MOD_EG_SUSTAIN },
289*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_EG2_RELEASETIME, PARAM_MOD_EG_RELEASE },
290*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_KEYONVELOCITY, CONN_SRC_NONE, CONN_DST_EG2_ATTACKTIME, PARAM_MOD_EG_VEL_TO_ATTACK },
291*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_KEYNUMBER, CONN_SRC_NONE, CONN_DST_EG2_DECAYTIME, PARAM_MOD_EG_KEY_TO_DECAY },
292*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_KEYNUMBER, CONN_SRC_NONE, CONN_DST_EG2_HOLDTIME, PARAM_MOD_EG_KEY_TO_HOLD },
293*f81fb7c4SAndroid Build Coastguard Worker
294*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_FILTER_CUTOFF, PARAM_INITIAL_FC },
295*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_FILTER_Q, PARAM_INITIAL_Q },
296*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_LFO, CONN_SRC_NONE, CONN_DST_FILTER_CUTOFF, PARAM_MOD_LFO_TO_FC },
297*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_LFO, CONN_SRC_CC1, CONN_DST_FILTER_CUTOFF, PARAM_MOD_LFO_CC1_TO_FC },
298*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_LFO, CONN_SRC_CHANNELPRESSURE, CONN_DST_FILTER_CUTOFF, PARAM_MOD_LFO_CHAN_PRESS_TO_FC },
299*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_EG2, CONN_SRC_NONE, CONN_DST_FILTER_CUTOFF, PARAM_MOD_EG_TO_FC },
300*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_KEYONVELOCITY, CONN_SRC_NONE, CONN_DST_FILTER_CUTOFF, PARAM_VEL_TO_FC },
301*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_KEYNUMBER, CONN_SRC_NONE, CONN_DST_FILTER_CUTOFF, PARAM_KEYNUM_TO_FC },
302*f81fb7c4SAndroid Build Coastguard Worker
303*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_LFO, CONN_SRC_NONE, CONN_DST_GAIN, PARAM_MOD_LFO_TO_GAIN },
304*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_LFO, CONN_SRC_CC1, CONN_DST_GAIN, PARAM_MOD_LFO_CC1_TO_GAIN },
305*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_LFO, CONN_SRC_CHANNELPRESSURE, CONN_DST_GAIN, PARAM_MOD_LFO_CHAN_PRESS_TO_GAIN },
306*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_KEYONVELOCITY, CONN_SRC_NONE, CONN_DST_GAIN, PARAM_VEL_TO_GAIN },
307*f81fb7c4SAndroid Build Coastguard Worker
308*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_PITCH, PARAM_TUNING },
309*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_KEYNUMBER, CONN_SRC_NONE, CONN_DST_PITCH, PARAM_KEYNUM_TO_PITCH },
310*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_VIBRATO, CONN_SRC_NONE, CONN_DST_PITCH, PARAM_VIB_LFO_TO_PITCH },
311*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_VIBRATO, CONN_SRC_CC1, CONN_DST_PITCH, PARAM_VIB_LFO_CC1_TO_PITCH },
312*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_VIBRATO, CONN_SRC_CHANNELPRESSURE, CONN_DST_PITCH, PARAM_VIB_LFO_CHAN_PRESS_TO_PITCH },
313*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_LFO, CONN_SRC_NONE, CONN_DST_PITCH, PARAM_MOD_LFO_TO_PITCH },
314*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_LFO, CONN_SRC_CC1, CONN_DST_PITCH, PARAM_MOD_LFO_CC1_TO_PITCH },
315*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_LFO, CONN_SRC_CHANNELPRESSURE, CONN_DST_PITCH, PARAM_MOD_LFO_CHAN_PRESS_TO_PITCH },
316*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_EG2, CONN_SRC_NONE, CONN_DST_PITCH, PARAM_MOD_EG_TO_PITCH },
317*f81fb7c4SAndroid Build Coastguard Worker
318*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_PAN, PARAM_DEFAULT_PAN },
319*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_REVERB, PARAM_DEFAULT_REVERB_SEND },
320*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_CC91, CONN_SRC_NONE, CONN_DST_REVERB, PARAM_MIDI_CC91_TO_REVERB_SEND },
321*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_CHORUS, PARAM_DEFAULT_CHORUS_SEND },
322*f81fb7c4SAndroid Build Coastguard Worker { CONN_SRC_CC93, CONN_SRC_NONE, CONN_DST_REVERB, PARAM_MIDI_CC93_TO_CHORUS_SEND }
323*f81fb7c4SAndroid Build Coastguard Worker };
324*f81fb7c4SAndroid Build Coastguard Worker #define ENTRIES_IN_CONN_TABLE (sizeof(connTable)/sizeof(S_CONNECTION))
325*f81fb7c4SAndroid Build Coastguard Worker
326*f81fb7c4SAndroid Build Coastguard Worker static const S_DLS_ART_VALUES defaultArt =
327*f81fb7c4SAndroid Build Coastguard Worker {
328*f81fb7c4SAndroid Build Coastguard Worker {
329*f81fb7c4SAndroid Build Coastguard Worker 0, /* not modified */
330*f81fb7c4SAndroid Build Coastguard Worker -851, /* Mod LFO frequency: 5 Hz */
331*f81fb7c4SAndroid Build Coastguard Worker -7973, /* Mod LFO delay: 10 milliseconds */
332*f81fb7c4SAndroid Build Coastguard Worker
333*f81fb7c4SAndroid Build Coastguard Worker -851, /* Vib LFO frequency: 5 Hz */
334*f81fb7c4SAndroid Build Coastguard Worker -7973, /* Vib LFO delay: 10 milliseconds */
335*f81fb7c4SAndroid Build Coastguard Worker
336*f81fb7c4SAndroid Build Coastguard Worker -32768, /* EG1 delay time: 0 secs */
337*f81fb7c4SAndroid Build Coastguard Worker -32768, /* EG1 attack time: 0 secs */
338*f81fb7c4SAndroid Build Coastguard Worker -32768, /* EG1 hold time: 0 secs */
339*f81fb7c4SAndroid Build Coastguard Worker -32768, /* EG1 decay time: 0 secs */
340*f81fb7c4SAndroid Build Coastguard Worker 1000, /* EG1 sustain level: 100.0% */
341*f81fb7c4SAndroid Build Coastguard Worker -32768, /* EG1 release time: 0 secs */
342*f81fb7c4SAndroid Build Coastguard Worker -7271, /* EG1 shutdown time: 15 msecs */
343*f81fb7c4SAndroid Build Coastguard Worker 0, /* EG1 velocity to attack: 0 time cents */
344*f81fb7c4SAndroid Build Coastguard Worker 0, /* EG1 key number to decay: 0 time cents */
345*f81fb7c4SAndroid Build Coastguard Worker 0, /* EG1 key number to hold: 0 time cents */
346*f81fb7c4SAndroid Build Coastguard Worker
347*f81fb7c4SAndroid Build Coastguard Worker -32768, /* EG2 delay time: 0 secs */
348*f81fb7c4SAndroid Build Coastguard Worker -32768, /* EG2 attack time: 0 secs */
349*f81fb7c4SAndroid Build Coastguard Worker -32768, /* EG2 hold time: 0 secs */
350*f81fb7c4SAndroid Build Coastguard Worker -32768, /* EG2 decay time: 0 secs */
351*f81fb7c4SAndroid Build Coastguard Worker 1000, /* EG2 sustain level: 100.0% */
352*f81fb7c4SAndroid Build Coastguard Worker -32768, /* EG2 release time: 0 secs */
353*f81fb7c4SAndroid Build Coastguard Worker 0, /* EG2 velocity to attack: 0 time cents */
354*f81fb7c4SAndroid Build Coastguard Worker 0, /* EG2 key number to decay: 0 time cents */
355*f81fb7c4SAndroid Build Coastguard Worker 0, /* EG2 key number to hold: 0 time cents */
356*f81fb7c4SAndroid Build Coastguard Worker
357*f81fb7c4SAndroid Build Coastguard Worker 0x7fff, /* Initial Fc: Disabled */
358*f81fb7c4SAndroid Build Coastguard Worker 0, /* Initial Q: 0 dB */
359*f81fb7c4SAndroid Build Coastguard Worker 0, /* Mod LFO to Fc: 0 cents */
360*f81fb7c4SAndroid Build Coastguard Worker 0, /* Mod LFO CC1 to Fc: 0 cents */
361*f81fb7c4SAndroid Build Coastguard Worker 0, /* Mod LFO channel pressure to Fc: 0 cents */
362*f81fb7c4SAndroid Build Coastguard Worker 0, /* EG2 to Fc: 0 cents */
363*f81fb7c4SAndroid Build Coastguard Worker 0, /* Velocity to Fc: 0 cents */
364*f81fb7c4SAndroid Build Coastguard Worker 0, /* Key number to Fc: 0 cents */
365*f81fb7c4SAndroid Build Coastguard Worker
366*f81fb7c4SAndroid Build Coastguard Worker 0, /* Mod LFO to gain: 0 dB */
367*f81fb7c4SAndroid Build Coastguard Worker 0, /* Mod LFO CC1 to gain: 0 dB */
368*f81fb7c4SAndroid Build Coastguard Worker 0, /* Mod LFO channel pressure to gain: 0 dB */
369*f81fb7c4SAndroid Build Coastguard Worker 960, /* Velocity to gain: 96 dB */
370*f81fb7c4SAndroid Build Coastguard Worker
371*f81fb7c4SAndroid Build Coastguard Worker 0, /* Tuning: 0 cents */
372*f81fb7c4SAndroid Build Coastguard Worker 12800, /* Key number to pitch: 12,800 cents */
373*f81fb7c4SAndroid Build Coastguard Worker 0, /* Vibrato to pitch: 0 cents */
374*f81fb7c4SAndroid Build Coastguard Worker 0, /* Vibrato CC1 to pitch: 0 cents */
375*f81fb7c4SAndroid Build Coastguard Worker 0, /* Vibrato channel pressure to pitch: 0 cents */
376*f81fb7c4SAndroid Build Coastguard Worker 0, /* Mod LFO to pitch: 0 cents */
377*f81fb7c4SAndroid Build Coastguard Worker 0, /* Mod LFO CC1 to pitch: 0 cents */
378*f81fb7c4SAndroid Build Coastguard Worker 0, /* Mod LFO channel pressure to pitch: 0 cents */
379*f81fb7c4SAndroid Build Coastguard Worker 0, /* Mod EG to pitch: 0 cents */
380*f81fb7c4SAndroid Build Coastguard Worker
381*f81fb7c4SAndroid Build Coastguard Worker 0, /* Default pan: 0.0% */
382*f81fb7c4SAndroid Build Coastguard Worker 0, /* Default reverb send: 0.0% */
383*f81fb7c4SAndroid Build Coastguard Worker 1000, /* Default CC91 to reverb send: 100.0% */
384*f81fb7c4SAndroid Build Coastguard Worker 0, /* Default chorus send: 0.0% */
385*f81fb7c4SAndroid Build Coastguard Worker 1000 /* Default CC93 to chorus send: 100.0% */
386*f81fb7c4SAndroid Build Coastguard Worker }
387*f81fb7c4SAndroid Build Coastguard Worker };
388*f81fb7c4SAndroid Build Coastguard Worker
389*f81fb7c4SAndroid Build Coastguard Worker /*------------------------------------
390*f81fb7c4SAndroid Build Coastguard Worker * local variables
391*f81fb7c4SAndroid Build Coastguard Worker *------------------------------------
392*f81fb7c4SAndroid Build Coastguard Worker */
393*f81fb7c4SAndroid Build Coastguard Worker
394*f81fb7c4SAndroid Build Coastguard Worker #if defined(_8_BIT_SAMPLES)
395*f81fb7c4SAndroid Build Coastguard Worker static const EAS_INT bitDepth = 8;
396*f81fb7c4SAndroid Build Coastguard Worker #elif defined(_16_BIT_SAMPLES)
397*f81fb7c4SAndroid Build Coastguard Worker static const EAS_INT bitDepth = 16;
398*f81fb7c4SAndroid Build Coastguard Worker #else
399*f81fb7c4SAndroid Build Coastguard Worker #error "Must define _8_BIT_SAMPLES or _16_BIT_SAMPLES"
400*f81fb7c4SAndroid Build Coastguard Worker #endif
401*f81fb7c4SAndroid Build Coastguard Worker
402*f81fb7c4SAndroid Build Coastguard Worker static const EAS_U32 outputSampleRate = _OUTPUT_SAMPLE_RATE;
403*f81fb7c4SAndroid Build Coastguard Worker static const EAS_I32 dlsRateConvert = DLS_RATE_CONVERT;
404*f81fb7c4SAndroid Build Coastguard Worker static const EAS_I32 dlsLFOFrequencyConvert = DLS_LFO_FREQUENCY_CONVERT;
405*f81fb7c4SAndroid Build Coastguard Worker
406*f81fb7c4SAndroid Build Coastguard Worker /*------------------------------------
407*f81fb7c4SAndroid Build Coastguard Worker * inline functions
408*f81fb7c4SAndroid Build Coastguard Worker *------------------------------------
409*f81fb7c4SAndroid Build Coastguard Worker */
PtrOfs(void * p,EAS_I32 offset)410*f81fb7c4SAndroid Build Coastguard Worker EAS_INLINE void *PtrOfs (void *p, EAS_I32 offset)
411*f81fb7c4SAndroid Build Coastguard Worker {
412*f81fb7c4SAndroid Build Coastguard Worker return (void*) (((EAS_U8*) p) + offset);
413*f81fb7c4SAndroid Build Coastguard Worker }
414*f81fb7c4SAndroid Build Coastguard Worker
415*f81fb7c4SAndroid Build Coastguard Worker /*------------------------------------
416*f81fb7c4SAndroid Build Coastguard Worker * prototypes
417*f81fb7c4SAndroid Build Coastguard Worker *------------------------------------
418*f81fb7c4SAndroid Build Coastguard Worker */
419*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT NextChunk (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 *pPos, EAS_U32 *pChunkType, EAS_I32 *pSize);
420*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_ptbl (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 wsmpPos, EAS_I32 wsmpSize);
421*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_wave (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_U16 waveIndex);
422*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_wsmp (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, S_WSMP_DATA *p);
423*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_fmt (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, S_WSMP_DATA *p);
424*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_data (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 size, S_WSMP_DATA *p, EAS_SAMPLE *pSample, EAS_U32 sampleLen);
425*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_lins(SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 size);
426*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_ins (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 size);
427*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_insh (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_U32 *pRgnCount, EAS_U32 *pLocale);
428*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_lrgn (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 size, EAS_U16 artIndex, EAS_U32 numRegions);
429*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_rgn (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 size, EAS_U16 artIndex);
430*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_rgnh (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, S_DLS_REGION *pRgn);
431*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_lart (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 size, S_DLS_ART_VALUES *pArt);
432*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_art (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, S_DLS_ART_VALUES *pArt);
433*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_wlnk (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_U32 *pWaveIndex);
434*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_cdl (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 size, EAS_U32 *pValue);
435*f81fb7c4SAndroid Build Coastguard Worker static void Convert_rgn (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_U16 regionIndex, EAS_U16 artIndex, EAS_U16 waveIndex, S_WSMP_DATA *pWsmp);
436*f81fb7c4SAndroid Build Coastguard Worker static void Convert_art (SDLS_SYNTHESIZER_DATA *pDLSData, const S_DLS_ART_VALUES *pDLSArt, EAS_U16 artIndex);
437*f81fb7c4SAndroid Build Coastguard Worker static EAS_I16 ConvertSampleRate (EAS_U32 sampleRate);
438*f81fb7c4SAndroid Build Coastguard Worker static EAS_I16 ConvertSustain (EAS_I32 sustain);
439*f81fb7c4SAndroid Build Coastguard Worker static EAS_I16 ConvertLFOPhaseIncrement (EAS_I32 pitchCents);
440*f81fb7c4SAndroid Build Coastguard Worker static EAS_I8 ConvertPan (EAS_I32 pan);
441*f81fb7c4SAndroid Build Coastguard Worker static EAS_U8 ConvertQ (EAS_I32 q);
442*f81fb7c4SAndroid Build Coastguard Worker
443*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_DLS
444*f81fb7c4SAndroid Build Coastguard Worker static void DumpDLS (S_EAS *pEAS);
445*f81fb7c4SAndroid Build Coastguard Worker #endif
446*f81fb7c4SAndroid Build Coastguard Worker
447*f81fb7c4SAndroid Build Coastguard Worker
448*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
449*f81fb7c4SAndroid Build Coastguard Worker * DLSParser ()
450*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
451*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
452*f81fb7c4SAndroid Build Coastguard Worker *
453*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
454*f81fb7c4SAndroid Build Coastguard Worker * pEASData - pointer to over EAS data instance
455*f81fb7c4SAndroid Build Coastguard Worker * fileHandle - file handle for input file
456*f81fb7c4SAndroid Build Coastguard Worker * offset - offset into file where DLS data starts
457*f81fb7c4SAndroid Build Coastguard Worker *
458*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
459*f81fb7c4SAndroid Build Coastguard Worker * EAS_RESULT
460*f81fb7c4SAndroid Build Coastguard Worker * ppEAS - address of pointer to alternate EAS wavetable
461*f81fb7c4SAndroid Build Coastguard Worker *
462*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
463*f81fb7c4SAndroid Build Coastguard Worker */
DLSParser(EAS_HW_DATA_HANDLE hwInstData,EAS_FILE_HANDLE fileHandle,EAS_I32 offset,EAS_DLSLIB_HANDLE * ppDLS)464*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT DLSParser (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE fileHandle, EAS_I32 offset, EAS_DLSLIB_HANDLE *ppDLS)
465*f81fb7c4SAndroid Build Coastguard Worker {
466*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
467*f81fb7c4SAndroid Build Coastguard Worker SDLS_SYNTHESIZER_DATA dls;
468*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 temp;
469*f81fb7c4SAndroid Build Coastguard Worker uint32_t chunk_type;
470*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 pos;
471*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 chunkPos;
472*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 size;
473*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 instSize;
474*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 rgnPoolSize;
475*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 artPoolSize;
476*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 waveLenSize;
477*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 endDLS;
478*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 wvplPos;
479*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 wvplSize;
480*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 linsPos;
481*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 linsSize;
482*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 ptblPos;
483*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 ptblSize;
484*f81fb7c4SAndroid Build Coastguard Worker void *p;
485*f81fb7c4SAndroid Build Coastguard Worker
486*f81fb7c4SAndroid Build Coastguard Worker /* zero counts and pointers */
487*f81fb7c4SAndroid Build Coastguard Worker EAS_HWMemSet(&dls, 0, sizeof(dls));
488*f81fb7c4SAndroid Build Coastguard Worker
489*f81fb7c4SAndroid Build Coastguard Worker /* save file handle and hwInstData to save copying pointers around */
490*f81fb7c4SAndroid Build Coastguard Worker dls.hwInstData = hwInstData;
491*f81fb7c4SAndroid Build Coastguard Worker dls.fileHandle = fileHandle;
492*f81fb7c4SAndroid Build Coastguard Worker
493*f81fb7c4SAndroid Build Coastguard Worker /* NULL return value in case of error */
494*f81fb7c4SAndroid Build Coastguard Worker *ppDLS = NULL;
495*f81fb7c4SAndroid Build Coastguard Worker
496*f81fb7c4SAndroid Build Coastguard Worker /* seek to start of DLS and read in RIFF tag and set processor endian flag */
497*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWFileSeek(dls.hwInstData, dls.fileHandle, offset)) != EAS_SUCCESS)
498*f81fb7c4SAndroid Build Coastguard Worker return result;
499*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWReadFile(dls.hwInstData, dls.fileHandle, &chunk_type, sizeof(chunk_type), &size)) != EAS_SUCCESS)
500*f81fb7c4SAndroid Build Coastguard Worker return result;
501*f81fb7c4SAndroid Build Coastguard Worker
502*f81fb7c4SAndroid Build Coastguard Worker /* check for processor endian-ness */
503*f81fb7c4SAndroid Build Coastguard Worker dls.bigEndian = (chunk_type == CHUNK_RIFF);
504*f81fb7c4SAndroid Build Coastguard Worker
505*f81fb7c4SAndroid Build Coastguard Worker /* first chunk should be DLS */
506*f81fb7c4SAndroid Build Coastguard Worker pos = offset;
507*f81fb7c4SAndroid Build Coastguard Worker if ((result = NextChunk(&dls, &pos, &temp, &size)) != EAS_SUCCESS)
508*f81fb7c4SAndroid Build Coastguard Worker return result;
509*f81fb7c4SAndroid Build Coastguard Worker if (temp != CHUNK_DLS)
510*f81fb7c4SAndroid Build Coastguard Worker {
511*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Expected DLS chunk, got %08lx\n", temp); */ }
512*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_FILE_FORMAT;
513*f81fb7c4SAndroid Build Coastguard Worker }
514*f81fb7c4SAndroid Build Coastguard Worker
515*f81fb7c4SAndroid Build Coastguard Worker /* no instrument or wavepool chunks */
516*f81fb7c4SAndroid Build Coastguard Worker linsSize = wvplSize = ptblSize = linsPos = wvplPos = ptblPos = 0;
517*f81fb7c4SAndroid Build Coastguard Worker
518*f81fb7c4SAndroid Build Coastguard Worker /* scan the chunks in the DLS list */
519*f81fb7c4SAndroid Build Coastguard Worker endDLS = offset + size;
520*f81fb7c4SAndroid Build Coastguard Worker pos = offset + 12;
521*f81fb7c4SAndroid Build Coastguard Worker while (pos < endDLS)
522*f81fb7c4SAndroid Build Coastguard Worker {
523*f81fb7c4SAndroid Build Coastguard Worker chunkPos = pos;
524*f81fb7c4SAndroid Build Coastguard Worker
525*f81fb7c4SAndroid Build Coastguard Worker /* get the next chunk type */
526*f81fb7c4SAndroid Build Coastguard Worker if ((result = NextChunk(&dls, &pos, &temp, &size)) != EAS_SUCCESS)
527*f81fb7c4SAndroid Build Coastguard Worker return result;
528*f81fb7c4SAndroid Build Coastguard Worker
529*f81fb7c4SAndroid Build Coastguard Worker /* parse useful chunks */
530*f81fb7c4SAndroid Build Coastguard Worker switch (temp)
531*f81fb7c4SAndroid Build Coastguard Worker {
532*f81fb7c4SAndroid Build Coastguard Worker case CHUNK_CDL:
533*f81fb7c4SAndroid Build Coastguard Worker if ((result = Parse_cdl(&dls, size, &temp)) != EAS_SUCCESS)
534*f81fb7c4SAndroid Build Coastguard Worker return result;
535*f81fb7c4SAndroid Build Coastguard Worker if (!temp)
536*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_UNRECOGNIZED_FORMAT;
537*f81fb7c4SAndroid Build Coastguard Worker break;
538*f81fb7c4SAndroid Build Coastguard Worker
539*f81fb7c4SAndroid Build Coastguard Worker case CHUNK_LINS:
540*f81fb7c4SAndroid Build Coastguard Worker linsPos = chunkPos + 12;
541*f81fb7c4SAndroid Build Coastguard Worker linsSize = size - 4;
542*f81fb7c4SAndroid Build Coastguard Worker break;
543*f81fb7c4SAndroid Build Coastguard Worker
544*f81fb7c4SAndroid Build Coastguard Worker case CHUNK_WVPL:
545*f81fb7c4SAndroid Build Coastguard Worker wvplPos = chunkPos + 12;
546*f81fb7c4SAndroid Build Coastguard Worker wvplSize = size - 4;
547*f81fb7c4SAndroid Build Coastguard Worker break;
548*f81fb7c4SAndroid Build Coastguard Worker
549*f81fb7c4SAndroid Build Coastguard Worker case CHUNK_PTBL:
550*f81fb7c4SAndroid Build Coastguard Worker ptblPos = chunkPos + 8;
551*f81fb7c4SAndroid Build Coastguard Worker ptblSize = size - 4;
552*f81fb7c4SAndroid Build Coastguard Worker break;
553*f81fb7c4SAndroid Build Coastguard Worker
554*f81fb7c4SAndroid Build Coastguard Worker default:
555*f81fb7c4SAndroid Build Coastguard Worker break;
556*f81fb7c4SAndroid Build Coastguard Worker }
557*f81fb7c4SAndroid Build Coastguard Worker }
558*f81fb7c4SAndroid Build Coastguard Worker
559*f81fb7c4SAndroid Build Coastguard Worker /* must have a lins chunk */
560*f81fb7c4SAndroid Build Coastguard Worker if (linsSize == 0)
561*f81fb7c4SAndroid Build Coastguard Worker {
562*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "No lins chunk found"); */ }
563*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_UNRECOGNIZED_FORMAT;
564*f81fb7c4SAndroid Build Coastguard Worker }
565*f81fb7c4SAndroid Build Coastguard Worker
566*f81fb7c4SAndroid Build Coastguard Worker /* must have a wvpl chunk */
567*f81fb7c4SAndroid Build Coastguard Worker if (wvplSize == 0)
568*f81fb7c4SAndroid Build Coastguard Worker {
569*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "No wvpl chunk found"); */ }
570*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_UNRECOGNIZED_FORMAT;
571*f81fb7c4SAndroid Build Coastguard Worker }
572*f81fb7c4SAndroid Build Coastguard Worker
573*f81fb7c4SAndroid Build Coastguard Worker /* must have a ptbl chunk */
574*f81fb7c4SAndroid Build Coastguard Worker if ((ptblSize == 0) || (ptblSize > (EAS_I32) (DLS_MAX_WAVE_COUNT * sizeof(POOLCUE) + sizeof(POOLTABLE))))
575*f81fb7c4SAndroid Build Coastguard Worker {
576*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "No ptbl chunk found"); */ }
577*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_UNRECOGNIZED_FORMAT;
578*f81fb7c4SAndroid Build Coastguard Worker }
579*f81fb7c4SAndroid Build Coastguard Worker
580*f81fb7c4SAndroid Build Coastguard Worker /* pre-parse the wave pool chunk */
581*f81fb7c4SAndroid Build Coastguard Worker if ((result = Parse_ptbl(&dls, ptblPos, wvplPos, wvplSize)) != EAS_SUCCESS)
582*f81fb7c4SAndroid Build Coastguard Worker return result;
583*f81fb7c4SAndroid Build Coastguard Worker
584*f81fb7c4SAndroid Build Coastguard Worker /* limit check */
585*f81fb7c4SAndroid Build Coastguard Worker if ((dls.waveCount == 0) || (dls.waveCount > DLS_MAX_WAVE_COUNT))
586*f81fb7c4SAndroid Build Coastguard Worker {
587*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "DLS file contains invalid #waves [%u]\n", dls.waveCount); */ }
588*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_FILE_FORMAT;
589*f81fb7c4SAndroid Build Coastguard Worker }
590*f81fb7c4SAndroid Build Coastguard Worker
591*f81fb7c4SAndroid Build Coastguard Worker /* allocate memory for wsmp data */
592*f81fb7c4SAndroid Build Coastguard Worker dls.wsmpData = EAS_HWMalloc(dls.hwInstData, (EAS_I32) (sizeof(S_WSMP_DATA) * dls.waveCount));
593*f81fb7c4SAndroid Build Coastguard Worker if (dls.wsmpData == NULL)
594*f81fb7c4SAndroid Build Coastguard Worker {
595*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "EAS_HWMalloc for wsmp data failed\n"); */ }
596*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_MALLOC_FAILED;
597*f81fb7c4SAndroid Build Coastguard Worker }
598*f81fb7c4SAndroid Build Coastguard Worker EAS_HWMemSet(dls.wsmpData, 0, (EAS_I32) (sizeof(S_WSMP_DATA) * dls.waveCount));
599*f81fb7c4SAndroid Build Coastguard Worker
600*f81fb7c4SAndroid Build Coastguard Worker /* pre-parse the lins chunk */
601*f81fb7c4SAndroid Build Coastguard Worker result = Parse_lins(&dls, linsPos, linsSize);
602*f81fb7c4SAndroid Build Coastguard Worker if (result == EAS_SUCCESS)
603*f81fb7c4SAndroid Build Coastguard Worker {
604*f81fb7c4SAndroid Build Coastguard Worker
605*f81fb7c4SAndroid Build Coastguard Worker /* limit check */
606*f81fb7c4SAndroid Build Coastguard Worker if ((dls.regionCount == 0) || (dls.regionCount > DLS_MAX_REGION_COUNT))
607*f81fb7c4SAndroid Build Coastguard Worker {
608*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "DLS file contains invalid #regions [%u]\n", dls.regionCount); */ }
609*f81fb7c4SAndroid Build Coastguard Worker EAS_HWFree(dls.hwInstData, dls.wsmpData);
610*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_FILE_FORMAT;
611*f81fb7c4SAndroid Build Coastguard Worker }
612*f81fb7c4SAndroid Build Coastguard Worker
613*f81fb7c4SAndroid Build Coastguard Worker /* limit check */
614*f81fb7c4SAndroid Build Coastguard Worker if ((dls.artCount == 0) || (dls.artCount > DLS_MAX_ART_COUNT))
615*f81fb7c4SAndroid Build Coastguard Worker {
616*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "DLS file contains invalid #articulations [%u]\n", dls.regionCount); */ }
617*f81fb7c4SAndroid Build Coastguard Worker EAS_HWFree(dls.hwInstData, dls.wsmpData);
618*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_FILE_FORMAT;
619*f81fb7c4SAndroid Build Coastguard Worker }
620*f81fb7c4SAndroid Build Coastguard Worker
621*f81fb7c4SAndroid Build Coastguard Worker /* limit check */
622*f81fb7c4SAndroid Build Coastguard Worker if ((dls.instCount == 0) || (dls.instCount > DLS_MAX_INST_COUNT))
623*f81fb7c4SAndroid Build Coastguard Worker {
624*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "DLS file contains invalid #instruments [%u]\n", dls.instCount); */ }
625*f81fb7c4SAndroid Build Coastguard Worker EAS_HWFree(dls.hwInstData, dls.wsmpData);
626*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_FILE_FORMAT;
627*f81fb7c4SAndroid Build Coastguard Worker }
628*f81fb7c4SAndroid Build Coastguard Worker
629*f81fb7c4SAndroid Build Coastguard Worker /* Allocate memory for the converted DLS data */
630*f81fb7c4SAndroid Build Coastguard Worker /* calculate size of instrument data */
631*f81fb7c4SAndroid Build Coastguard Worker instSize = (EAS_I32) (sizeof(S_PROGRAM) * dls.instCount);
632*f81fb7c4SAndroid Build Coastguard Worker
633*f81fb7c4SAndroid Build Coastguard Worker /* calculate size of region pool */
634*f81fb7c4SAndroid Build Coastguard Worker rgnPoolSize = (EAS_I32) (sizeof(S_DLS_REGION) * dls.regionCount);
635*f81fb7c4SAndroid Build Coastguard Worker
636*f81fb7c4SAndroid Build Coastguard Worker /* calculate size of articulation pool, add one for default articulation */
637*f81fb7c4SAndroid Build Coastguard Worker dls.artCount++;
638*f81fb7c4SAndroid Build Coastguard Worker artPoolSize = (EAS_I32) (sizeof(S_DLS_ARTICULATION) * dls.artCount);
639*f81fb7c4SAndroid Build Coastguard Worker
640*f81fb7c4SAndroid Build Coastguard Worker /* calculate size of wave length and offset arrays */
641*f81fb7c4SAndroid Build Coastguard Worker waveLenSize = (EAS_I32) (dls.waveCount * sizeof(EAS_U32));
642*f81fb7c4SAndroid Build Coastguard Worker
643*f81fb7c4SAndroid Build Coastguard Worker /* calculate final memory size */
644*f81fb7c4SAndroid Build Coastguard Worker size = (EAS_I32) sizeof(S_EAS) + instSize + rgnPoolSize + artPoolSize + (2 * waveLenSize) + (EAS_I32) dls.wavePoolSize;
645*f81fb7c4SAndroid Build Coastguard Worker if (size <= 0) {
646*f81fb7c4SAndroid Build Coastguard Worker EAS_HWFree(dls.hwInstData, dls.wsmpData);
647*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_FILE_FORMAT;
648*f81fb7c4SAndroid Build Coastguard Worker }
649*f81fb7c4SAndroid Build Coastguard Worker
650*f81fb7c4SAndroid Build Coastguard Worker /* allocate the main EAS chunk */
651*f81fb7c4SAndroid Build Coastguard Worker dls.pDLS = EAS_HWMalloc(dls.hwInstData, size);
652*f81fb7c4SAndroid Build Coastguard Worker if (dls.pDLS == NULL)
653*f81fb7c4SAndroid Build Coastguard Worker {
654*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "EAS_HWMalloc failed for DLS memory allocation size %ld\n", size); */ }
655*f81fb7c4SAndroid Build Coastguard Worker EAS_HWFree(dls.hwInstData, dls.wsmpData);
656*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_MALLOC_FAILED;
657*f81fb7c4SAndroid Build Coastguard Worker }
658*f81fb7c4SAndroid Build Coastguard Worker EAS_HWMemSet(dls.pDLS, 0, size);
659*f81fb7c4SAndroid Build Coastguard Worker dls.pDLS->refCount = 1;
660*f81fb7c4SAndroid Build Coastguard Worker p = PtrOfs(dls.pDLS, sizeof(S_EAS));
661*f81fb7c4SAndroid Build Coastguard Worker
662*f81fb7c4SAndroid Build Coastguard Worker /* setup pointer to programs */
663*f81fb7c4SAndroid Build Coastguard Worker dls.pDLS->numDLSPrograms = (EAS_U16) dls.instCount;
664*f81fb7c4SAndroid Build Coastguard Worker dls.pDLS->pDLSPrograms = p;
665*f81fb7c4SAndroid Build Coastguard Worker p = PtrOfs(p, instSize);
666*f81fb7c4SAndroid Build Coastguard Worker
667*f81fb7c4SAndroid Build Coastguard Worker /* setup pointer to regions */
668*f81fb7c4SAndroid Build Coastguard Worker dls.pDLS->pDLSRegions = p;
669*f81fb7c4SAndroid Build Coastguard Worker dls.pDLS->numDLSRegions = (EAS_U16) dls.regionCount;
670*f81fb7c4SAndroid Build Coastguard Worker p = PtrOfs(p, rgnPoolSize);
671*f81fb7c4SAndroid Build Coastguard Worker
672*f81fb7c4SAndroid Build Coastguard Worker /* setup pointer to articulations */
673*f81fb7c4SAndroid Build Coastguard Worker dls.pDLS->numDLSArticulations = (EAS_U16) dls.artCount;
674*f81fb7c4SAndroid Build Coastguard Worker dls.pDLS->pDLSArticulations = p;
675*f81fb7c4SAndroid Build Coastguard Worker p = PtrOfs(p, artPoolSize);
676*f81fb7c4SAndroid Build Coastguard Worker
677*f81fb7c4SAndroid Build Coastguard Worker /* setup pointer to wave length table */
678*f81fb7c4SAndroid Build Coastguard Worker dls.pDLS->numDLSSamples = (EAS_U16) dls.waveCount;
679*f81fb7c4SAndroid Build Coastguard Worker dls.pDLS->pDLSSampleLen = p;
680*f81fb7c4SAndroid Build Coastguard Worker p = PtrOfs(p, waveLenSize);
681*f81fb7c4SAndroid Build Coastguard Worker
682*f81fb7c4SAndroid Build Coastguard Worker /* setup pointer to wave offsets table */
683*f81fb7c4SAndroid Build Coastguard Worker dls.pDLS->pDLSSampleOffsets = p;
684*f81fb7c4SAndroid Build Coastguard Worker p = PtrOfs(p, waveLenSize);
685*f81fb7c4SAndroid Build Coastguard Worker
686*f81fb7c4SAndroid Build Coastguard Worker /* setup pointer to wave pool */
687*f81fb7c4SAndroid Build Coastguard Worker dls.pDLS->pDLSSamples = p;
688*f81fb7c4SAndroid Build Coastguard Worker
689*f81fb7c4SAndroid Build Coastguard Worker /* clear filter flag */
690*f81fb7c4SAndroid Build Coastguard Worker dls.filterUsed = EAS_FALSE;
691*f81fb7c4SAndroid Build Coastguard Worker
692*f81fb7c4SAndroid Build Coastguard Worker /* parse the wave pool and load samples */
693*f81fb7c4SAndroid Build Coastguard Worker result = Parse_ptbl(&dls, ptblPos, wvplPos, wvplSize);
694*f81fb7c4SAndroid Build Coastguard Worker }
695*f81fb7c4SAndroid Build Coastguard Worker
696*f81fb7c4SAndroid Build Coastguard Worker /* create the default articulation */
697*f81fb7c4SAndroid Build Coastguard Worker if (dls.pDLS) {
698*f81fb7c4SAndroid Build Coastguard Worker Convert_art(&dls, &defaultArt, 0);
699*f81fb7c4SAndroid Build Coastguard Worker dls.artCount = 1;
700*f81fb7c4SAndroid Build Coastguard Worker }
701*f81fb7c4SAndroid Build Coastguard Worker
702*f81fb7c4SAndroid Build Coastguard Worker /* parse the lins chunk and load instruments */
703*f81fb7c4SAndroid Build Coastguard Worker dls.regionCount = dls.instCount = 0;
704*f81fb7c4SAndroid Build Coastguard Worker if (result == EAS_SUCCESS)
705*f81fb7c4SAndroid Build Coastguard Worker result = Parse_lins(&dls, linsPos, linsSize);
706*f81fb7c4SAndroid Build Coastguard Worker
707*f81fb7c4SAndroid Build Coastguard Worker /* clean up any temporary objects that were allocated */
708*f81fb7c4SAndroid Build Coastguard Worker if (dls.wsmpData)
709*f81fb7c4SAndroid Build Coastguard Worker EAS_HWFree(dls.hwInstData, dls.wsmpData);
710*f81fb7c4SAndroid Build Coastguard Worker
711*f81fb7c4SAndroid Build Coastguard Worker /* if successful, return a pointer to the EAS collection */
712*f81fb7c4SAndroid Build Coastguard Worker if (result == EAS_SUCCESS)
713*f81fb7c4SAndroid Build Coastguard Worker {
714*f81fb7c4SAndroid Build Coastguard Worker *ppDLS = dls.pDLS;
715*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_DLS
716*f81fb7c4SAndroid Build Coastguard Worker DumpDLS(dls.pDLS);
717*f81fb7c4SAndroid Build Coastguard Worker #endif
718*f81fb7c4SAndroid Build Coastguard Worker }
719*f81fb7c4SAndroid Build Coastguard Worker
720*f81fb7c4SAndroid Build Coastguard Worker /* something went wrong, deallocate the EAS collection */
721*f81fb7c4SAndroid Build Coastguard Worker else
722*f81fb7c4SAndroid Build Coastguard Worker DLSCleanup(dls.hwInstData, dls.pDLS);
723*f81fb7c4SAndroid Build Coastguard Worker
724*f81fb7c4SAndroid Build Coastguard Worker return result;
725*f81fb7c4SAndroid Build Coastguard Worker }
726*f81fb7c4SAndroid Build Coastguard Worker
727*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
728*f81fb7c4SAndroid Build Coastguard Worker * DLSCleanup ()
729*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
730*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
731*f81fb7c4SAndroid Build Coastguard Worker *
732*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
733*f81fb7c4SAndroid Build Coastguard Worker * pEASData - pointer to over EAS data instance
734*f81fb7c4SAndroid Build Coastguard Worker * pEAS - pointer to alternate EAS wavetable
735*f81fb7c4SAndroid Build Coastguard Worker *
736*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
737*f81fb7c4SAndroid Build Coastguard Worker * EAS_RESULT
738*f81fb7c4SAndroid Build Coastguard Worker *
739*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
740*f81fb7c4SAndroid Build Coastguard Worker */
DLSCleanup(EAS_HW_DATA_HANDLE hwInstData,S_DLS * pDLS)741*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT DLSCleanup (EAS_HW_DATA_HANDLE hwInstData, S_DLS *pDLS)
742*f81fb7c4SAndroid Build Coastguard Worker {
743*f81fb7c4SAndroid Build Coastguard Worker
744*f81fb7c4SAndroid Build Coastguard Worker /* free the allocated memory */
745*f81fb7c4SAndroid Build Coastguard Worker if (pDLS)
746*f81fb7c4SAndroid Build Coastguard Worker {
747*f81fb7c4SAndroid Build Coastguard Worker if (pDLS->refCount)
748*f81fb7c4SAndroid Build Coastguard Worker {
749*f81fb7c4SAndroid Build Coastguard Worker if (--pDLS->refCount == 0)
750*f81fb7c4SAndroid Build Coastguard Worker EAS_HWFree(hwInstData, pDLS);
751*f81fb7c4SAndroid Build Coastguard Worker }
752*f81fb7c4SAndroid Build Coastguard Worker }
753*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
754*f81fb7c4SAndroid Build Coastguard Worker }
755*f81fb7c4SAndroid Build Coastguard Worker
756*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
757*f81fb7c4SAndroid Build Coastguard Worker * DLSAddRef ()
758*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
759*f81fb7c4SAndroid Build Coastguard Worker * Increment reference count
760*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
761*f81fb7c4SAndroid Build Coastguard Worker */
DLSAddRef(S_DLS * pDLS)762*f81fb7c4SAndroid Build Coastguard Worker void DLSAddRef (S_DLS *pDLS)
763*f81fb7c4SAndroid Build Coastguard Worker {
764*f81fb7c4SAndroid Build Coastguard Worker if (pDLS)
765*f81fb7c4SAndroid Build Coastguard Worker pDLS->refCount++;
766*f81fb7c4SAndroid Build Coastguard Worker }
767*f81fb7c4SAndroid Build Coastguard Worker
768*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
769*f81fb7c4SAndroid Build Coastguard Worker * NextChunk ()
770*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
771*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
772*f81fb7c4SAndroid Build Coastguard Worker * Returns the type and size of the next chunk in the file
773*f81fb7c4SAndroid Build Coastguard Worker *
774*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
775*f81fb7c4SAndroid Build Coastguard Worker *
776*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
777*f81fb7c4SAndroid Build Coastguard Worker *
778*f81fb7c4SAndroid Build Coastguard Worker * Side Effects:
779*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
780*f81fb7c4SAndroid Build Coastguard Worker */
NextChunk(SDLS_SYNTHESIZER_DATA * pDLSData,EAS_I32 * pPos,EAS_U32 * pChunkType,EAS_I32 * pSize)781*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT NextChunk (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 *pPos, EAS_U32 *pChunkType, EAS_I32 *pSize)
782*f81fb7c4SAndroid Build Coastguard Worker {
783*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
784*f81fb7c4SAndroid Build Coastguard Worker
785*f81fb7c4SAndroid Build Coastguard Worker /* seek to start of chunk */
786*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, *pPos)) != EAS_SUCCESS)
787*f81fb7c4SAndroid Build Coastguard Worker return result;
788*f81fb7c4SAndroid Build Coastguard Worker
789*f81fb7c4SAndroid Build Coastguard Worker /* read the chunk type */
790*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, pChunkType, EAS_TRUE)) != EAS_SUCCESS)
791*f81fb7c4SAndroid Build Coastguard Worker return result;
792*f81fb7c4SAndroid Build Coastguard Worker
793*f81fb7c4SAndroid Build Coastguard Worker /* read the chunk size */
794*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, pSize, EAS_FALSE)) != EAS_SUCCESS)
795*f81fb7c4SAndroid Build Coastguard Worker return result;
796*f81fb7c4SAndroid Build Coastguard Worker
797*f81fb7c4SAndroid Build Coastguard Worker if (*pSize < 0) {
798*f81fb7c4SAndroid Build Coastguard Worker ALOGE("b/37093318");
799*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_FILE_FORMAT;
800*f81fb7c4SAndroid Build Coastguard Worker }
801*f81fb7c4SAndroid Build Coastguard Worker
802*f81fb7c4SAndroid Build Coastguard Worker /* get form type for RIFF and LIST types */
803*f81fb7c4SAndroid Build Coastguard Worker if ((*pChunkType == CHUNK_RIFF) || (*pChunkType == CHUNK_LIST))
804*f81fb7c4SAndroid Build Coastguard Worker {
805*f81fb7c4SAndroid Build Coastguard Worker
806*f81fb7c4SAndroid Build Coastguard Worker /* read the form type */
807*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, pChunkType, EAS_TRUE)) != EAS_SUCCESS)
808*f81fb7c4SAndroid Build Coastguard Worker return result;
809*f81fb7c4SAndroid Build Coastguard Worker
810*f81fb7c4SAndroid Build Coastguard Worker }
811*f81fb7c4SAndroid Build Coastguard Worker
812*f81fb7c4SAndroid Build Coastguard Worker /* calculate start of next chunk */
813*f81fb7c4SAndroid Build Coastguard Worker *pPos += *pSize + 8;
814*f81fb7c4SAndroid Build Coastguard Worker
815*f81fb7c4SAndroid Build Coastguard Worker /* adjust to word boundary */
816*f81fb7c4SAndroid Build Coastguard Worker if (*pPos & 1)
817*f81fb7c4SAndroid Build Coastguard Worker (*pPos)++;
818*f81fb7c4SAndroid Build Coastguard Worker
819*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
820*f81fb7c4SAndroid Build Coastguard Worker }
821*f81fb7c4SAndroid Build Coastguard Worker
822*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
823*f81fb7c4SAndroid Build Coastguard Worker * Parse_ptbl ()
824*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
825*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
826*f81fb7c4SAndroid Build Coastguard Worker *
827*f81fb7c4SAndroid Build Coastguard Worker *
828*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
829*f81fb7c4SAndroid Build Coastguard Worker *
830*f81fb7c4SAndroid Build Coastguard Worker *
831*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
832*f81fb7c4SAndroid Build Coastguard Worker *
833*f81fb7c4SAndroid Build Coastguard Worker *
834*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
835*f81fb7c4SAndroid Build Coastguard Worker */
Parse_ptbl(SDLS_SYNTHESIZER_DATA * pDLSData,EAS_I32 pos,EAS_I32 wtblPos,EAS_I32 wtblSize)836*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_ptbl (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 wtblPos, EAS_I32 wtblSize)
837*f81fb7c4SAndroid Build Coastguard Worker {
838*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
839*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 temp;
840*f81fb7c4SAndroid Build Coastguard Worker EAS_FILE_HANDLE tempFile;
841*f81fb7c4SAndroid Build Coastguard Worker EAS_U16 waveIndex;
842*f81fb7c4SAndroid Build Coastguard Worker
843*f81fb7c4SAndroid Build Coastguard Worker /* seek to start of chunk */
844*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
845*f81fb7c4SAndroid Build Coastguard Worker return result;
846*f81fb7c4SAndroid Build Coastguard Worker
847*f81fb7c4SAndroid Build Coastguard Worker /* get the structure size */
848*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &temp, EAS_FALSE)) != EAS_SUCCESS)
849*f81fb7c4SAndroid Build Coastguard Worker return result;
850*f81fb7c4SAndroid Build Coastguard Worker
851*f81fb7c4SAndroid Build Coastguard Worker /* get the number of waves */
852*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &pDLSData->waveCount, EAS_FALSE)) != EAS_SUCCESS)
853*f81fb7c4SAndroid Build Coastguard Worker return result;
854*f81fb7c4SAndroid Build Coastguard Worker
855*f81fb7c4SAndroid Build Coastguard Worker /* if second pass, ensure waveCount matches with the value parsed in first pass */
856*f81fb7c4SAndroid Build Coastguard Worker if (pDLSData->pDLS)
857*f81fb7c4SAndroid Build Coastguard Worker {
858*f81fb7c4SAndroid Build Coastguard Worker if (pDLSData->waveCount != pDLSData->pDLS->numDLSSamples)
859*f81fb7c4SAndroid Build Coastguard Worker {
860*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_DATA_INCONSISTENCY;
861*f81fb7c4SAndroid Build Coastguard Worker }
862*f81fb7c4SAndroid Build Coastguard Worker }
863*f81fb7c4SAndroid Build Coastguard Worker
864*f81fb7c4SAndroid Build Coastguard Worker #if 0
865*f81fb7c4SAndroid Build Coastguard Worker /* just need the wave count on the first pass */
866*f81fb7c4SAndroid Build Coastguard Worker if (!pDLSData->pDLS)
867*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
868*f81fb7c4SAndroid Build Coastguard Worker #endif
869*f81fb7c4SAndroid Build Coastguard Worker
870*f81fb7c4SAndroid Build Coastguard Worker /* open duplicate file handle */
871*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWDupHandle(pDLSData->hwInstData, pDLSData->fileHandle, &tempFile)) != EAS_SUCCESS)
872*f81fb7c4SAndroid Build Coastguard Worker return result;
873*f81fb7c4SAndroid Build Coastguard Worker
874*f81fb7c4SAndroid Build Coastguard Worker /* read to end of chunk */
875*f81fb7c4SAndroid Build Coastguard Worker for (waveIndex = 0; waveIndex < pDLSData->waveCount; waveIndex++)
876*f81fb7c4SAndroid Build Coastguard Worker {
877*f81fb7c4SAndroid Build Coastguard Worker
878*f81fb7c4SAndroid Build Coastguard Worker /* get the offset to the wave and make sure it is within the wtbl chunk */
879*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetDWord(pDLSData->hwInstData, tempFile, &temp, EAS_FALSE)) != EAS_SUCCESS)
880*f81fb7c4SAndroid Build Coastguard Worker return result;
881*f81fb7c4SAndroid Build Coastguard Worker if (temp > (EAS_U32) wtblSize)
882*f81fb7c4SAndroid Build Coastguard Worker {
883*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Ptbl offset exceeds size of wtbl\n"); */ }
884*f81fb7c4SAndroid Build Coastguard Worker EAS_HWCloseFile(pDLSData->hwInstData, tempFile);
885*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_FILE_FORMAT;
886*f81fb7c4SAndroid Build Coastguard Worker }
887*f81fb7c4SAndroid Build Coastguard Worker
888*f81fb7c4SAndroid Build Coastguard Worker /* parse the wave */
889*f81fb7c4SAndroid Build Coastguard Worker if ((result = Parse_wave(pDLSData, wtblPos +(EAS_I32) temp, waveIndex)) != EAS_SUCCESS)
890*f81fb7c4SAndroid Build Coastguard Worker return result;
891*f81fb7c4SAndroid Build Coastguard Worker }
892*f81fb7c4SAndroid Build Coastguard Worker
893*f81fb7c4SAndroid Build Coastguard Worker /* close the temporary handle and return */
894*f81fb7c4SAndroid Build Coastguard Worker EAS_HWCloseFile(pDLSData->hwInstData, tempFile);
895*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
896*f81fb7c4SAndroid Build Coastguard Worker }
897*f81fb7c4SAndroid Build Coastguard Worker
898*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
899*f81fb7c4SAndroid Build Coastguard Worker * Parse_wave ()
900*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
901*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
902*f81fb7c4SAndroid Build Coastguard Worker *
903*f81fb7c4SAndroid Build Coastguard Worker *
904*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
905*f81fb7c4SAndroid Build Coastguard Worker *
906*f81fb7c4SAndroid Build Coastguard Worker *
907*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
908*f81fb7c4SAndroid Build Coastguard Worker *
909*f81fb7c4SAndroid Build Coastguard Worker *
910*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
911*f81fb7c4SAndroid Build Coastguard Worker */
Parse_wave(SDLS_SYNTHESIZER_DATA * pDLSData,EAS_I32 pos,EAS_U16 waveIndex)912*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_wave (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_U16 waveIndex)
913*f81fb7c4SAndroid Build Coastguard Worker {
914*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
915*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 temp;
916*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 size;
917*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 endChunk;
918*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 chunkPos;
919*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 wsmpPos = 0;
920*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 fmtPos = 0;
921*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 dataPos = 0;
922*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 dataSize = 0;
923*f81fb7c4SAndroid Build Coastguard Worker S_WSMP_DATA *p;
924*f81fb7c4SAndroid Build Coastguard Worker void *pSample;
925*f81fb7c4SAndroid Build Coastguard Worker S_WSMP_DATA wsmp;
926*f81fb7c4SAndroid Build Coastguard Worker
927*f81fb7c4SAndroid Build Coastguard Worker /* seek to start of chunk */
928*f81fb7c4SAndroid Build Coastguard Worker chunkPos = pos + 12;
929*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
930*f81fb7c4SAndroid Build Coastguard Worker return result;
931*f81fb7c4SAndroid Build Coastguard Worker
932*f81fb7c4SAndroid Build Coastguard Worker /* get the chunk type */
933*f81fb7c4SAndroid Build Coastguard Worker if ((result = NextChunk(pDLSData, &pos, &temp, &size)) != EAS_SUCCESS)
934*f81fb7c4SAndroid Build Coastguard Worker return result;
935*f81fb7c4SAndroid Build Coastguard Worker
936*f81fb7c4SAndroid Build Coastguard Worker /* make sure it is a wave chunk */
937*f81fb7c4SAndroid Build Coastguard Worker if (temp != CHUNK_WAVE)
938*f81fb7c4SAndroid Build Coastguard Worker {
939*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Offset in ptbl does not point to wave chunk\n"); */ }
940*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_FILE_FORMAT;
941*f81fb7c4SAndroid Build Coastguard Worker }
942*f81fb7c4SAndroid Build Coastguard Worker
943*f81fb7c4SAndroid Build Coastguard Worker /* read to end of chunk */
944*f81fb7c4SAndroid Build Coastguard Worker pos = chunkPos;
945*f81fb7c4SAndroid Build Coastguard Worker endChunk = pos + size;
946*f81fb7c4SAndroid Build Coastguard Worker while (pos < endChunk)
947*f81fb7c4SAndroid Build Coastguard Worker {
948*f81fb7c4SAndroid Build Coastguard Worker chunkPos = pos;
949*f81fb7c4SAndroid Build Coastguard Worker
950*f81fb7c4SAndroid Build Coastguard Worker /* get the chunk type */
951*f81fb7c4SAndroid Build Coastguard Worker if ((result = NextChunk(pDLSData, &pos, &temp, &size)) != EAS_SUCCESS)
952*f81fb7c4SAndroid Build Coastguard Worker return result;
953*f81fb7c4SAndroid Build Coastguard Worker
954*f81fb7c4SAndroid Build Coastguard Worker /* parse useful chunks */
955*f81fb7c4SAndroid Build Coastguard Worker switch (temp)
956*f81fb7c4SAndroid Build Coastguard Worker {
957*f81fb7c4SAndroid Build Coastguard Worker case CHUNK_WSMP:
958*f81fb7c4SAndroid Build Coastguard Worker wsmpPos = chunkPos + 8;
959*f81fb7c4SAndroid Build Coastguard Worker break;
960*f81fb7c4SAndroid Build Coastguard Worker
961*f81fb7c4SAndroid Build Coastguard Worker case CHUNK_FMT:
962*f81fb7c4SAndroid Build Coastguard Worker fmtPos = chunkPos + 8;
963*f81fb7c4SAndroid Build Coastguard Worker break;
964*f81fb7c4SAndroid Build Coastguard Worker
965*f81fb7c4SAndroid Build Coastguard Worker case CHUNK_DATA:
966*f81fb7c4SAndroid Build Coastguard Worker dataPos = chunkPos + 8;
967*f81fb7c4SAndroid Build Coastguard Worker dataSize = size;
968*f81fb7c4SAndroid Build Coastguard Worker break;
969*f81fb7c4SAndroid Build Coastguard Worker
970*f81fb7c4SAndroid Build Coastguard Worker default:
971*f81fb7c4SAndroid Build Coastguard Worker break;
972*f81fb7c4SAndroid Build Coastguard Worker }
973*f81fb7c4SAndroid Build Coastguard Worker }
974*f81fb7c4SAndroid Build Coastguard Worker
975*f81fb7c4SAndroid Build Coastguard Worker // limit to reasonable size
976*f81fb7c4SAndroid Build Coastguard Worker if (dataSize < 0 || dataSize > MAX_DLS_WAVE_SIZE)
977*f81fb7c4SAndroid Build Coastguard Worker {
978*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_SOUND_LIBRARY;
979*f81fb7c4SAndroid Build Coastguard Worker }
980*f81fb7c4SAndroid Build Coastguard Worker
981*f81fb7c4SAndroid Build Coastguard Worker /* for first pass, use temporary variable */
982*f81fb7c4SAndroid Build Coastguard Worker if (pDLSData->pDLS == NULL)
983*f81fb7c4SAndroid Build Coastguard Worker p = &wsmp;
984*f81fb7c4SAndroid Build Coastguard Worker else
985*f81fb7c4SAndroid Build Coastguard Worker p = &pDLSData->wsmpData[waveIndex];
986*f81fb7c4SAndroid Build Coastguard Worker
987*f81fb7c4SAndroid Build Coastguard Worker /* set the defaults */
988*f81fb7c4SAndroid Build Coastguard Worker p->fineTune = 0;
989*f81fb7c4SAndroid Build Coastguard Worker p->unityNote = 60;
990*f81fb7c4SAndroid Build Coastguard Worker p->gain = 0;
991*f81fb7c4SAndroid Build Coastguard Worker p->loopStart = 0;
992*f81fb7c4SAndroid Build Coastguard Worker p->loopLength = 0;
993*f81fb7c4SAndroid Build Coastguard Worker
994*f81fb7c4SAndroid Build Coastguard Worker /* must have a fmt chunk */
995*f81fb7c4SAndroid Build Coastguard Worker if (!fmtPos)
996*f81fb7c4SAndroid Build Coastguard Worker {
997*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "DLS wave chunk has no fmt chunk\n"); */ }
998*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_UNRECOGNIZED_FORMAT;
999*f81fb7c4SAndroid Build Coastguard Worker }
1000*f81fb7c4SAndroid Build Coastguard Worker
1001*f81fb7c4SAndroid Build Coastguard Worker /* must have a data chunk */
1002*f81fb7c4SAndroid Build Coastguard Worker if (!dataPos)
1003*f81fb7c4SAndroid Build Coastguard Worker {
1004*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "DLS wave chunk has no data chunk\n"); */ }
1005*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_UNRECOGNIZED_FORMAT;
1006*f81fb7c4SAndroid Build Coastguard Worker }
1007*f81fb7c4SAndroid Build Coastguard Worker
1008*f81fb7c4SAndroid Build Coastguard Worker /* parse the wsmp chunk */
1009*f81fb7c4SAndroid Build Coastguard Worker if (wsmpPos)
1010*f81fb7c4SAndroid Build Coastguard Worker {
1011*f81fb7c4SAndroid Build Coastguard Worker if ((result = Parse_wsmp(pDLSData, wsmpPos, p)) != EAS_SUCCESS)
1012*f81fb7c4SAndroid Build Coastguard Worker return result;
1013*f81fb7c4SAndroid Build Coastguard Worker }
1014*f81fb7c4SAndroid Build Coastguard Worker
1015*f81fb7c4SAndroid Build Coastguard Worker /* parse the fmt chunk */
1016*f81fb7c4SAndroid Build Coastguard Worker if ((result = Parse_fmt(pDLSData, fmtPos, p)) != EAS_SUCCESS)
1017*f81fb7c4SAndroid Build Coastguard Worker return result;
1018*f81fb7c4SAndroid Build Coastguard Worker
1019*f81fb7c4SAndroid Build Coastguard Worker /* calculate the size of the wavetable needed. We need only half
1020*f81fb7c4SAndroid Build Coastguard Worker * the memory for 16-bit samples when in 8-bit mode, and we need
1021*f81fb7c4SAndroid Build Coastguard Worker * double the memory for 8-bit samples in 16-bit mode. For
1022*f81fb7c4SAndroid Build Coastguard Worker * unlooped samples, we may use ADPCM. If so, we need only 1/4
1023*f81fb7c4SAndroid Build Coastguard Worker * the memory.
1024*f81fb7c4SAndroid Build Coastguard Worker *
1025*f81fb7c4SAndroid Build Coastguard Worker * We also need to add one for looped samples to allow for
1026*f81fb7c4SAndroid Build Coastguard Worker * the first sample to be copied to the end of the loop.
1027*f81fb7c4SAndroid Build Coastguard Worker */
1028*f81fb7c4SAndroid Build Coastguard Worker
1029*f81fb7c4SAndroid Build Coastguard Worker /* use ADPCM encode for unlooped 16-bit samples if ADPCM is enabled */
1030*f81fb7c4SAndroid Build Coastguard Worker /*lint -e{506} -e{774} groundwork for future version to support 8 & 16 bit */
1031*f81fb7c4SAndroid Build Coastguard Worker if (bitDepth == 8)
1032*f81fb7c4SAndroid Build Coastguard Worker {
1033*f81fb7c4SAndroid Build Coastguard Worker if (p->bitsPerSample == 8)
1034*f81fb7c4SAndroid Build Coastguard Worker size = dataSize;
1035*f81fb7c4SAndroid Build Coastguard Worker else
1036*f81fb7c4SAndroid Build Coastguard Worker /*lint -e{704} use shift for performance */
1037*f81fb7c4SAndroid Build Coastguard Worker size = dataSize >> 1;
1038*f81fb7c4SAndroid Build Coastguard Worker if (p->loopLength)
1039*f81fb7c4SAndroid Build Coastguard Worker size++;
1040*f81fb7c4SAndroid Build Coastguard Worker }
1041*f81fb7c4SAndroid Build Coastguard Worker
1042*f81fb7c4SAndroid Build Coastguard Worker else
1043*f81fb7c4SAndroid Build Coastguard Worker {
1044*f81fb7c4SAndroid Build Coastguard Worker if (p->bitsPerSample == 16)
1045*f81fb7c4SAndroid Build Coastguard Worker size = dataSize;
1046*f81fb7c4SAndroid Build Coastguard Worker else
1047*f81fb7c4SAndroid Build Coastguard Worker /*lint -e{703} use shift for performance */
1048*f81fb7c4SAndroid Build Coastguard Worker size = dataSize << 1;
1049*f81fb7c4SAndroid Build Coastguard Worker if (p->loopLength)
1050*f81fb7c4SAndroid Build Coastguard Worker size += 2;
1051*f81fb7c4SAndroid Build Coastguard Worker }
1052*f81fb7c4SAndroid Build Coastguard Worker
1053*f81fb7c4SAndroid Build Coastguard Worker /* for first pass, add size to wave pool size and return */
1054*f81fb7c4SAndroid Build Coastguard Worker if (pDLSData->pDLS == NULL)
1055*f81fb7c4SAndroid Build Coastguard Worker {
1056*f81fb7c4SAndroid Build Coastguard Worker pDLSData->wavePoolSize += (EAS_U32) size;
1057*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
1058*f81fb7c4SAndroid Build Coastguard Worker }
1059*f81fb7c4SAndroid Build Coastguard Worker
1060*f81fb7c4SAndroid Build Coastguard Worker /* allocate memory and read in the sample data */
1061*f81fb7c4SAndroid Build Coastguard Worker pSample = (EAS_U8*)pDLSData->pDLS->pDLSSamples + pDLSData->wavePoolOffset;
1062*f81fb7c4SAndroid Build Coastguard Worker pDLSData->pDLS->pDLSSampleOffsets[waveIndex] = pDLSData->wavePoolOffset;
1063*f81fb7c4SAndroid Build Coastguard Worker pDLSData->pDLS->pDLSSampleLen[waveIndex] = (EAS_U32) size;
1064*f81fb7c4SAndroid Build Coastguard Worker pDLSData->wavePoolOffset += (EAS_U32) size;
1065*f81fb7c4SAndroid Build Coastguard Worker if (pDLSData->wavePoolOffset > pDLSData->wavePoolSize)
1066*f81fb7c4SAndroid Build Coastguard Worker {
1067*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Wave pool exceeded allocation\n"); */ }
1068*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_SOUND_LIBRARY;
1069*f81fb7c4SAndroid Build Coastguard Worker }
1070*f81fb7c4SAndroid Build Coastguard Worker
1071*f81fb7c4SAndroid Build Coastguard Worker if ((result = Parse_data(pDLSData, dataPos, dataSize, p, pSample, (EAS_U32)size)) != EAS_SUCCESS)
1072*f81fb7c4SAndroid Build Coastguard Worker return result;
1073*f81fb7c4SAndroid Build Coastguard Worker
1074*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
1075*f81fb7c4SAndroid Build Coastguard Worker }
1076*f81fb7c4SAndroid Build Coastguard Worker
1077*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1078*f81fb7c4SAndroid Build Coastguard Worker * Parse_wsmp ()
1079*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1080*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
1081*f81fb7c4SAndroid Build Coastguard Worker *
1082*f81fb7c4SAndroid Build Coastguard Worker *
1083*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
1084*f81fb7c4SAndroid Build Coastguard Worker *
1085*f81fb7c4SAndroid Build Coastguard Worker *
1086*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
1087*f81fb7c4SAndroid Build Coastguard Worker *
1088*f81fb7c4SAndroid Build Coastguard Worker *
1089*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1090*f81fb7c4SAndroid Build Coastguard Worker */
Parse_wsmp(SDLS_SYNTHESIZER_DATA * pDLSData,EAS_I32 pos,S_WSMP_DATA * p)1091*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_wsmp (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, S_WSMP_DATA *p)
1092*f81fb7c4SAndroid Build Coastguard Worker {
1093*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
1094*f81fb7c4SAndroid Build Coastguard Worker EAS_U16 wtemp;
1095*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 ltemp;
1096*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 cbSize;
1097*f81fb7c4SAndroid Build Coastguard Worker
1098*f81fb7c4SAndroid Build Coastguard Worker /* seek to start of chunk */
1099*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
1100*f81fb7c4SAndroid Build Coastguard Worker return result;
1101*f81fb7c4SAndroid Build Coastguard Worker
1102*f81fb7c4SAndroid Build Coastguard Worker /* get structure size */
1103*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &cbSize, EAS_FALSE)) != EAS_SUCCESS)
1104*f81fb7c4SAndroid Build Coastguard Worker return result;
1105*f81fb7c4SAndroid Build Coastguard Worker
1106*f81fb7c4SAndroid Build Coastguard Worker /* get unity note */
1107*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &wtemp, EAS_FALSE)) != EAS_SUCCESS)
1108*f81fb7c4SAndroid Build Coastguard Worker return result;
1109*f81fb7c4SAndroid Build Coastguard Worker if (wtemp <= 127)
1110*f81fb7c4SAndroid Build Coastguard Worker p->unityNote = (EAS_U8) wtemp;
1111*f81fb7c4SAndroid Build Coastguard Worker else
1112*f81fb7c4SAndroid Build Coastguard Worker {
1113*f81fb7c4SAndroid Build Coastguard Worker p->unityNote = 60;
1114*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Invalid unity note [%u] in DLS wsmp ignored, set to 60\n", wtemp); */ }
1115*f81fb7c4SAndroid Build Coastguard Worker }
1116*f81fb7c4SAndroid Build Coastguard Worker
1117*f81fb7c4SAndroid Build Coastguard Worker /* get fine tune */
1118*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &p->fineTune, EAS_FALSE)) != EAS_SUCCESS)
1119*f81fb7c4SAndroid Build Coastguard Worker return result;
1120*f81fb7c4SAndroid Build Coastguard Worker
1121*f81fb7c4SAndroid Build Coastguard Worker /* get gain */
1122*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &p->gain, EAS_FALSE)) != EAS_SUCCESS)
1123*f81fb7c4SAndroid Build Coastguard Worker return result;
1124*f81fb7c4SAndroid Build Coastguard Worker if (p->gain > 0)
1125*f81fb7c4SAndroid Build Coastguard Worker {
1126*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Positive gain [%ld] in DLS wsmp ignored, set to 0dB\n", p->gain); */ }
1127*f81fb7c4SAndroid Build Coastguard Worker p->gain = 0;
1128*f81fb7c4SAndroid Build Coastguard Worker }
1129*f81fb7c4SAndroid Build Coastguard Worker
1130*f81fb7c4SAndroid Build Coastguard Worker /* option flags */
1131*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, <emp, EAS_FALSE)) != EAS_SUCCESS)
1132*f81fb7c4SAndroid Build Coastguard Worker return result;
1133*f81fb7c4SAndroid Build Coastguard Worker
1134*f81fb7c4SAndroid Build Coastguard Worker /* sample loops */
1135*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, <emp, EAS_FALSE)) != EAS_SUCCESS)
1136*f81fb7c4SAndroid Build Coastguard Worker return result;
1137*f81fb7c4SAndroid Build Coastguard Worker
1138*f81fb7c4SAndroid Build Coastguard Worker /* if looped sample, get loop data */
1139*f81fb7c4SAndroid Build Coastguard Worker if (ltemp)
1140*f81fb7c4SAndroid Build Coastguard Worker {
1141*f81fb7c4SAndroid Build Coastguard Worker
1142*f81fb7c4SAndroid Build Coastguard Worker if (ltemp > 1)
1143*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "DLS sample with %lu loops, ignoring extra loops\n", ltemp); */ }
1144*f81fb7c4SAndroid Build Coastguard Worker
1145*f81fb7c4SAndroid Build Coastguard Worker /* skip ahead to loop data */
1146*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos + (EAS_I32) cbSize)) != EAS_SUCCESS)
1147*f81fb7c4SAndroid Build Coastguard Worker return result;
1148*f81fb7c4SAndroid Build Coastguard Worker
1149*f81fb7c4SAndroid Build Coastguard Worker /* get structure size */
1150*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, <emp, EAS_FALSE)) != EAS_SUCCESS)
1151*f81fb7c4SAndroid Build Coastguard Worker return result;
1152*f81fb7c4SAndroid Build Coastguard Worker
1153*f81fb7c4SAndroid Build Coastguard Worker /* get loop type */
1154*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, <emp, EAS_FALSE)) != EAS_SUCCESS)
1155*f81fb7c4SAndroid Build Coastguard Worker return result;
1156*f81fb7c4SAndroid Build Coastguard Worker
1157*f81fb7c4SAndroid Build Coastguard Worker /* get loop start */
1158*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &p->loopStart, EAS_FALSE)) != EAS_SUCCESS)
1159*f81fb7c4SAndroid Build Coastguard Worker return result;
1160*f81fb7c4SAndroid Build Coastguard Worker
1161*f81fb7c4SAndroid Build Coastguard Worker /* get loop length */
1162*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &p->loopLength, EAS_FALSE)) != EAS_SUCCESS)
1163*f81fb7c4SAndroid Build Coastguard Worker return result;
1164*f81fb7c4SAndroid Build Coastguard Worker
1165*f81fb7c4SAndroid Build Coastguard Worker /* ensure no overflow */
1166*f81fb7c4SAndroid Build Coastguard Worker if (p->loopLength
1167*f81fb7c4SAndroid Build Coastguard Worker && ((p->loopStart > EAS_U32_MAX - p->loopLength)
1168*f81fb7c4SAndroid Build Coastguard Worker || (p->loopStart + p->loopLength > EAS_U32_MAX / sizeof(EAS_SAMPLE))))
1169*f81fb7c4SAndroid Build Coastguard Worker {
1170*f81fb7c4SAndroid Build Coastguard Worker return EAS_FAILURE;
1171*f81fb7c4SAndroid Build Coastguard Worker }
1172*f81fb7c4SAndroid Build Coastguard Worker }
1173*f81fb7c4SAndroid Build Coastguard Worker
1174*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
1175*f81fb7c4SAndroid Build Coastguard Worker }
1176*f81fb7c4SAndroid Build Coastguard Worker
1177*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1178*f81fb7c4SAndroid Build Coastguard Worker * Parse_fmt ()
1179*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1180*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
1181*f81fb7c4SAndroid Build Coastguard Worker *
1182*f81fb7c4SAndroid Build Coastguard Worker *
1183*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
1184*f81fb7c4SAndroid Build Coastguard Worker *
1185*f81fb7c4SAndroid Build Coastguard Worker *
1186*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
1187*f81fb7c4SAndroid Build Coastguard Worker *
1188*f81fb7c4SAndroid Build Coastguard Worker *
1189*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1190*f81fb7c4SAndroid Build Coastguard Worker */
Parse_fmt(SDLS_SYNTHESIZER_DATA * pDLSData,EAS_I32 pos,S_WSMP_DATA * p)1191*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_fmt (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, S_WSMP_DATA *p)
1192*f81fb7c4SAndroid Build Coastguard Worker {
1193*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
1194*f81fb7c4SAndroid Build Coastguard Worker EAS_U16 wtemp;
1195*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 ltemp;
1196*f81fb7c4SAndroid Build Coastguard Worker
1197*f81fb7c4SAndroid Build Coastguard Worker /* seek to start of chunk */
1198*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
1199*f81fb7c4SAndroid Build Coastguard Worker return result;
1200*f81fb7c4SAndroid Build Coastguard Worker
1201*f81fb7c4SAndroid Build Coastguard Worker /* get format tag */
1202*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &wtemp, EAS_FALSE)) != EAS_SUCCESS)
1203*f81fb7c4SAndroid Build Coastguard Worker return result;
1204*f81fb7c4SAndroid Build Coastguard Worker if (wtemp != WAVE_FORMAT_PCM)
1205*f81fb7c4SAndroid Build Coastguard Worker {
1206*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Unsupported DLS sample format %04x\n", wtemp); */ }
1207*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_UNRECOGNIZED_FORMAT;
1208*f81fb7c4SAndroid Build Coastguard Worker }
1209*f81fb7c4SAndroid Build Coastguard Worker
1210*f81fb7c4SAndroid Build Coastguard Worker /* get number of channels */
1211*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &wtemp, EAS_FALSE)) != EAS_SUCCESS)
1212*f81fb7c4SAndroid Build Coastguard Worker return result;
1213*f81fb7c4SAndroid Build Coastguard Worker if (wtemp != 1)
1214*f81fb7c4SAndroid Build Coastguard Worker {
1215*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "No support for DLS multi-channel samples\n"); */ }
1216*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_UNRECOGNIZED_FORMAT;
1217*f81fb7c4SAndroid Build Coastguard Worker }
1218*f81fb7c4SAndroid Build Coastguard Worker
1219*f81fb7c4SAndroid Build Coastguard Worker /* get sample rate */
1220*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &p->sampleRate, EAS_FALSE)) != EAS_SUCCESS)
1221*f81fb7c4SAndroid Build Coastguard Worker return result;
1222*f81fb7c4SAndroid Build Coastguard Worker
1223*f81fb7c4SAndroid Build Coastguard Worker /* bytes/sec */
1224*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, <emp, EAS_FALSE)) != EAS_SUCCESS)
1225*f81fb7c4SAndroid Build Coastguard Worker return result;
1226*f81fb7c4SAndroid Build Coastguard Worker
1227*f81fb7c4SAndroid Build Coastguard Worker /* block align */
1228*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &wtemp, EAS_FALSE)) != EAS_SUCCESS)
1229*f81fb7c4SAndroid Build Coastguard Worker return result;
1230*f81fb7c4SAndroid Build Coastguard Worker
1231*f81fb7c4SAndroid Build Coastguard Worker /* bits/sample */
1232*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &p->bitsPerSample, EAS_FALSE)) != EAS_SUCCESS)
1233*f81fb7c4SAndroid Build Coastguard Worker return result;
1234*f81fb7c4SAndroid Build Coastguard Worker
1235*f81fb7c4SAndroid Build Coastguard Worker if ((p->bitsPerSample != 8) && (p->bitsPerSample != 16))
1236*f81fb7c4SAndroid Build Coastguard Worker {
1237*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Unsupported DLS bits-per-sample %d\n", p->bitsPerSample); */ }
1238*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_UNRECOGNIZED_FORMAT;
1239*f81fb7c4SAndroid Build Coastguard Worker }
1240*f81fb7c4SAndroid Build Coastguard Worker
1241*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
1242*f81fb7c4SAndroid Build Coastguard Worker }
1243*f81fb7c4SAndroid Build Coastguard Worker
1244*f81fb7c4SAndroid Build Coastguard Worker #if defined( _8_BIT_SAMPLES)
1245*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1246*f81fb7c4SAndroid Build Coastguard Worker * Parse_data ()
1247*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1248*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
1249*f81fb7c4SAndroid Build Coastguard Worker *
1250*f81fb7c4SAndroid Build Coastguard Worker * NOTE: The optimized assembly versions of the interpolator require
1251*f81fb7c4SAndroid Build Coastguard Worker * an extra sample at the end of the loop - a copy of the first
1252*f81fb7c4SAndroid Build Coastguard Worker * sample. This routine must allocate an extra sample of data and
1253*f81fb7c4SAndroid Build Coastguard Worker * copy the first sample of the loop to the end.
1254*f81fb7c4SAndroid Build Coastguard Worker *
1255*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
1256*f81fb7c4SAndroid Build Coastguard Worker *
1257*f81fb7c4SAndroid Build Coastguard Worker *
1258*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
1259*f81fb7c4SAndroid Build Coastguard Worker *
1260*f81fb7c4SAndroid Build Coastguard Worker *
1261*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1262*f81fb7c4SAndroid Build Coastguard Worker */
Parse_data(SDLS_SYNTHESIZER_DATA * pDLSData,EAS_I32 pos,EAS_I32 size,S_WSMP_DATA * pWsmp,EAS_SAMPLE * pSample,EAS_U32 sampleLen)1263*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_data (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 size, S_WSMP_DATA *pWsmp, EAS_SAMPLE *pSample, EAS_U32 sampleLen)
1264*f81fb7c4SAndroid Build Coastguard Worker {
1265*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
1266*f81fb7c4SAndroid Build Coastguard Worker EAS_U8 convBuf[SAMPLE_CONVERT_CHUNK_SIZE];
1267*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 count;
1268*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 i;
1269*f81fb7c4SAndroid Build Coastguard Worker EAS_I8 *p;
1270*f81fb7c4SAndroid Build Coastguard Worker
1271*f81fb7c4SAndroid Build Coastguard Worker /* seek to start of chunk */
1272*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
1273*f81fb7c4SAndroid Build Coastguard Worker return result;
1274*f81fb7c4SAndroid Build Coastguard Worker
1275*f81fb7c4SAndroid Build Coastguard Worker /* 8-bit samples in an 8-bit synth, just copy the data, and flip bit 7 */
1276*f81fb7c4SAndroid Build Coastguard Worker p = pSample;
1277*f81fb7c4SAndroid Build Coastguard Worker if (pWsmp->bitsPerSample == 8)
1278*f81fb7c4SAndroid Build Coastguard Worker {
1279*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWReadFile(pDLSData->hwInstData, pDLSData->fileHandle, pSample, size, &count)) != EAS_SUCCESS)
1280*f81fb7c4SAndroid Build Coastguard Worker return result;
1281*f81fb7c4SAndroid Build Coastguard Worker for (i = 0; i < size; i++)
1282*f81fb7c4SAndroid Build Coastguard Worker /*lint -e{734} convert from unsigned to signed audio */
1283*f81fb7c4SAndroid Build Coastguard Worker *p++ ^= 0x80;
1284*f81fb7c4SAndroid Build Coastguard Worker }
1285*f81fb7c4SAndroid Build Coastguard Worker
1286*f81fb7c4SAndroid Build Coastguard Worker /* 16-bit samples, need to convert to 8-bit or ADPCM */
1287*f81fb7c4SAndroid Build Coastguard Worker else
1288*f81fb7c4SAndroid Build Coastguard Worker {
1289*f81fb7c4SAndroid Build Coastguard Worker
1290*f81fb7c4SAndroid Build Coastguard Worker while (size)
1291*f81fb7c4SAndroid Build Coastguard Worker {
1292*f81fb7c4SAndroid Build Coastguard Worker EAS_I8 *pInput;
1293*f81fb7c4SAndroid Build Coastguard Worker
1294*f81fb7c4SAndroid Build Coastguard Worker /* for undithered conversion, we're just copying the 8-bit data */
1295*f81fb7c4SAndroid Build Coastguard Worker if (pDLSData->bigEndian)
1296*f81fb7c4SAndroid Build Coastguard Worker pInput = (EAS_I8*) convBuf;
1297*f81fb7c4SAndroid Build Coastguard Worker else
1298*f81fb7c4SAndroid Build Coastguard Worker pInput = (EAS_I8*) convBuf + 1;
1299*f81fb7c4SAndroid Build Coastguard Worker
1300*f81fb7c4SAndroid Build Coastguard Worker /* read a small chunk of data and convert it */
1301*f81fb7c4SAndroid Build Coastguard Worker count = (size < SAMPLE_CONVERT_CHUNK_SIZE ? size : SAMPLE_CONVERT_CHUNK_SIZE);
1302*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWReadFile(pDLSData->hwInstData, pDLSData->fileHandle, convBuf, count, &count)) != EAS_SUCCESS)
1303*f81fb7c4SAndroid Build Coastguard Worker return result;
1304*f81fb7c4SAndroid Build Coastguard Worker size -= count;
1305*f81fb7c4SAndroid Build Coastguard Worker /*lint -e{704} use shift for performance */
1306*f81fb7c4SAndroid Build Coastguard Worker count = count >> 1;
1307*f81fb7c4SAndroid Build Coastguard Worker
1308*f81fb7c4SAndroid Build Coastguard Worker while (count--)
1309*f81fb7c4SAndroid Build Coastguard Worker {
1310*f81fb7c4SAndroid Build Coastguard Worker *p++ = *pInput;
1311*f81fb7c4SAndroid Build Coastguard Worker pInput += 2;
1312*f81fb7c4SAndroid Build Coastguard Worker }
1313*f81fb7c4SAndroid Build Coastguard Worker }
1314*f81fb7c4SAndroid Build Coastguard Worker }
1315*f81fb7c4SAndroid Build Coastguard Worker
1316*f81fb7c4SAndroid Build Coastguard Worker /* for looped samples, copy the last sample to the end */
1317*f81fb7c4SAndroid Build Coastguard Worker if (pWsmp->loopLength)
1318*f81fb7c4SAndroid Build Coastguard Worker {
1319*f81fb7c4SAndroid Build Coastguard Worker if (sampleLen < sizeof(EAS_SAMPLE)
1320*f81fb7c4SAndroid Build Coastguard Worker || (pWsmp->loopStart + pWsmp->loopLength) * sizeof(EAS_SAMPLE) > sampleLen - sizeof(EAS_SAMPLE))
1321*f81fb7c4SAndroid Build Coastguard Worker {
1322*f81fb7c4SAndroid Build Coastguard Worker return EAS_FAILURE;
1323*f81fb7c4SAndroid Build Coastguard Worker }
1324*f81fb7c4SAndroid Build Coastguard Worker
1325*f81fb7c4SAndroid Build Coastguard Worker pSample[pWsmp->loopStart + pWsmp->loopLength] = pSample[pWsmp->loopStart];
1326*f81fb7c4SAndroid Build Coastguard Worker }
1327*f81fb7c4SAndroid Build Coastguard Worker
1328*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
1329*f81fb7c4SAndroid Build Coastguard Worker }
1330*f81fb7c4SAndroid Build Coastguard Worker #elif defined(_16_BIT_SAMPLES)
Parse_data(SDLS_SYNTHESIZER_DATA * pDLSData,EAS_I32 pos,EAS_I32 size,S_WSMP_DATA * pWsmp,EAS_SAMPLE * pSample,EAS_U32 sampleLen)1331*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_data (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 size, S_WSMP_DATA *pWsmp, EAS_SAMPLE *pSample, EAS_U32 sampleLen)
1332*f81fb7c4SAndroid Build Coastguard Worker {
1333*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
1334*f81fb7c4SAndroid Build Coastguard Worker EAS_U8 convBuf[SAMPLE_CONVERT_CHUNK_SIZE];
1335*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 count = 0;
1336*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 i;
1337*f81fb7c4SAndroid Build Coastguard Worker EAS_I16 *p;
1338*f81fb7c4SAndroid Build Coastguard Worker
1339*f81fb7c4SAndroid Build Coastguard Worker /* seek to start of chunk */
1340*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
1341*f81fb7c4SAndroid Build Coastguard Worker return result;
1342*f81fb7c4SAndroid Build Coastguard Worker
1343*f81fb7c4SAndroid Build Coastguard Worker p = pSample;
1344*f81fb7c4SAndroid Build Coastguard Worker
1345*f81fb7c4SAndroid Build Coastguard Worker while (size)
1346*f81fb7c4SAndroid Build Coastguard Worker {
1347*f81fb7c4SAndroid Build Coastguard Worker /* read a small chunk of data and convert it */
1348*f81fb7c4SAndroid Build Coastguard Worker count = (size < SAMPLE_CONVERT_CHUNK_SIZE ? size : SAMPLE_CONVERT_CHUNK_SIZE);
1349*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWReadFile(pDLSData->hwInstData, pDLSData->fileHandle, convBuf, count, &count)) != EAS_SUCCESS)
1350*f81fb7c4SAndroid Build Coastguard Worker {
1351*f81fb7c4SAndroid Build Coastguard Worker return result;
1352*f81fb7c4SAndroid Build Coastguard Worker }
1353*f81fb7c4SAndroid Build Coastguard Worker size -= count;
1354*f81fb7c4SAndroid Build Coastguard Worker if (pWsmp->bitsPerSample == 16)
1355*f81fb7c4SAndroid Build Coastguard Worker {
1356*f81fb7c4SAndroid Build Coastguard Worker memcpy(p, convBuf, count);
1357*f81fb7c4SAndroid Build Coastguard Worker p += count >> 1;
1358*f81fb7c4SAndroid Build Coastguard Worker }
1359*f81fb7c4SAndroid Build Coastguard Worker else
1360*f81fb7c4SAndroid Build Coastguard Worker {
1361*f81fb7c4SAndroid Build Coastguard Worker for(i=0; i<count; i++)
1362*f81fb7c4SAndroid Build Coastguard Worker {
1363*f81fb7c4SAndroid Build Coastguard Worker *p++ = (short)((convBuf[i] ^ 0x80) << 8);
1364*f81fb7c4SAndroid Build Coastguard Worker }
1365*f81fb7c4SAndroid Build Coastguard Worker }
1366*f81fb7c4SAndroid Build Coastguard Worker
1367*f81fb7c4SAndroid Build Coastguard Worker }
1368*f81fb7c4SAndroid Build Coastguard Worker
1369*f81fb7c4SAndroid Build Coastguard Worker /* for looped samples, copy the last sample to the end */
1370*f81fb7c4SAndroid Build Coastguard Worker if (pWsmp->loopLength)
1371*f81fb7c4SAndroid Build Coastguard Worker {
1372*f81fb7c4SAndroid Build Coastguard Worker if( (pDLSData->wavePoolOffset + pWsmp->loopLength) >= pDLSData->wavePoolSize )
1373*f81fb7c4SAndroid Build Coastguard Worker {
1374*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
1375*f81fb7c4SAndroid Build Coastguard Worker }
1376*f81fb7c4SAndroid Build Coastguard Worker if (sampleLen < sizeof(EAS_SAMPLE)
1377*f81fb7c4SAndroid Build Coastguard Worker || (pWsmp->loopStart + pWsmp->loopLength) * sizeof(EAS_SAMPLE) > sampleLen - sizeof(EAS_SAMPLE)) {
1378*f81fb7c4SAndroid Build Coastguard Worker return EAS_FAILURE;
1379*f81fb7c4SAndroid Build Coastguard Worker }
1380*f81fb7c4SAndroid Build Coastguard Worker
1381*f81fb7c4SAndroid Build Coastguard Worker pSample[(pWsmp->loopStart + pWsmp->loopLength)>>1] = pSample[(pWsmp->loopStart)>>1];
1382*f81fb7c4SAndroid Build Coastguard Worker }
1383*f81fb7c4SAndroid Build Coastguard Worker
1384*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
1385*f81fb7c4SAndroid Build Coastguard Worker }
1386*f81fb7c4SAndroid Build Coastguard Worker #else
1387*f81fb7c4SAndroid Build Coastguard Worker #error "Must specifiy _8_BIT_SAMPLES or _16_BIT_SAMPLES"
1388*f81fb7c4SAndroid Build Coastguard Worker #endif
1389*f81fb7c4SAndroid Build Coastguard Worker
1390*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1391*f81fb7c4SAndroid Build Coastguard Worker * Parse_lins ()
1392*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1393*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
1394*f81fb7c4SAndroid Build Coastguard Worker *
1395*f81fb7c4SAndroid Build Coastguard Worker *
1396*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
1397*f81fb7c4SAndroid Build Coastguard Worker *
1398*f81fb7c4SAndroid Build Coastguard Worker *
1399*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
1400*f81fb7c4SAndroid Build Coastguard Worker *
1401*f81fb7c4SAndroid Build Coastguard Worker *
1402*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1403*f81fb7c4SAndroid Build Coastguard Worker */
Parse_lins(SDLS_SYNTHESIZER_DATA * pDLSData,EAS_I32 pos,EAS_I32 size)1404*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_lins (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 size)
1405*f81fb7c4SAndroid Build Coastguard Worker {
1406*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
1407*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 temp;
1408*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 endChunk;
1409*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 chunkPos;
1410*f81fb7c4SAndroid Build Coastguard Worker
1411*f81fb7c4SAndroid Build Coastguard Worker /* seek to start of chunk */
1412*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
1413*f81fb7c4SAndroid Build Coastguard Worker return result;
1414*f81fb7c4SAndroid Build Coastguard Worker
1415*f81fb7c4SAndroid Build Coastguard Worker /* read to end of chunk */
1416*f81fb7c4SAndroid Build Coastguard Worker endChunk = pos + size;
1417*f81fb7c4SAndroid Build Coastguard Worker while (pos < endChunk)
1418*f81fb7c4SAndroid Build Coastguard Worker {
1419*f81fb7c4SAndroid Build Coastguard Worker chunkPos = pos;
1420*f81fb7c4SAndroid Build Coastguard Worker
1421*f81fb7c4SAndroid Build Coastguard Worker /* get the next chunk type */
1422*f81fb7c4SAndroid Build Coastguard Worker if ((result = NextChunk(pDLSData, &pos, &temp, &size)) != EAS_SUCCESS)
1423*f81fb7c4SAndroid Build Coastguard Worker return result;
1424*f81fb7c4SAndroid Build Coastguard Worker
1425*f81fb7c4SAndroid Build Coastguard Worker /* only instrument chunks are useful */
1426*f81fb7c4SAndroid Build Coastguard Worker if (temp != CHUNK_INS)
1427*f81fb7c4SAndroid Build Coastguard Worker continue;
1428*f81fb7c4SAndroid Build Coastguard Worker
1429*f81fb7c4SAndroid Build Coastguard Worker /* if second pass, ensure instCount is less than numDLSPrograms */
1430*f81fb7c4SAndroid Build Coastguard Worker if (pDLSData->pDLS)
1431*f81fb7c4SAndroid Build Coastguard Worker {
1432*f81fb7c4SAndroid Build Coastguard Worker if (pDLSData->instCount >= pDLSData->pDLS->numDLSPrograms)
1433*f81fb7c4SAndroid Build Coastguard Worker {
1434*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_DATA_INCONSISTENCY;
1435*f81fb7c4SAndroid Build Coastguard Worker }
1436*f81fb7c4SAndroid Build Coastguard Worker }
1437*f81fb7c4SAndroid Build Coastguard Worker
1438*f81fb7c4SAndroid Build Coastguard Worker if ((result = Parse_ins(pDLSData, chunkPos + 12, size)) != EAS_SUCCESS)
1439*f81fb7c4SAndroid Build Coastguard Worker return result;
1440*f81fb7c4SAndroid Build Coastguard Worker }
1441*f81fb7c4SAndroid Build Coastguard Worker
1442*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
1443*f81fb7c4SAndroid Build Coastguard Worker }
1444*f81fb7c4SAndroid Build Coastguard Worker
1445*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1446*f81fb7c4SAndroid Build Coastguard Worker * Parse_ins ()
1447*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1448*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
1449*f81fb7c4SAndroid Build Coastguard Worker *
1450*f81fb7c4SAndroid Build Coastguard Worker *
1451*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
1452*f81fb7c4SAndroid Build Coastguard Worker *
1453*f81fb7c4SAndroid Build Coastguard Worker *
1454*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
1455*f81fb7c4SAndroid Build Coastguard Worker *
1456*f81fb7c4SAndroid Build Coastguard Worker *
1457*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1458*f81fb7c4SAndroid Build Coastguard Worker */
Parse_ins(SDLS_SYNTHESIZER_DATA * pDLSData,EAS_I32 pos,EAS_I32 size)1459*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_ins (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 size)
1460*f81fb7c4SAndroid Build Coastguard Worker {
1461*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
1462*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 temp;
1463*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 chunkPos;
1464*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 endChunk;
1465*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 lrgnPos;
1466*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 lrgnSize;
1467*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 lartPos;
1468*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 lartSize;
1469*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 lar2Pos;
1470*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 lar2Size;
1471*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 inshPos;
1472*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 regionCount;
1473*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 locale;
1474*f81fb7c4SAndroid Build Coastguard Worker S_DLS_ART_VALUES art;
1475*f81fb7c4SAndroid Build Coastguard Worker S_PROGRAM *pProgram;
1476*f81fb7c4SAndroid Build Coastguard Worker EAS_U16 artIndex;
1477*f81fb7c4SAndroid Build Coastguard Worker
1478*f81fb7c4SAndroid Build Coastguard Worker /* seek to start of chunk */
1479*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
1480*f81fb7c4SAndroid Build Coastguard Worker return result;
1481*f81fb7c4SAndroid Build Coastguard Worker
1482*f81fb7c4SAndroid Build Coastguard Worker /* no chunks yet */
1483*f81fb7c4SAndroid Build Coastguard Worker lrgnPos = lrgnSize = lartPos = lartSize = lar2Pos = lar2Size = inshPos = artIndex = 0;
1484*f81fb7c4SAndroid Build Coastguard Worker
1485*f81fb7c4SAndroid Build Coastguard Worker /* read to end of chunk */
1486*f81fb7c4SAndroid Build Coastguard Worker endChunk = pos + size;
1487*f81fb7c4SAndroid Build Coastguard Worker while (pos < endChunk)
1488*f81fb7c4SAndroid Build Coastguard Worker {
1489*f81fb7c4SAndroid Build Coastguard Worker chunkPos = pos;
1490*f81fb7c4SAndroid Build Coastguard Worker
1491*f81fb7c4SAndroid Build Coastguard Worker /* get the next chunk type */
1492*f81fb7c4SAndroid Build Coastguard Worker if ((result = NextChunk(pDLSData, &pos, &temp, &size)) != EAS_SUCCESS)
1493*f81fb7c4SAndroid Build Coastguard Worker return result;
1494*f81fb7c4SAndroid Build Coastguard Worker
1495*f81fb7c4SAndroid Build Coastguard Worker /* parse useful chunks */
1496*f81fb7c4SAndroid Build Coastguard Worker switch (temp)
1497*f81fb7c4SAndroid Build Coastguard Worker {
1498*f81fb7c4SAndroid Build Coastguard Worker case CHUNK_INSH:
1499*f81fb7c4SAndroid Build Coastguard Worker inshPos = chunkPos + 8;
1500*f81fb7c4SAndroid Build Coastguard Worker break;
1501*f81fb7c4SAndroid Build Coastguard Worker
1502*f81fb7c4SAndroid Build Coastguard Worker case CHUNK_LART:
1503*f81fb7c4SAndroid Build Coastguard Worker lartPos = chunkPos + 12;
1504*f81fb7c4SAndroid Build Coastguard Worker lartSize = size;
1505*f81fb7c4SAndroid Build Coastguard Worker break;
1506*f81fb7c4SAndroid Build Coastguard Worker
1507*f81fb7c4SAndroid Build Coastguard Worker case CHUNK_LAR2:
1508*f81fb7c4SAndroid Build Coastguard Worker lar2Pos = chunkPos + 12;
1509*f81fb7c4SAndroid Build Coastguard Worker lar2Size = size;
1510*f81fb7c4SAndroid Build Coastguard Worker break;
1511*f81fb7c4SAndroid Build Coastguard Worker
1512*f81fb7c4SAndroid Build Coastguard Worker case CHUNK_LRGN:
1513*f81fb7c4SAndroid Build Coastguard Worker lrgnPos = chunkPos + 12;
1514*f81fb7c4SAndroid Build Coastguard Worker lrgnSize = size;
1515*f81fb7c4SAndroid Build Coastguard Worker break;
1516*f81fb7c4SAndroid Build Coastguard Worker
1517*f81fb7c4SAndroid Build Coastguard Worker default:
1518*f81fb7c4SAndroid Build Coastguard Worker break;
1519*f81fb7c4SAndroid Build Coastguard Worker }
1520*f81fb7c4SAndroid Build Coastguard Worker }
1521*f81fb7c4SAndroid Build Coastguard Worker
1522*f81fb7c4SAndroid Build Coastguard Worker /* must have an lrgn to be useful */
1523*f81fb7c4SAndroid Build Coastguard Worker if (!lrgnPos)
1524*f81fb7c4SAndroid Build Coastguard Worker {
1525*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "DLS ins chunk has no lrgn chunk\n"); */ }
1526*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_UNRECOGNIZED_FORMAT;
1527*f81fb7c4SAndroid Build Coastguard Worker }
1528*f81fb7c4SAndroid Build Coastguard Worker
1529*f81fb7c4SAndroid Build Coastguard Worker /* must have an insh to be useful */
1530*f81fb7c4SAndroid Build Coastguard Worker if (!inshPos)
1531*f81fb7c4SAndroid Build Coastguard Worker {
1532*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "DLS ins chunk has no insh chunk\n"); */ }
1533*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_UNRECOGNIZED_FORMAT;
1534*f81fb7c4SAndroid Build Coastguard Worker }
1535*f81fb7c4SAndroid Build Coastguard Worker
1536*f81fb7c4SAndroid Build Coastguard Worker /* parse the instrument header */
1537*f81fb7c4SAndroid Build Coastguard Worker if ((result = Parse_insh(pDLSData, inshPos, ®ionCount, &locale)) != EAS_SUCCESS)
1538*f81fb7c4SAndroid Build Coastguard Worker return result;
1539*f81fb7c4SAndroid Build Coastguard Worker
1540*f81fb7c4SAndroid Build Coastguard Worker /* initialize and parse the global data first */
1541*f81fb7c4SAndroid Build Coastguard Worker EAS_HWMemCpy(&art, &defaultArt, sizeof(S_DLS_ART_VALUES));
1542*f81fb7c4SAndroid Build Coastguard Worker if (lartPos)
1543*f81fb7c4SAndroid Build Coastguard Worker if ((result = Parse_lart(pDLSData, lartPos, lartSize, &art)) != EAS_SUCCESS)
1544*f81fb7c4SAndroid Build Coastguard Worker return result;
1545*f81fb7c4SAndroid Build Coastguard Worker if (lar2Pos)
1546*f81fb7c4SAndroid Build Coastguard Worker if ((result = Parse_lart(pDLSData, lar2Pos, lar2Size, &art)) != EAS_SUCCESS)
1547*f81fb7c4SAndroid Build Coastguard Worker return result;
1548*f81fb7c4SAndroid Build Coastguard Worker
1549*f81fb7c4SAndroid Build Coastguard Worker if (art.values[PARAM_MODIFIED])
1550*f81fb7c4SAndroid Build Coastguard Worker {
1551*f81fb7c4SAndroid Build Coastguard Worker artIndex = (EAS_U16) pDLSData->artCount;
1552*f81fb7c4SAndroid Build Coastguard Worker pDLSData->artCount++;
1553*f81fb7c4SAndroid Build Coastguard Worker }
1554*f81fb7c4SAndroid Build Coastguard Worker
1555*f81fb7c4SAndroid Build Coastguard Worker /* convert data on second pass */
1556*f81fb7c4SAndroid Build Coastguard Worker if (pDLSData->pDLS)
1557*f81fb7c4SAndroid Build Coastguard Worker {
1558*f81fb7c4SAndroid Build Coastguard Worker
1559*f81fb7c4SAndroid Build Coastguard Worker if (art.values[PARAM_MODIFIED])
1560*f81fb7c4SAndroid Build Coastguard Worker Convert_art(pDLSData, &art, artIndex);
1561*f81fb7c4SAndroid Build Coastguard Worker
1562*f81fb7c4SAndroid Build Coastguard Worker /* setup pointers */
1563*f81fb7c4SAndroid Build Coastguard Worker pProgram = &pDLSData->pDLS->pDLSPrograms[pDLSData->instCount];
1564*f81fb7c4SAndroid Build Coastguard Worker
1565*f81fb7c4SAndroid Build Coastguard Worker /* initialize instrument */
1566*f81fb7c4SAndroid Build Coastguard Worker pProgram->locale = locale;
1567*f81fb7c4SAndroid Build Coastguard Worker pProgram->regionIndex = (EAS_U16) pDLSData->regionCount | FLAG_RGN_IDX_DLS_SYNTH;
1568*f81fb7c4SAndroid Build Coastguard Worker
1569*f81fb7c4SAndroid Build Coastguard Worker }
1570*f81fb7c4SAndroid Build Coastguard Worker
1571*f81fb7c4SAndroid Build Coastguard Worker /* parse the region data */
1572*f81fb7c4SAndroid Build Coastguard Worker if ((result = Parse_lrgn(pDLSData, lrgnPos, lrgnSize, artIndex, regionCount)) != EAS_SUCCESS)
1573*f81fb7c4SAndroid Build Coastguard Worker return result;
1574*f81fb7c4SAndroid Build Coastguard Worker
1575*f81fb7c4SAndroid Build Coastguard Worker /* bump instrument count */
1576*f81fb7c4SAndroid Build Coastguard Worker pDLSData->instCount++;
1577*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
1578*f81fb7c4SAndroid Build Coastguard Worker }
1579*f81fb7c4SAndroid Build Coastguard Worker
1580*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1581*f81fb7c4SAndroid Build Coastguard Worker * Parse_insh ()
1582*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1583*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
1584*f81fb7c4SAndroid Build Coastguard Worker *
1585*f81fb7c4SAndroid Build Coastguard Worker *
1586*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
1587*f81fb7c4SAndroid Build Coastguard Worker *
1588*f81fb7c4SAndroid Build Coastguard Worker *
1589*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
1590*f81fb7c4SAndroid Build Coastguard Worker *
1591*f81fb7c4SAndroid Build Coastguard Worker *
1592*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1593*f81fb7c4SAndroid Build Coastguard Worker */
Parse_insh(SDLS_SYNTHESIZER_DATA * pDLSData,EAS_I32 pos,EAS_U32 * pRgnCount,EAS_U32 * pLocale)1594*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_insh (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_U32 *pRgnCount, EAS_U32 *pLocale)
1595*f81fb7c4SAndroid Build Coastguard Worker {
1596*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
1597*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 bank;
1598*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 program;
1599*f81fb7c4SAndroid Build Coastguard Worker
1600*f81fb7c4SAndroid Build Coastguard Worker /* seek to start of chunk */
1601*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
1602*f81fb7c4SAndroid Build Coastguard Worker return result;
1603*f81fb7c4SAndroid Build Coastguard Worker
1604*f81fb7c4SAndroid Build Coastguard Worker /* get the region count and locale */
1605*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, pRgnCount, EAS_FALSE)) != EAS_SUCCESS)
1606*f81fb7c4SAndroid Build Coastguard Worker return result;
1607*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &bank, EAS_FALSE)) != EAS_SUCCESS)
1608*f81fb7c4SAndroid Build Coastguard Worker return result;
1609*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &program, EAS_FALSE)) != EAS_SUCCESS)
1610*f81fb7c4SAndroid Build Coastguard Worker return result;
1611*f81fb7c4SAndroid Build Coastguard Worker
1612*f81fb7c4SAndroid Build Coastguard Worker /* verify the parameters are valid */
1613*f81fb7c4SAndroid Build Coastguard Worker if (bank & 0x7fff8080)
1614*f81fb7c4SAndroid Build Coastguard Worker {
1615*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "DLS bank number is out of range: %08lx\n", bank); */ }
1616*f81fb7c4SAndroid Build Coastguard Worker bank &= 0xff7f;
1617*f81fb7c4SAndroid Build Coastguard Worker }
1618*f81fb7c4SAndroid Build Coastguard Worker if (program > 127)
1619*f81fb7c4SAndroid Build Coastguard Worker {
1620*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "DLS program number is out of range: %08lx\n", program); */ }
1621*f81fb7c4SAndroid Build Coastguard Worker program &= 0x7f;
1622*f81fb7c4SAndroid Build Coastguard Worker }
1623*f81fb7c4SAndroid Build Coastguard Worker
1624*f81fb7c4SAndroid Build Coastguard Worker /* save the program number */
1625*f81fb7c4SAndroid Build Coastguard Worker *pLocale = (bank << 8) | program;
1626*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
1627*f81fb7c4SAndroid Build Coastguard Worker }
1628*f81fb7c4SAndroid Build Coastguard Worker
1629*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1630*f81fb7c4SAndroid Build Coastguard Worker * Parse_lrgn ()
1631*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1632*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
1633*f81fb7c4SAndroid Build Coastguard Worker *
1634*f81fb7c4SAndroid Build Coastguard Worker *
1635*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
1636*f81fb7c4SAndroid Build Coastguard Worker *
1637*f81fb7c4SAndroid Build Coastguard Worker *
1638*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
1639*f81fb7c4SAndroid Build Coastguard Worker *
1640*f81fb7c4SAndroid Build Coastguard Worker *
1641*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1642*f81fb7c4SAndroid Build Coastguard Worker */
Parse_lrgn(SDLS_SYNTHESIZER_DATA * pDLSData,EAS_I32 pos,EAS_I32 size,EAS_U16 artIndex,EAS_U32 numRegions)1643*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_lrgn (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 size, EAS_U16 artIndex, EAS_U32 numRegions)
1644*f81fb7c4SAndroid Build Coastguard Worker {
1645*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
1646*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 temp;
1647*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 chunkPos;
1648*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 endChunk;
1649*f81fb7c4SAndroid Build Coastguard Worker EAS_U16 regionCount;
1650*f81fb7c4SAndroid Build Coastguard Worker
1651*f81fb7c4SAndroid Build Coastguard Worker /* seek to start of chunk */
1652*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
1653*f81fb7c4SAndroid Build Coastguard Worker return result;
1654*f81fb7c4SAndroid Build Coastguard Worker
1655*f81fb7c4SAndroid Build Coastguard Worker /* read to end of chunk */
1656*f81fb7c4SAndroid Build Coastguard Worker regionCount = 0;
1657*f81fb7c4SAndroid Build Coastguard Worker endChunk = pos + size;
1658*f81fb7c4SAndroid Build Coastguard Worker while (pos < endChunk)
1659*f81fb7c4SAndroid Build Coastguard Worker {
1660*f81fb7c4SAndroid Build Coastguard Worker chunkPos = pos;
1661*f81fb7c4SAndroid Build Coastguard Worker
1662*f81fb7c4SAndroid Build Coastguard Worker /* get the next chunk type */
1663*f81fb7c4SAndroid Build Coastguard Worker if ((result = NextChunk(pDLSData, &pos, &temp, &size)) != EAS_SUCCESS)
1664*f81fb7c4SAndroid Build Coastguard Worker return result;
1665*f81fb7c4SAndroid Build Coastguard Worker
1666*f81fb7c4SAndroid Build Coastguard Worker if ((temp == CHUNK_RGN) || (temp == CHUNK_RGN2))
1667*f81fb7c4SAndroid Build Coastguard Worker {
1668*f81fb7c4SAndroid Build Coastguard Worker if (regionCount == numRegions)
1669*f81fb7c4SAndroid Build Coastguard Worker {
1670*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "DLS region count exceeded cRegions value in insh, extra region ignored\n"); */ }
1671*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
1672*f81fb7c4SAndroid Build Coastguard Worker }
1673*f81fb7c4SAndroid Build Coastguard Worker /* if second pass, ensure regionCount is less than numDLSRegions */
1674*f81fb7c4SAndroid Build Coastguard Worker if (pDLSData->pDLS)
1675*f81fb7c4SAndroid Build Coastguard Worker {
1676*f81fb7c4SAndroid Build Coastguard Worker if (pDLSData->regionCount >= pDLSData->pDLS->numDLSRegions)
1677*f81fb7c4SAndroid Build Coastguard Worker {
1678*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_DATA_INCONSISTENCY;
1679*f81fb7c4SAndroid Build Coastguard Worker }
1680*f81fb7c4SAndroid Build Coastguard Worker }
1681*f81fb7c4SAndroid Build Coastguard Worker if ((result = Parse_rgn(pDLSData, chunkPos + 12, size, artIndex)) != EAS_SUCCESS)
1682*f81fb7c4SAndroid Build Coastguard Worker return result;
1683*f81fb7c4SAndroid Build Coastguard Worker regionCount++;
1684*f81fb7c4SAndroid Build Coastguard Worker }
1685*f81fb7c4SAndroid Build Coastguard Worker }
1686*f81fb7c4SAndroid Build Coastguard Worker
1687*f81fb7c4SAndroid Build Coastguard Worker /* set a flag in the last region */
1688*f81fb7c4SAndroid Build Coastguard Worker if ((pDLSData->pDLS != NULL) && (regionCount > 0))
1689*f81fb7c4SAndroid Build Coastguard Worker pDLSData->pDLS->pDLSRegions[pDLSData->regionCount - 1].wtRegion.region.keyGroupAndFlags |= REGION_FLAG_LAST_REGION;
1690*f81fb7c4SAndroid Build Coastguard Worker
1691*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
1692*f81fb7c4SAndroid Build Coastguard Worker }
1693*f81fb7c4SAndroid Build Coastguard Worker
1694*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1695*f81fb7c4SAndroid Build Coastguard Worker * Parse_rgn ()
1696*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1697*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
1698*f81fb7c4SAndroid Build Coastguard Worker *
1699*f81fb7c4SAndroid Build Coastguard Worker *
1700*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
1701*f81fb7c4SAndroid Build Coastguard Worker *
1702*f81fb7c4SAndroid Build Coastguard Worker *
1703*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
1704*f81fb7c4SAndroid Build Coastguard Worker *
1705*f81fb7c4SAndroid Build Coastguard Worker *
1706*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1707*f81fb7c4SAndroid Build Coastguard Worker */
Parse_rgn(SDLS_SYNTHESIZER_DATA * pDLSData,EAS_I32 pos,EAS_I32 size,EAS_U16 artIndex)1708*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_rgn (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 size, EAS_U16 artIndex)
1709*f81fb7c4SAndroid Build Coastguard Worker {
1710*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
1711*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 temp;
1712*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 chunkPos;
1713*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 endChunk;
1714*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 rgnhPos;
1715*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 lartPos;
1716*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 lartSize;
1717*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 lar2Pos;
1718*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 lar2Size;
1719*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 wlnkPos;
1720*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 wsmpPos;
1721*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 waveIndex;
1722*f81fb7c4SAndroid Build Coastguard Worker S_DLS_ART_VALUES art;
1723*f81fb7c4SAndroid Build Coastguard Worker S_WSMP_DATA wsmp;
1724*f81fb7c4SAndroid Build Coastguard Worker S_WSMP_DATA *pWsmp;
1725*f81fb7c4SAndroid Build Coastguard Worker EAS_U16 regionIndex;
1726*f81fb7c4SAndroid Build Coastguard Worker
1727*f81fb7c4SAndroid Build Coastguard Worker /* seek to start of chunk */
1728*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
1729*f81fb7c4SAndroid Build Coastguard Worker return result;
1730*f81fb7c4SAndroid Build Coastguard Worker
1731*f81fb7c4SAndroid Build Coastguard Worker /* no chunks found yet */
1732*f81fb7c4SAndroid Build Coastguard Worker rgnhPos = lartPos = lartSize = lar2Pos = lar2Size = wsmpPos = wlnkPos = 0;
1733*f81fb7c4SAndroid Build Coastguard Worker regionIndex = (EAS_U16) pDLSData->regionCount;
1734*f81fb7c4SAndroid Build Coastguard Worker
1735*f81fb7c4SAndroid Build Coastguard Worker /* read to end of chunk */
1736*f81fb7c4SAndroid Build Coastguard Worker endChunk = pos + size;
1737*f81fb7c4SAndroid Build Coastguard Worker while (pos < endChunk)
1738*f81fb7c4SAndroid Build Coastguard Worker {
1739*f81fb7c4SAndroid Build Coastguard Worker chunkPos = pos;
1740*f81fb7c4SAndroid Build Coastguard Worker
1741*f81fb7c4SAndroid Build Coastguard Worker /* get the next chunk type */
1742*f81fb7c4SAndroid Build Coastguard Worker if ((result = NextChunk(pDLSData, &pos, &temp, &size)) != EAS_SUCCESS)
1743*f81fb7c4SAndroid Build Coastguard Worker return result;
1744*f81fb7c4SAndroid Build Coastguard Worker
1745*f81fb7c4SAndroid Build Coastguard Worker /* parse useful chunks */
1746*f81fb7c4SAndroid Build Coastguard Worker switch (temp)
1747*f81fb7c4SAndroid Build Coastguard Worker {
1748*f81fb7c4SAndroid Build Coastguard Worker case CHUNK_CDL:
1749*f81fb7c4SAndroid Build Coastguard Worker if ((result = Parse_cdl(pDLSData, size, &temp)) != EAS_SUCCESS)
1750*f81fb7c4SAndroid Build Coastguard Worker return result;
1751*f81fb7c4SAndroid Build Coastguard Worker
1752*f81fb7c4SAndroid Build Coastguard Worker /* if conditional chunk evaluates false, skip this list */
1753*f81fb7c4SAndroid Build Coastguard Worker if (!temp)
1754*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
1755*f81fb7c4SAndroid Build Coastguard Worker break;
1756*f81fb7c4SAndroid Build Coastguard Worker
1757*f81fb7c4SAndroid Build Coastguard Worker case CHUNK_RGNH:
1758*f81fb7c4SAndroid Build Coastguard Worker rgnhPos = chunkPos + 8;
1759*f81fb7c4SAndroid Build Coastguard Worker break;
1760*f81fb7c4SAndroid Build Coastguard Worker
1761*f81fb7c4SAndroid Build Coastguard Worker case CHUNK_WLNK:
1762*f81fb7c4SAndroid Build Coastguard Worker wlnkPos = chunkPos + 8;
1763*f81fb7c4SAndroid Build Coastguard Worker break;
1764*f81fb7c4SAndroid Build Coastguard Worker
1765*f81fb7c4SAndroid Build Coastguard Worker case CHUNK_WSMP:
1766*f81fb7c4SAndroid Build Coastguard Worker wsmpPos = chunkPos + 8;
1767*f81fb7c4SAndroid Build Coastguard Worker break;
1768*f81fb7c4SAndroid Build Coastguard Worker
1769*f81fb7c4SAndroid Build Coastguard Worker case CHUNK_LART:
1770*f81fb7c4SAndroid Build Coastguard Worker lartPos = chunkPos + 12;
1771*f81fb7c4SAndroid Build Coastguard Worker lartSize = size;
1772*f81fb7c4SAndroid Build Coastguard Worker break;
1773*f81fb7c4SAndroid Build Coastguard Worker
1774*f81fb7c4SAndroid Build Coastguard Worker case CHUNK_LAR2:
1775*f81fb7c4SAndroid Build Coastguard Worker lar2Pos = chunkPos + 12;
1776*f81fb7c4SAndroid Build Coastguard Worker lar2Size = size;
1777*f81fb7c4SAndroid Build Coastguard Worker break;
1778*f81fb7c4SAndroid Build Coastguard Worker
1779*f81fb7c4SAndroid Build Coastguard Worker default:
1780*f81fb7c4SAndroid Build Coastguard Worker break;
1781*f81fb7c4SAndroid Build Coastguard Worker }
1782*f81fb7c4SAndroid Build Coastguard Worker }
1783*f81fb7c4SAndroid Build Coastguard Worker
1784*f81fb7c4SAndroid Build Coastguard Worker /* must have a rgnh chunk to be useful */
1785*f81fb7c4SAndroid Build Coastguard Worker if (!rgnhPos)
1786*f81fb7c4SAndroid Build Coastguard Worker {
1787*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "DLS rgn chunk has no rgnh chunk\n"); */ }
1788*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_UNRECOGNIZED_FORMAT;
1789*f81fb7c4SAndroid Build Coastguard Worker }
1790*f81fb7c4SAndroid Build Coastguard Worker
1791*f81fb7c4SAndroid Build Coastguard Worker /* must have a wlnk chunk to be useful */
1792*f81fb7c4SAndroid Build Coastguard Worker if (!wlnkPos)
1793*f81fb7c4SAndroid Build Coastguard Worker {
1794*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "DLS rgn chunk has no wlnk chunk\n"); */ }
1795*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_UNRECOGNIZED_FORMAT;
1796*f81fb7c4SAndroid Build Coastguard Worker }
1797*f81fb7c4SAndroid Build Coastguard Worker
1798*f81fb7c4SAndroid Build Coastguard Worker /* parse wlnk chunk */
1799*f81fb7c4SAndroid Build Coastguard Worker if ((result = Parse_wlnk(pDLSData, wlnkPos, &waveIndex)) != EAS_SUCCESS)
1800*f81fb7c4SAndroid Build Coastguard Worker return result;
1801*f81fb7c4SAndroid Build Coastguard Worker if (waveIndex >= pDLSData->waveCount)
1802*f81fb7c4SAndroid Build Coastguard Worker {
1803*f81fb7c4SAndroid Build Coastguard Worker return EAS_FAILURE;
1804*f81fb7c4SAndroid Build Coastguard Worker }
1805*f81fb7c4SAndroid Build Coastguard Worker pWsmp = &pDLSData->wsmpData[waveIndex];
1806*f81fb7c4SAndroid Build Coastguard Worker
1807*f81fb7c4SAndroid Build Coastguard Worker /* if there is any articulation data, parse it */
1808*f81fb7c4SAndroid Build Coastguard Worker EAS_HWMemCpy(&art, &defaultArt, sizeof(S_DLS_ART_VALUES));
1809*f81fb7c4SAndroid Build Coastguard Worker if (lartPos)
1810*f81fb7c4SAndroid Build Coastguard Worker {
1811*f81fb7c4SAndroid Build Coastguard Worker if ((result = Parse_lart(pDLSData, lartPos, lartSize, &art)) != EAS_SUCCESS)
1812*f81fb7c4SAndroid Build Coastguard Worker return result;
1813*f81fb7c4SAndroid Build Coastguard Worker }
1814*f81fb7c4SAndroid Build Coastguard Worker
1815*f81fb7c4SAndroid Build Coastguard Worker if (lar2Pos)
1816*f81fb7c4SAndroid Build Coastguard Worker {
1817*f81fb7c4SAndroid Build Coastguard Worker if ((result = Parse_lart(pDLSData, lar2Pos, lar2Size, &art)) != EAS_SUCCESS)
1818*f81fb7c4SAndroid Build Coastguard Worker return result;
1819*f81fb7c4SAndroid Build Coastguard Worker }
1820*f81fb7c4SAndroid Build Coastguard Worker
1821*f81fb7c4SAndroid Build Coastguard Worker /* if second pass, process region header */
1822*f81fb7c4SAndroid Build Coastguard Worker if (pDLSData->pDLS)
1823*f81fb7c4SAndroid Build Coastguard Worker {
1824*f81fb7c4SAndroid Build Coastguard Worker
1825*f81fb7c4SAndroid Build Coastguard Worker /* if local data was found convert it */
1826*f81fb7c4SAndroid Build Coastguard Worker if (art.values[PARAM_MODIFIED] == EAS_TRUE)
1827*f81fb7c4SAndroid Build Coastguard Worker {
1828*f81fb7c4SAndroid Build Coastguard Worker /* ensure artCount is less than numDLSArticulations */
1829*f81fb7c4SAndroid Build Coastguard Worker if (pDLSData->artCount >= pDLSData->pDLS->numDLSArticulations)
1830*f81fb7c4SAndroid Build Coastguard Worker {
1831*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_DATA_INCONSISTENCY;
1832*f81fb7c4SAndroid Build Coastguard Worker }
1833*f81fb7c4SAndroid Build Coastguard Worker
1834*f81fb7c4SAndroid Build Coastguard Worker Convert_art(pDLSData, &art, (EAS_U16) pDLSData->artCount);
1835*f81fb7c4SAndroid Build Coastguard Worker artIndex = (EAS_U16) pDLSData->artCount;
1836*f81fb7c4SAndroid Build Coastguard Worker }
1837*f81fb7c4SAndroid Build Coastguard Worker
1838*f81fb7c4SAndroid Build Coastguard Worker /* parse region header */
1839*f81fb7c4SAndroid Build Coastguard Worker if ((result = Parse_rgnh(pDLSData, rgnhPos, &pDLSData->pDLS->pDLSRegions[regionIndex & REGION_INDEX_MASK])) != EAS_SUCCESS)
1840*f81fb7c4SAndroid Build Coastguard Worker return result;
1841*f81fb7c4SAndroid Build Coastguard Worker
1842*f81fb7c4SAndroid Build Coastguard Worker /* parse wsmp chunk, copying parameters from original first */
1843*f81fb7c4SAndroid Build Coastguard Worker if (wsmpPos)
1844*f81fb7c4SAndroid Build Coastguard Worker {
1845*f81fb7c4SAndroid Build Coastguard Worker EAS_HWMemCpy(&wsmp, pWsmp, sizeof(wsmp));
1846*f81fb7c4SAndroid Build Coastguard Worker if ((result = Parse_wsmp(pDLSData, wsmpPos, &wsmp)) != EAS_SUCCESS)
1847*f81fb7c4SAndroid Build Coastguard Worker return result;
1848*f81fb7c4SAndroid Build Coastguard Worker
1849*f81fb7c4SAndroid Build Coastguard Worker pWsmp = &wsmp;
1850*f81fb7c4SAndroid Build Coastguard Worker }
1851*f81fb7c4SAndroid Build Coastguard Worker
1852*f81fb7c4SAndroid Build Coastguard Worker Convert_rgn(pDLSData, regionIndex, artIndex, (EAS_U16) waveIndex, pWsmp);
1853*f81fb7c4SAndroid Build Coastguard Worker
1854*f81fb7c4SAndroid Build Coastguard Worker /* ensure loopStart and loopEnd fall in the range */
1855*f81fb7c4SAndroid Build Coastguard Worker if (pWsmp->loopLength != 0)
1856*f81fb7c4SAndroid Build Coastguard Worker {
1857*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 sampleLen = pDLSData->pDLS->pDLSSampleLen[waveIndex];
1858*f81fb7c4SAndroid Build Coastguard Worker if (sampleLen < sizeof(EAS_SAMPLE)
1859*f81fb7c4SAndroid Build Coastguard Worker || (pWsmp->loopStart + pWsmp->loopLength) * sizeof(EAS_SAMPLE) > sampleLen - sizeof(EAS_SAMPLE))
1860*f81fb7c4SAndroid Build Coastguard Worker {
1861*f81fb7c4SAndroid Build Coastguard Worker return EAS_FAILURE;
1862*f81fb7c4SAndroid Build Coastguard Worker }
1863*f81fb7c4SAndroid Build Coastguard Worker }
1864*f81fb7c4SAndroid Build Coastguard Worker }
1865*f81fb7c4SAndroid Build Coastguard Worker
1866*f81fb7c4SAndroid Build Coastguard Worker /* if local articulation, bump count */
1867*f81fb7c4SAndroid Build Coastguard Worker if (art.values[PARAM_MODIFIED])
1868*f81fb7c4SAndroid Build Coastguard Worker pDLSData->artCount++;
1869*f81fb7c4SAndroid Build Coastguard Worker
1870*f81fb7c4SAndroid Build Coastguard Worker /* increment region count */
1871*f81fb7c4SAndroid Build Coastguard Worker pDLSData->regionCount++;
1872*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
1873*f81fb7c4SAndroid Build Coastguard Worker }
1874*f81fb7c4SAndroid Build Coastguard Worker
1875*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1876*f81fb7c4SAndroid Build Coastguard Worker * Parse_rgnh ()
1877*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1878*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
1879*f81fb7c4SAndroid Build Coastguard Worker *
1880*f81fb7c4SAndroid Build Coastguard Worker *
1881*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
1882*f81fb7c4SAndroid Build Coastguard Worker *
1883*f81fb7c4SAndroid Build Coastguard Worker *
1884*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
1885*f81fb7c4SAndroid Build Coastguard Worker *
1886*f81fb7c4SAndroid Build Coastguard Worker *
1887*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1888*f81fb7c4SAndroid Build Coastguard Worker */
Parse_rgnh(SDLS_SYNTHESIZER_DATA * pDLSData,EAS_I32 pos,S_DLS_REGION * pRgn)1889*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_rgnh (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, S_DLS_REGION *pRgn)
1890*f81fb7c4SAndroid Build Coastguard Worker {
1891*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
1892*f81fb7c4SAndroid Build Coastguard Worker EAS_U16 lowKey;
1893*f81fb7c4SAndroid Build Coastguard Worker EAS_U16 highKey;
1894*f81fb7c4SAndroid Build Coastguard Worker EAS_U16 lowVel;
1895*f81fb7c4SAndroid Build Coastguard Worker EAS_U16 highVel;
1896*f81fb7c4SAndroid Build Coastguard Worker EAS_U16 optionFlags;
1897*f81fb7c4SAndroid Build Coastguard Worker EAS_U16 keyGroup;
1898*f81fb7c4SAndroid Build Coastguard Worker
1899*f81fb7c4SAndroid Build Coastguard Worker /* seek to start of chunk */
1900*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
1901*f81fb7c4SAndroid Build Coastguard Worker return result;
1902*f81fb7c4SAndroid Build Coastguard Worker
1903*f81fb7c4SAndroid Build Coastguard Worker /* get the key range */
1904*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &lowKey, EAS_FALSE)) != EAS_SUCCESS)
1905*f81fb7c4SAndroid Build Coastguard Worker return result;
1906*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &highKey, EAS_FALSE)) != EAS_SUCCESS)
1907*f81fb7c4SAndroid Build Coastguard Worker return result;
1908*f81fb7c4SAndroid Build Coastguard Worker
1909*f81fb7c4SAndroid Build Coastguard Worker /* check the range */
1910*f81fb7c4SAndroid Build Coastguard Worker if (lowKey > 127)
1911*f81fb7c4SAndroid Build Coastguard Worker {
1912*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "DLS rgnh: Low key out of range [%u]\n", lowKey); */ }
1913*f81fb7c4SAndroid Build Coastguard Worker lowKey = 127;
1914*f81fb7c4SAndroid Build Coastguard Worker }
1915*f81fb7c4SAndroid Build Coastguard Worker if (highKey > 127)
1916*f81fb7c4SAndroid Build Coastguard Worker {
1917*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "DLS rgnh: High key out of range [%u]\n", lowKey); */ }
1918*f81fb7c4SAndroid Build Coastguard Worker highKey = 127;
1919*f81fb7c4SAndroid Build Coastguard Worker }
1920*f81fb7c4SAndroid Build Coastguard Worker
1921*f81fb7c4SAndroid Build Coastguard Worker /* get the velocity range */
1922*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &lowVel, EAS_FALSE)) != EAS_SUCCESS)
1923*f81fb7c4SAndroid Build Coastguard Worker return result;
1924*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &highVel, EAS_FALSE)) != EAS_SUCCESS)
1925*f81fb7c4SAndroid Build Coastguard Worker return result;
1926*f81fb7c4SAndroid Build Coastguard Worker
1927*f81fb7c4SAndroid Build Coastguard Worker /* check the range */
1928*f81fb7c4SAndroid Build Coastguard Worker if (lowVel > 127)
1929*f81fb7c4SAndroid Build Coastguard Worker {
1930*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "DLS rgnh: Low velocity out of range [%u]\n", lowVel); */ }
1931*f81fb7c4SAndroid Build Coastguard Worker lowVel = 127;
1932*f81fb7c4SAndroid Build Coastguard Worker }
1933*f81fb7c4SAndroid Build Coastguard Worker if (highVel > 127)
1934*f81fb7c4SAndroid Build Coastguard Worker {
1935*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "DLS rgnh: High velocity out of range [%u]\n", highVel); */ }
1936*f81fb7c4SAndroid Build Coastguard Worker highVel = 127;
1937*f81fb7c4SAndroid Build Coastguard Worker }
1938*f81fb7c4SAndroid Build Coastguard Worker
1939*f81fb7c4SAndroid Build Coastguard Worker /* get the option flags */
1940*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &optionFlags, EAS_FALSE)) != EAS_SUCCESS)
1941*f81fb7c4SAndroid Build Coastguard Worker return result;
1942*f81fb7c4SAndroid Build Coastguard Worker
1943*f81fb7c4SAndroid Build Coastguard Worker /* get the key group */
1944*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &keyGroup, EAS_FALSE)) != EAS_SUCCESS)
1945*f81fb7c4SAndroid Build Coastguard Worker return result;
1946*f81fb7c4SAndroid Build Coastguard Worker
1947*f81fb7c4SAndroid Build Coastguard Worker /* save the key range and key group */
1948*f81fb7c4SAndroid Build Coastguard Worker pRgn->wtRegion.region.rangeLow = (EAS_U8) lowKey;
1949*f81fb7c4SAndroid Build Coastguard Worker pRgn->wtRegion.region.rangeHigh = (EAS_U8) highKey;
1950*f81fb7c4SAndroid Build Coastguard Worker
1951*f81fb7c4SAndroid Build Coastguard Worker /*lint -e{734} keyGroup will always be from 0-15 */
1952*f81fb7c4SAndroid Build Coastguard Worker pRgn->wtRegion.region.keyGroupAndFlags = keyGroup << 8;
1953*f81fb7c4SAndroid Build Coastguard Worker pRgn->velLow = (EAS_U8) lowVel;
1954*f81fb7c4SAndroid Build Coastguard Worker pRgn->velHigh = (EAS_U8) highVel;
1955*f81fb7c4SAndroid Build Coastguard Worker if (optionFlags & F_RGN_OPTION_SELFNONEXCLUSIVE)
1956*f81fb7c4SAndroid Build Coastguard Worker pRgn->wtRegion.region.keyGroupAndFlags |= REGION_FLAG_NON_SELF_EXCLUSIVE;
1957*f81fb7c4SAndroid Build Coastguard Worker
1958*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
1959*f81fb7c4SAndroid Build Coastguard Worker }
1960*f81fb7c4SAndroid Build Coastguard Worker
1961*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1962*f81fb7c4SAndroid Build Coastguard Worker * Parse_lart ()
1963*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1964*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
1965*f81fb7c4SAndroid Build Coastguard Worker *
1966*f81fb7c4SAndroid Build Coastguard Worker *
1967*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
1968*f81fb7c4SAndroid Build Coastguard Worker *
1969*f81fb7c4SAndroid Build Coastguard Worker *
1970*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
1971*f81fb7c4SAndroid Build Coastguard Worker *
1972*f81fb7c4SAndroid Build Coastguard Worker *
1973*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1974*f81fb7c4SAndroid Build Coastguard Worker */
Parse_lart(SDLS_SYNTHESIZER_DATA * pDLSData,EAS_I32 pos,EAS_I32 size,S_DLS_ART_VALUES * pArt)1975*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_lart (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 size, S_DLS_ART_VALUES *pArt)
1976*f81fb7c4SAndroid Build Coastguard Worker {
1977*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
1978*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 temp;
1979*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 endChunk;
1980*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 chunkPos;
1981*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 art1Pos;
1982*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 art2Pos;
1983*f81fb7c4SAndroid Build Coastguard Worker
1984*f81fb7c4SAndroid Build Coastguard Worker /* seek to start of chunk */
1985*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
1986*f81fb7c4SAndroid Build Coastguard Worker return result;
1987*f81fb7c4SAndroid Build Coastguard Worker
1988*f81fb7c4SAndroid Build Coastguard Worker /* no articulation chunks yet */
1989*f81fb7c4SAndroid Build Coastguard Worker art1Pos = art2Pos = 0;
1990*f81fb7c4SAndroid Build Coastguard Worker
1991*f81fb7c4SAndroid Build Coastguard Worker /* read to end of chunk */
1992*f81fb7c4SAndroid Build Coastguard Worker endChunk = pos + size;
1993*f81fb7c4SAndroid Build Coastguard Worker while (pos < endChunk)
1994*f81fb7c4SAndroid Build Coastguard Worker {
1995*f81fb7c4SAndroid Build Coastguard Worker chunkPos = pos;
1996*f81fb7c4SAndroid Build Coastguard Worker
1997*f81fb7c4SAndroid Build Coastguard Worker /* get the next chunk type */
1998*f81fb7c4SAndroid Build Coastguard Worker if ((result = NextChunk(pDLSData, &pos, &temp, &size)) != EAS_SUCCESS)
1999*f81fb7c4SAndroid Build Coastguard Worker return result;
2000*f81fb7c4SAndroid Build Coastguard Worker
2001*f81fb7c4SAndroid Build Coastguard Worker /* parse useful chunks */
2002*f81fb7c4SAndroid Build Coastguard Worker switch (temp)
2003*f81fb7c4SAndroid Build Coastguard Worker {
2004*f81fb7c4SAndroid Build Coastguard Worker case CHUNK_CDL:
2005*f81fb7c4SAndroid Build Coastguard Worker if ((result = Parse_cdl(pDLSData, size, &temp)) != EAS_SUCCESS)
2006*f81fb7c4SAndroid Build Coastguard Worker return result;
2007*f81fb7c4SAndroid Build Coastguard Worker
2008*f81fb7c4SAndroid Build Coastguard Worker /* if conditional chunk evaluates false, skip this list */
2009*f81fb7c4SAndroid Build Coastguard Worker if (!temp)
2010*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
2011*f81fb7c4SAndroid Build Coastguard Worker break;
2012*f81fb7c4SAndroid Build Coastguard Worker
2013*f81fb7c4SAndroid Build Coastguard Worker case CHUNK_ART1:
2014*f81fb7c4SAndroid Build Coastguard Worker art1Pos = chunkPos + 8;
2015*f81fb7c4SAndroid Build Coastguard Worker break;
2016*f81fb7c4SAndroid Build Coastguard Worker
2017*f81fb7c4SAndroid Build Coastguard Worker case CHUNK_ART2:
2018*f81fb7c4SAndroid Build Coastguard Worker art2Pos = chunkPos + 8;
2019*f81fb7c4SAndroid Build Coastguard Worker break;
2020*f81fb7c4SAndroid Build Coastguard Worker
2021*f81fb7c4SAndroid Build Coastguard Worker default:
2022*f81fb7c4SAndroid Build Coastguard Worker break;
2023*f81fb7c4SAndroid Build Coastguard Worker
2024*f81fb7c4SAndroid Build Coastguard Worker }
2025*f81fb7c4SAndroid Build Coastguard Worker }
2026*f81fb7c4SAndroid Build Coastguard Worker
2027*f81fb7c4SAndroid Build Coastguard Worker if (art1Pos)
2028*f81fb7c4SAndroid Build Coastguard Worker {
2029*f81fb7c4SAndroid Build Coastguard Worker if ((result = Parse_art(pDLSData, art1Pos, pArt)) != EAS_SUCCESS)
2030*f81fb7c4SAndroid Build Coastguard Worker return result;
2031*f81fb7c4SAndroid Build Coastguard Worker }
2032*f81fb7c4SAndroid Build Coastguard Worker
2033*f81fb7c4SAndroid Build Coastguard Worker if (art2Pos)
2034*f81fb7c4SAndroid Build Coastguard Worker {
2035*f81fb7c4SAndroid Build Coastguard Worker if ((result = Parse_art(pDLSData, art2Pos, pArt)) != EAS_SUCCESS)
2036*f81fb7c4SAndroid Build Coastguard Worker return result;
2037*f81fb7c4SAndroid Build Coastguard Worker }
2038*f81fb7c4SAndroid Build Coastguard Worker
2039*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
2040*f81fb7c4SAndroid Build Coastguard Worker }
2041*f81fb7c4SAndroid Build Coastguard Worker
2042*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
2043*f81fb7c4SAndroid Build Coastguard Worker * Parse_art()
2044*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2045*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
2046*f81fb7c4SAndroid Build Coastguard Worker *
2047*f81fb7c4SAndroid Build Coastguard Worker *
2048*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
2049*f81fb7c4SAndroid Build Coastguard Worker *
2050*f81fb7c4SAndroid Build Coastguard Worker *
2051*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
2052*f81fb7c4SAndroid Build Coastguard Worker *
2053*f81fb7c4SAndroid Build Coastguard Worker *
2054*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2055*f81fb7c4SAndroid Build Coastguard Worker */
Parse_art(SDLS_SYNTHESIZER_DATA * pDLSData,EAS_I32 pos,S_DLS_ART_VALUES * pArt)2056*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_art (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, S_DLS_ART_VALUES *pArt)
2057*f81fb7c4SAndroid Build Coastguard Worker {
2058*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
2059*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 structSize;
2060*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 numConnections;
2061*f81fb7c4SAndroid Build Coastguard Worker EAS_U16 source;
2062*f81fb7c4SAndroid Build Coastguard Worker EAS_U16 control;
2063*f81fb7c4SAndroid Build Coastguard Worker EAS_U16 destination;
2064*f81fb7c4SAndroid Build Coastguard Worker EAS_U16 transform;
2065*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 scale;
2066*f81fb7c4SAndroid Build Coastguard Worker EAS_INT i;
2067*f81fb7c4SAndroid Build Coastguard Worker
2068*f81fb7c4SAndroid Build Coastguard Worker /* seek to start of data */
2069*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
2070*f81fb7c4SAndroid Build Coastguard Worker return result;
2071*f81fb7c4SAndroid Build Coastguard Worker
2072*f81fb7c4SAndroid Build Coastguard Worker /* get the structure size */
2073*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &structSize, EAS_FALSE)) != EAS_SUCCESS)
2074*f81fb7c4SAndroid Build Coastguard Worker return result;
2075*f81fb7c4SAndroid Build Coastguard Worker pos += (EAS_I32) structSize;
2076*f81fb7c4SAndroid Build Coastguard Worker
2077*f81fb7c4SAndroid Build Coastguard Worker /* get the number of connections */
2078*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &numConnections, EAS_FALSE)) != EAS_SUCCESS)
2079*f81fb7c4SAndroid Build Coastguard Worker return result;
2080*f81fb7c4SAndroid Build Coastguard Worker
2081*f81fb7c4SAndroid Build Coastguard Worker /* skip to start of connections */
2082*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
2083*f81fb7c4SAndroid Build Coastguard Worker return result;
2084*f81fb7c4SAndroid Build Coastguard Worker
2085*f81fb7c4SAndroid Build Coastguard Worker while (numConnections)
2086*f81fb7c4SAndroid Build Coastguard Worker {
2087*f81fb7c4SAndroid Build Coastguard Worker numConnections--;
2088*f81fb7c4SAndroid Build Coastguard Worker /* read the connection data */
2089*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &source, EAS_FALSE)) != EAS_SUCCESS)
2090*f81fb7c4SAndroid Build Coastguard Worker return result;
2091*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &control, EAS_FALSE)) != EAS_SUCCESS)
2092*f81fb7c4SAndroid Build Coastguard Worker return result;
2093*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &destination, EAS_FALSE)) != EAS_SUCCESS)
2094*f81fb7c4SAndroid Build Coastguard Worker return result;
2095*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &transform, EAS_FALSE)) != EAS_SUCCESS)
2096*f81fb7c4SAndroid Build Coastguard Worker return result;
2097*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &scale, EAS_FALSE)) != EAS_SUCCESS)
2098*f81fb7c4SAndroid Build Coastguard Worker return result;
2099*f81fb7c4SAndroid Build Coastguard Worker
2100*f81fb7c4SAndroid Build Coastguard Worker /* look up the connection */
2101*f81fb7c4SAndroid Build Coastguard Worker for (i = 0; i < (EAS_INT) ENTRIES_IN_CONN_TABLE; i++)
2102*f81fb7c4SAndroid Build Coastguard Worker {
2103*f81fb7c4SAndroid Build Coastguard Worker if ((connTable[i].source == source) &&
2104*f81fb7c4SAndroid Build Coastguard Worker (connTable[i].destination == destination) &&
2105*f81fb7c4SAndroid Build Coastguard Worker (connTable[i].control == control))
2106*f81fb7c4SAndroid Build Coastguard Worker {
2107*f81fb7c4SAndroid Build Coastguard Worker /*lint -e{704} use shift for performance */
2108*f81fb7c4SAndroid Build Coastguard Worker pArt->values[connTable[i].connection] = (EAS_I16) (scale >> 16);
2109*f81fb7c4SAndroid Build Coastguard Worker pArt->values[PARAM_MODIFIED] = EAS_TRUE;
2110*f81fb7c4SAndroid Build Coastguard Worker break;
2111*f81fb7c4SAndroid Build Coastguard Worker }
2112*f81fb7c4SAndroid Build Coastguard Worker }
2113*f81fb7c4SAndroid Build Coastguard Worker if (i == PARAM_TABLE_SIZE)
2114*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "WARN: Unsupported parameter in DLS file\n"); */ }
2115*f81fb7c4SAndroid Build Coastguard Worker }
2116*f81fb7c4SAndroid Build Coastguard Worker
2117*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
2118*f81fb7c4SAndroid Build Coastguard Worker }
2119*f81fb7c4SAndroid Build Coastguard Worker
2120*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
2121*f81fb7c4SAndroid Build Coastguard Worker * Parse_wlnk ()
2122*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2123*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
2124*f81fb7c4SAndroid Build Coastguard Worker *
2125*f81fb7c4SAndroid Build Coastguard Worker *
2126*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
2127*f81fb7c4SAndroid Build Coastguard Worker *
2128*f81fb7c4SAndroid Build Coastguard Worker *
2129*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
2130*f81fb7c4SAndroid Build Coastguard Worker *
2131*f81fb7c4SAndroid Build Coastguard Worker *
2132*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2133*f81fb7c4SAndroid Build Coastguard Worker */
Parse_wlnk(SDLS_SYNTHESIZER_DATA * pDLSData,EAS_I32 pos,EAS_U32 * pWaveIndex)2134*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_wlnk (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_U32 *pWaveIndex)
2135*f81fb7c4SAndroid Build Coastguard Worker {
2136*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
2137*f81fb7c4SAndroid Build Coastguard Worker
2138*f81fb7c4SAndroid Build Coastguard Worker /* we only care about the the index */
2139*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos + 8)) != EAS_SUCCESS)
2140*f81fb7c4SAndroid Build Coastguard Worker return result;
2141*f81fb7c4SAndroid Build Coastguard Worker
2142*f81fb7c4SAndroid Build Coastguard Worker /* read the index */
2143*f81fb7c4SAndroid Build Coastguard Worker return EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle,pWaveIndex, EAS_FALSE);
2144*f81fb7c4SAndroid Build Coastguard Worker }
2145*f81fb7c4SAndroid Build Coastguard Worker
2146*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
2147*f81fb7c4SAndroid Build Coastguard Worker * PopcdlStack ()
2148*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2149*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
2150*f81fb7c4SAndroid Build Coastguard Worker *
2151*f81fb7c4SAndroid Build Coastguard Worker *
2152*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
2153*f81fb7c4SAndroid Build Coastguard Worker *
2154*f81fb7c4SAndroid Build Coastguard Worker *
2155*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
2156*f81fb7c4SAndroid Build Coastguard Worker *
2157*f81fb7c4SAndroid Build Coastguard Worker *
2158*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2159*f81fb7c4SAndroid Build Coastguard Worker */
PopcdlStack(EAS_U32 * pStack,EAS_INT * pStackPtr,EAS_U32 * pValue)2160*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT PopcdlStack (EAS_U32 *pStack, EAS_INT *pStackPtr, EAS_U32 *pValue)
2161*f81fb7c4SAndroid Build Coastguard Worker {
2162*f81fb7c4SAndroid Build Coastguard Worker
2163*f81fb7c4SAndroid Build Coastguard Worker /* stack underflow, cdl block has an errorr */
2164*f81fb7c4SAndroid Build Coastguard Worker if (*pStackPtr < 0)
2165*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_FILE_FORMAT;
2166*f81fb7c4SAndroid Build Coastguard Worker
2167*f81fb7c4SAndroid Build Coastguard Worker /* pop the value off the stack */
2168*f81fb7c4SAndroid Build Coastguard Worker *pValue = pStack[*pStackPtr];
2169*f81fb7c4SAndroid Build Coastguard Worker *pStackPtr = *pStackPtr - 1;
2170*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
2171*f81fb7c4SAndroid Build Coastguard Worker }
2172*f81fb7c4SAndroid Build Coastguard Worker
2173*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
2174*f81fb7c4SAndroid Build Coastguard Worker * PushcdlStack ()
2175*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2176*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
2177*f81fb7c4SAndroid Build Coastguard Worker *
2178*f81fb7c4SAndroid Build Coastguard Worker *
2179*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
2180*f81fb7c4SAndroid Build Coastguard Worker *
2181*f81fb7c4SAndroid Build Coastguard Worker *
2182*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
2183*f81fb7c4SAndroid Build Coastguard Worker *
2184*f81fb7c4SAndroid Build Coastguard Worker *
2185*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2186*f81fb7c4SAndroid Build Coastguard Worker */
PushcdlStack(EAS_U32 * pStack,EAS_INT * pStackPtr,EAS_U32 value)2187*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT PushcdlStack (EAS_U32 *pStack, EAS_INT *pStackPtr, EAS_U32 value)
2188*f81fb7c4SAndroid Build Coastguard Worker {
2189*f81fb7c4SAndroid Build Coastguard Worker
2190*f81fb7c4SAndroid Build Coastguard Worker /* stack overflow, return an error */
2191*f81fb7c4SAndroid Build Coastguard Worker if (*pStackPtr >= (CDL_STACK_SIZE - 1)) {
2192*f81fb7c4SAndroid Build Coastguard Worker ALOGE("b/34031018, stackPtr(%d)", *pStackPtr);
2193*f81fb7c4SAndroid Build Coastguard Worker android_errorWriteLog(0x534e4554, "34031018");
2194*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_FILE_FORMAT;
2195*f81fb7c4SAndroid Build Coastguard Worker }
2196*f81fb7c4SAndroid Build Coastguard Worker
2197*f81fb7c4SAndroid Build Coastguard Worker /* push the value onto the stack */
2198*f81fb7c4SAndroid Build Coastguard Worker *pStackPtr = *pStackPtr + 1;
2199*f81fb7c4SAndroid Build Coastguard Worker pStack[*pStackPtr] = value;
2200*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
2201*f81fb7c4SAndroid Build Coastguard Worker }
2202*f81fb7c4SAndroid Build Coastguard Worker
2203*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
2204*f81fb7c4SAndroid Build Coastguard Worker * QueryGUID ()
2205*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2206*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
2207*f81fb7c4SAndroid Build Coastguard Worker *
2208*f81fb7c4SAndroid Build Coastguard Worker *
2209*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
2210*f81fb7c4SAndroid Build Coastguard Worker *
2211*f81fb7c4SAndroid Build Coastguard Worker *
2212*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
2213*f81fb7c4SAndroid Build Coastguard Worker *
2214*f81fb7c4SAndroid Build Coastguard Worker *
2215*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2216*f81fb7c4SAndroid Build Coastguard Worker */
QueryGUID(const DLSID * pGUID,EAS_U32 * pValue)2217*f81fb7c4SAndroid Build Coastguard Worker static EAS_BOOL QueryGUID (const DLSID *pGUID, EAS_U32 *pValue)
2218*f81fb7c4SAndroid Build Coastguard Worker {
2219*f81fb7c4SAndroid Build Coastguard Worker
2220*f81fb7c4SAndroid Build Coastguard Worker /* assume false */
2221*f81fb7c4SAndroid Build Coastguard Worker *pValue = 0;
2222*f81fb7c4SAndroid Build Coastguard Worker if (EAS_HWMemCmp(&DLSID_GMInHardware, pGUID, sizeof(DLSID)) == 0)
2223*f81fb7c4SAndroid Build Coastguard Worker {
2224*f81fb7c4SAndroid Build Coastguard Worker *pValue = 0xffffffff;
2225*f81fb7c4SAndroid Build Coastguard Worker return EAS_TRUE;
2226*f81fb7c4SAndroid Build Coastguard Worker }
2227*f81fb7c4SAndroid Build Coastguard Worker
2228*f81fb7c4SAndroid Build Coastguard Worker if (EAS_HWMemCmp(&DLSID_GSInHardware, pGUID, sizeof(DLSID)) == 0)
2229*f81fb7c4SAndroid Build Coastguard Worker return EAS_TRUE;
2230*f81fb7c4SAndroid Build Coastguard Worker
2231*f81fb7c4SAndroid Build Coastguard Worker if (EAS_HWMemCmp(&DLSID_XGInHardware, pGUID, sizeof(DLSID)) == 0)
2232*f81fb7c4SAndroid Build Coastguard Worker return EAS_TRUE;
2233*f81fb7c4SAndroid Build Coastguard Worker
2234*f81fb7c4SAndroid Build Coastguard Worker if (EAS_HWMemCmp(&DLSID_SupportsDLS1, pGUID, sizeof(DLSID)) == 0)
2235*f81fb7c4SAndroid Build Coastguard Worker {
2236*f81fb7c4SAndroid Build Coastguard Worker *pValue = 0xffffffff;
2237*f81fb7c4SAndroid Build Coastguard Worker return EAS_TRUE;
2238*f81fb7c4SAndroid Build Coastguard Worker }
2239*f81fb7c4SAndroid Build Coastguard Worker
2240*f81fb7c4SAndroid Build Coastguard Worker if (EAS_HWMemCmp(&DLSID_SupportsDLS2, pGUID, sizeof(DLSID)) == 0)
2241*f81fb7c4SAndroid Build Coastguard Worker return EAS_TRUE;
2242*f81fb7c4SAndroid Build Coastguard Worker
2243*f81fb7c4SAndroid Build Coastguard Worker if (EAS_HWMemCmp(&DLSID_SampleMemorySize, pGUID, sizeof(DLSID)) == 0)
2244*f81fb7c4SAndroid Build Coastguard Worker {
2245*f81fb7c4SAndroid Build Coastguard Worker *pValue = MAX_DLS_MEMORY;
2246*f81fb7c4SAndroid Build Coastguard Worker return EAS_TRUE;
2247*f81fb7c4SAndroid Build Coastguard Worker }
2248*f81fb7c4SAndroid Build Coastguard Worker
2249*f81fb7c4SAndroid Build Coastguard Worker if (EAS_HWMemCmp(&DLSID_ManufacturersID, pGUID, sizeof(DLSID)) == 0)
2250*f81fb7c4SAndroid Build Coastguard Worker {
2251*f81fb7c4SAndroid Build Coastguard Worker *pValue = 0x0000013A;
2252*f81fb7c4SAndroid Build Coastguard Worker return EAS_TRUE;
2253*f81fb7c4SAndroid Build Coastguard Worker }
2254*f81fb7c4SAndroid Build Coastguard Worker
2255*f81fb7c4SAndroid Build Coastguard Worker if (EAS_HWMemCmp(&DLSID_ProductID, pGUID, sizeof(DLSID)) == 0)
2256*f81fb7c4SAndroid Build Coastguard Worker {
2257*f81fb7c4SAndroid Build Coastguard Worker *pValue = LIB_VERSION;
2258*f81fb7c4SAndroid Build Coastguard Worker return EAS_TRUE;
2259*f81fb7c4SAndroid Build Coastguard Worker }
2260*f81fb7c4SAndroid Build Coastguard Worker
2261*f81fb7c4SAndroid Build Coastguard Worker if (EAS_HWMemCmp(&DLSID_SamplePlaybackRate, pGUID, sizeof(DLSID)) == 0)
2262*f81fb7c4SAndroid Build Coastguard Worker {
2263*f81fb7c4SAndroid Build Coastguard Worker *pValue = (EAS_U32) outputSampleRate;
2264*f81fb7c4SAndroid Build Coastguard Worker return EAS_TRUE;
2265*f81fb7c4SAndroid Build Coastguard Worker }
2266*f81fb7c4SAndroid Build Coastguard Worker
2267*f81fb7c4SAndroid Build Coastguard Worker /* unrecognized DLSID */
2268*f81fb7c4SAndroid Build Coastguard Worker return EAS_FALSE;
2269*f81fb7c4SAndroid Build Coastguard Worker }
2270*f81fb7c4SAndroid Build Coastguard Worker
2271*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
2272*f81fb7c4SAndroid Build Coastguard Worker * ReadDLSID ()
2273*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2274*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
2275*f81fb7c4SAndroid Build Coastguard Worker * Reads a DLSID in a manner that is not sensitive to processor endian-ness
2276*f81fb7c4SAndroid Build Coastguard Worker *
2277*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
2278*f81fb7c4SAndroid Build Coastguard Worker *
2279*f81fb7c4SAndroid Build Coastguard Worker *
2280*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
2281*f81fb7c4SAndroid Build Coastguard Worker *
2282*f81fb7c4SAndroid Build Coastguard Worker *
2283*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2284*f81fb7c4SAndroid Build Coastguard Worker */
ReadDLSID(SDLS_SYNTHESIZER_DATA * pDLSData,DLSID * pDLSID)2285*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT ReadDLSID (SDLS_SYNTHESIZER_DATA *pDLSData, DLSID *pDLSID)
2286*f81fb7c4SAndroid Build Coastguard Worker {
2287*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
2288*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 n;
2289*f81fb7c4SAndroid Build Coastguard Worker
2290*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &pDLSID->Data1, EAS_FALSE)) != EAS_SUCCESS)
2291*f81fb7c4SAndroid Build Coastguard Worker return result;
2292*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &pDLSID->Data2, EAS_FALSE)) != EAS_SUCCESS)
2293*f81fb7c4SAndroid Build Coastguard Worker return result;
2294*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &pDLSID->Data3, EAS_FALSE)) != EAS_SUCCESS)
2295*f81fb7c4SAndroid Build Coastguard Worker return result;
2296*f81fb7c4SAndroid Build Coastguard Worker return EAS_HWReadFile(pDLSData->hwInstData, pDLSData->fileHandle, pDLSID->Data4, sizeof(pDLSID->Data4), &n);
2297*f81fb7c4SAndroid Build Coastguard Worker }
2298*f81fb7c4SAndroid Build Coastguard Worker
2299*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
2300*f81fb7c4SAndroid Build Coastguard Worker * Parse_cdl ()
2301*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2302*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
2303*f81fb7c4SAndroid Build Coastguard Worker *
2304*f81fb7c4SAndroid Build Coastguard Worker *
2305*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
2306*f81fb7c4SAndroid Build Coastguard Worker *
2307*f81fb7c4SAndroid Build Coastguard Worker *
2308*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
2309*f81fb7c4SAndroid Build Coastguard Worker *
2310*f81fb7c4SAndroid Build Coastguard Worker *
2311*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2312*f81fb7c4SAndroid Build Coastguard Worker */
Parse_cdl(SDLS_SYNTHESIZER_DATA * pDLSData,EAS_I32 size,EAS_U32 * pValue)2313*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Parse_cdl (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 size, EAS_U32 *pValue)
2314*f81fb7c4SAndroid Build Coastguard Worker {
2315*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
2316*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 stack[CDL_STACK_SIZE];
2317*f81fb7c4SAndroid Build Coastguard Worker EAS_U16 opcode;
2318*f81fb7c4SAndroid Build Coastguard Worker EAS_INT stackPtr;
2319*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 x, y;
2320*f81fb7c4SAndroid Build Coastguard Worker DLSID dlsid;
2321*f81fb7c4SAndroid Build Coastguard Worker
2322*f81fb7c4SAndroid Build Coastguard Worker stackPtr = -1;
2323*f81fb7c4SAndroid Build Coastguard Worker *pValue = 0;
2324*f81fb7c4SAndroid Build Coastguard Worker x = 0;
2325*f81fb7c4SAndroid Build Coastguard Worker while (size)
2326*f81fb7c4SAndroid Build Coastguard Worker {
2327*f81fb7c4SAndroid Build Coastguard Worker /* read the opcode */
2328*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &opcode, EAS_FALSE)) != EAS_SUCCESS)
2329*f81fb7c4SAndroid Build Coastguard Worker return result;
2330*f81fb7c4SAndroid Build Coastguard Worker
2331*f81fb7c4SAndroid Build Coastguard Worker /* handle binary opcodes */
2332*f81fb7c4SAndroid Build Coastguard Worker if (opcode <= DLS_CDL_EQ)
2333*f81fb7c4SAndroid Build Coastguard Worker {
2334*f81fb7c4SAndroid Build Coastguard Worker /* pop X and Y */
2335*f81fb7c4SAndroid Build Coastguard Worker if ((result = PopcdlStack(stack, &stackPtr, &x)) != EAS_SUCCESS)
2336*f81fb7c4SAndroid Build Coastguard Worker return result;
2337*f81fb7c4SAndroid Build Coastguard Worker if ((result = PopcdlStack(stack, &stackPtr, &y)) != EAS_SUCCESS)
2338*f81fb7c4SAndroid Build Coastguard Worker return result;
2339*f81fb7c4SAndroid Build Coastguard Worker switch (opcode)
2340*f81fb7c4SAndroid Build Coastguard Worker {
2341*f81fb7c4SAndroid Build Coastguard Worker case DLS_CDL_AND:
2342*f81fb7c4SAndroid Build Coastguard Worker x = x & y;
2343*f81fb7c4SAndroid Build Coastguard Worker break;
2344*f81fb7c4SAndroid Build Coastguard Worker case DLS_CDL_OR:
2345*f81fb7c4SAndroid Build Coastguard Worker x = x | y;
2346*f81fb7c4SAndroid Build Coastguard Worker break;
2347*f81fb7c4SAndroid Build Coastguard Worker case DLS_CDL_XOR:
2348*f81fb7c4SAndroid Build Coastguard Worker x = x ^ y;
2349*f81fb7c4SAndroid Build Coastguard Worker break;
2350*f81fb7c4SAndroid Build Coastguard Worker case DLS_CDL_ADD:
2351*f81fb7c4SAndroid Build Coastguard Worker x = x + y;
2352*f81fb7c4SAndroid Build Coastguard Worker break;
2353*f81fb7c4SAndroid Build Coastguard Worker case DLS_CDL_SUBTRACT:
2354*f81fb7c4SAndroid Build Coastguard Worker x = x - y;
2355*f81fb7c4SAndroid Build Coastguard Worker break;
2356*f81fb7c4SAndroid Build Coastguard Worker case DLS_CDL_MULTIPLY:
2357*f81fb7c4SAndroid Build Coastguard Worker x = x * y;
2358*f81fb7c4SAndroid Build Coastguard Worker break;
2359*f81fb7c4SAndroid Build Coastguard Worker case DLS_CDL_DIVIDE:
2360*f81fb7c4SAndroid Build Coastguard Worker if (!y)
2361*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_FILE_FORMAT;
2362*f81fb7c4SAndroid Build Coastguard Worker x = x / y;
2363*f81fb7c4SAndroid Build Coastguard Worker break;
2364*f81fb7c4SAndroid Build Coastguard Worker case DLS_CDL_LOGICAL_AND:
2365*f81fb7c4SAndroid Build Coastguard Worker x = (x && y);
2366*f81fb7c4SAndroid Build Coastguard Worker break;
2367*f81fb7c4SAndroid Build Coastguard Worker case DLS_CDL_LOGICAL_OR:
2368*f81fb7c4SAndroid Build Coastguard Worker x = (x || y);
2369*f81fb7c4SAndroid Build Coastguard Worker break;
2370*f81fb7c4SAndroid Build Coastguard Worker case DLS_CDL_LT:
2371*f81fb7c4SAndroid Build Coastguard Worker x = (x < y);
2372*f81fb7c4SAndroid Build Coastguard Worker break;
2373*f81fb7c4SAndroid Build Coastguard Worker case DLS_CDL_LE:
2374*f81fb7c4SAndroid Build Coastguard Worker x = (x <= y);
2375*f81fb7c4SAndroid Build Coastguard Worker break;
2376*f81fb7c4SAndroid Build Coastguard Worker case DLS_CDL_GT:
2377*f81fb7c4SAndroid Build Coastguard Worker x = (x > y);
2378*f81fb7c4SAndroid Build Coastguard Worker break;
2379*f81fb7c4SAndroid Build Coastguard Worker case DLS_CDL_GE:
2380*f81fb7c4SAndroid Build Coastguard Worker x = (x >= y);
2381*f81fb7c4SAndroid Build Coastguard Worker break;
2382*f81fb7c4SAndroid Build Coastguard Worker case DLS_CDL_EQ:
2383*f81fb7c4SAndroid Build Coastguard Worker x = (x == y);
2384*f81fb7c4SAndroid Build Coastguard Worker break;
2385*f81fb7c4SAndroid Build Coastguard Worker default:
2386*f81fb7c4SAndroid Build Coastguard Worker break;
2387*f81fb7c4SAndroid Build Coastguard Worker }
2388*f81fb7c4SAndroid Build Coastguard Worker }
2389*f81fb7c4SAndroid Build Coastguard Worker
2390*f81fb7c4SAndroid Build Coastguard Worker else if (opcode == DLS_CDL_NOT)
2391*f81fb7c4SAndroid Build Coastguard Worker {
2392*f81fb7c4SAndroid Build Coastguard Worker if ((result = PopcdlStack(stack, &stackPtr, &x)) != EAS_SUCCESS)
2393*f81fb7c4SAndroid Build Coastguard Worker return result;
2394*f81fb7c4SAndroid Build Coastguard Worker x = !x;
2395*f81fb7c4SAndroid Build Coastguard Worker }
2396*f81fb7c4SAndroid Build Coastguard Worker
2397*f81fb7c4SAndroid Build Coastguard Worker else if (opcode == DLS_CDL_CONST)
2398*f81fb7c4SAndroid Build Coastguard Worker {
2399*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &x, EAS_FALSE)) != EAS_SUCCESS)
2400*f81fb7c4SAndroid Build Coastguard Worker return result;
2401*f81fb7c4SAndroid Build Coastguard Worker }
2402*f81fb7c4SAndroid Build Coastguard Worker
2403*f81fb7c4SAndroid Build Coastguard Worker else if (opcode == DLS_CDL_QUERY)
2404*f81fb7c4SAndroid Build Coastguard Worker {
2405*f81fb7c4SAndroid Build Coastguard Worker if ((result = ReadDLSID(pDLSData, &dlsid)) != EAS_SUCCESS)
2406*f81fb7c4SAndroid Build Coastguard Worker return result;
2407*f81fb7c4SAndroid Build Coastguard Worker QueryGUID(&dlsid, &x);
2408*f81fb7c4SAndroid Build Coastguard Worker }
2409*f81fb7c4SAndroid Build Coastguard Worker
2410*f81fb7c4SAndroid Build Coastguard Worker else if (opcode == DLS_CDL_QUERYSUPPORTED)
2411*f81fb7c4SAndroid Build Coastguard Worker {
2412*f81fb7c4SAndroid Build Coastguard Worker if ((result = ReadDLSID(pDLSData, &dlsid)) != EAS_SUCCESS)
2413*f81fb7c4SAndroid Build Coastguard Worker return result;
2414*f81fb7c4SAndroid Build Coastguard Worker x = QueryGUID(&dlsid, &y);
2415*f81fb7c4SAndroid Build Coastguard Worker }
2416*f81fb7c4SAndroid Build Coastguard Worker else
2417*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Unsupported opcode %d in DLS file\n", opcode); */ }
2418*f81fb7c4SAndroid Build Coastguard Worker
2419*f81fb7c4SAndroid Build Coastguard Worker /* push the result on the stack */
2420*f81fb7c4SAndroid Build Coastguard Worker if ((result = PushcdlStack(stack, &stackPtr, x)) != EAS_SUCCESS)
2421*f81fb7c4SAndroid Build Coastguard Worker return result;
2422*f81fb7c4SAndroid Build Coastguard Worker }
2423*f81fb7c4SAndroid Build Coastguard Worker
2424*f81fb7c4SAndroid Build Coastguard Worker /* pop the last result off the stack */
2425*f81fb7c4SAndroid Build Coastguard Worker return PopcdlStack(stack, &stackPtr, pValue);
2426*f81fb7c4SAndroid Build Coastguard Worker }
2427*f81fb7c4SAndroid Build Coastguard Worker
2428*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
2429*f81fb7c4SAndroid Build Coastguard Worker * Convert_rgn()
2430*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2431*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
2432*f81fb7c4SAndroid Build Coastguard Worker * Convert region data from DLS to EAS
2433*f81fb7c4SAndroid Build Coastguard Worker *
2434*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
2435*f81fb7c4SAndroid Build Coastguard Worker *
2436*f81fb7c4SAndroid Build Coastguard Worker *
2437*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
2438*f81fb7c4SAndroid Build Coastguard Worker *
2439*f81fb7c4SAndroid Build Coastguard Worker *
2440*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2441*f81fb7c4SAndroid Build Coastguard Worker */
Convert_rgn(SDLS_SYNTHESIZER_DATA * pDLSData,EAS_U16 regionIndex,EAS_U16 artIndex,EAS_U16 waveIndex,S_WSMP_DATA * pWsmp)2442*f81fb7c4SAndroid Build Coastguard Worker static void Convert_rgn (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_U16 regionIndex, EAS_U16 artIndex, EAS_U16 waveIndex, S_WSMP_DATA *pWsmp)
2443*f81fb7c4SAndroid Build Coastguard Worker {
2444*f81fb7c4SAndroid Build Coastguard Worker S_DLS_REGION *pRgn;
2445*f81fb7c4SAndroid Build Coastguard Worker
2446*f81fb7c4SAndroid Build Coastguard Worker /* setup pointers to data structures */
2447*f81fb7c4SAndroid Build Coastguard Worker pRgn = &pDLSData->pDLS->pDLSRegions[regionIndex];
2448*f81fb7c4SAndroid Build Coastguard Worker
2449*f81fb7c4SAndroid Build Coastguard Worker /* intiailize indices */
2450*f81fb7c4SAndroid Build Coastguard Worker pRgn->wtRegion.artIndex = artIndex;
2451*f81fb7c4SAndroid Build Coastguard Worker pRgn->wtRegion.waveIndex = waveIndex;
2452*f81fb7c4SAndroid Build Coastguard Worker
2453*f81fb7c4SAndroid Build Coastguard Worker /* convert region data */
2454*f81fb7c4SAndroid Build Coastguard Worker /*lint -e{704} use shift for performance */
2455*f81fb7c4SAndroid Build Coastguard Worker pRgn->wtRegion.gain = (EAS_I16) (pWsmp->gain >> 16);
2456*f81fb7c4SAndroid Build Coastguard Worker pRgn->wtRegion.loopStart = pWsmp->loopStart;
2457*f81fb7c4SAndroid Build Coastguard Worker pRgn->wtRegion.loopEnd = (pWsmp->loopStart + pWsmp->loopLength);
2458*f81fb7c4SAndroid Build Coastguard Worker pRgn->wtRegion.tuning = pWsmp->fineTune -(pWsmp->unityNote * 100) + ConvertSampleRate(pWsmp->sampleRate);
2459*f81fb7c4SAndroid Build Coastguard Worker if (pWsmp->loopLength != 0)
2460*f81fb7c4SAndroid Build Coastguard Worker pRgn->wtRegion.region.keyGroupAndFlags |= REGION_FLAG_IS_LOOPED;
2461*f81fb7c4SAndroid Build Coastguard Worker }
2462*f81fb7c4SAndroid Build Coastguard Worker
2463*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
2464*f81fb7c4SAndroid Build Coastguard Worker * Convert_art()
2465*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2466*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
2467*f81fb7c4SAndroid Build Coastguard Worker * Convert articulation data from DLS to EAS
2468*f81fb7c4SAndroid Build Coastguard Worker *
2469*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
2470*f81fb7c4SAndroid Build Coastguard Worker *
2471*f81fb7c4SAndroid Build Coastguard Worker *
2472*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
2473*f81fb7c4SAndroid Build Coastguard Worker *
2474*f81fb7c4SAndroid Build Coastguard Worker *
2475*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2476*f81fb7c4SAndroid Build Coastguard Worker */
Convert_art(SDLS_SYNTHESIZER_DATA * pDLSData,const S_DLS_ART_VALUES * pDLSArt,EAS_U16 artIndex)2477*f81fb7c4SAndroid Build Coastguard Worker static void Convert_art (SDLS_SYNTHESIZER_DATA *pDLSData, const S_DLS_ART_VALUES *pDLSArt, EAS_U16 artIndex)
2478*f81fb7c4SAndroid Build Coastguard Worker {
2479*f81fb7c4SAndroid Build Coastguard Worker S_DLS_ARTICULATION *pArt;
2480*f81fb7c4SAndroid Build Coastguard Worker
2481*f81fb7c4SAndroid Build Coastguard Worker /* setup pointers to data structures */
2482*f81fb7c4SAndroid Build Coastguard Worker pArt = &pDLSData->pDLS->pDLSArticulations[artIndex];
2483*f81fb7c4SAndroid Build Coastguard Worker
2484*f81fb7c4SAndroid Build Coastguard Worker /* LFO parameters */
2485*f81fb7c4SAndroid Build Coastguard Worker pArt->modLFO.lfoFreq = ConvertLFOPhaseIncrement(pDLSArt->values[PARAM_MOD_LFO_FREQ]);
2486*f81fb7c4SAndroid Build Coastguard Worker pArt->modLFO.lfoDelay = -ConvertDelay(pDLSArt->values[PARAM_MOD_LFO_DELAY]);
2487*f81fb7c4SAndroid Build Coastguard Worker pArt->vibLFO.lfoFreq = ConvertLFOPhaseIncrement(pDLSArt->values[PARAM_VIB_LFO_FREQ]);
2488*f81fb7c4SAndroid Build Coastguard Worker pArt->vibLFO.lfoDelay = -ConvertDelay(pDLSArt->values[PARAM_VIB_LFO_DELAY]);
2489*f81fb7c4SAndroid Build Coastguard Worker
2490*f81fb7c4SAndroid Build Coastguard Worker /* EG1 parameters */
2491*f81fb7c4SAndroid Build Coastguard Worker pArt->eg1.delayTime = ConvertDelay(pDLSArt->values[PARAM_VOL_EG_DELAY]);
2492*f81fb7c4SAndroid Build Coastguard Worker pArt->eg1.attackTime = pDLSArt->values[PARAM_VOL_EG_ATTACK];
2493*f81fb7c4SAndroid Build Coastguard Worker pArt->eg1.holdTime = pDLSArt->values[PARAM_VOL_EG_HOLD];
2494*f81fb7c4SAndroid Build Coastguard Worker pArt->eg1.decayTime = pDLSArt->values[PARAM_VOL_EG_DECAY];
2495*f81fb7c4SAndroid Build Coastguard Worker pArt->eg1.sustainLevel = ConvertSustain(pDLSArt->values[PARAM_VOL_EG_SUSTAIN]);
2496*f81fb7c4SAndroid Build Coastguard Worker pArt->eg1.releaseTime = ConvertRate(pDLSArt->values[PARAM_VOL_EG_RELEASE]);
2497*f81fb7c4SAndroid Build Coastguard Worker pArt->eg1.velToAttack = pDLSArt->values[PARAM_VOL_EG_VEL_TO_ATTACK];
2498*f81fb7c4SAndroid Build Coastguard Worker pArt->eg1.keyNumToDecay = pDLSArt->values[PARAM_VOL_EG_KEY_TO_DECAY];
2499*f81fb7c4SAndroid Build Coastguard Worker pArt->eg1.keyNumToHold = pDLSArt->values[PARAM_VOL_EG_KEY_TO_HOLD];
2500*f81fb7c4SAndroid Build Coastguard Worker pArt->eg1ShutdownTime = ConvertRate(pDLSArt->values[PARAM_VOL_EG_SHUTDOWN]);
2501*f81fb7c4SAndroid Build Coastguard Worker
2502*f81fb7c4SAndroid Build Coastguard Worker /* EG2 parameters */
2503*f81fb7c4SAndroid Build Coastguard Worker pArt->eg2.delayTime = ConvertDelay(pDLSArt->values[PARAM_MOD_EG_DELAY]);
2504*f81fb7c4SAndroid Build Coastguard Worker pArt->eg2.attackTime = pDLSArt->values[PARAM_MOD_EG_ATTACK];
2505*f81fb7c4SAndroid Build Coastguard Worker pArt->eg2.holdTime = pDLSArt->values[PARAM_MOD_EG_HOLD];
2506*f81fb7c4SAndroid Build Coastguard Worker pArt->eg2.decayTime = pDLSArt->values[PARAM_MOD_EG_DECAY];
2507*f81fb7c4SAndroid Build Coastguard Worker pArt->eg2.sustainLevel = ConvertSustain(pDLSArt->values[PARAM_MOD_EG_SUSTAIN]);
2508*f81fb7c4SAndroid Build Coastguard Worker pArt->eg2.releaseTime = ConvertRate(pDLSArt->values[PARAM_MOD_EG_RELEASE]);
2509*f81fb7c4SAndroid Build Coastguard Worker pArt->eg2.velToAttack = pDLSArt->values[PARAM_MOD_EG_VEL_TO_ATTACK];
2510*f81fb7c4SAndroid Build Coastguard Worker pArt->eg2.keyNumToDecay = pDLSArt->values[PARAM_MOD_EG_KEY_TO_DECAY];
2511*f81fb7c4SAndroid Build Coastguard Worker pArt->eg2.keyNumToHold = pDLSArt->values[PARAM_MOD_EG_KEY_TO_HOLD];
2512*f81fb7c4SAndroid Build Coastguard Worker
2513*f81fb7c4SAndroid Build Coastguard Worker /* filter parameters */
2514*f81fb7c4SAndroid Build Coastguard Worker pArt->filterCutoff = pDLSArt->values[PARAM_INITIAL_FC];
2515*f81fb7c4SAndroid Build Coastguard Worker pArt->filterQandFlags = ConvertQ(pDLSArt->values[PARAM_INITIAL_Q]);
2516*f81fb7c4SAndroid Build Coastguard Worker pArt->modLFOToFc = pDLSArt->values[PARAM_MOD_LFO_TO_FC];
2517*f81fb7c4SAndroid Build Coastguard Worker pArt->modLFOCC1ToFc = pDLSArt->values[PARAM_MOD_LFO_CC1_TO_FC];
2518*f81fb7c4SAndroid Build Coastguard Worker pArt->modLFOChanPressToFc = pDLSArt->values[PARAM_MOD_LFO_CHAN_PRESS_TO_FC];
2519*f81fb7c4SAndroid Build Coastguard Worker pArt->eg2ToFc = pDLSArt->values[PARAM_MOD_EG_TO_FC];
2520*f81fb7c4SAndroid Build Coastguard Worker pArt->velToFc = pDLSArt->values[PARAM_VEL_TO_FC];
2521*f81fb7c4SAndroid Build Coastguard Worker pArt->keyNumToFc = pDLSArt->values[PARAM_KEYNUM_TO_FC];
2522*f81fb7c4SAndroid Build Coastguard Worker
2523*f81fb7c4SAndroid Build Coastguard Worker /* gain parameters */
2524*f81fb7c4SAndroid Build Coastguard Worker pArt->modLFOToGain = pDLSArt->values[PARAM_MOD_LFO_TO_GAIN];
2525*f81fb7c4SAndroid Build Coastguard Worker pArt->modLFOCC1ToGain = pDLSArt->values[PARAM_MOD_LFO_CC1_TO_GAIN];
2526*f81fb7c4SAndroid Build Coastguard Worker pArt->modLFOChanPressToGain = pDLSArt->values[PARAM_MOD_LFO_CHAN_PRESS_TO_GAIN];
2527*f81fb7c4SAndroid Build Coastguard Worker
2528*f81fb7c4SAndroid Build Coastguard Worker /* pitch parameters */
2529*f81fb7c4SAndroid Build Coastguard Worker pArt->tuning = pDLSArt->values[PARAM_TUNING];
2530*f81fb7c4SAndroid Build Coastguard Worker pArt->keyNumToPitch = pDLSArt->values[PARAM_KEYNUM_TO_PITCH];
2531*f81fb7c4SAndroid Build Coastguard Worker pArt->vibLFOToPitch = pDLSArt->values[PARAM_VIB_LFO_TO_PITCH];
2532*f81fb7c4SAndroid Build Coastguard Worker pArt->vibLFOCC1ToPitch = pDLSArt->values[PARAM_VIB_LFO_CC1_TO_PITCH];
2533*f81fb7c4SAndroid Build Coastguard Worker pArt->vibLFOChanPressToPitch = pDLSArt->values[PARAM_VIB_LFO_CHAN_PRESS_TO_PITCH];
2534*f81fb7c4SAndroid Build Coastguard Worker pArt->modLFOToPitch = pDLSArt->values[PARAM_MOD_LFO_TO_PITCH];
2535*f81fb7c4SAndroid Build Coastguard Worker pArt->modLFOCC1ToPitch = pDLSArt->values[PARAM_MOD_LFO_CC1_TO_PITCH];
2536*f81fb7c4SAndroid Build Coastguard Worker pArt->modLFOChanPressToPitch = pDLSArt->values[PARAM_MOD_LFO_CHAN_PRESS_TO_PITCH];
2537*f81fb7c4SAndroid Build Coastguard Worker pArt->eg2ToPitch = pDLSArt->values[PARAM_MOD_EG_TO_PITCH];
2538*f81fb7c4SAndroid Build Coastguard Worker
2539*f81fb7c4SAndroid Build Coastguard Worker /* output parameters */
2540*f81fb7c4SAndroid Build Coastguard Worker pArt->pan = ConvertPan(pDLSArt->values[PARAM_DEFAULT_PAN]);
2541*f81fb7c4SAndroid Build Coastguard Worker
2542*f81fb7c4SAndroid Build Coastguard Worker if (pDLSArt->values[PARAM_VEL_TO_GAIN] != 0)
2543*f81fb7c4SAndroid Build Coastguard Worker pArt->filterQandFlags |= FLAG_DLS_VELOCITY_SENSITIVE;
2544*f81fb7c4SAndroid Build Coastguard Worker
2545*f81fb7c4SAndroid Build Coastguard Worker #ifdef _REVERB
2546*f81fb7c4SAndroid Build Coastguard Worker pArt->reverbSend = pDLSArt->values[PARAM_DEFAULT_REVERB_SEND];
2547*f81fb7c4SAndroid Build Coastguard Worker pArt->cc91ToReverbSend = pDLSArt->values[PARAM_MIDI_CC91_TO_REVERB_SEND];
2548*f81fb7c4SAndroid Build Coastguard Worker #endif
2549*f81fb7c4SAndroid Build Coastguard Worker
2550*f81fb7c4SAndroid Build Coastguard Worker #ifdef _CHORUS
2551*f81fb7c4SAndroid Build Coastguard Worker pArt->chorusSend = pDLSArt->values[PARAM_DEFAULT_CHORUS_SEND];
2552*f81fb7c4SAndroid Build Coastguard Worker pArt->cc93ToChorusSend = pDLSArt->values[PARAM_MIDI_CC93_TO_CHORUS_SEND];
2553*f81fb7c4SAndroid Build Coastguard Worker #endif
2554*f81fb7c4SAndroid Build Coastguard Worker }
2555*f81fb7c4SAndroid Build Coastguard Worker
2556*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
2557*f81fb7c4SAndroid Build Coastguard Worker * ConvertSampleRate()
2558*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2559*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
2560*f81fb7c4SAndroid Build Coastguard Worker *
2561*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
2562*f81fb7c4SAndroid Build Coastguard Worker *
2563*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
2564*f81fb7c4SAndroid Build Coastguard Worker *
2565*f81fb7c4SAndroid Build Coastguard Worker * Side Effects:
2566*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2567*f81fb7c4SAndroid Build Coastguard Worker */
ConvertSampleRate(EAS_U32 sampleRate)2568*f81fb7c4SAndroid Build Coastguard Worker static EAS_I16 ConvertSampleRate (EAS_U32 sampleRate)
2569*f81fb7c4SAndroid Build Coastguard Worker {
2570*f81fb7c4SAndroid Build Coastguard Worker return (EAS_I16) (1200.0 * log10((double) sampleRate / (double) outputSampleRate) / log10(2.0));
2571*f81fb7c4SAndroid Build Coastguard Worker }
2572*f81fb7c4SAndroid Build Coastguard Worker
2573*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
2574*f81fb7c4SAndroid Build Coastguard Worker * ConvertSustainEG2()
2575*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2576*f81fb7c4SAndroid Build Coastguard Worker * Convert sustain level to pitch/Fc multipler for EG2
2577*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2578*f81fb7c4SAndroid Build Coastguard Worker */
ConvertSustain(EAS_I32 sustain)2579*f81fb7c4SAndroid Build Coastguard Worker static EAS_I16 ConvertSustain (EAS_I32 sustain)
2580*f81fb7c4SAndroid Build Coastguard Worker {
2581*f81fb7c4SAndroid Build Coastguard Worker /* check for sustain level of zero */
2582*f81fb7c4SAndroid Build Coastguard Worker if (sustain == 0)
2583*f81fb7c4SAndroid Build Coastguard Worker return 0;
2584*f81fb7c4SAndroid Build Coastguard Worker
2585*f81fb7c4SAndroid Build Coastguard Worker /* convert to log2 factor */
2586*f81fb7c4SAndroid Build Coastguard Worker /*lint -e{704} use shift for performance */
2587*f81fb7c4SAndroid Build Coastguard Worker sustain = (sustain * SUSTAIN_LINEAR_CONVERSION_FACTOR) >> 15;
2588*f81fb7c4SAndroid Build Coastguard Worker
2589*f81fb7c4SAndroid Build Coastguard Worker if (sustain > SYNTH_FULL_SCALE_EG1_GAIN)
2590*f81fb7c4SAndroid Build Coastguard Worker return SYNTH_FULL_SCALE_EG1_GAIN;
2591*f81fb7c4SAndroid Build Coastguard Worker return (EAS_I16) sustain;
2592*f81fb7c4SAndroid Build Coastguard Worker }
2593*f81fb7c4SAndroid Build Coastguard Worker
2594*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
2595*f81fb7c4SAndroid Build Coastguard Worker * ConvertDelay ()
2596*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2597*f81fb7c4SAndroid Build Coastguard Worker * Converts timecents to frame count. Used for LFO and envelope
2598*f81fb7c4SAndroid Build Coastguard Worker * delay times.
2599*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2600*f81fb7c4SAndroid Build Coastguard Worker */
ConvertDelay(EAS_I32 timeCents)2601*f81fb7c4SAndroid Build Coastguard Worker EAS_I16 ConvertDelay (EAS_I32 timeCents)
2602*f81fb7c4SAndroid Build Coastguard Worker {
2603*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 temp;
2604*f81fb7c4SAndroid Build Coastguard Worker
2605*f81fb7c4SAndroid Build Coastguard Worker if (timeCents == ZERO_TIME_IN_CENTS)
2606*f81fb7c4SAndroid Build Coastguard Worker return 0;
2607*f81fb7c4SAndroid Build Coastguard Worker
2608*f81fb7c4SAndroid Build Coastguard Worker /* divide time by secs per frame to get number of frames */
2609*f81fb7c4SAndroid Build Coastguard Worker temp = timeCents - dlsRateConvert;
2610*f81fb7c4SAndroid Build Coastguard Worker
2611*f81fb7c4SAndroid Build Coastguard Worker /* convert from time cents to 10-bit fraction */
2612*f81fb7c4SAndroid Build Coastguard Worker temp = FMUL_15x15(temp, TIME_CENTS_TO_LOG2);
2613*f81fb7c4SAndroid Build Coastguard Worker
2614*f81fb7c4SAndroid Build Coastguard Worker /* convert to frame count */
2615*f81fb7c4SAndroid Build Coastguard Worker temp = EAS_LogToLinear16(temp - (15 << 10));
2616*f81fb7c4SAndroid Build Coastguard Worker
2617*f81fb7c4SAndroid Build Coastguard Worker if (temp < SYNTH_FULL_SCALE_EG1_GAIN)
2618*f81fb7c4SAndroid Build Coastguard Worker return (EAS_I16) temp;
2619*f81fb7c4SAndroid Build Coastguard Worker return SYNTH_FULL_SCALE_EG1_GAIN;
2620*f81fb7c4SAndroid Build Coastguard Worker }
2621*f81fb7c4SAndroid Build Coastguard Worker
2622*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
2623*f81fb7c4SAndroid Build Coastguard Worker * ConvertRate ()
2624*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2625*f81fb7c4SAndroid Build Coastguard Worker * Convert timecents to rate
2626*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2627*f81fb7c4SAndroid Build Coastguard Worker */
ConvertRate(EAS_I32 timeCents)2628*f81fb7c4SAndroid Build Coastguard Worker EAS_I16 ConvertRate (EAS_I32 timeCents)
2629*f81fb7c4SAndroid Build Coastguard Worker {
2630*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 temp;
2631*f81fb7c4SAndroid Build Coastguard Worker
2632*f81fb7c4SAndroid Build Coastguard Worker if (timeCents == ZERO_TIME_IN_CENTS)
2633*f81fb7c4SAndroid Build Coastguard Worker return SYNTH_FULL_SCALE_EG1_GAIN;
2634*f81fb7c4SAndroid Build Coastguard Worker
2635*f81fb7c4SAndroid Build Coastguard Worker /* divide frame rate by time in log domain to get rate */
2636*f81fb7c4SAndroid Build Coastguard Worker temp = dlsRateConvert - timeCents;
2637*f81fb7c4SAndroid Build Coastguard Worker
2638*f81fb7c4SAndroid Build Coastguard Worker #if 1
2639*f81fb7c4SAndroid Build Coastguard Worker temp = EAS_Calculate2toX(temp);
2640*f81fb7c4SAndroid Build Coastguard Worker #else
2641*f81fb7c4SAndroid Build Coastguard Worker /* convert from time cents to 10-bit fraction */
2642*f81fb7c4SAndroid Build Coastguard Worker temp = FMUL_15x15(temp, TIME_CENTS_TO_LOG2);
2643*f81fb7c4SAndroid Build Coastguard Worker
2644*f81fb7c4SAndroid Build Coastguard Worker /* convert to rate */
2645*f81fb7c4SAndroid Build Coastguard Worker temp = EAS_LogToLinear16(temp);
2646*f81fb7c4SAndroid Build Coastguard Worker #endif
2647*f81fb7c4SAndroid Build Coastguard Worker
2648*f81fb7c4SAndroid Build Coastguard Worker if (temp < SYNTH_FULL_SCALE_EG1_GAIN)
2649*f81fb7c4SAndroid Build Coastguard Worker return (EAS_I16) temp;
2650*f81fb7c4SAndroid Build Coastguard Worker return SYNTH_FULL_SCALE_EG1_GAIN;
2651*f81fb7c4SAndroid Build Coastguard Worker }
2652*f81fb7c4SAndroid Build Coastguard Worker
2653*f81fb7c4SAndroid Build Coastguard Worker
2654*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
2655*f81fb7c4SAndroid Build Coastguard Worker * ConvertLFOPhaseIncrement()
2656*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2657*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
2658*f81fb7c4SAndroid Build Coastguard Worker *
2659*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
2660*f81fb7c4SAndroid Build Coastguard Worker *
2661*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
2662*f81fb7c4SAndroid Build Coastguard Worker *
2663*f81fb7c4SAndroid Build Coastguard Worker * Side Effects:
2664*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2665*f81fb7c4SAndroid Build Coastguard Worker */
ConvertLFOPhaseIncrement(EAS_I32 pitchCents)2666*f81fb7c4SAndroid Build Coastguard Worker static EAS_I16 ConvertLFOPhaseIncrement (EAS_I32 pitchCents)
2667*f81fb7c4SAndroid Build Coastguard Worker {
2668*f81fb7c4SAndroid Build Coastguard Worker
2669*f81fb7c4SAndroid Build Coastguard Worker /* check range */
2670*f81fb7c4SAndroid Build Coastguard Worker if (pitchCents > MAX_LFO_FREQUENCY_IN_PITCHCENTS)
2671*f81fb7c4SAndroid Build Coastguard Worker pitchCents = MAX_LFO_FREQUENCY_IN_PITCHCENTS;
2672*f81fb7c4SAndroid Build Coastguard Worker if (pitchCents < MIN_LFO_FREQUENCY_IN_PITCHCENTS)
2673*f81fb7c4SAndroid Build Coastguard Worker pitchCents = MIN_LFO_FREQUENCY_IN_PITCHCENTS;
2674*f81fb7c4SAndroid Build Coastguard Worker
2675*f81fb7c4SAndroid Build Coastguard Worker /* double the rate and divide by frame rate by subtracting in log domain */
2676*f81fb7c4SAndroid Build Coastguard Worker pitchCents = pitchCents - dlsLFOFrequencyConvert;
2677*f81fb7c4SAndroid Build Coastguard Worker
2678*f81fb7c4SAndroid Build Coastguard Worker /* convert to phase increment */
2679*f81fb7c4SAndroid Build Coastguard Worker return (EAS_I16) EAS_Calculate2toX(pitchCents);
2680*f81fb7c4SAndroid Build Coastguard Worker }
2681*f81fb7c4SAndroid Build Coastguard Worker
2682*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
2683*f81fb7c4SAndroid Build Coastguard Worker * ConvertPan()
2684*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2685*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
2686*f81fb7c4SAndroid Build Coastguard Worker *
2687*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
2688*f81fb7c4SAndroid Build Coastguard Worker *
2689*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
2690*f81fb7c4SAndroid Build Coastguard Worker *
2691*f81fb7c4SAndroid Build Coastguard Worker * Side Effects:
2692*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2693*f81fb7c4SAndroid Build Coastguard Worker */
ConvertPan(EAS_I32 pan)2694*f81fb7c4SAndroid Build Coastguard Worker static EAS_I8 ConvertPan (EAS_I32 pan)
2695*f81fb7c4SAndroid Build Coastguard Worker {
2696*f81fb7c4SAndroid Build Coastguard Worker
2697*f81fb7c4SAndroid Build Coastguard Worker /* multiply by conversion factor */
2698*f81fb7c4SAndroid Build Coastguard Worker pan = FMUL_15x15 (PAN_CONVERSION_FACTOR, pan);
2699*f81fb7c4SAndroid Build Coastguard Worker if (pan < MIN_PAN_VALUE)
2700*f81fb7c4SAndroid Build Coastguard Worker return MIN_PAN_VALUE;
2701*f81fb7c4SAndroid Build Coastguard Worker if (pan > MAX_PAN_VALUE)
2702*f81fb7c4SAndroid Build Coastguard Worker return MAX_PAN_VALUE;
2703*f81fb7c4SAndroid Build Coastguard Worker return (EAS_I8) pan;
2704*f81fb7c4SAndroid Build Coastguard Worker }
2705*f81fb7c4SAndroid Build Coastguard Worker
2706*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
2707*f81fb7c4SAndroid Build Coastguard Worker * ConvertQ()
2708*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2709*f81fb7c4SAndroid Build Coastguard Worker * Convert the DLS filter resonance to an index value used by the synth
2710*f81fb7c4SAndroid Build Coastguard Worker * that accesses tables of coefficients based on the Q.
2711*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2712*f81fb7c4SAndroid Build Coastguard Worker */
ConvertQ(EAS_I32 q)2713*f81fb7c4SAndroid Build Coastguard Worker static EAS_U8 ConvertQ (EAS_I32 q)
2714*f81fb7c4SAndroid Build Coastguard Worker {
2715*f81fb7c4SAndroid Build Coastguard Worker
2716*f81fb7c4SAndroid Build Coastguard Worker /* apply limits */
2717*f81fb7c4SAndroid Build Coastguard Worker if (q <= 0)
2718*f81fb7c4SAndroid Build Coastguard Worker return 0;
2719*f81fb7c4SAndroid Build Coastguard Worker
2720*f81fb7c4SAndroid Build Coastguard Worker /* convert to table index */
2721*f81fb7c4SAndroid Build Coastguard Worker /*lint -e{704} use shift for performance */
2722*f81fb7c4SAndroid Build Coastguard Worker q = (FILTER_Q_CONVERSION_FACTOR * q + 0x4000) >> 15;
2723*f81fb7c4SAndroid Build Coastguard Worker
2724*f81fb7c4SAndroid Build Coastguard Worker /* apply upper limit */
2725*f81fb7c4SAndroid Build Coastguard Worker if (q >= FILTER_RESONANCE_NUM_ENTRIES)
2726*f81fb7c4SAndroid Build Coastguard Worker q = FILTER_RESONANCE_NUM_ENTRIES - 1;
2727*f81fb7c4SAndroid Build Coastguard Worker return (EAS_U8) q;
2728*f81fb7c4SAndroid Build Coastguard Worker }
2729*f81fb7c4SAndroid Build Coastguard Worker
2730*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_DLS
2731*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
2732*f81fb7c4SAndroid Build Coastguard Worker * DumpDLS()
2733*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2734*f81fb7c4SAndroid Build Coastguard Worker */
DumpDLS(S_EAS * pEAS)2735*f81fb7c4SAndroid Build Coastguard Worker static void DumpDLS (S_EAS *pEAS)
2736*f81fb7c4SAndroid Build Coastguard Worker {
2737*f81fb7c4SAndroid Build Coastguard Worker S_DLS_ARTICULATION *pArt;
2738*f81fb7c4SAndroid Build Coastguard Worker S_DLS_REGION *pRegion;
2739*f81fb7c4SAndroid Build Coastguard Worker EAS_INT i;
2740*f81fb7c4SAndroid Build Coastguard Worker EAS_INT j;
2741*f81fb7c4SAndroid Build Coastguard Worker
2742*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000022 , pEAS->numPrograms);
2743*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000023 , pEAS->numWTRegions);
2744*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000024 , pEAS->numDLSArticulations);
2745*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000025 , pEAS->numSamples);
2746*f81fb7c4SAndroid Build Coastguard Worker
2747*f81fb7c4SAndroid Build Coastguard Worker /* dump the instruments */
2748*f81fb7c4SAndroid Build Coastguard Worker for (i = 0; i < pEAS->numPrograms; i++)
2749*f81fb7c4SAndroid Build Coastguard Worker {
2750*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000026 ,
2751*f81fb7c4SAndroid Build Coastguard Worker pEAS->pPrograms[i].locale >> 16,
2752*f81fb7c4SAndroid Build Coastguard Worker (pEAS->pPrograms[i].locale >> 8) & 0x7f,
2753*f81fb7c4SAndroid Build Coastguard Worker pEAS->pPrograms[i].locale & 0x7f);
2754*f81fb7c4SAndroid Build Coastguard Worker
2755*f81fb7c4SAndroid Build Coastguard Worker for (j = pEAS->pPrograms[i].regionIndex; ; j++)
2756*f81fb7c4SAndroid Build Coastguard Worker {
2757*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000027 , j);
2758*f81fb7c4SAndroid Build Coastguard Worker pRegion = &pEAS->pWTRegions[j];
2759*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000028 , pRegion->gain);
2760*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000029 , pRegion->region.rangeLow, pRegion->region.rangeHigh);
2761*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x0000002a , pRegion->region.keyGroupAndFlags);
2762*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x0000002b , pRegion->loopStart);
2763*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x0000002c , pRegion->loopEnd);
2764*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x0000002d , pRegion->tuning);
2765*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x0000002e , pRegion->artIndex);
2766*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x0000002f , pRegion->waveIndex);
2767*f81fb7c4SAndroid Build Coastguard Worker
2768*f81fb7c4SAndroid Build Coastguard Worker if (pRegion->region.keyGroupAndFlags & REGION_FLAG_LAST_REGION)
2769*f81fb7c4SAndroid Build Coastguard Worker break;
2770*f81fb7c4SAndroid Build Coastguard Worker }
2771*f81fb7c4SAndroid Build Coastguard Worker
2772*f81fb7c4SAndroid Build Coastguard Worker }
2773*f81fb7c4SAndroid Build Coastguard Worker
2774*f81fb7c4SAndroid Build Coastguard Worker /* dump the articulation data */
2775*f81fb7c4SAndroid Build Coastguard Worker for (i = 0; i < pEAS->numDLSArticulations; i++)
2776*f81fb7c4SAndroid Build Coastguard Worker {
2777*f81fb7c4SAndroid Build Coastguard Worker /* articulation data */
2778*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000030 , i);
2779*f81fb7c4SAndroid Build Coastguard Worker pArt = &pEAS->pDLSArticulations[i];
2780*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000031 , pArt->m_nEG2toFilterDepth);
2781*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000032 , pArt->m_nEG2toPitchDepth);
2782*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000033 , pArt->m_nFilterCutoffFrequency);
2783*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000034 , pArt->m_nFilterResonance);
2784*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000035 , pArt->m_nLFOAmplitudeDepth);
2785*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000036 , pArt->m_nLFODelayTime);
2786*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000037 , pArt->m_nLFOFrequency);
2787*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000038 , pArt->m_nLFOPitchDepth);
2788*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000039 , pArt->m_nPan);
2789*f81fb7c4SAndroid Build Coastguard Worker
2790*f81fb7c4SAndroid Build Coastguard Worker /* EG1 data */
2791*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x0000003a , pArt->m_sEG1.m_nAttack);
2792*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x0000003b , pArt->m_sEG1.m_nDecay);
2793*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x0000003c , pArt->m_sEG1.m_nSustain);
2794*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x0000003d , pArt->m_sEG1.m_nRelease);
2795*f81fb7c4SAndroid Build Coastguard Worker
2796*f81fb7c4SAndroid Build Coastguard Worker /* EG2 data */
2797*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x0000003e , pArt->m_sEG2.m_nAttack);
2798*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x0000003f , pArt->m_sEG2.m_nDecay);
2799*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000040 , pArt->m_sEG2.m_nSustain);
2800*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000041 , pArt->m_sEG2.m_nRelease);
2801*f81fb7c4SAndroid Build Coastguard Worker
2802*f81fb7c4SAndroid Build Coastguard Worker }
2803*f81fb7c4SAndroid Build Coastguard Worker
2804*f81fb7c4SAndroid Build Coastguard Worker /* dump the waves */
2805*f81fb7c4SAndroid Build Coastguard Worker for (i = 0; i < pEAS->numSamples; i++)
2806*f81fb7c4SAndroid Build Coastguard Worker {
2807*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000042 , i);
2808*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000043 , pEAS->pSampleLen[i]);
2809*f81fb7c4SAndroid Build Coastguard Worker EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000044 , pEAS->ppSamples[i]);
2810*f81fb7c4SAndroid Build Coastguard Worker }
2811*f81fb7c4SAndroid Build Coastguard Worker
2812*f81fb7c4SAndroid Build Coastguard Worker }
2813*f81fb7c4SAndroid Build Coastguard Worker #endif
2814*f81fb7c4SAndroid Build Coastguard Worker
2815