17df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
27df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * File:
47df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * eas_mdls.c
57df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
67df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Contents and purpose:
77df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * This file contains DLS to EAS converter.
856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
97df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Copyright (c) 2005 Sonic Network Inc.
107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * you may not use this file except in compliance with the License.
137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * You may obtain a copy of the License at
147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * See the License for the specific language governing permissions and
217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * limitations under the License.
227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Revision Control:
257df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *   $Revision: 818 $
267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *   $Date: 2007-08-02 15:19:41 -0700 (Thu, 02 Aug 2007) $
277df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
287df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*
317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * NOTES:
327df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
337df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Processor Endian-ness:
347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
357df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * We use the EAS_HWGetDWord() and EAS_HWGetWord () functions
367df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * extensively in this module. It would probably be faster to read
377df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * an entire data structure, but this introduces the problem of
387df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * sensitivity to processor endian-ness to the parser. By utlilizing
397df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * the host wrapper functions, we avoid having to flip bytes around
407df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * for big-endian processors. The default host wrapper versions of
417df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * these functions are insensitive to processor endian-ness due to
427df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * the fact that they read the file as a byte stream.
437df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
447df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Dynamic Memory:
457df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
467df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Dynamic memory allocation is a risky proposition in a mobile
477df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * device. The memory can become fragmented, resulting in an
487df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * inability to allocate a memory block, or garbage collection
497df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * routines can use many CPU cycles. Either can contribute to
507df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * failures of critical systems. Therefore, we try to minimize the
517df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * number of memory allocations we make.
527df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
537df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * We allocate a single large block of memory for the entire
547df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * converted DLS collection, including the articulation data and
557df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * samples. This block is then sub-allocated for the various
567df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * data structures.
577df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
587df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Parser Overview:
597df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
607df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * We make two passes through the file, the first pass to count the
617df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * number of instruments, regions, etc. and allocate memory for
627df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * them. The second pass parses the data into the allocated data
637df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * structures.
647df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
657df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Conditional chunks are challenging in that they can occur
667df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * anywhere in the list chunk that contains them. To simplify, we
677df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * parse the blocks in a list in specific order, no matter which
687df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * order they appear in the file. This way we don't allocate memory
697df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * and parse a block that we end up throwing away later due to
707df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * a conditional chunk.
717df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
727df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Assumptions that may bite us in the future:
737df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
747df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * We make some assumptions to simplify things. The most fundamental
757df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * assumption is that there will be no more than one of any type of
767df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * chunk in a list. While this is consistent with the block diagram
777df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * of the file layout in the mDLS spec, there is nothing in the
787df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * spec that precludes having mulitple lar2 or rgn2 chunks, with
797df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * conditional blocks that dictate their usage.
807df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
817df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * DLS -> EAS Conversion Process:
827df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
837df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Another challenge is that the DLS structure does not map well to
847df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * the current EAS sound library structure. Not all DLS constructs
857df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * are supported, and data from DLS structures must sometimes be
867df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * mapped to multiple EAS data structures. To simplify the process,
877df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * the EAS region, articulation, and envelopes are treated as a
887df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * single combined unit. Thus for each region, there must be one
897df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * articulation element and two envelope elements.
907df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
917df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * The sample processing is also a multi-step process. First the
927df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * ptbl chunk is pre-parsed to determine the number of samples
937df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * in the collection. The next step is to parse the instrument data
947df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * to determine which samples are actually used by instruments.
957df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Some samples may not be used because they are used only in
967df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * conditional blocks that the synthesizer cannot parse, or the
977df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * author neglected to remove unused samples from the collection.
987df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * In the next step, the active samples are read into memory and
997df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * converted to the appropriate playback format. Finally, as the
1007df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * instruments are processed, the links are made to the samples and
1017df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * wsmp data is extracted for the region and articulation data
1027df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * structures.
1037df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
1047df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1057df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#ifndef _FILTER_ENABLED
1067df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#error "Filter must be enabled if DLS_SYNTHESIZER is enabled"
1077df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif
1087df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1097df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*------------------------------------
1107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * includes
1117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *------------------------------------
1127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
1137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/* this define allows us to use the sndlib.h structures as RW memory */
1157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#define SCNST
1167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "eas_data.h"
1187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "eas_host.h"
1197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "eas_mdls.h"
1207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "eas_math.h"
1217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "dls.h"
1227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "dls2.h"
1237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "eas_report.h"
1247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1257df30109963092559d3760c0661a020f9daf1030The Android Open Source Project//2 we should replace log10() function with fixed point routine in ConvertSampleRate()
1267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/* lint is choking on the ARM math.h file, so we declare the log10 function here */
1277df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectextern double log10(double x);
1287df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*------------------------------------
1307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * defines
1317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *------------------------------------
1327df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
1337df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project// #define _DEBUG_DLS
1357df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
13656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define DLS_MAX_WAVE_COUNT      1024
13756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define DLS_MAX_ART_COUNT       2048
13856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define DLS_MAX_REGION_COUNT    2048
13956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define DLS_MAX_INST_COUNT      256
14056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define MAX_DLS_WAVE_SIZE       (1024*1024)
1417df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1427df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*------------------------------------
1437df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * typedefs
1447df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *------------------------------------
1457df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
1467df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1477df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/* offsets to articulation data */
1487df30109963092559d3760c0661a020f9daf1030The Android Open Source Projecttypedef enum
1497df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
15056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_MODIFIED = 0,
15156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_MOD_LFO_FREQ,
15256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_MOD_LFO_DELAY,
15356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
15456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_VIB_LFO_FREQ,
15556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_VIB_LFO_DELAY,
15656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
15756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_VOL_EG_DELAY,
15856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_VOL_EG_ATTACK,
15956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_VOL_EG_HOLD,
16056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_VOL_EG_DECAY,
16156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_VOL_EG_SUSTAIN,
16256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_VOL_EG_RELEASE,
16356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_VOL_EG_SHUTDOWN,
16456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_VOL_EG_VEL_TO_ATTACK,
16556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_VOL_EG_KEY_TO_DECAY,
16656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_VOL_EG_KEY_TO_HOLD,
16756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
16856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_MOD_EG_DELAY,
16956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_MOD_EG_ATTACK,
17056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_MOD_EG_HOLD,
17156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_MOD_EG_DECAY,
17256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_MOD_EG_SUSTAIN,
17356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_MOD_EG_RELEASE,
17456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_MOD_EG_VEL_TO_ATTACK,
17556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_MOD_EG_KEY_TO_DECAY,
17656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_MOD_EG_KEY_TO_HOLD,
17756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
17856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_INITIAL_FC,
17956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_INITIAL_Q,
18056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_MOD_LFO_TO_FC,
18156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_MOD_LFO_CC1_TO_FC,
18256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_MOD_LFO_CHAN_PRESS_TO_FC,
18356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_MOD_EG_TO_FC,
18456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_VEL_TO_FC,
18556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_KEYNUM_TO_FC,
18656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
18756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_MOD_LFO_TO_GAIN,
18856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_MOD_LFO_CC1_TO_GAIN,
18956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_MOD_LFO_CHAN_PRESS_TO_GAIN,
19056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_VEL_TO_GAIN,
19156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
19256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_TUNING,
19356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_KEYNUM_TO_PITCH,
19456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_VIB_LFO_TO_PITCH,
19556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_VIB_LFO_CC1_TO_PITCH,
19656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_VIB_LFO_CHAN_PRESS_TO_PITCH,
19756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_MOD_LFO_TO_PITCH,
19856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_MOD_LFO_CC1_TO_PITCH,
19956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_MOD_LFO_CHAN_PRESS_TO_PITCH,
20056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_MOD_EG_TO_PITCH,
20156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
20256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_DEFAULT_PAN,
20356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_MIDI_CC91_TO_REVERB_SEND,
20456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_DEFAULT_REVERB_SEND,
20556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_MIDI_CC93_TO_CHORUS_SEND,
20656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_DEFAULT_CHORUS_SEND,
20756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PARAM_TABLE_SIZE
2087df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} E_ART_INDEX;
2097df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
2107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/* temporary data structure combining region, articulation, and envelope data */
2117df30109963092559d3760c0661a020f9daf1030The Android Open Source Projecttypedef struct s_art_dls_tag
2127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
21356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I16     values[PARAM_TABLE_SIZE];
2147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} S_DLS_ART_VALUES;
2157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
2167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/* temporary data structure for wlnk chunk data */
2177df30109963092559d3760c0661a020f9daf1030The Android Open Source Projecttypedef struct
2187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
21956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 gain;
22056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 loopStart;
22156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 loopLength;
22256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 sampleRate;
22356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16 bitsPerSample;
22456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I16 fineTune;
22556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U8  unityNote;
2267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} S_WSMP_DATA;
2277df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
2287df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/* temporary data structure used while parsing a DLS file */
2297df30109963092559d3760c0661a020f9daf1030The Android Open Source Projecttypedef struct
2307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
23156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_DLS               *pDLS;
23256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_HW_DATA_HANDLE  hwInstData;
23356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_FILE_HANDLE     fileHandle;
23456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_WSMP_DATA         *wsmpData;
23556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32             instCount;
23656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32             regionCount;
23756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32             artCount;
23856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32             waveCount;
23956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32             wavePoolSize;
24056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32             wavePoolOffset;
24156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_BOOL            bigEndian;
24256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_BOOL            filterUsed;
2437df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} SDLS_SYNTHESIZER_DATA;
2447df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
2457df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/* connection lookup table */
2467df30109963092559d3760c0661a020f9daf1030The Android Open Source Projecttypedef struct s_connection_tag
2477df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
24856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16 source;
24956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16 control;
25056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16 destination;
25156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16 connection;
2527df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} S_CONNECTION;
2537df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
25456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic const S_CONNECTION connTable[] =
2557df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
25656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_LFO_FREQUENCY, PARAM_MOD_LFO_FREQ },
25756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_LFO_STARTDELAY, PARAM_MOD_LFO_DELAY},
25856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
25956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_VIB_FREQUENCY, PARAM_VIB_LFO_FREQ },
26056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_VIB_STARTDELAY, PARAM_VIB_LFO_DELAY },
26156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
26256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_EG1_DELAYTIME, PARAM_VOL_EG_DELAY },
26356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_EG1_ATTACKTIME, PARAM_VOL_EG_ATTACK },
26456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_EG1_HOLDTIME, PARAM_VOL_EG_HOLD },
26556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_EG1_DECAYTIME, PARAM_VOL_EG_DECAY },
26656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_EG1_SUSTAINLEVEL, PARAM_VOL_EG_SUSTAIN },
26756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_EG1_RELEASETIME, PARAM_VOL_EG_RELEASE },
26856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_EG1_SHUTDOWNTIME, PARAM_VOL_EG_SHUTDOWN },
26956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_KEYONVELOCITY, CONN_SRC_NONE, CONN_DST_EG1_ATTACKTIME, PARAM_VOL_EG_VEL_TO_ATTACK },
27056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_KEYNUMBER, CONN_SRC_NONE, CONN_DST_EG1_DECAYTIME, PARAM_VOL_EG_KEY_TO_DECAY },
27156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_KEYNUMBER, CONN_SRC_NONE, CONN_DST_EG1_HOLDTIME, PARAM_VOL_EG_KEY_TO_HOLD },
27256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
27356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_EG2_DELAYTIME, PARAM_MOD_EG_DELAY },
27456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_EG2_ATTACKTIME, PARAM_MOD_EG_ATTACK },
27556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_EG2_HOLDTIME, PARAM_MOD_EG_HOLD },
27656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_EG2_DECAYTIME, PARAM_MOD_EG_DECAY },
27756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_EG2_SUSTAINLEVEL, PARAM_MOD_EG_SUSTAIN },
27856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_EG2_RELEASETIME, PARAM_MOD_EG_RELEASE },
27956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_KEYONVELOCITY, CONN_SRC_NONE, CONN_DST_EG2_ATTACKTIME, PARAM_MOD_EG_VEL_TO_ATTACK },
28056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_KEYNUMBER, CONN_SRC_NONE, CONN_DST_EG2_DECAYTIME, PARAM_MOD_EG_KEY_TO_DECAY },
28156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_KEYNUMBER, CONN_SRC_NONE, CONN_DST_EG2_HOLDTIME, PARAM_MOD_EG_KEY_TO_HOLD },
28256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
28356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_FILTER_CUTOFF, PARAM_INITIAL_FC },
28456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_FILTER_Q, PARAM_INITIAL_Q },
28556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_LFO, CONN_SRC_NONE, CONN_DST_FILTER_CUTOFF, PARAM_MOD_LFO_TO_FC },
28656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_LFO, CONN_SRC_CC1, CONN_DST_FILTER_CUTOFF, PARAM_MOD_LFO_CC1_TO_FC },
28756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_LFO, CONN_SRC_CHANNELPRESSURE, CONN_DST_FILTER_CUTOFF, PARAM_MOD_LFO_CHAN_PRESS_TO_FC },
28856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_EG2, CONN_SRC_NONE, CONN_DST_FILTER_CUTOFF, PARAM_MOD_EG_TO_FC },
28956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_KEYONVELOCITY, CONN_SRC_NONE, CONN_DST_FILTER_CUTOFF, PARAM_VEL_TO_FC },
29056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_KEYNUMBER, CONN_SRC_NONE, CONN_DST_FILTER_CUTOFF, PARAM_KEYNUM_TO_FC },
29156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
29256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_LFO, CONN_SRC_NONE, CONN_DST_GAIN, PARAM_MOD_LFO_TO_GAIN },
29356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_LFO, CONN_SRC_CC1, CONN_DST_GAIN, PARAM_MOD_LFO_CC1_TO_GAIN },
29456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_LFO, CONN_SRC_CHANNELPRESSURE, CONN_DST_GAIN, PARAM_MOD_LFO_CHAN_PRESS_TO_GAIN },
29556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_KEYONVELOCITY, CONN_SRC_NONE, CONN_DST_GAIN, PARAM_VEL_TO_GAIN },
29656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
29756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_PITCH, PARAM_TUNING },
29856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_KEYNUMBER, CONN_SRC_NONE, CONN_DST_PITCH, PARAM_KEYNUM_TO_PITCH },
29956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_VIBRATO, CONN_SRC_NONE, CONN_DST_PITCH, PARAM_VIB_LFO_TO_PITCH },
30056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_VIBRATO, CONN_SRC_CC1, CONN_DST_PITCH, PARAM_VIB_LFO_CC1_TO_PITCH },
30156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_VIBRATO, CONN_SRC_CHANNELPRESSURE, CONN_DST_PITCH, PARAM_VIB_LFO_CHAN_PRESS_TO_PITCH },
30256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_LFO, CONN_SRC_NONE, CONN_DST_PITCH, PARAM_MOD_LFO_TO_PITCH },
30356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_LFO, CONN_SRC_CC1, CONN_DST_PITCH, PARAM_MOD_LFO_CC1_TO_PITCH },
30456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_LFO, CONN_SRC_CHANNELPRESSURE, CONN_DST_PITCH, PARAM_MOD_LFO_CHAN_PRESS_TO_PITCH },
30556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_EG2, CONN_SRC_NONE, CONN_DST_PITCH, PARAM_MOD_EG_TO_PITCH },
30656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
30756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_PAN, PARAM_DEFAULT_PAN },
30856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_REVERB, PARAM_DEFAULT_REVERB_SEND },
30956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_CC91, CONN_SRC_NONE, CONN_DST_REVERB, PARAM_MIDI_CC91_TO_REVERB_SEND },
31056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_CHORUS, PARAM_DEFAULT_CHORUS_SEND },
31156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { CONN_SRC_CC93, CONN_SRC_NONE, CONN_DST_REVERB, PARAM_MIDI_CC93_TO_CHORUS_SEND }
3127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project};
3137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#define ENTRIES_IN_CONN_TABLE (sizeof(connTable)/sizeof(S_CONNECTION))
3147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
3157df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic const S_DLS_ART_VALUES defaultArt =
3167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
31756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0,              /* not modified */
31856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    -851,           /* Mod LFO frequency: 5 Hz */
31956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    -7973,          /* Mod LFO delay: 10 milliseconds */
32056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
32156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    -851,           /* Vib LFO frequency: 5 Hz */
32256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    -7973,          /* Vib LFO delay: 10 milliseconds */
32356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
32456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    -32768,         /* EG1 delay time: 0 secs */
32556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    -32768,         /* EG1 attack time: 0 secs */
32656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    -32768,         /* EG1 hold time: 0 secs */
32756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    -32768,         /* EG1 decay time: 0 secs */
32856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    1000,           /* EG1 sustain level: 100.0% */
32956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    -32768,         /* EG1 release time: 0 secs */
33056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    -7271,          /* EG1 shutdown time: 15 msecs */
33156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0,              /* EG1 velocity to attack: 0 time cents */
33256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0,              /* EG1 key number to decay: 0 time cents */
33356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0,              /* EG1 key number to hold: 0 time cents */
33456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
33556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    -32768,         /* EG2 delay time: 0 secs */
33656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    -32768,         /* EG2 attack time: 0 secs */
33756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    -32768,         /* EG2 hold time: 0 secs */
33856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    -32768,         /* EG2 decay time: 0 secs */
33956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    1000,           /* EG2 sustain level: 100.0% */
34056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    -32768,         /* EG2 release time: 0 secs */
34156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0,              /* EG2 velocity to attack: 0 time cents */
34256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0,              /* EG2 key number to decay: 0 time cents */
34356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0,              /* EG2 key number to hold: 0 time cents */
34456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
34556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0x7fff,         /* Initial Fc: Disabled */
34656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0,              /* Initial Q: 0 dB */
34756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0,              /* Mod LFO to Fc: 0 cents */
34856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0,              /* Mod LFO CC1 to Fc: 0 cents */
34956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0,              /* Mod LFO channel pressure to Fc: 0 cents */
35056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0,              /* EG2 to Fc: 0 cents */
35156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0,              /* Velocity to Fc: 0 cents */
35256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0,              /* Key number to Fc: 0 cents */
35356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
35456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0,              /* Mod LFO to gain: 0 dB */
35556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0,              /* Mod LFO CC1 to gain: 0 dB */
35656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0,              /* Mod LFO channel pressure to gain: 0 dB */
35756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    960,            /* Velocity to gain: 96 dB */
35856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
35956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0,              /* Tuning: 0 cents */
36056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    12800,          /* Key number to pitch: 12,800 cents */
36156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0,              /* Vibrato to pitch: 0 cents */
36256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0,              /* Vibrato CC1 to pitch: 0 cents */
36356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0,              /* Vibrato channel pressure to pitch: 0 cents */
36456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0,              /* Mod LFO to pitch: 0 cents */
36556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0,              /* Mod LFO CC1 to pitch: 0 cents */
36656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0,              /* Mod LFO channel pressure to pitch: 0 cents */
36756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0,              /* Mod EG to pitch: 0 cents */
36856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
36956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0,              /* Default pan: 0.0% */
37056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0,              /* Default reverb send: 0.0% */
37156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    1000,           /* Default CC91 to reverb send: 100.0% */
37256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0,              /* Default chorus send: 0.0% */
37356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    1000            /* Default CC93 to chorus send: 100.0% */
3747df30109963092559d3760c0661a020f9daf1030The Android Open Source Project};
3757df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
3767df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*------------------------------------
3777df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * local variables
3787df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *------------------------------------
3797df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
3807df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
3817df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#if defined(_8_BIT_SAMPLES)
3827df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic const EAS_INT bitDepth = 8;
3837df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#elif defined(_16_BIT_SAMPLES)
3847df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic const EAS_INT bitDepth = 16;
3857df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#else
3867df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#error "Must define _8_BIT_SAMPLES or _16_BIT_SAMPLES"
3877df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif
3887df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
3897df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic const EAS_U32 outputSampleRate = _OUTPUT_SAMPLE_RATE;
3907df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic const EAS_I32 dlsRateConvert = DLS_RATE_CONVERT;
3917df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic const EAS_I32 dlsLFOFrequencyConvert = DLS_LFO_FREQUENCY_CONVERT;
3927df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
3937df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*------------------------------------
3947df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * inline functions
3957df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *------------------------------------
3967df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
3977df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectEAS_INLINE void *PtrOfs (void *p, EAS_I32 offset)
3987df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
39956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return (void*) (((EAS_U8*) p) + offset);
4007df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
4017df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
4027df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*------------------------------------
4037df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * prototypes
4047df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *------------------------------------
4057df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
4067df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT NextChunk (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 *pPos, EAS_U32 *pChunkType, EAS_I32 *pSize);
4077df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_ptbl (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 wsmpPos, EAS_I32 wsmpSize);
4087df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_wave (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_U16 waveIndex);
4097df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_wsmp (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, S_WSMP_DATA *p);
4107df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_fmt (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, S_WSMP_DATA *p);
4117df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_data (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 size, S_WSMP_DATA *p, EAS_SAMPLE *pSample);
4127df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_lins(SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 size);
4137df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_ins (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 size);
4147df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_insh (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_U32 *pRgnCount, EAS_U32 *pLocale);
4157df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_lrgn (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 size, EAS_U16 artIndex, EAS_U32 numRegions);
4167df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_rgn (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 size, EAS_U16 artIndex);
4177df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_rgnh (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, S_DLS_REGION *pRgn);
4187df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_lart (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 size, S_DLS_ART_VALUES *pArt);
4197df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_art (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, S_DLS_ART_VALUES *pArt);
4207df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_wlnk (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_U32 *pWaveIndex);
4217df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_cdl (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 size, EAS_U32 *pValue);
4227df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic void Convert_rgn (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_U16 regionIndex, EAS_U16 artIndex, EAS_U16 waveIndex, S_WSMP_DATA *pWsmp);
4237df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic void Convert_art (SDLS_SYNTHESIZER_DATA *pDLSData, const S_DLS_ART_VALUES *pDLSArt,  EAS_U16 artIndex);
4247df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_I16 ConvertSampleRate (EAS_U32 sampleRate);
4257df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_I16 ConvertSustain (EAS_I32 sustain);
4267df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_I16 ConvertLFOPhaseIncrement (EAS_I32 pitchCents);
4277df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_I8 ConvertPan (EAS_I32 pan);
4287df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_U8 ConvertQ (EAS_I32 q);
4297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
4307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#ifdef _DEBUG_DLS
4317df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic void DumpDLS (S_EAS *pEAS);
4327df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif
4337df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
4347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
4357df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
4367df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * DLSParser ()
4377df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
43856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
43956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
44056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
4417df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * pEASData - pointer to over EAS data instance
4427df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * fileHandle - file handle for input file
4437df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * offset - offset into file where DLS data starts
44456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
4457df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
4467df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * EAS_RESULT
4477df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * ppEAS - address of pointer to alternate EAS wavetable
4487df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
4497df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
4507df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
4517df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectEAS_RESULT DLSParser (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE fileHandle, EAS_I32 offset, EAS_DLSLIB_HANDLE *ppDLS)
4527df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
45356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
45456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    SDLS_SYNTHESIZER_DATA dls;
45556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 temp;
45656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 pos;
45756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 chunkPos;
45856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 size;
45956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 instSize;
46056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 rgnPoolSize;
46156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 artPoolSize;
46256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 waveLenSize;
46356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 endDLS;
46456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 wvplPos;
46556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 wvplSize;
46656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 linsPos;
46756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 linsSize;
46856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 ptblPos;
46956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 ptblSize;
47056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    void *p;
47156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
47256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* zero counts and pointers */
47356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_HWMemSet(&dls, 0, sizeof(dls));
47456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
47556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* save file handle and hwInstData to save copying pointers around */
47656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    dls.hwInstData = hwInstData;
47756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    dls.fileHandle = fileHandle;
47856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
47956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* NULL return value in case of error */
48056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *ppDLS = NULL;
48156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
48256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* seek to start of DLS and read in RIFF tag and set processor endian flag */
48356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(dls.hwInstData, dls.fileHandle, offset)) != EAS_SUCCESS)
48456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
48556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWReadFile(dls.hwInstData, dls.fileHandle, &temp, sizeof(temp), &size)) != EAS_SUCCESS)
48656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
48756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
48856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check for processor endian-ness */
48956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    dls.bigEndian = (temp == CHUNK_RIFF);
49056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
49156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* first chunk should be DLS */
49256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pos = offset;
49356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = NextChunk(&dls, &pos, &temp, &size)) != EAS_SUCCESS)
49456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
49556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (temp != CHUNK_DLS)
49656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
49756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Expected DLS chunk, got %08lx\n", temp); */ }
49856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FILE_FORMAT;
49956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
50056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
50156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* no instrument or wavepool chunks */
50256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    linsSize = wvplSize = ptblSize = linsPos = wvplPos = ptblPos = 0;
50356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
50456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* scan the chunks in the DLS list */
50556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    endDLS = offset + size;
50656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pos = offset + 12;
50756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    while (pos < endDLS)
50856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
50956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        chunkPos = pos;
51056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
51156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* get the next chunk type */
51256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = NextChunk(&dls, &pos, &temp, &size)) != EAS_SUCCESS)
51356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
51456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
51556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* parse useful chunks */
51656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        switch (temp)
51756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
51856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case CHUNK_CDL:
51956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if ((result = Parse_cdl(&dls, size, &temp)) != EAS_SUCCESS)
52056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return result;
52156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (!temp)
52256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return EAS_ERROR_UNRECOGNIZED_FORMAT;
52356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
52456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
52556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case CHUNK_LINS:
52656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                linsPos = chunkPos + 12;
52756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                linsSize = size - 4;
52856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
52956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
53056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case CHUNK_WVPL:
53156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                wvplPos = chunkPos + 12;
53256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                wvplSize = size - 4;
53356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
53456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
53556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case CHUNK_PTBL:
53656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                ptblPos = chunkPos + 8;
53756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                ptblSize = size - 4;
53856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
53956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
54056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            default:
54156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
54256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
54356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
54456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
54556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* must have a lins chunk */
54656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (linsSize == 0)
54756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
54856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "No lins chunk found"); */ }
54956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_UNRECOGNIZED_FORMAT;
55056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
55156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
55256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* must have a wvpl chunk */
55356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (wvplSize == 0)
55456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
55556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "No wvpl chunk found"); */ }
55656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_UNRECOGNIZED_FORMAT;
55756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
55856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
55956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* must have a ptbl chunk */
56056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((ptblSize == 0) || (ptblSize > DLS_MAX_WAVE_COUNT * sizeof(POOLCUE) + sizeof(POOLTABLE)))
56156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
56256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "No ptbl chunk found"); */ }
56356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_UNRECOGNIZED_FORMAT;
56456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
56556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
56656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* pre-parse the wave pool chunk */
56756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = Parse_ptbl(&dls, ptblPos, wvplPos, wvplSize)) != EAS_SUCCESS)
56856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
56956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
57056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* limit check  */
57156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((dls.waveCount == 0) || (dls.waveCount > DLS_MAX_WAVE_COUNT))
57256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
57356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "DLS file contains invalid #waves [%u]\n", dls.waveCount); */ }
57456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FILE_FORMAT;
57556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
57656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
57756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* allocate memory for wsmp data */
57856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    dls.wsmpData = EAS_HWMalloc(dls.hwInstData, (EAS_I32) (sizeof(S_WSMP_DATA) * dls.waveCount));
57956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (dls.wsmpData == NULL)
58056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
58156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "EAS_HWMalloc for wsmp data failed\n"); */ }
58256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_MALLOC_FAILED;
58356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
58456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_HWMemSet(dls.wsmpData, 0, (EAS_I32) (sizeof(S_WSMP_DATA) * dls.waveCount));
58556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
58656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* pre-parse the lins chunk */
58756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    result = Parse_lins(&dls, linsPos, linsSize);
58856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (result == EAS_SUCCESS)
58956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
59056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
59156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* limit check  */
59256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((dls.regionCount == 0) || (dls.regionCount > DLS_MAX_REGION_COUNT))
59356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
59456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "DLS file contains invalid #regions [%u]\n", dls.regionCount); */ }
59556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_FILE_FORMAT;
59656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
59756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
59856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* limit check  */
59956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((dls.artCount == 0) || (dls.artCount > DLS_MAX_ART_COUNT))
60056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
60156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "DLS file contains invalid #articulations [%u]\n", dls.regionCount); */ }
60256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_FILE_FORMAT;
60356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
60456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
60556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* limit check  */
60656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((dls.instCount == 0) || (dls.instCount > DLS_MAX_INST_COUNT))
60756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
60856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "DLS file contains invalid #instruments [%u]\n", dls.instCount); */ }
60956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_FILE_FORMAT;
61056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
61156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
61256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* Allocate memory for the converted DLS data */
61356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* calculate size of instrument data */
61456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        instSize = (EAS_I32) (sizeof(S_PROGRAM) * dls.instCount);
61556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
61656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* calculate size of region pool */
61756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        rgnPoolSize = (EAS_I32) (sizeof(S_DLS_REGION) * dls.regionCount);
61856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
61956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* calculate size of articulation pool, add one for default articulation */
62056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        dls.artCount++;
62156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        artPoolSize = (EAS_I32) (sizeof(S_DLS_ARTICULATION) * dls.artCount);
62256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
62356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* calculate size of wave length and offset arrays */
62456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        waveLenSize = (EAS_I32) (dls.waveCount * sizeof(EAS_U32));
62556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
62656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* calculate final memory size */
62756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        size = (EAS_I32) sizeof(S_EAS) + instSize + rgnPoolSize + artPoolSize + (2 * waveLenSize) + (EAS_I32) dls.wavePoolSize;
62856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (size <= 0) {
62956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_FILE_FORMAT;
63056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
63156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
63256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* allocate the main EAS chunk */
63356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        dls.pDLS = EAS_HWMalloc(dls.hwInstData, size);
63456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (dls.pDLS == NULL)
63556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
63656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "EAS_HWMalloc failed for DLS memory allocation size %ld\n", size); */ }
63756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_MALLOC_FAILED;
63856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
63956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_HWMemSet(dls.pDLS, 0, size);
64056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        dls.pDLS->refCount = 1;
64156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        p = PtrOfs(dls.pDLS, sizeof(S_EAS));
64256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
64356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* setup pointer to programs */
64456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        dls.pDLS->numDLSPrograms = (EAS_U16) dls.instCount;
64556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        dls.pDLS->pDLSPrograms = p;
64656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        p = PtrOfs(p, instSize);
64756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
64856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* setup pointer to regions */
64956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        dls.pDLS->pDLSRegions = p;
65056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        dls.pDLS->numDLSRegions = (EAS_U16) dls.regionCount;
65156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        p = PtrOfs(p, rgnPoolSize);
65256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
65356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* setup pointer to articulations */
65456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        dls.pDLS->numDLSArticulations = (EAS_U16) dls.artCount;
65556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        dls.pDLS->pDLSArticulations = p;
65656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        p = PtrOfs(p, artPoolSize);
65756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
65856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* setup pointer to wave length table */
65956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        dls.pDLS->numDLSSamples = (EAS_U16) dls.waveCount;
66056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        dls.pDLS->pDLSSampleLen = p;
66156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        p = PtrOfs(p, waveLenSize);
66256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
66356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* setup pointer to wave offsets table */
66456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        dls.pDLS->pDLSSampleOffsets = p;
66556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        p = PtrOfs(p, waveLenSize);
66656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
66756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* setup pointer to wave pool */
66856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        dls.pDLS->pDLSSamples = p;
66956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
67056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* clear filter flag */
67156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        dls.filterUsed = EAS_FALSE;
67256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
67356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* parse the wave pool and load samples */
67456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        result = Parse_ptbl(&dls, ptblPos, wvplPos, wvplSize);
67556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
67656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
67756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* create the default articulation */
67856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    Convert_art(&dls, &defaultArt, 0);
67956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    dls.artCount = 1;
68056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
68156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* parse the lins chunk and load instruments */
68256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    dls.regionCount = dls.instCount = 0;
68356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (result == EAS_SUCCESS)
68456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        result = Parse_lins(&dls, linsPos, linsSize);
68556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
68656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* clean up any temporary objects that were allocated */
68756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (dls.wsmpData)
68856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_HWFree(dls.hwInstData, dls.wsmpData);
68956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
69056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if successful, return a pointer to the EAS collection */
69156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (result == EAS_SUCCESS)
69256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
69356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        *ppDLS = dls.pDLS;
6947df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#ifdef _DEBUG_DLS
69556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        DumpDLS(dls.pDLS);
6967df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif
69756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
6987df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
69956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* something went wrong, deallocate the EAS collection */
70056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else
70156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        DLSCleanup(dls.hwInstData, dls.pDLS);
7027df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
70356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return result;
7047df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
7057df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
7067df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
7077df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * DLSCleanup ()
7087df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
70956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
71056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
71156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
7127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * pEASData - pointer to over EAS data instance
7137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * pEAS - pointer to alternate EAS wavetable
71456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
7157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
7167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * EAS_RESULT
7177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
7187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
7197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
7207df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectEAS_RESULT DLSCleanup (EAS_HW_DATA_HANDLE hwInstData, S_DLS *pDLS)
7217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
7227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
72356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* free the allocated memory */
72456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pDLS)
72556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
72656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pDLS->refCount)
72756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
72856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (--pDLS->refCount == 0)
72956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                EAS_HWFree(hwInstData, pDLS);
73056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
73156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
73256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
7337df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
7347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
7357df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
7367df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * DLSAddRef ()
7377df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
7387df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Increment reference count
7397df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
7407df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
7417df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectvoid DLSAddRef (S_DLS *pDLS)
7427df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
74356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pDLS)
74456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pDLS->refCount++;
7457df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
7467df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
7477df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
7487df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * NextChunk ()
7497df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
75056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
7517df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Returns the type and size of the next chunk in the file
7527df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
75356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
75456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
7557df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
7567df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
7577df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects:
7587df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
7597df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
7607df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT NextChunk (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 *pPos, EAS_U32 *pChunkType, EAS_I32 *pSize)
7617df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
76256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
76356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
76456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* seek to start of chunk */
76556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, *pPos)) != EAS_SUCCESS)
76656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
76756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
76856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* read the chunk type */
76956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, pChunkType, EAS_TRUE)) != EAS_SUCCESS)
77056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
77156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
77256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* read the chunk size */
77356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, pSize, EAS_FALSE)) != EAS_SUCCESS)
77456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
77556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
77656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get form type for RIFF and LIST types */
77756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((*pChunkType == CHUNK_RIFF) || (*pChunkType == CHUNK_LIST))
77856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
77956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
78056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* read the form type */
78156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, pChunkType, EAS_TRUE)) != EAS_SUCCESS)
78256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
78356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
78456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
78556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
78656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* calculate start of next chunk */
78756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pPos += *pSize + 8;
78856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
78956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* adjust to word boundary */
79056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (*pPos & 1)
79156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        (*pPos)++;
79256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
79356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
7947df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
7957df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
7967df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
7977df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Parse_ptbl ()
7987df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
79956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
80056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
8017df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
8027df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
80356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
80456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
8057df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
80656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
8077df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
8087df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
8097df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
8107df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_ptbl (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 wtblPos, EAS_I32 wtblSize)
8117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
81256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
81356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 temp;
81456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_FILE_HANDLE tempFile;
81556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16 waveIndex;
8167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
81756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* seek to start of chunk */
81856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
81956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
8207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
82156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the structure size */
82256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &temp, EAS_FALSE)) != EAS_SUCCESS)
82356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
8247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
82556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the number of waves */
82656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &pDLSData->waveCount, EAS_FALSE)) != EAS_SUCCESS)
82756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
8287df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
8297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#if 0
83056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* just need the wave count on the first pass */
83156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!pDLSData->pDLS)
83256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_SUCCESS;
8337df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif
8347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
83556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* open duplicate file handle */
83656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWDupHandle(pDLSData->hwInstData, pDLSData->fileHandle, &tempFile)) != EAS_SUCCESS)
83756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
83856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
83956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* read to end of chunk */
84056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (waveIndex = 0; waveIndex < pDLSData->waveCount; waveIndex++)
84156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
84256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
84356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* get the offset to the wave and make sure it is within the wtbl chunk */
84456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWGetDWord(pDLSData->hwInstData, tempFile, &temp, EAS_FALSE)) != EAS_SUCCESS)
84556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
84656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (temp > (EAS_U32) wtblSize)
84756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
84856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Ptbl offset exceeds size of wtbl\n"); */ }
84956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            EAS_HWCloseFile(pDLSData->hwInstData, tempFile);
85056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_FILE_FORMAT;
85156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
85256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
85356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* parse the wave */
85456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = Parse_wave(pDLSData, wtblPos +(EAS_I32)  temp, waveIndex)) != EAS_SUCCESS)
85556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
85656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
85756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
85856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* close the temporary handle and return */
85956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_HWCloseFile(pDLSData->hwInstData, tempFile);
86056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
8617df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
8627df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
8637df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
8647df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Parse_wave ()
8657df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
86656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
86756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
8687df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
8697df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
87056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
87156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
8727df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
87356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
8747df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
8757df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
8767df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
8777df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_wave (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_U16 waveIndex)
8787df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
87956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
88056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 temp;
88156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 size;
88256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 endChunk;
88356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 chunkPos;
88456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 wsmpPos = 0;
88556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 fmtPos = 0;
88656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 dataPos = 0;
88756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 dataSize = 0;
88856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_WSMP_DATA *p;
88956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    void *pSample;
89056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_WSMP_DATA wsmp;
89156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
89256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* seek to start of chunk */
89356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    chunkPos = pos + 12;
89456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
89556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
89656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
89756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the chunk type */
89856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = NextChunk(pDLSData, &pos, &temp, &size)) != EAS_SUCCESS)
89956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
90056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
90156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* make sure it is a wave chunk */
90256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (temp != CHUNK_WAVE)
90356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
90456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Offset in ptbl does not point to wave chunk\n"); */ }
90556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FILE_FORMAT;
90656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
90756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
90856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* read to end of chunk */
90956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pos = chunkPos;
91056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    endChunk = pos + size;
91156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    while (pos < endChunk)
91256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
91356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        chunkPos = pos;
91456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
91556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* get the chunk type */
91656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = NextChunk(pDLSData, &pos, &temp, &size)) != EAS_SUCCESS)
91756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
91856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
91956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* parse useful chunks */
92056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        switch (temp)
92156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
92256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case CHUNK_WSMP:
92356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                wsmpPos = chunkPos + 8;
92456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
92556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
92656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case CHUNK_FMT:
92756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                fmtPos = chunkPos + 8;
92856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
92956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
93056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case CHUNK_DATA:
93156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                dataPos = chunkPos + 8;
93256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                dataSize = size;
93356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
93456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
93556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            default:
93656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
93756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
93856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
93956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
94056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    // limit to reasonable size
94156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (dataSize > MAX_DLS_WAVE_SIZE)
94256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
94356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_SOUND_LIBRARY;
94456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
94556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
94656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* for first pass, use temporary variable */
94756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pDLSData->pDLS == NULL)
94856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        p = &wsmp;
94956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else
95056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        p = &pDLSData->wsmpData[waveIndex];
95156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
95256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* set the defaults */
95356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    p->fineTune = 0;
95456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    p->unityNote = 60;
95556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    p->gain = 0;
95656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    p->loopStart = 0;
95756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    p->loopLength = 0;
95856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
95956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* must have a fmt chunk */
96056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!fmtPos)
96156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
96256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "DLS wave chunk has no fmt chunk\n"); */ }
96356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_UNRECOGNIZED_FORMAT;
96456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
96556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
96656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* must have a data chunk */
96756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!dataPos)
96856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
96956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "DLS wave chunk has no data chunk\n"); */ }
97056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_UNRECOGNIZED_FORMAT;
97156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
97256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
97356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* parse the wsmp chunk */
97456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (wsmpPos)
97556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
97656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = Parse_wsmp(pDLSData, wsmpPos, p)) != EAS_SUCCESS)
97756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
97856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
97956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
98056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* parse the fmt chunk */
98156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = Parse_fmt(pDLSData, fmtPos, p)) != EAS_SUCCESS)
98256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
98356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
98456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* calculate the size of the wavetable needed. We need only half
98556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     * the memory for 16-bit samples when in 8-bit mode, and we need
98656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     * double the memory for 8-bit samples in 16-bit mode. For
98756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     * unlooped samples, we may use ADPCM. If so, we need only 1/4
98856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     * the memory.
98956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     *
99056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     * We also need to add one for looped samples to allow for
99156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     * the first sample to be copied to the end of the loop.
99256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     */
99356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
99456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* use ADPCM encode for unlooped 16-bit samples if ADPCM is enabled */
99556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e{506} -e{774} groundwork for future version to support 8 & 16 bit */
99656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (bitDepth == 8)
99756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
99856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (p->bitsPerSample == 8)
99956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            size = dataSize;
100056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else
100156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /*lint -e{704} use shift for performance */
100256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            size = dataSize >> 1;
100356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (p->loopLength)
100456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            size++;
100556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
100656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
100756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else
100856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
100956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (p->bitsPerSample == 16)
101056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            size = dataSize;
101156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else
101256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /*lint -e{703} use shift for performance */
101356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            size = dataSize << 1;
101456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (p->loopLength)
101556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            size += 2;
101656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
101756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
101856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* for first pass, add size to wave pool size and return */
101956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pDLSData->pDLS == NULL)
102056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
102156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pDLSData->wavePoolSize += (EAS_U32) size;
102256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_SUCCESS;
102356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
102456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
102556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* allocate memory and read in the sample data */
102656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSample = pDLSData->pDLS->pDLSSamples + pDLSData->wavePoolOffset;
102756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pDLSData->pDLS->pDLSSampleOffsets[waveIndex] = pDLSData->wavePoolOffset;
102856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pDLSData->pDLS->pDLSSampleLen[waveIndex] = (EAS_U32) size;
102956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pDLSData->wavePoolOffset += (EAS_U32) size;
103056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pDLSData->wavePoolOffset > pDLSData->wavePoolSize)
103156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
103256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Wave pool exceeded allocation\n"); */ }
103356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_SOUND_LIBRARY;
103456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
103556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
103656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = Parse_data(pDLSData, dataPos, dataSize, p, pSample)) != EAS_SUCCESS)
103756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
103856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
103956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
10407df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
10417df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
10427df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
10437df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Parse_wsmp ()
10447df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
104556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
104656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
10477df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
10487df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
104956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
105056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
10517df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
105256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
10537df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
10547df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
10557df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
10567df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_wsmp (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, S_WSMP_DATA *p)
10577df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
105856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
105956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16 wtemp;
106056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 ltemp;
106156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 cbSize;
106256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
106356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* seek to start of chunk */
106456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
106556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
106656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
106756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get structure size */
106856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &cbSize, EAS_FALSE)) != EAS_SUCCESS)
106956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
107056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
107156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get unity note */
107256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &wtemp, EAS_FALSE)) != EAS_SUCCESS)
107356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
107456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (wtemp <= 127)
107556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        p->unityNote = (EAS_U8) wtemp;
107656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else
107756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
107856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        p->unityNote = 60;
107956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Invalid unity note [%u] in DLS wsmp ignored, set to 60\n", wtemp); */ }
108056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
108156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
108256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get fine tune */
108356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &p->fineTune, EAS_FALSE)) != EAS_SUCCESS)
108456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
108556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
108656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get gain */
108756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &p->gain, EAS_FALSE)) != EAS_SUCCESS)
108856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
108956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (p->gain > 0)
109056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
109156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Positive gain [%ld] in DLS wsmp ignored, set to 0dB\n", p->gain); */ }
109256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        p->gain = 0;
109356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
109456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
109556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* option flags */
109656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &ltemp, EAS_FALSE)) != EAS_SUCCESS)
109756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
109856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
109956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* sample loops */
110056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &ltemp, EAS_FALSE)) != EAS_SUCCESS)
110156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
110256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
110356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if looped sample, get loop data */
110456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (ltemp)
110556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
110656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
110756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (ltemp > 1)
110856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "DLS sample with %lu loops, ignoring extra loops\n", ltemp); */ }
110956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
111056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* skip ahead to loop data */
111156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos + (EAS_I32) cbSize)) != EAS_SUCCESS)
111256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
111356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
111456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* get structure size */
111556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &ltemp, EAS_FALSE)) != EAS_SUCCESS)
111656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
111756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
111856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* get loop type */
111956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &ltemp, EAS_FALSE)) != EAS_SUCCESS)
112056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
112156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
112256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* get loop start */
112356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &p->loopStart, EAS_FALSE)) != EAS_SUCCESS)
112456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
112556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
112656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* get loop length */
112756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &p->loopLength, EAS_FALSE)) != EAS_SUCCESS)
112856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
112956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
113056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
113156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
11327df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
11337df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
11347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
11357df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Parse_fmt ()
11367df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
113756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
113856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
11397df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
11407df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
114156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
114256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
11437df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
114456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
11457df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
11467df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
11477df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
11487df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_fmt (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, S_WSMP_DATA *p)
11497df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
115056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
115156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16 wtemp;
115256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 ltemp;
115356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
115456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* seek to start of chunk */
115556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
115656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
115756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
115856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get format tag */
115956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &wtemp, EAS_FALSE)) != EAS_SUCCESS)
116056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
116156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (wtemp != WAVE_FORMAT_PCM)
116256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
116356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Unsupported DLS sample format %04x\n", wtemp); */ }
116456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_UNRECOGNIZED_FORMAT;
116556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
116656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
116756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get number of channels */
116856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &wtemp, EAS_FALSE)) != EAS_SUCCESS)
116956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
117056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (wtemp != 1)
117156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
117256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "No support for DLS multi-channel samples\n"); */ }
117356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_UNRECOGNIZED_FORMAT;
117456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
117556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
117656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get sample rate */
117756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &p->sampleRate, EAS_FALSE)) != EAS_SUCCESS)
117856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
117956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
118056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* bytes/sec */
118156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &ltemp, EAS_FALSE)) != EAS_SUCCESS)
118256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
118356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
118456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* block align */
118556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &wtemp, EAS_FALSE)) != EAS_SUCCESS)
118656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
118756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
118856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* bits/sample */
118956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &p->bitsPerSample, EAS_FALSE)) != EAS_SUCCESS)
119056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
119156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
119256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((p->bitsPerSample != 8) && (p->bitsPerSample != 16))
119356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
119456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Unsupported DLS bits-per-sample %d\n", p->bitsPerSample); */ }
119556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_UNRECOGNIZED_FORMAT;
119656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
119756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
119856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
11997df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
12007df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
12017df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#if defined( _8_BIT_SAMPLES)
12027df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
12037df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Parse_data ()
12047df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
120556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
120656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
12077df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * NOTE: The optimized assembly versions of the interpolator require
12087df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * an extra sample at the end of the loop - a copy of the first
12097df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * sample. This routine must allocate an extra sample of data and
12107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * copy the first sample of the loop to the end.
12117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
12127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
121356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
121456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
12157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
121656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
12177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
12187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
12197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
12207df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_data (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 size, S_WSMP_DATA *pWsmp, EAS_SAMPLE *pSample)
12217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
122256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
122356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U8 convBuf[SAMPLE_CONVERT_CHUNK_SIZE];
122456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 count;
122556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 i;
122656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I8 *p;
122756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
122856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* seek to start of chunk */
122956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
123056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
123156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
123256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* 8-bit samples in an 8-bit synth, just copy the data, and flip bit 7 */
123356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    p = pSample;
123456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pWsmp->bitsPerSample == 8)
123556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
123656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWReadFile(pDLSData->hwInstData, pDLSData->fileHandle, pSample, size, &count)) != EAS_SUCCESS)
123756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
123856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        for (i = 0; i < size; i++)
123956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /*lint -e{734} convert from unsigned to signed audio */
124056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            *p++ ^= 0x80;
124156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
124256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
124356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* 16-bit samples, need to convert to 8-bit or ADPCM */
124456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else
124556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
124656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
124756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        while (size)
124856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
124956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            EAS_I8 *pInput;
125056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
125156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* for undithered conversion, we're just copying the 8-bit data */
125256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (pDLSData->bigEndian)
125356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pInput = (EAS_I8*) convBuf;
125456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            else
125556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pInput = (EAS_I8*) convBuf + 1;
125656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
125756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* read a small chunk of data and convert it */
125856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            count = (size < SAMPLE_CONVERT_CHUNK_SIZE ? size : SAMPLE_CONVERT_CHUNK_SIZE);
125956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = EAS_HWReadFile(pDLSData->hwInstData, pDLSData->fileHandle, convBuf, count, &count)) != EAS_SUCCESS)
126056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
126156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            size -= count;
126256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /*lint -e{704} use shift for performance */
126356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            count = count >> 1;
126456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
126556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            while (count--)
126656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
126756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                *p++ = *pInput;
126856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pInput += 2;
126956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
127056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
127156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
127256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
127356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* for looped samples, copy the last sample to the end */
127456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pWsmp->loopLength)
127556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pSample[pWsmp->loopStart + pWsmp->loopLength] = pSample[pWsmp->loopStart];
127656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
127756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
12787df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
12797df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#elif defined(_16_BIT_SAMPLES)
12807df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#error "16-bit DLS conversion not implemented yet"
12817df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#else
12827df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#error "Must specifiy _8_BIT_SAMPLES or _16_BIT_SAMPLES"
12837df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif
12847df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
12857df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
12867df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Parse_lins ()
12877df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
128856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
128956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
12907df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
12917df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
129256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
129356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
12947df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
129556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
12967df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
12977df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
12987df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
12997df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_lins (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 size)
13007df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
130156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
130256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 temp;
130356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 endChunk;
130456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 chunkPos;
130556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
130656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* seek to start of chunk */
130756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
130856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
130956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
131056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* read to end of chunk */
131156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    endChunk = pos + size;
131256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    while (pos < endChunk)
131356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
131456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        chunkPos = pos;
131556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
131656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* get the next chunk type */
131756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = NextChunk(pDLSData, &pos, &temp, &size)) != EAS_SUCCESS)
131856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
131956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
132056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* only instrument chunks are useful */
132156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (temp != CHUNK_INS)
132256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            continue;
132356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
132456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = Parse_ins(pDLSData, chunkPos + 12, size)) != EAS_SUCCESS)
132556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
132656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
132756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
132856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
13297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
13307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
13317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
13327df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Parse_ins ()
13337df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
133456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
133556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
13367df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
13377df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
133856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
133956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
13407df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
134156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
13427df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
13437df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
13447df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
13457df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_ins (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 size)
13467df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
134756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
134856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 temp;
134956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 chunkPos;
135056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 endChunk;
135156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 lrgnPos;
135256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 lrgnSize;
135356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 lartPos;
135456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 lartSize;
135556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 lar2Pos;
135656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 lar2Size;
135756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 inshPos;
135856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 regionCount;
135956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 locale;
136056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_DLS_ART_VALUES art;
136156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_PROGRAM *pProgram;
136256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16 artIndex;
136356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
136456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* seek to start of chunk */
136556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
136656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
136756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
136856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* no chunks yet */
136956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    lrgnPos = lrgnSize = lartPos = lartSize = lar2Pos = lar2Size = inshPos = artIndex = 0;
137056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
137156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* read to end of chunk */
137256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    endChunk = pos + size;
137356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    while (pos < endChunk)
137456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
137556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        chunkPos = pos;
137656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
137756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* get the next chunk type */
137856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = NextChunk(pDLSData, &pos, &temp, &size)) != EAS_SUCCESS)
137956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
138056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
138156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* parse useful chunks */
138256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        switch (temp)
138356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
138456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case CHUNK_INSH:
138556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                inshPos = chunkPos + 8;
138656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
138756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
138856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case CHUNK_LART:
138956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                lartPos = chunkPos + 12;
139056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                lartSize = size;
139156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
139256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
139356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case CHUNK_LAR2:
139456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                lar2Pos = chunkPos + 12;
139556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                lar2Size = size;
139656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
139756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
139856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case CHUNK_LRGN:
139956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                lrgnPos = chunkPos + 12;
140056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                lrgnSize = size;
140156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
140256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
140356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            default:
140456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
140556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
140656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
140756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
140856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* must have an lrgn to be useful */
140956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!lrgnPos)
141056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
141156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "DLS ins chunk has no lrgn chunk\n"); */ }
141256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_UNRECOGNIZED_FORMAT;
141356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
141456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
141556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* must have an insh to be useful */
141656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!inshPos)
141756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
141856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "DLS ins chunk has no insh chunk\n"); */ }
141956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_UNRECOGNIZED_FORMAT;
142056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
142156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
142256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* parse the instrument header */
142356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = Parse_insh(pDLSData, inshPos, &regionCount, &locale)) != EAS_SUCCESS)
142456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
142556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
142656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* initialize and parse the global data first */
142756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_HWMemCpy(&art, &defaultArt, sizeof(S_DLS_ART_VALUES));
142856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (lartPos)
142956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = Parse_lart(pDLSData, lartPos, lartSize, &art)) != EAS_SUCCESS)
143056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
143156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (lar2Pos)
143256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = Parse_lart(pDLSData, lar2Pos, lar2Size, &art)) != EAS_SUCCESS)
143356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
143456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
143556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (art.values[PARAM_MODIFIED])
143656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
143756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        artIndex = (EAS_U16) pDLSData->artCount;
143856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pDLSData->artCount++;
143956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
144056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
144156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* convert data on second pass */
144256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pDLSData->pDLS)
144356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
144456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
144556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (art.values[PARAM_MODIFIED])
144656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            Convert_art(pDLSData, &art, artIndex);
144756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
144856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* setup pointers */
144956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pProgram = &pDLSData->pDLS->pDLSPrograms[pDLSData->instCount];
145056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
145156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* initialize instrument */
145256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pProgram->locale = locale;
145356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pProgram->regionIndex = (EAS_U16) pDLSData->regionCount | FLAG_RGN_IDX_DLS_SYNTH;
145456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
145556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
145656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
145756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* parse the region data */
145856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = Parse_lrgn(pDLSData, lrgnPos, lrgnSize, artIndex, regionCount)) != EAS_SUCCESS)
145956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
146056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
146156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* bump instrument count */
146256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pDLSData->instCount++;
146356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
14647df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
14657df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
14667df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
14677df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Parse_insh ()
14687df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
146956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
147056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
14717df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
14727df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
147356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
147456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
14757df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
147656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
14777df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
14787df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
14797df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
14807df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_insh (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_U32 *pRgnCount, EAS_U32 *pLocale)
14817df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
148256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
148356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 bank;
148456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 program;
148556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
148656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* seek to start of chunk */
148756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
148856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
148956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
149056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the region count and locale */
149156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, pRgnCount, EAS_FALSE)) != EAS_SUCCESS)
149256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
149356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &bank, EAS_FALSE)) != EAS_SUCCESS)
149456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
149556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &program, EAS_FALSE)) != EAS_SUCCESS)
149656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
149756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
149856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* verify the parameters are valid */
149956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (bank & 0x7fff8080)
150056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
150156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "DLS bank number is out of range: %08lx\n", bank); */ }
150256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        bank &= 0xff7f;
150356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
150456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (program > 127)
150556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
150656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "DLS program number is out of range: %08lx\n", program); */ }
150756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        program &= 0x7f;
150856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
150956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
151056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* save the program number */
151156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pLocale = (bank << 8) | program;
151256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
15137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
15147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
15157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
15167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Parse_lrgn ()
15177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
151856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
151956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
15207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
15217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
152256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
152356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
15247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
152556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
15267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
15277df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
15287df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
15297df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_lrgn (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 size, EAS_U16 artIndex, EAS_U32 numRegions)
15307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
153156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
153256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 temp;
153356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 chunkPos;
153456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 endChunk;
153556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16 regionCount;
153656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
153756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* seek to start of chunk */
153856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
153956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
154056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
154156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* read to end of chunk */
154256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    regionCount = 0;
154356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    endChunk = pos + size;
154456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    while (pos < endChunk)
154556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
154656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        chunkPos = pos;
154756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
154856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* get the next chunk type */
154956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = NextChunk(pDLSData, &pos, &temp, &size)) != EAS_SUCCESS)
155056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
155156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
155256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((temp == CHUNK_RGN) || (temp == CHUNK_RGN2))
155356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
155456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (regionCount == numRegions)
155556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
155656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "DLS region count exceeded cRegions value in insh, extra region ignored\n"); */ }
155756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return EAS_SUCCESS;
155856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
155956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = Parse_rgn(pDLSData, chunkPos + 12, size, artIndex)) != EAS_SUCCESS)
156056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
156156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            regionCount++;
156256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
156356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
156456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
156556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* set a flag in the last region */
156656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((pDLSData->pDLS != NULL) && (regionCount > 0))
156756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pDLSData->pDLS->pDLSRegions[pDLSData->regionCount - 1].wtRegion.region.keyGroupAndFlags |= REGION_FLAG_LAST_REGION;
156856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
156956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
15707df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
15717df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
15727df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
15737df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Parse_rgn ()
15747df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
157556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
157656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
15777df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
15787df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
157956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
158056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
15817df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
158256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
15837df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
15847df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
15857df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
15867df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_rgn (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 size, EAS_U16 artIndex)
15877df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
158856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
158956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 temp;
159056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 chunkPos;
159156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 endChunk;
159256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 rgnhPos;
159356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 lartPos;
159456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 lartSize;
159556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 lar2Pos;
159656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 lar2Size;
159756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 wlnkPos;
159856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 wsmpPos;
159956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 waveIndex;
160056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_DLS_ART_VALUES art;
160156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_WSMP_DATA wsmp;
160256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_WSMP_DATA *pWsmp;
160356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16 regionIndex;
160456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
160556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* seek to start of chunk */
160656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
160756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
160856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
160956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* no chunks found yet */
161056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    rgnhPos = lartPos = lartSize = lar2Pos = lar2Size = wsmpPos = wlnkPos = 0;
161156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    regionIndex = (EAS_U16) pDLSData->regionCount;
161256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
161356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* read to end of chunk */
161456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    endChunk = pos + size;
161556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    while (pos < endChunk)
161656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
161756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        chunkPos = pos;
161856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
161956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* get the next chunk type */
162056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = NextChunk(pDLSData, &pos, &temp, &size)) != EAS_SUCCESS)
162156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
162256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
162356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* parse useful chunks */
162456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        switch (temp)
162556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
162656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case CHUNK_CDL:
162756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if ((result = Parse_cdl(pDLSData, size, &temp)) != EAS_SUCCESS)
162856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return result;
162956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
163056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                /* if conditional chunk evaluates false, skip this list */
163156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (!temp)
163256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return EAS_SUCCESS;
163356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
163456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
163556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case CHUNK_RGNH:
163656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                rgnhPos = chunkPos + 8;
163756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
163856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
163956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case CHUNK_WLNK:
164056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                wlnkPos = chunkPos + 8;
164156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
164256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
164356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case CHUNK_WSMP:
164456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                wsmpPos = chunkPos + 8;
164556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
164656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
164756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case CHUNK_LART:
164856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                lartPos = chunkPos + 12;
164956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                lartSize = size;
165056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
165156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
165256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case CHUNK_LAR2:
165356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                lar2Pos = chunkPos + 12;
165456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                lar2Size = size;
165556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
165656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
165756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            default:
165856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
165956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
166056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
166156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
166256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* must have a rgnh chunk to be useful */
166356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!rgnhPos)
166456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
166556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "DLS rgn chunk has no rgnh chunk\n"); */ }
166656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_UNRECOGNIZED_FORMAT;
166756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
166856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
166956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* must have a wlnk chunk to be useful */
167056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!wlnkPos)
167156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
167256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "DLS rgn chunk has no wlnk chunk\n"); */ }
167356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_UNRECOGNIZED_FORMAT;
167456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
167556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
167656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* parse wlnk chunk */
167756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = Parse_wlnk(pDLSData, wlnkPos, &waveIndex)) != EAS_SUCCESS)
167856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
167956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pWsmp = &pDLSData->wsmpData[waveIndex];
168056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
168156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if there is any articulation data, parse it */
168256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_HWMemCpy(&art, &defaultArt, sizeof(S_DLS_ART_VALUES));
168356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (lartPos)
168456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
168556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = Parse_lart(pDLSData, lartPos, lartSize, &art)) != EAS_SUCCESS)
168656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
168756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
168856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
168956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (lar2Pos)
169056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
169156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = Parse_lart(pDLSData, lar2Pos, lar2Size, &art)) != EAS_SUCCESS)
169256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
169356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
169456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
169556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if second pass, process region header */
169656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pDLSData->pDLS)
169756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
169856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
169956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* if local data was found convert it */
170056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (art.values[PARAM_MODIFIED] == EAS_TRUE)
170156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
170256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            Convert_art(pDLSData, &art, (EAS_U16) pDLSData->artCount);
170356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            artIndex = (EAS_U16) pDLSData->artCount;
170456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
170556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
170656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* parse region header */
170756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = Parse_rgnh(pDLSData, rgnhPos, &pDLSData->pDLS->pDLSRegions[regionIndex & REGION_INDEX_MASK])) != EAS_SUCCESS)
170856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
170956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
171056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* parse wsmp chunk, copying parameters from original first */
171156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (wsmpPos)
171256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
171356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            EAS_HWMemCpy(&wsmp, pWsmp, sizeof(wsmp));
171456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = Parse_wsmp(pDLSData, wsmpPos, &wsmp)) != EAS_SUCCESS)
171556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
171656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
171756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pWsmp = &wsmp;
171856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
171956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
172056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        Convert_rgn(pDLSData, regionIndex, artIndex, (EAS_U16) waveIndex, pWsmp);
172156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
172256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
172356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if local articulation, bump count */
172456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (art.values[PARAM_MODIFIED])
172556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pDLSData->artCount++;
172656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
172756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* increment region count */
172856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pDLSData->regionCount++;
172956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
17307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
17317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
17327df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
17337df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Parse_rgnh ()
17347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
173556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
173656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
17377df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
17387df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
173956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
174056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
17417df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
174256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
17437df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
17447df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
17457df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
17467df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_rgnh (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, S_DLS_REGION *pRgn)
17477df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
174856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
174956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16 lowKey;
175056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16 highKey;
175156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16 lowVel;
175256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16 highVel;
175356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16 optionFlags;
175456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16 keyGroup;
175556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
175656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* seek to start of chunk */
175756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
175856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
175956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
176056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the key range */
176156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &lowKey, EAS_FALSE)) != EAS_SUCCESS)
176256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
176356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &highKey, EAS_FALSE)) != EAS_SUCCESS)
176456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
176556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
176656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check the range */
176756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (lowKey > 127)
176856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
176956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "DLS rgnh: Low key out of range [%u]\n", lowKey); */ }
177056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        lowKey = 127;
177156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
177256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (highKey > 127)
177356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
177456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "DLS rgnh: High key out of range [%u]\n", lowKey); */ }
177556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        highKey = 127;
177656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
177756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
177856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the velocity range */
177956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &lowVel, EAS_FALSE)) != EAS_SUCCESS)
178056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
178156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &highVel, EAS_FALSE)) != EAS_SUCCESS)
178256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
178356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
178456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check the range */
178556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (lowVel > 127)
178656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
178756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "DLS rgnh: Low velocity out of range [%u]\n", lowVel); */ }
178856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        lowVel = 127;
178956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
179056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (highVel > 127)
179156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
179256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "DLS rgnh: High velocity out of range [%u]\n", highVel); */ }
179356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        highVel = 127;
179456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
179556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
179656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the option flags */
179756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &optionFlags, EAS_FALSE)) != EAS_SUCCESS)
179856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
179956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
180056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the key group */
180156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &keyGroup, EAS_FALSE)) != EAS_SUCCESS)
180256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
180356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
180456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* save the key range and key group */
180556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pRgn->wtRegion.region.rangeLow = (EAS_U8) lowKey;
180656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pRgn->wtRegion.region.rangeHigh = (EAS_U8) highKey;
180756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
180856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e{734} keyGroup will always be from 0-15 */
180956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pRgn->wtRegion.region.keyGroupAndFlags = keyGroup << 8;
181056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pRgn->velLow = (EAS_U8) lowVel;
181156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pRgn->velHigh = (EAS_U8) highVel;
181256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (optionFlags & F_RGN_OPTION_SELFNONEXCLUSIVE)
181356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pRgn->wtRegion.region.keyGroupAndFlags |= REGION_FLAG_NON_SELF_EXCLUSIVE;
181456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
181556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
18167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
18177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
18187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
18197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Parse_lart ()
18207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
182156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
182256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
18237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
18247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
182556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
182656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
18277df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
182856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
18297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
18307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
18317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
18327df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_lart (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I32 size, S_DLS_ART_VALUES *pArt)
18337df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
183456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
183556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 temp;
183656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 endChunk;
183756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 chunkPos;
183856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 art1Pos;
183956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 art2Pos;
184056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
184156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* seek to start of chunk */
184256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
184356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
184456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
184556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* no articulation chunks yet */
184656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    art1Pos = art2Pos = 0;
184756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
184856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* read to end of chunk */
184956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    endChunk = pos + size;
185056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    while (pos < endChunk)
185156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
185256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        chunkPos = pos;
185356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
185456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* get the next chunk type */
185556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = NextChunk(pDLSData, &pos, &temp, &size)) != EAS_SUCCESS)
185656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
185756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
185856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* parse useful chunks */
185956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        switch (temp)
186056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
186156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case CHUNK_CDL:
186256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if ((result = Parse_cdl(pDLSData, size, &temp)) != EAS_SUCCESS)
186356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return result;
186456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
186556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                /* if conditional chunk evaluates false, skip this list */
186656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (!temp)
186756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return EAS_SUCCESS;
186856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
186956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
187056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case CHUNK_ART1:
187156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                art1Pos = chunkPos + 8;
187256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
187356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
187456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case CHUNK_ART2:
187556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                art2Pos = chunkPos + 8;
187656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
187756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
187856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            default:
187956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
188056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
188156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
188256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
188356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
188456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (art1Pos)
188556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
188656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = Parse_art(pDLSData, art1Pos, pArt)) != EAS_SUCCESS)
188756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
188856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
188956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
189056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (art2Pos)
189156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
189256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = Parse_art(pDLSData, art2Pos, pArt)) != EAS_SUCCESS)
189356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
189456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
189556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
189656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
18977df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
18987df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
18997df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
19007df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Parse_art()
19017df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
190256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
190356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
19047df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
19057df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
190656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
190756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
19087df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
190956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
19107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
19117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
19127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
19137df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_art (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, S_DLS_ART_VALUES *pArt)
19147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
191556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
191656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 structSize;
191756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 numConnections;
191856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16 source;
191956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16 control;
192056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16 destination;
192156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16 transform;
192256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 scale;
192356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT i;
192456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
192556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* seek to start of data */
192656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
192756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
192856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
192956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the structure size */
193056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &structSize, EAS_FALSE)) != EAS_SUCCESS)
193156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
193256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pos += (EAS_I32) structSize;
193356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
193456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the number of connections */
193556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &numConnections, EAS_FALSE)) != EAS_SUCCESS)
193656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
193756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
193856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* skip to start of connections */
193956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos)) != EAS_SUCCESS)
194056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
194156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
194256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    while (numConnections--)
194356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
194456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
194556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* read the connection data */
194656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &source, EAS_FALSE)) != EAS_SUCCESS)
194756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
194856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &control, EAS_FALSE)) != EAS_SUCCESS)
194956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
195056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &destination, EAS_FALSE)) != EAS_SUCCESS)
195156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
195256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &transform, EAS_FALSE)) != EAS_SUCCESS)
195356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
195456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &scale, EAS_FALSE)) != EAS_SUCCESS)
195556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
195656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
195756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* look up the connection */
195856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        for (i = 0; i < (EAS_INT) ENTRIES_IN_CONN_TABLE; i++)
195956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
196056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((connTable[i].source == source) &&
196156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                (connTable[i].destination == destination) &&
196256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                (connTable[i].control == control))
196356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
196456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                /*lint -e{704} use shift for performance */
196556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pArt->values[connTable[i].connection] = (EAS_I16) (scale >> 16);
196656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pArt->values[PARAM_MODIFIED] = EAS_TRUE;
196756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
196856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
196956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
197056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (i == PARAM_TABLE_SIZE)
197156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "WARN: Unsupported parameter in DLS file\n"); */ }
197256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
197356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
197456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
19757df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
19767df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
19777df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
19787df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Parse_wlnk ()
19797df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
198056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
198156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
19827df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
19837df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
198456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
198556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
19867df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
198756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
19887df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
19897df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
19907df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
19917df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_wlnk (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_U32 *pWaveIndex)
19927df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
199356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
19947df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
199556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* we only care about the the index */
199656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(pDLSData->hwInstData, pDLSData->fileHandle, pos + 8)) != EAS_SUCCESS)
199756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
19987df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
199956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* read the index */
200056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle,pWaveIndex, EAS_FALSE);
20017df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
20027df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
20037df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
20047df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * PopcdlStack ()
20057df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
200656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
200756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
20087df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
20097df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
201056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
201156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
20127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
201356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
20147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
20157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
20167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
20177df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT PopcdlStack (EAS_U32 *pStack, EAS_INT *pStackPtr, EAS_U32 *pValue)
20187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
20197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
202056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* stack underflow, cdl block has an errorr */
202156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (*pStackPtr < 0)
202256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FILE_FORMAT;
20237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
202456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* pop the value off the stack */
202556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pValue = pStack[*pStackPtr];
202656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pStackPtr = *pStackPtr - 1;
202756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
20287df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
20297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
20307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
20317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * PushcdlStack ()
20327df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
203356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
203456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
20357df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
20367df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
203756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
203856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
20397df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
204056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
20417df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
20427df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
20437df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
20447df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT PushcdlStack (EAS_U32 *pStack, EAS_INT *pStackPtr, EAS_U32 value)
20457df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
20467df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
204756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* stack overflow, return an error */
204856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (*pStackPtr >= CDL_STACK_SIZE)
204956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FILE_FORMAT;
20507df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
205156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* push the value onto the stack */
205256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pStackPtr = *pStackPtr + 1;
205356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pStack[*pStackPtr] = value;
205456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
20557df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
20567df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
20577df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
20587df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * QueryGUID ()
20597df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
206056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
206156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
20627df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
20637df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
206456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
206556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
20667df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
206756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
20687df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
20697df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
20707df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
20717df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_BOOL QueryGUID (const DLSID *pGUID, EAS_U32 *pValue)
20727df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
20737df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
207456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* assume false */
207556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pValue = 0;
207656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (EAS_HWMemCmp(&DLSID_GMInHardware, pGUID, sizeof(DLSID)) == 0)
207756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
207856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        *pValue = 0xffffffff;
207956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_TRUE;
208056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
208156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
208256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (EAS_HWMemCmp(&DLSID_GSInHardware, pGUID, sizeof(DLSID)) == 0)
208356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_TRUE;
208456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
208556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (EAS_HWMemCmp(&DLSID_XGInHardware, pGUID, sizeof(DLSID)) == 0)
208656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_TRUE;
208756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
208856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (EAS_HWMemCmp(&DLSID_SupportsDLS1, pGUID, sizeof(DLSID)) == 0)
208956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
209056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        *pValue = 0xffffffff;
209156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_TRUE;
209256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
209356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
209456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (EAS_HWMemCmp(&DLSID_SupportsDLS2, pGUID, sizeof(DLSID)) == 0)
209556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_TRUE;
209656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
209756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (EAS_HWMemCmp(&DLSID_SampleMemorySize, pGUID, sizeof(DLSID)) == 0)
209856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
209956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        *pValue = MAX_DLS_MEMORY;
210056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_TRUE;
210156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
210256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
210356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (EAS_HWMemCmp(&DLSID_ManufacturersID, pGUID, sizeof(DLSID)) == 0)
210456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
210556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        *pValue = 0x0000013A;
210656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_TRUE;
210756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
210856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
210956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (EAS_HWMemCmp(&DLSID_ProductID, pGUID, sizeof(DLSID)) == 0)
211056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
211156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        *pValue = LIB_VERSION;
211256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_TRUE;
211356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
211456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
211556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (EAS_HWMemCmp(&DLSID_SamplePlaybackRate, pGUID, sizeof(DLSID)) == 0)
211656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
211756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        *pValue = (EAS_U32) outputSampleRate;
211856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_TRUE;
211956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
212056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
212156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* unrecognized DLSID */
212256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_FALSE;
21237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
21247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
21257df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
21267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * ReadDLSID ()
21277df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
212856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
21297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Reads a DLSID in a manner that is not sensitive to processor endian-ness
21307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
21317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
213256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
213356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
21347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
213556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
21367df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
21377df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
21387df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
21397df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT ReadDLSID (SDLS_SYNTHESIZER_DATA *pDLSData, DLSID *pDLSID)
21407df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
214156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
214256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 n;
214356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
214456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &pDLSID->Data1, EAS_FALSE)) != EAS_SUCCESS)
214556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
214656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &pDLSID->Data2, EAS_FALSE)) != EAS_SUCCESS)
214756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
214856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &pDLSID->Data3, EAS_FALSE)) != EAS_SUCCESS)
214956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
215056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_HWReadFile(pDLSData->hwInstData, pDLSData->fileHandle, pDLSID->Data4, sizeof(pDLSID->Data4), &n);
21517df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
21527df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
21537df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
21547df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Parse_cdl ()
21557df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
215656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
215756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
21587df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
21597df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
216056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
216156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
21627df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
216356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
21647df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
21657df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
21667df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
21677df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT Parse_cdl (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 size, EAS_U32 *pValue)
21687df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
216956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
217056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 stack[CDL_STACK_SIZE];
217156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16 opcode;
217256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT stackPtr;
217356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 x, y;
217456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    DLSID dlsid;
217556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
217656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    stackPtr = -1;
217756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pValue = 0;
217856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    x = 0;
217956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    while (size)
218056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
218156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* read the opcode */
218256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWGetWord(pDLSData->hwInstData, pDLSData->fileHandle, &opcode, EAS_FALSE)) != EAS_SUCCESS)
218356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
218456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
218556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* handle binary opcodes */
218656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (opcode <= DLS_CDL_EQ)
218756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
218856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* pop X and Y */
218956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = PopcdlStack(stack, &stackPtr, &x)) != EAS_SUCCESS)
219056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
219156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = PopcdlStack(stack, &stackPtr, &y)) != EAS_SUCCESS)
219256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
219356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            switch (opcode)
219456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
219556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                case DLS_CDL_AND:
219656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    x = x & y;
219756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    break;
219856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                case DLS_CDL_OR:
219956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    x = x | y;
220056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    break;
220156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                case DLS_CDL_XOR:
220256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    x = x ^ y;
220356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    break;
220456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                case DLS_CDL_ADD:
220556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    x = x + y;
220656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    break;
220756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                case DLS_CDL_SUBTRACT:
220856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    x = x - y;
220956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    break;
221056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                case DLS_CDL_MULTIPLY:
221156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    x = x * y;
221256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    break;
221356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                case DLS_CDL_DIVIDE:
221456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    if (!y)
221556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        return EAS_ERROR_FILE_FORMAT;
221656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    x = x / y;
221756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    break;
221856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                case DLS_CDL_LOGICAL_AND:
221956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    x = (x && y);
222056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    break;
222156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                case DLS_CDL_LOGICAL_OR:
222256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    x = (x || y);
222356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    break;
222456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                case DLS_CDL_LT:
222556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    x = (x < y);
222656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    break;
222756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                case DLS_CDL_LE:
222856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    x = (x <= y);
222956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    break;
223056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                case DLS_CDL_GT:
223156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    x = (x > y);
223256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    break;
223356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                case DLS_CDL_GE:
223456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    x = (x >= y);
223556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    break;
223656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                case DLS_CDL_EQ:
223756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    x = (x == y);
223856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    break;
223956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                default:
224056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    break;
224156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
224256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
224356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
224456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else if (opcode == DLS_CDL_NOT)
224556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
224656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = PopcdlStack(stack, &stackPtr, &x)) != EAS_SUCCESS)
224756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
224856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            x = !x;
224956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
225056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
225156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else if (opcode == DLS_CDL_CONST)
225256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
225356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &x, EAS_FALSE)) != EAS_SUCCESS)
225456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
225556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
225656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
225756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else if (opcode == DLS_CDL_QUERY)
225856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
225956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = ReadDLSID(pDLSData, &dlsid)) != EAS_SUCCESS)
226056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
226156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            QueryGUID(&dlsid, &x);
226256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
226356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
226456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else if (opcode == DLS_CDL_QUERYSUPPORTED)
226556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
226656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = ReadDLSID(pDLSData, &dlsid)) != EAS_SUCCESS)
226756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
226856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            x = QueryGUID(&dlsid, &y);
226956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
227056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else
227156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Unsupported opcode %d in DLS file\n", opcode); */ }
227256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
227356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* push the result on the stack */
227456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = PushcdlStack(stack, &stackPtr, x)) != EAS_SUCCESS)
227556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
227656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
227756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
227856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* pop the last result off the stack */
227956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return PopcdlStack(stack, &stackPtr, pValue);
22807df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
22817df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
22827df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
22837df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Convert_rgn()
22847df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
228556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
22867df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Convert region data from DLS to EAS
22877df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
22887df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
228956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
229056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
22917df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
229256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
22937df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
22947df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
22957df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
22967df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic void Convert_rgn (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_U16 regionIndex, EAS_U16 artIndex, EAS_U16 waveIndex, S_WSMP_DATA *pWsmp)
22977df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
229856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_DLS_REGION *pRgn;
229956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
230056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* setup pointers to data structures */
230156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pRgn = &pDLSData->pDLS->pDLSRegions[regionIndex];
230256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
230356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* intiailize indices */
230456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pRgn->wtRegion.artIndex = artIndex;
230556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pRgn->wtRegion.waveIndex = waveIndex;
230656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
230756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* convert region data */
230856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e{704} use shift for performance */
230956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pRgn->wtRegion.gain = (EAS_I16) (pWsmp->gain >> 16);
231056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pRgn->wtRegion.loopStart = pWsmp->loopStart;
231156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pRgn->wtRegion.loopEnd = (pWsmp->loopStart + pWsmp->loopLength);
231256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pRgn->wtRegion.tuning = pWsmp->fineTune -(pWsmp->unityNote * 100) + ConvertSampleRate(pWsmp->sampleRate);
231356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pWsmp->loopLength != 0)
231456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pRgn->wtRegion.region.keyGroupAndFlags |= REGION_FLAG_IS_LOOPED;
23157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
23167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
23177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
23187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Convert_art()
23197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
232056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
23217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Convert articulation data from DLS to EAS
23227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
23237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
232456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
232556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
23267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
232756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
23287df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
23297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
23307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
23317df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic void Convert_art (SDLS_SYNTHESIZER_DATA *pDLSData, const S_DLS_ART_VALUES *pDLSArt,  EAS_U16 artIndex)
23327df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
233356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_DLS_ARTICULATION *pArt;
233456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
233556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* setup pointers to data structures */
233656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt = &pDLSData->pDLS->pDLSArticulations[artIndex];
233756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
233856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* LFO parameters */
233956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->modLFO.lfoFreq = ConvertLFOPhaseIncrement(pDLSArt->values[PARAM_MOD_LFO_FREQ]);
234056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->modLFO.lfoDelay = -ConvertDelay(pDLSArt->values[PARAM_MOD_LFO_DELAY]);
234156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->vibLFO.lfoFreq = ConvertLFOPhaseIncrement(pDLSArt->values[PARAM_VIB_LFO_FREQ]);
234256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->vibLFO.lfoDelay = -ConvertDelay(pDLSArt->values[PARAM_VIB_LFO_DELAY]);
234356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
234456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* EG1 parameters */
234556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->eg1.delayTime = ConvertDelay(pDLSArt->values[PARAM_VOL_EG_DELAY]);
234656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->eg1.attackTime = pDLSArt->values[PARAM_VOL_EG_ATTACK];
234756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->eg1.holdTime = pDLSArt->values[PARAM_VOL_EG_HOLD];
234856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->eg1.decayTime = pDLSArt->values[PARAM_VOL_EG_DECAY];
234956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->eg1.sustainLevel = ConvertSustain(pDLSArt->values[PARAM_VOL_EG_SUSTAIN]);
235056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->eg1.releaseTime = ConvertRate(pDLSArt->values[PARAM_VOL_EG_RELEASE]);
235156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->eg1.velToAttack = pDLSArt->values[PARAM_VOL_EG_VEL_TO_ATTACK];
235256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->eg1.keyNumToDecay = pDLSArt->values[PARAM_VOL_EG_KEY_TO_DECAY];
235356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->eg1.keyNumToHold = pDLSArt->values[PARAM_VOL_EG_KEY_TO_HOLD];
235456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->eg1ShutdownTime = ConvertRate(pDLSArt->values[PARAM_VOL_EG_SHUTDOWN]);
235556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
235656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* EG2 parameters */
235756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->eg2.delayTime = ConvertDelay(pDLSArt->values[PARAM_MOD_EG_DELAY]);
235856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->eg2.attackTime = pDLSArt->values[PARAM_MOD_EG_ATTACK];
235956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->eg2.holdTime = pDLSArt->values[PARAM_MOD_EG_HOLD];
236056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->eg2.decayTime = pDLSArt->values[PARAM_MOD_EG_DECAY];
236156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->eg2.sustainLevel = ConvertSustain(pDLSArt->values[PARAM_MOD_EG_SUSTAIN]);
236256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->eg2.releaseTime = ConvertRate(pDLSArt->values[PARAM_MOD_EG_RELEASE]);
236356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->eg2.velToAttack = pDLSArt->values[PARAM_MOD_EG_VEL_TO_ATTACK];
236456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->eg2.keyNumToDecay = pDLSArt->values[PARAM_MOD_EG_KEY_TO_DECAY];
236556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->eg2.keyNumToHold = pDLSArt->values[PARAM_MOD_EG_KEY_TO_HOLD];
236656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
236756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* filter parameters */
236856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->filterCutoff = pDLSArt->values[PARAM_INITIAL_FC];
236956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->filterQandFlags = ConvertQ(pDLSArt->values[PARAM_INITIAL_Q]);
237056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->modLFOToFc = pDLSArt->values[PARAM_MOD_LFO_TO_FC];
237156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->modLFOCC1ToFc = pDLSArt->values[PARAM_MOD_LFO_CC1_TO_FC];
237256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->modLFOChanPressToFc = pDLSArt->values[PARAM_MOD_LFO_CHAN_PRESS_TO_FC];
237356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->eg2ToFc = pDLSArt->values[PARAM_MOD_EG_TO_FC];
237456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->velToFc = pDLSArt->values[PARAM_VEL_TO_FC];
237556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->keyNumToFc = pDLSArt->values[PARAM_KEYNUM_TO_FC];
237656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
237756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* gain parameters */
237856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->modLFOToGain = pDLSArt->values[PARAM_MOD_LFO_TO_GAIN];
237956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->modLFOCC1ToGain = pDLSArt->values[PARAM_MOD_LFO_CC1_TO_GAIN];
238056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->modLFOChanPressToGain = pDLSArt->values[PARAM_MOD_LFO_CHAN_PRESS_TO_GAIN];
238156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
238256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* pitch parameters */
238356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->tuning = pDLSArt->values[PARAM_TUNING];
238456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->keyNumToPitch = pDLSArt->values[PARAM_KEYNUM_TO_PITCH];
238556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->vibLFOToPitch = pDLSArt->values[PARAM_VIB_LFO_TO_PITCH];
238656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->vibLFOCC1ToPitch = pDLSArt->values[PARAM_VIB_LFO_CC1_TO_PITCH];
238756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->vibLFOChanPressToPitch = pDLSArt->values[PARAM_VIB_LFO_CHAN_PRESS_TO_PITCH];
238856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->modLFOToPitch = pDLSArt->values[PARAM_MOD_LFO_TO_PITCH];
238956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->modLFOCC1ToPitch = pDLSArt->values[PARAM_MOD_LFO_CC1_TO_PITCH];
239056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->modLFOChanPressToPitch = pDLSArt->values[PARAM_MOD_LFO_CHAN_PRESS_TO_PITCH];
239156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->eg2ToPitch = pDLSArt->values[PARAM_MOD_EG_TO_PITCH];
239256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
239356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* output parameters */
239456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->pan = ConvertPan(pDLSArt->values[PARAM_DEFAULT_PAN]);
239556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
239656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pDLSArt->values[PARAM_VEL_TO_GAIN] != 0)
239756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pArt->filterQandFlags |= FLAG_DLS_VELOCITY_SENSITIVE;
239856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
239956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _REVERB
240056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->reverbSend = pDLSArt->values[PARAM_DEFAULT_REVERB_SEND];
240156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->cc91ToReverbSend = pDLSArt->values[PARAM_MIDI_CC91_TO_REVERB_SEND];
24027df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif
24037df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
24047df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#ifdef _CHORUS
240556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->chorusSend = pDLSArt->values[PARAM_DEFAULT_CHORUS_SEND];
240656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pArt->cc93ToChorusSend = pDLSArt->values[PARAM_MIDI_CC93_TO_CHORUS_SEND];
240756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
24087df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
24097df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
24107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
24117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * ConvertSampleRate()
24127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
241356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
24147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
241556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
24167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
24177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
24187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
24197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects:
24207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
24217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
24227df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_I16 ConvertSampleRate (EAS_U32 sampleRate)
24237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
242456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return (EAS_I16) (1200.0 * log10((double) sampleRate / (double) outputSampleRate) / log10(2.0));
24257df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
24267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
24277df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
24287df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * ConvertSustainEG2()
24297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
24307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Convert sustain level to pitch/Fc multipler for EG2
24317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
24327df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
24337df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_I16 ConvertSustain (EAS_I32 sustain)
24347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
243556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check for sustain level of zero */
243656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (sustain == 0)
243756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return 0;
24387df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
243956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* convert to log2 factor */
244056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e{704} use shift for performance */
244156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    sustain = (sustain * SUSTAIN_LINEAR_CONVERSION_FACTOR) >> 15;
24427df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
244356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (sustain > SYNTH_FULL_SCALE_EG1_GAIN)
244456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return SYNTH_FULL_SCALE_EG1_GAIN;
244556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return (EAS_I16) sustain;
24467df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
24477df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
24487df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
24497df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * ConvertDelay ()
24507df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
24517df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Converts timecents to frame count. Used for LFO and envelope
24527df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * delay times.
24537df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
24547df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
24557df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectEAS_I16 ConvertDelay (EAS_I32 timeCents)
24567df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
245756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 temp;
245856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
245956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (timeCents == ZERO_TIME_IN_CENTS)
246056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return 0;
24617df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
246256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* divide time by secs per frame to get number of frames */
246356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    temp = timeCents - dlsRateConvert;
24647df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
246556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* convert from time cents to 10-bit fraction */
246656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    temp = FMUL_15x15(temp, TIME_CENTS_TO_LOG2);
24677df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
246856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* convert to frame count */
246956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    temp = EAS_LogToLinear16(temp - (15 << 10));
24707df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
247156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (temp < SYNTH_FULL_SCALE_EG1_GAIN)
247256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return (EAS_I16) temp;
247356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return SYNTH_FULL_SCALE_EG1_GAIN;
24747df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
24757df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
24767df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
24777df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * ConvertRate ()
24787df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
24797df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Convert timecents to rate
24807df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
24817df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
24827df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectEAS_I16 ConvertRate (EAS_I32 timeCents)
24837df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
248456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 temp;
24857df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
248656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (timeCents == ZERO_TIME_IN_CENTS)
248756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return SYNTH_FULL_SCALE_EG1_GAIN;
24887df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
248956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* divide frame rate by time in log domain to get rate */
249056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    temp = dlsRateConvert - timeCents;
24917df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
24927df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#if 1
249356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    temp = EAS_Calculate2toX(temp);
24947df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#else
249556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* convert from time cents to 10-bit fraction */
249656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    temp = FMUL_15x15(temp, TIME_CENTS_TO_LOG2);
249756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
249856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* convert to rate */
249956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    temp = EAS_LogToLinear16(temp);
25007df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif
25017df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
250256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (temp < SYNTH_FULL_SCALE_EG1_GAIN)
250356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return (EAS_I16) temp;
250456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return SYNTH_FULL_SCALE_EG1_GAIN;
25057df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
25067df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
25077df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
25087df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
25097df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * ConvertLFOPhaseIncrement()
25107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
251156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
25127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
251356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
25147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
25157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
25167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
25177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects:
25187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
25197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
25207df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_I16 ConvertLFOPhaseIncrement (EAS_I32 pitchCents)
25217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
252256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
252356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check range */
252456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pitchCents > MAX_LFO_FREQUENCY_IN_PITCHCENTS)
252556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pitchCents = MAX_LFO_FREQUENCY_IN_PITCHCENTS;
252656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pitchCents < MIN_LFO_FREQUENCY_IN_PITCHCENTS)
252756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pitchCents = MIN_LFO_FREQUENCY_IN_PITCHCENTS;
252856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
252956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* double the rate and divide by frame rate by subtracting in log domain */
253056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pitchCents = pitchCents - dlsLFOFrequencyConvert;
253156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
253256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* convert to phase increment */
253356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return (EAS_I16) EAS_Calculate2toX(pitchCents);
25347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
25357df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
25367df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
25377df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * ConvertPan()
25387df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
253956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
25407df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
254156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
25427df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
25437df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
25447df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
25457df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects:
25467df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
25477df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
25487df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_I8 ConvertPan (EAS_I32 pan)
25497df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
255056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
255156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* multiply by conversion factor */
255256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pan = FMUL_15x15 (PAN_CONVERSION_FACTOR, pan);
255356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pan < MIN_PAN_VALUE)
255456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return MIN_PAN_VALUE;
255556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pan > MAX_PAN_VALUE)
255656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return MAX_PAN_VALUE;
255756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return (EAS_I8) pan;
25587df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
25597df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
25607df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
25617df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * ConvertQ()
25627df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
25637df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Convert the DLS filter resonance to an index value used by the synth
25647df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * that accesses tables of coefficients based on the Q.
25657df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
25667df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
25677df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_U8 ConvertQ (EAS_I32 q)
25687df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
25697df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
257056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* apply limits */
257156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (q <= 0)
257256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return 0;
25737df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
257456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* convert to table index */
257556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e{704} use shift for performance */
257656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    q = (FILTER_Q_CONVERSION_FACTOR * q + 0x4000) >> 15;
25777df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
257856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* apply upper limit */
257956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (q >= FILTER_RESONANCE_NUM_ENTRIES)
258056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        q = FILTER_RESONANCE_NUM_ENTRIES - 1;
258156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return (EAS_U8) q;
25827df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
25837df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
25847df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#ifdef _DEBUG_DLS
25857df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
25867df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * DumpDLS()
25877df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
25887df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
25897df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic void DumpDLS (S_EAS *pEAS)
25907df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
259156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_DLS_ARTICULATION *pArt;
259256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_DLS_REGION *pRegion;
259356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT i;
259456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT j;
259556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
259656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000022 , pEAS->numPrograms);
259756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000023 , pEAS->numWTRegions);
259856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000024 , pEAS->numDLSArticulations);
259956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000025 , pEAS->numSamples);
260056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
260156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* dump the instruments */
260256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (i = 0; i < pEAS->numPrograms; i++)
260356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
260456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000026 ,
260556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pEAS->pPrograms[i].locale >> 16,
260656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                (pEAS->pPrograms[i].locale >> 8) & 0x7f,
260756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pEAS->pPrograms[i].locale & 0x7f);
260856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
260956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        for (j = pEAS->pPrograms[i].regionIndex; ; j++)
261056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
261156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000027 , j);
261256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pRegion = &pEAS->pWTRegions[j];
261356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000028 , pRegion->gain);
261456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000029 , pRegion->region.rangeLow, pRegion->region.rangeHigh);
261556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x0000002a , pRegion->region.keyGroupAndFlags);
261656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x0000002b , pRegion->loopStart);
261756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x0000002c , pRegion->loopEnd);
261856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x0000002d , pRegion->tuning);
261956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x0000002e , pRegion->artIndex);
262056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x0000002f , pRegion->waveIndex);
262156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
262256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (pRegion->region.keyGroupAndFlags & REGION_FLAG_LAST_REGION)
262356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
262456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
262556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
262656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
262756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
262856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* dump the articulation data */
262956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (i = 0; i < pEAS->numDLSArticulations; i++)
263056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
263156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* articulation data */
263256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000030 , i);
263356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pArt = &pEAS->pDLSArticulations[i];
263456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000031 , pArt->m_nEG2toFilterDepth);
263556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000032 , pArt->m_nEG2toPitchDepth);
263656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000033 , pArt->m_nFilterCutoffFrequency);
263756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000034 , pArt->m_nFilterResonance);
263856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000035 , pArt->m_nLFOAmplitudeDepth);
263956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000036 , pArt->m_nLFODelayTime);
264056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000037 , pArt->m_nLFOFrequency);
264156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000038 , pArt->m_nLFOPitchDepth);
264256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000039 , pArt->m_nPan);
264356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
264456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* EG1 data */
264556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x0000003a , pArt->m_sEG1.m_nAttack);
264656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x0000003b , pArt->m_sEG1.m_nDecay);
264756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x0000003c , pArt->m_sEG1.m_nSustain);
264856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x0000003d , pArt->m_sEG1.m_nRelease);
264956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
265056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* EG2 data */
265156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x0000003e , pArt->m_sEG2.m_nAttack);
265256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x0000003f , pArt->m_sEG2.m_nDecay);
265356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000040 , pArt->m_sEG2.m_nSustain);
265456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000041 , pArt->m_sEG2.m_nRelease);
265556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
265656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
265756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
265856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* dump the waves */
265956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (i = 0; i < pEAS->numSamples; i++)
266056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
266156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000042 , i);
266256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000043 , pEAS->pSampleLen[i]);
266356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0x19299ed4, 0x00000044 , pEAS->ppSamples[i]);
266456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
26657df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
26667df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
26677df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif
26687df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
2669