xref: /aosp_15_r20/external/sonivox/arm-wt-22k/lib_src/eas_ota.c (revision f81fb7c475c4b71ff83bdcc517de2a8c174e4e5c)
1*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
2*f81fb7c4SAndroid Build Coastguard Worker  *
3*f81fb7c4SAndroid Build Coastguard Worker  * File:
4*f81fb7c4SAndroid Build Coastguard Worker  * eas_ota.c
5*f81fb7c4SAndroid Build Coastguard Worker  *
6*f81fb7c4SAndroid Build Coastguard Worker  * Contents and purpose:
7*f81fb7c4SAndroid Build Coastguard Worker  * OTA parser
8*f81fb7c4SAndroid Build Coastguard Worker  *
9*f81fb7c4SAndroid Build Coastguard Worker  * Copyright Sonic Network Inc. 2005
10*f81fb7c4SAndroid Build Coastguard Worker 
11*f81fb7c4SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
12*f81fb7c4SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
13*f81fb7c4SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
14*f81fb7c4SAndroid Build Coastguard Worker  *
15*f81fb7c4SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
16*f81fb7c4SAndroid Build Coastguard Worker  *
17*f81fb7c4SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
18*f81fb7c4SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
19*f81fb7c4SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20*f81fb7c4SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
21*f81fb7c4SAndroid Build Coastguard Worker  * limitations under the License.
22*f81fb7c4SAndroid Build Coastguard Worker  *
23*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
24*f81fb7c4SAndroid Build Coastguard Worker  * Revision Control:
25*f81fb7c4SAndroid Build Coastguard Worker  *   $Revision: 795 $
26*f81fb7c4SAndroid Build Coastguard Worker  *   $Date: 2007-08-01 00:14:45 -0700 (Wed, 01 Aug 2007) $
27*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
28*f81fb7c4SAndroid Build Coastguard Worker */
29*f81fb7c4SAndroid Build Coastguard Worker 
30*f81fb7c4SAndroid Build Coastguard Worker #define LOG_TAG "Sonivox"
31*f81fb7c4SAndroid Build Coastguard Worker #include <log/log.h>
32*f81fb7c4SAndroid Build Coastguard Worker 
33*f81fb7c4SAndroid Build Coastguard Worker #include "eas_data.h"
34*f81fb7c4SAndroid Build Coastguard Worker #include "eas_miditypes.h"
35*f81fb7c4SAndroid Build Coastguard Worker #include "eas_parser.h"
36*f81fb7c4SAndroid Build Coastguard Worker #include "eas_report.h"
37*f81fb7c4SAndroid Build Coastguard Worker #include "eas_host.h"
38*f81fb7c4SAndroid Build Coastguard Worker #include "eas_midi.h"
39*f81fb7c4SAndroid Build Coastguard Worker #include "eas_config.h"
40*f81fb7c4SAndroid Build Coastguard Worker #include "eas_vm_protos.h"
41*f81fb7c4SAndroid Build Coastguard Worker #include "eas_otadata.h"
42*f81fb7c4SAndroid Build Coastguard Worker 
43*f81fb7c4SAndroid Build Coastguard Worker /* increase gain for mono ringtones */
44*f81fb7c4SAndroid Build Coastguard Worker #define OTA_GAIN_OFFSET             8
45*f81fb7c4SAndroid Build Coastguard Worker 
46*f81fb7c4SAndroid Build Coastguard Worker /* file definitions */
47*f81fb7c4SAndroid Build Coastguard Worker #define OTA_RINGTONE                0x25
48*f81fb7c4SAndroid Build Coastguard Worker #define OTA_SOUND                   0x1d
49*f81fb7c4SAndroid Build Coastguard Worker #define OTA_UNICODE                 0x22
50*f81fb7c4SAndroid Build Coastguard Worker 
51*f81fb7c4SAndroid Build Coastguard Worker /* song type definitions */
52*f81fb7c4SAndroid Build Coastguard Worker #define OTA_BASIC_SONG_TYPE         0x01
53*f81fb7c4SAndroid Build Coastguard Worker #define OTA_TEMPORARY_SONG_TYPE     0x02
54*f81fb7c4SAndroid Build Coastguard Worker 
55*f81fb7c4SAndroid Build Coastguard Worker /* instruction ID coding */
56*f81fb7c4SAndroid Build Coastguard Worker #define OTA_PATTERN_HEADER_ID       0x00
57*f81fb7c4SAndroid Build Coastguard Worker #define OTA_NOTE_INST_ID            0x01
58*f81fb7c4SAndroid Build Coastguard Worker #define OTA_SCALE_INST_ID           0x02
59*f81fb7c4SAndroid Build Coastguard Worker #define OTA_STYLE_INST_ID           0x03
60*f81fb7c4SAndroid Build Coastguard Worker #define OTA_TEMPO_INST_ID           0x04
61*f81fb7c4SAndroid Build Coastguard Worker #define OTA_VOLUME_INST_ID          0x05
62*f81fb7c4SAndroid Build Coastguard Worker 
63*f81fb7c4SAndroid Build Coastguard Worker /* note durations */
64*f81fb7c4SAndroid Build Coastguard Worker #define OTA_NORMAL_DURATION         0x00
65*f81fb7c4SAndroid Build Coastguard Worker #define OTA_DOTTED_NOTE             0x01
66*f81fb7c4SAndroid Build Coastguard Worker #define OTA_DOUBLE_DOTTED_NOTE      0x02
67*f81fb7c4SAndroid Build Coastguard Worker #define OTA_TRIPLET_NOTE            0x03
68*f81fb7c4SAndroid Build Coastguard Worker 
69*f81fb7c4SAndroid Build Coastguard Worker /* loop count value for infinite loop */
70*f81fb7c4SAndroid Build Coastguard Worker #define OTA_INFINITE_LOOP           0x0f
71*f81fb7c4SAndroid Build Coastguard Worker 
72*f81fb7c4SAndroid Build Coastguard Worker /* length of 32nd note in 1/256ths of a msec for 63 BPM tempo */
73*f81fb7c4SAndroid Build Coastguard Worker #define DEFAULT_TICK_CONV           30476
74*f81fb7c4SAndroid Build Coastguard Worker 
75*f81fb7c4SAndroid Build Coastguard Worker /* default channel and program for OTA playback */
76*f81fb7c4SAndroid Build Coastguard Worker #define OTA_CHANNEL                 0
77*f81fb7c4SAndroid Build Coastguard Worker #define OTA_PROGRAM                 80
78*f81fb7c4SAndroid Build Coastguard Worker #define OTA_VEL_MUL                 4
79*f81fb7c4SAndroid Build Coastguard Worker #define OTA_VEL_OFS                 67
80*f81fb7c4SAndroid Build Coastguard Worker #define OTA_VEL_DEFAULT             95
81*f81fb7c4SAndroid Build Coastguard Worker 
82*f81fb7c4SAndroid Build Coastguard Worker /* multiplier for fixed point triplet conversion */
83*f81fb7c4SAndroid Build Coastguard Worker #define TRIPLET_MULTIPLIER          683
84*f81fb7c4SAndroid Build Coastguard Worker #define TRIPLET_SHIFT               10
85*f81fb7c4SAndroid Build Coastguard Worker 
86*f81fb7c4SAndroid Build Coastguard Worker /* local prototypes */
87*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_CheckFileType (S_EAS_DATA *pEASData, EAS_FILE_HANDLE fileHandle, EAS_VOID_PTR *ppHandle, EAS_I32 offset);
88*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_Prepare (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
89*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_Time (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_U32 *pTime);
90*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_Event (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_INT parserMode);
91*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_State (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_STATE *pState);
92*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_Close (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
93*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_Reset (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
94*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_Pause (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
95*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_Resume (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
96*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_SetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value);
97*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_GetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue);
98*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_ParseHeader (S_EAS_DATA *pEASData, S_OTA_DATA* pData);
99*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_FetchBitField (EAS_HW_DATA_HANDLE hwInstData, S_OTA_DATA *pData, EAS_I32 numBits, EAS_U8 *pValue);
100*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_SavePosition (EAS_HW_DATA_HANDLE hwInstData, S_OTA_DATA *pData, S_OTA_LOC *pLoc);
101*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_RestorePosition (EAS_HW_DATA_HANDLE hwInstData, S_OTA_DATA *pData, S_OTA_LOC *pLoc);
102*f81fb7c4SAndroid Build Coastguard Worker 
103*f81fb7c4SAndroid Build Coastguard Worker 
104*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
105*f81fb7c4SAndroid Build Coastguard Worker  *
106*f81fb7c4SAndroid Build Coastguard Worker  * EAS_OTA_Parser
107*f81fb7c4SAndroid Build Coastguard Worker  *
108*f81fb7c4SAndroid Build Coastguard Worker  * This structure contains the functional interface for the OTA parser
109*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
110*f81fb7c4SAndroid Build Coastguard Worker */
111*f81fb7c4SAndroid Build Coastguard Worker const S_FILE_PARSER_INTERFACE EAS_OTA_Parser =
112*f81fb7c4SAndroid Build Coastguard Worker {
113*f81fb7c4SAndroid Build Coastguard Worker     OTA_CheckFileType,
114*f81fb7c4SAndroid Build Coastguard Worker     OTA_Prepare,
115*f81fb7c4SAndroid Build Coastguard Worker     OTA_Time,
116*f81fb7c4SAndroid Build Coastguard Worker     OTA_Event,
117*f81fb7c4SAndroid Build Coastguard Worker     OTA_State,
118*f81fb7c4SAndroid Build Coastguard Worker     OTA_Close,
119*f81fb7c4SAndroid Build Coastguard Worker     OTA_Reset,
120*f81fb7c4SAndroid Build Coastguard Worker #ifdef JET_INTERFACE
121*f81fb7c4SAndroid Build Coastguard Worker     OTA_Pause,
122*f81fb7c4SAndroid Build Coastguard Worker     OTA_Resume,
123*f81fb7c4SAndroid Build Coastguard Worker #else
124*f81fb7c4SAndroid Build Coastguard Worker     NULL,
125*f81fb7c4SAndroid Build Coastguard Worker     NULL,
126*f81fb7c4SAndroid Build Coastguard Worker #endif
127*f81fb7c4SAndroid Build Coastguard Worker     NULL,
128*f81fb7c4SAndroid Build Coastguard Worker     OTA_SetData,
129*f81fb7c4SAndroid Build Coastguard Worker     OTA_GetData,
130*f81fb7c4SAndroid Build Coastguard Worker     NULL
131*f81fb7c4SAndroid Build Coastguard Worker };
132*f81fb7c4SAndroid Build Coastguard Worker 
133*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
134*f81fb7c4SAndroid Build Coastguard Worker  *
135*f81fb7c4SAndroid Build Coastguard Worker  * bpmTable
136*f81fb7c4SAndroid Build Coastguard Worker  *
137*f81fb7c4SAndroid Build Coastguard Worker  * BPM conversion table. Converts bpm values to 256ths of a millisecond for a 32nd note
138*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
139*f81fb7c4SAndroid Build Coastguard Worker */
140*f81fb7c4SAndroid Build Coastguard Worker static const EAS_U32 bpmTable[32] =
141*f81fb7c4SAndroid Build Coastguard Worker {
142*f81fb7c4SAndroid Build Coastguard Worker     76800, 68571, 61935, 54857,
143*f81fb7c4SAndroid Build Coastguard Worker     48000, 42667, 38400, 34286,
144*f81fb7c4SAndroid Build Coastguard Worker     30476, 27429, 24000, 21333,
145*f81fb7c4SAndroid Build Coastguard Worker     19200, 17143, 15360, 13714,
146*f81fb7c4SAndroid Build Coastguard Worker     12000, 10667, 9600, 8533,
147*f81fb7c4SAndroid Build Coastguard Worker     7680, 6737, 6000, 5408,
148*f81fb7c4SAndroid Build Coastguard Worker     4800, 4267, 3840, 3398,
149*f81fb7c4SAndroid Build Coastguard Worker     3024, 2685, 2400, 2133
150*f81fb7c4SAndroid Build Coastguard Worker };
151*f81fb7c4SAndroid Build Coastguard Worker 
152*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
153*f81fb7c4SAndroid Build Coastguard Worker  * OTA_CheckFileType()
154*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
155*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
156*f81fb7c4SAndroid Build Coastguard Worker  * Check the file type to see if we can parse it
157*f81fb7c4SAndroid Build Coastguard Worker  *
158*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
159*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
160*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
161*f81fb7c4SAndroid Build Coastguard Worker  *
162*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
163*f81fb7c4SAndroid Build Coastguard Worker  *
164*f81fb7c4SAndroid Build Coastguard Worker  *
165*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
166*f81fb7c4SAndroid Build Coastguard Worker  *
167*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
168*f81fb7c4SAndroid Build Coastguard Worker */
OTA_CheckFileType(S_EAS_DATA * pEASData,EAS_FILE_HANDLE fileHandle,EAS_VOID_PTR * ppHandle,EAS_I32 offset)169*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_CheckFileType (S_EAS_DATA *pEASData, EAS_FILE_HANDLE fileHandle, EAS_VOID_PTR *ppHandle, EAS_I32 offset)
170*f81fb7c4SAndroid Build Coastguard Worker {
171*f81fb7c4SAndroid Build Coastguard Worker     S_OTA_DATA* pData;
172*f81fb7c4SAndroid Build Coastguard Worker     EAS_RESULT result;
173*f81fb7c4SAndroid Build Coastguard Worker     EAS_INT cmdLen;
174*f81fb7c4SAndroid Build Coastguard Worker     EAS_INT state;
175*f81fb7c4SAndroid Build Coastguard Worker     EAS_U8 temp;
176*f81fb7c4SAndroid Build Coastguard Worker 
177*f81fb7c4SAndroid Build Coastguard Worker     /* read the first byte, should be command length */
178*f81fb7c4SAndroid Build Coastguard Worker     *ppHandle = NULL;
179*f81fb7c4SAndroid Build Coastguard Worker     if ((result = EAS_HWGetByte(pEASData->hwInstData, fileHandle, &temp)) != EAS_SUCCESS)
180*f81fb7c4SAndroid Build Coastguard Worker         return result;
181*f81fb7c4SAndroid Build Coastguard Worker 
182*f81fb7c4SAndroid Build Coastguard Worker     /* read all the commands */
183*f81fb7c4SAndroid Build Coastguard Worker     cmdLen = temp;
184*f81fb7c4SAndroid Build Coastguard Worker     state = 0;
185*f81fb7c4SAndroid Build Coastguard Worker     while (cmdLen--)
186*f81fb7c4SAndroid Build Coastguard Worker     {
187*f81fb7c4SAndroid Build Coastguard Worker 
188*f81fb7c4SAndroid Build Coastguard Worker         /* read the command, upper 7 bits */
189*f81fb7c4SAndroid Build Coastguard Worker         if ((result = EAS_HWGetByte(pEASData->hwInstData, fileHandle, &temp)) != EAS_SUCCESS)
190*f81fb7c4SAndroid Build Coastguard Worker             return result;
191*f81fb7c4SAndroid Build Coastguard Worker         temp = temp >> 1;
192*f81fb7c4SAndroid Build Coastguard Worker 
193*f81fb7c4SAndroid Build Coastguard Worker         if (state == 0)
194*f81fb7c4SAndroid Build Coastguard Worker         {
195*f81fb7c4SAndroid Build Coastguard Worker             if (temp != OTA_RINGTONE)
196*f81fb7c4SAndroid Build Coastguard Worker                 break;
197*f81fb7c4SAndroid Build Coastguard Worker             state++;
198*f81fb7c4SAndroid Build Coastguard Worker         }
199*f81fb7c4SAndroid Build Coastguard Worker         else
200*f81fb7c4SAndroid Build Coastguard Worker         {
201*f81fb7c4SAndroid Build Coastguard Worker 
202*f81fb7c4SAndroid Build Coastguard Worker             if (temp == OTA_SOUND)
203*f81fb7c4SAndroid Build Coastguard Worker             {
204*f81fb7c4SAndroid Build Coastguard Worker 
205*f81fb7c4SAndroid Build Coastguard Worker                 /* check for static memory allocation */
206*f81fb7c4SAndroid Build Coastguard Worker                 if (pEASData->staticMemoryModel)
207*f81fb7c4SAndroid Build Coastguard Worker                     pData = EAS_CMEnumData(EAS_CM_OTA_DATA);
208*f81fb7c4SAndroid Build Coastguard Worker                 else
209*f81fb7c4SAndroid Build Coastguard Worker                     pData = EAS_HWMalloc(pEASData->hwInstData, sizeof(S_OTA_DATA));
210*f81fb7c4SAndroid Build Coastguard Worker                 if (!pData)
211*f81fb7c4SAndroid Build Coastguard Worker                 {
212*f81fb7c4SAndroid Build Coastguard Worker                     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Malloc failed in OTA_Prepare\n"); */ }
213*f81fb7c4SAndroid Build Coastguard Worker                     return EAS_ERROR_MALLOC_FAILED;
214*f81fb7c4SAndroid Build Coastguard Worker                 }
215*f81fb7c4SAndroid Build Coastguard Worker                 EAS_HWMemSet(pData, 0, sizeof(S_OTA_DATA));
216*f81fb7c4SAndroid Build Coastguard Worker 
217*f81fb7c4SAndroid Build Coastguard Worker                 /* return a pointer to the instance data */
218*f81fb7c4SAndroid Build Coastguard Worker                 pData->fileHandle = fileHandle;
219*f81fb7c4SAndroid Build Coastguard Worker                 pData->fileOffset = offset;
220*f81fb7c4SAndroid Build Coastguard Worker                 pData->state = EAS_STATE_OPEN;
221*f81fb7c4SAndroid Build Coastguard Worker                 *ppHandle = pData;
222*f81fb7c4SAndroid Build Coastguard Worker                 ALOGD("%s() OTA file recognized", __func__);
223*f81fb7c4SAndroid Build Coastguard Worker                 break;
224*f81fb7c4SAndroid Build Coastguard Worker             }
225*f81fb7c4SAndroid Build Coastguard Worker 
226*f81fb7c4SAndroid Build Coastguard Worker             if (temp != OTA_UNICODE)
227*f81fb7c4SAndroid Build Coastguard Worker                 break;
228*f81fb7c4SAndroid Build Coastguard Worker         }
229*f81fb7c4SAndroid Build Coastguard Worker     }
230*f81fb7c4SAndroid Build Coastguard Worker 
231*f81fb7c4SAndroid Build Coastguard Worker     /* not recognized */
232*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
233*f81fb7c4SAndroid Build Coastguard Worker }
234*f81fb7c4SAndroid Build Coastguard Worker 
235*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
236*f81fb7c4SAndroid Build Coastguard Worker  * OTA_Prepare()
237*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
238*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
239*f81fb7c4SAndroid Build Coastguard Worker  * Prepare to parse the file. Allocates instance data (or uses static allocation for
240*f81fb7c4SAndroid Build Coastguard Worker  * static memory model).
241*f81fb7c4SAndroid Build Coastguard Worker  *
242*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
243*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
244*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
245*f81fb7c4SAndroid Build Coastguard Worker  *
246*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
247*f81fb7c4SAndroid Build Coastguard Worker  *
248*f81fb7c4SAndroid Build Coastguard Worker  *
249*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
250*f81fb7c4SAndroid Build Coastguard Worker  *
251*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
252*f81fb7c4SAndroid Build Coastguard Worker */
OTA_Prepare(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData)253*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_Prepare (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
254*f81fb7c4SAndroid Build Coastguard Worker {
255*f81fb7c4SAndroid Build Coastguard Worker     S_OTA_DATA* pData;
256*f81fb7c4SAndroid Build Coastguard Worker     EAS_RESULT result;
257*f81fb7c4SAndroid Build Coastguard Worker 
258*f81fb7c4SAndroid Build Coastguard Worker     /* check for valid state */
259*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_OTA_DATA*) pInstData;
260*f81fb7c4SAndroid Build Coastguard Worker     if (pData->state != EAS_STATE_OPEN)
261*f81fb7c4SAndroid Build Coastguard Worker         return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
262*f81fb7c4SAndroid Build Coastguard Worker 
263*f81fb7c4SAndroid Build Coastguard Worker     /* instantiate a synthesizer */
264*f81fb7c4SAndroid Build Coastguard Worker     if ((result = VMInitMIDI(pEASData, &pData->pSynth)) != EAS_SUCCESS)
265*f81fb7c4SAndroid Build Coastguard Worker     {
266*f81fb7c4SAndroid Build Coastguard Worker         { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "VMInitMIDI returned %d\n", result); */ }
267*f81fb7c4SAndroid Build Coastguard Worker         return result;
268*f81fb7c4SAndroid Build Coastguard Worker     }
269*f81fb7c4SAndroid Build Coastguard Worker 
270*f81fb7c4SAndroid Build Coastguard Worker     pData->state = EAS_STATE_ERROR;
271*f81fb7c4SAndroid Build Coastguard Worker     if ((result = OTA_ParseHeader(pEASData, pData)) != EAS_SUCCESS)
272*f81fb7c4SAndroid Build Coastguard Worker         return result;
273*f81fb7c4SAndroid Build Coastguard Worker 
274*f81fb7c4SAndroid Build Coastguard Worker     pData->state = EAS_STATE_READY;
275*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
276*f81fb7c4SAndroid Build Coastguard Worker }
277*f81fb7c4SAndroid Build Coastguard Worker 
278*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
279*f81fb7c4SAndroid Build Coastguard Worker  * OTA_Time()
280*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
281*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
282*f81fb7c4SAndroid Build Coastguard Worker  * Returns the time of the next event in msecs
283*f81fb7c4SAndroid Build Coastguard Worker  *
284*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
285*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
286*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
287*f81fb7c4SAndroid Build Coastguard Worker  * pTime            - pointer to variable to hold time of next event (in msecs)
288*f81fb7c4SAndroid Build Coastguard Worker  *
289*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
290*f81fb7c4SAndroid Build Coastguard Worker  *
291*f81fb7c4SAndroid Build Coastguard Worker  *
292*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
293*f81fb7c4SAndroid Build Coastguard Worker  *
294*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
295*f81fb7c4SAndroid Build Coastguard Worker */
296*f81fb7c4SAndroid Build Coastguard Worker /*lint -esym(715, pEASData) common decoder interface - pEASData not used */
OTA_Time(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData,EAS_U32 * pTime)297*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_Time (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_U32 *pTime)
298*f81fb7c4SAndroid Build Coastguard Worker {
299*f81fb7c4SAndroid Build Coastguard Worker     S_OTA_DATA *pData;
300*f81fb7c4SAndroid Build Coastguard Worker 
301*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_OTA_DATA*) pInstData;
302*f81fb7c4SAndroid Build Coastguard Worker 
303*f81fb7c4SAndroid Build Coastguard Worker     /* return time in milliseconds */
304*f81fb7c4SAndroid Build Coastguard Worker     /*lint -e{704} use shift instead of division */
305*f81fb7c4SAndroid Build Coastguard Worker     *pTime = pData->time >> 8;
306*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
307*f81fb7c4SAndroid Build Coastguard Worker }
308*f81fb7c4SAndroid Build Coastguard Worker 
309*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
310*f81fb7c4SAndroid Build Coastguard Worker  * OTA_Event()
311*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
312*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
313*f81fb7c4SAndroid Build Coastguard Worker  * Parse the next event in the file
314*f81fb7c4SAndroid Build Coastguard Worker  *
315*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
316*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
317*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
318*f81fb7c4SAndroid Build Coastguard Worker  *
319*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
320*f81fb7c4SAndroid Build Coastguard Worker  *
321*f81fb7c4SAndroid Build Coastguard Worker  *
322*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
323*f81fb7c4SAndroid Build Coastguard Worker  *
324*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
325*f81fb7c4SAndroid Build Coastguard Worker */
OTA_Event(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData,EAS_INT parserMode)326*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_Event (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_INT parserMode)
327*f81fb7c4SAndroid Build Coastguard Worker {
328*f81fb7c4SAndroid Build Coastguard Worker     S_OTA_DATA* pData;
329*f81fb7c4SAndroid Build Coastguard Worker     EAS_RESULT result;
330*f81fb7c4SAndroid Build Coastguard Worker     EAS_U32 duration;
331*f81fb7c4SAndroid Build Coastguard Worker     EAS_U8 temp;
332*f81fb7c4SAndroid Build Coastguard Worker 
333*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_OTA_DATA*) pInstData;
334*f81fb7c4SAndroid Build Coastguard Worker     if (pData->state >= EAS_STATE_OPEN)
335*f81fb7c4SAndroid Build Coastguard Worker         return EAS_SUCCESS;
336*f81fb7c4SAndroid Build Coastguard Worker 
337*f81fb7c4SAndroid Build Coastguard Worker     /* initialize MIDI channel when the track starts playing */
338*f81fb7c4SAndroid Build Coastguard Worker     if (pData->time == 0)
339*f81fb7c4SAndroid Build Coastguard Worker     {
340*f81fb7c4SAndroid Build Coastguard Worker         /* set program to square lead */
341*f81fb7c4SAndroid Build Coastguard Worker         if (parserMode != eParserModeMetaData)
342*f81fb7c4SAndroid Build Coastguard Worker             VMProgramChange(pEASData->pVoiceMgr, pData->pSynth, OTA_CHANNEL, OTA_PROGRAM);
343*f81fb7c4SAndroid Build Coastguard Worker 
344*f81fb7c4SAndroid Build Coastguard Worker         /* set channel volume to max */
345*f81fb7c4SAndroid Build Coastguard Worker         if (parserMode != eParserModeMetaData)
346*f81fb7c4SAndroid Build Coastguard Worker             VMControlChange(pEASData->pVoiceMgr, pData->pSynth, OTA_CHANNEL, 7, 127);
347*f81fb7c4SAndroid Build Coastguard Worker     }
348*f81fb7c4SAndroid Build Coastguard Worker 
349*f81fb7c4SAndroid Build Coastguard Worker     /* check for end of note */
350*f81fb7c4SAndroid Build Coastguard Worker     if (pData->note)
351*f81fb7c4SAndroid Build Coastguard Worker     {
352*f81fb7c4SAndroid Build Coastguard Worker         /* stop the note */
353*f81fb7c4SAndroid Build Coastguard Worker         VMStopNote(pEASData->pVoiceMgr, pData->pSynth, OTA_CHANNEL, pData->note, 0);
354*f81fb7c4SAndroid Build Coastguard Worker         pData->note = 0;
355*f81fb7c4SAndroid Build Coastguard Worker 
356*f81fb7c4SAndroid Build Coastguard Worker         /* check for rest between notes */
357*f81fb7c4SAndroid Build Coastguard Worker         if (pData->restTicks)
358*f81fb7c4SAndroid Build Coastguard Worker         {
359*f81fb7c4SAndroid Build Coastguard Worker             pData->time += (EAS_I32) pData->restTicks;
360*f81fb7c4SAndroid Build Coastguard Worker             pData->restTicks = 0;
361*f81fb7c4SAndroid Build Coastguard Worker             return EAS_SUCCESS;
362*f81fb7c4SAndroid Build Coastguard Worker         }
363*f81fb7c4SAndroid Build Coastguard Worker     }
364*f81fb7c4SAndroid Build Coastguard Worker 
365*f81fb7c4SAndroid Build Coastguard Worker     /* if not in a pattern, read the pattern header */
366*f81fb7c4SAndroid Build Coastguard Worker     while (pData->current.patternLen == 0)
367*f81fb7c4SAndroid Build Coastguard Worker     {
368*f81fb7c4SAndroid Build Coastguard Worker 
369*f81fb7c4SAndroid Build Coastguard Worker         /* check for loop - don't do infinite loops when locating */
370*f81fb7c4SAndroid Build Coastguard Worker         if (pData->loopCount && ((parserMode == eParserModePlay) || (pData->loopCount != OTA_INFINITE_LOOP)))
371*f81fb7c4SAndroid Build Coastguard Worker         {
372*f81fb7c4SAndroid Build Coastguard Worker             ALOGV("%s() loop backwards, loopCount = %d", __func__, pData->loopCount);
373*f81fb7c4SAndroid Build Coastguard Worker             /* if not infinite loop, decrement loop count */
374*f81fb7c4SAndroid Build Coastguard Worker             if (pData->loopCount != OTA_INFINITE_LOOP)
375*f81fb7c4SAndroid Build Coastguard Worker                 pData->loopCount--;
376*f81fb7c4SAndroid Build Coastguard Worker 
377*f81fb7c4SAndroid Build Coastguard Worker             /* back to start of pattern*/
378*f81fb7c4SAndroid Build Coastguard Worker             if ((result = OTA_RestorePosition(pEASData->hwInstData, pData, &pData->patterns[pData->currentPattern])) != EAS_SUCCESS)
379*f81fb7c4SAndroid Build Coastguard Worker                 return result;
380*f81fb7c4SAndroid Build Coastguard Worker         }
381*f81fb7c4SAndroid Build Coastguard Worker 
382*f81fb7c4SAndroid Build Coastguard Worker         /* if no previous position to restore, continue forward */
383*f81fb7c4SAndroid Build Coastguard Worker         else if (pData->restore.fileOffset < 0)
384*f81fb7c4SAndroid Build Coastguard Worker         {
385*f81fb7c4SAndroid Build Coastguard Worker 
386*f81fb7c4SAndroid Build Coastguard Worker             /* check for end of song */
387*f81fb7c4SAndroid Build Coastguard Worker             if (pData->numPatterns == 0)
388*f81fb7c4SAndroid Build Coastguard Worker             {
389*f81fb7c4SAndroid Build Coastguard Worker                 pData->state = EAS_STATE_STOPPING;
390*f81fb7c4SAndroid Build Coastguard Worker                 VMReleaseAllVoices(pEASData->pVoiceMgr, pData->pSynth);
391*f81fb7c4SAndroid Build Coastguard Worker                 return EAS_SUCCESS;
392*f81fb7c4SAndroid Build Coastguard Worker             }
393*f81fb7c4SAndroid Build Coastguard Worker 
394*f81fb7c4SAndroid Build Coastguard Worker             /* read the next pattern header */
395*f81fb7c4SAndroid Build Coastguard Worker             if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 3, &temp)) != EAS_SUCCESS)
396*f81fb7c4SAndroid Build Coastguard Worker                 return result;
397*f81fb7c4SAndroid Build Coastguard Worker             if (temp != OTA_PATTERN_HEADER_ID)
398*f81fb7c4SAndroid Build Coastguard Worker             {
399*f81fb7c4SAndroid Build Coastguard Worker                 { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Expected OTA pattern header\n"); */ }
400*f81fb7c4SAndroid Build Coastguard Worker                 return EAS_ERROR_FILE_FORMAT;
401*f81fb7c4SAndroid Build Coastguard Worker             }
402*f81fb7c4SAndroid Build Coastguard Worker 
403*f81fb7c4SAndroid Build Coastguard Worker             /* get the pattern ID */
404*f81fb7c4SAndroid Build Coastguard Worker             if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 2, &pData->currentPattern)) != EAS_SUCCESS)
405*f81fb7c4SAndroid Build Coastguard Worker                 return result;
406*f81fb7c4SAndroid Build Coastguard Worker 
407*f81fb7c4SAndroid Build Coastguard Worker             /* get the loop count */
408*f81fb7c4SAndroid Build Coastguard Worker             if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 4, &pData->loopCount)) != EAS_SUCCESS)
409*f81fb7c4SAndroid Build Coastguard Worker                 return result;
410*f81fb7c4SAndroid Build Coastguard Worker 
411*f81fb7c4SAndroid Build Coastguard Worker             /* get the pattern length */
412*f81fb7c4SAndroid Build Coastguard Worker             if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 8, &pData->current.patternLen)) != EAS_SUCCESS)
413*f81fb7c4SAndroid Build Coastguard Worker                 return result;
414*f81fb7c4SAndroid Build Coastguard Worker 
415*f81fb7c4SAndroid Build Coastguard Worker             /* if pattern definition, save the current position */
416*f81fb7c4SAndroid Build Coastguard Worker             if (pData->current.patternLen)
417*f81fb7c4SAndroid Build Coastguard Worker             {
418*f81fb7c4SAndroid Build Coastguard Worker                 if ((result = OTA_SavePosition(pEASData->hwInstData, pData, &pData->patterns[pData->currentPattern])) != EAS_SUCCESS)
419*f81fb7c4SAndroid Build Coastguard Worker                     return result;
420*f81fb7c4SAndroid Build Coastguard Worker             }
421*f81fb7c4SAndroid Build Coastguard Worker 
422*f81fb7c4SAndroid Build Coastguard Worker             /* if pattern length is zero, repeat a previous pattern */
423*f81fb7c4SAndroid Build Coastguard Worker             else
424*f81fb7c4SAndroid Build Coastguard Worker             {
425*f81fb7c4SAndroid Build Coastguard Worker                 /* make sure it's a valid pattern */
426*f81fb7c4SAndroid Build Coastguard Worker                 if (pData->patterns[pData->currentPattern].fileOffset < 0)
427*f81fb7c4SAndroid Build Coastguard Worker                 {
428*f81fb7c4SAndroid Build Coastguard Worker                     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "OTA pattern error, invalid pattern specified\n"); */ }
429*f81fb7c4SAndroid Build Coastguard Worker                     return EAS_ERROR_FILE_FORMAT;
430*f81fb7c4SAndroid Build Coastguard Worker                 }
431*f81fb7c4SAndroid Build Coastguard Worker 
432*f81fb7c4SAndroid Build Coastguard Worker                 /* save current position and data */
433*f81fb7c4SAndroid Build Coastguard Worker                 if ((result = OTA_SavePosition(pEASData->hwInstData, pData, &pData->restore)) != EAS_SUCCESS)
434*f81fb7c4SAndroid Build Coastguard Worker                     return result;
435*f81fb7c4SAndroid Build Coastguard Worker 
436*f81fb7c4SAndroid Build Coastguard Worker                 /* seek to the pattern in the file */
437*f81fb7c4SAndroid Build Coastguard Worker                 if ((result = OTA_RestorePosition(pEASData->hwInstData, pData, &pData->patterns[pData->currentPattern])) != EAS_SUCCESS)
438*f81fb7c4SAndroid Build Coastguard Worker                     return result;
439*f81fb7c4SAndroid Build Coastguard Worker             }
440*f81fb7c4SAndroid Build Coastguard Worker 
441*f81fb7c4SAndroid Build Coastguard Worker             /* decrement pattern count */
442*f81fb7c4SAndroid Build Coastguard Worker             pData->numPatterns--;
443*f81fb7c4SAndroid Build Coastguard Worker         }
444*f81fb7c4SAndroid Build Coastguard Worker 
445*f81fb7c4SAndroid Build Coastguard Worker         /* restore previous position */
446*f81fb7c4SAndroid Build Coastguard Worker         else
447*f81fb7c4SAndroid Build Coastguard Worker         {
448*f81fb7c4SAndroid Build Coastguard Worker             if ((result = OTA_RestorePosition(pEASData->hwInstData, pData, &pData->restore)) != EAS_SUCCESS)
449*f81fb7c4SAndroid Build Coastguard Worker                 return result;
450*f81fb7c4SAndroid Build Coastguard Worker         }
451*f81fb7c4SAndroid Build Coastguard Worker     }
452*f81fb7c4SAndroid Build Coastguard Worker 
453*f81fb7c4SAndroid Build Coastguard Worker     /* get the next event */
454*f81fb7c4SAndroid Build Coastguard Worker     if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 3, &temp)) != EAS_SUCCESS)
455*f81fb7c4SAndroid Build Coastguard Worker         return result;
456*f81fb7c4SAndroid Build Coastguard Worker 
457*f81fb7c4SAndroid Build Coastguard Worker     switch (temp)
458*f81fb7c4SAndroid Build Coastguard Worker     {
459*f81fb7c4SAndroid Build Coastguard Worker         case OTA_NOTE_INST_ID:
460*f81fb7c4SAndroid Build Coastguard Worker             /* fetch note value */
461*f81fb7c4SAndroid Build Coastguard Worker             if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 4, &pData->note)) != EAS_SUCCESS)
462*f81fb7c4SAndroid Build Coastguard Worker                 return result;
463*f81fb7c4SAndroid Build Coastguard Worker 
464*f81fb7c4SAndroid Build Coastguard Worker             /* fetch note duration */
465*f81fb7c4SAndroid Build Coastguard Worker             if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 3, &temp)) != EAS_SUCCESS)
466*f81fb7c4SAndroid Build Coastguard Worker                 return result;
467*f81fb7c4SAndroid Build Coastguard Worker             duration = pData->tick * (0x20 >> temp);
468*f81fb7c4SAndroid Build Coastguard Worker 
469*f81fb7c4SAndroid Build Coastguard Worker             /* fetch note duration modifier */
470*f81fb7c4SAndroid Build Coastguard Worker             if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 2, &temp)) != EAS_SUCCESS)
471*f81fb7c4SAndroid Build Coastguard Worker                 return result;
472*f81fb7c4SAndroid Build Coastguard Worker             switch (temp)
473*f81fb7c4SAndroid Build Coastguard Worker             {
474*f81fb7c4SAndroid Build Coastguard Worker                 case OTA_NORMAL_DURATION:
475*f81fb7c4SAndroid Build Coastguard Worker                     break;
476*f81fb7c4SAndroid Build Coastguard Worker 
477*f81fb7c4SAndroid Build Coastguard Worker                 case OTA_DOTTED_NOTE:
478*f81fb7c4SAndroid Build Coastguard Worker                     duration += duration >> 1;
479*f81fb7c4SAndroid Build Coastguard Worker                     break;
480*f81fb7c4SAndroid Build Coastguard Worker 
481*f81fb7c4SAndroid Build Coastguard Worker                 case OTA_DOUBLE_DOTTED_NOTE:
482*f81fb7c4SAndroid Build Coastguard Worker                     duration += (duration >> 1) + (duration >> 2);
483*f81fb7c4SAndroid Build Coastguard Worker                     break;
484*f81fb7c4SAndroid Build Coastguard Worker 
485*f81fb7c4SAndroid Build Coastguard Worker                 case OTA_TRIPLET_NOTE:
486*f81fb7c4SAndroid Build Coastguard Worker                     duration = (duration * TRIPLET_MULTIPLIER) >> TRIPLET_SHIFT;
487*f81fb7c4SAndroid Build Coastguard Worker                     break;
488*f81fb7c4SAndroid Build Coastguard Worker 
489*f81fb7c4SAndroid Build Coastguard Worker                 default:
490*f81fb7c4SAndroid Build Coastguard Worker                     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Unrecognized note duration ignored\n"); */ }
491*f81fb7c4SAndroid Build Coastguard Worker                     break;
492*f81fb7c4SAndroid Build Coastguard Worker             }
493*f81fb7c4SAndroid Build Coastguard Worker 
494*f81fb7c4SAndroid Build Coastguard Worker             /* check for note */
495*f81fb7c4SAndroid Build Coastguard Worker             if (pData->note)
496*f81fb7c4SAndroid Build Coastguard Worker             {
497*f81fb7c4SAndroid Build Coastguard Worker 
498*f81fb7c4SAndroid Build Coastguard Worker                 /* determine note length based on style */
499*f81fb7c4SAndroid Build Coastguard Worker                 switch (pData->style)
500*f81fb7c4SAndroid Build Coastguard Worker                 {
501*f81fb7c4SAndroid Build Coastguard Worker                     case 0:
502*f81fb7c4SAndroid Build Coastguard Worker                         pData->restTicks = duration >> 4;
503*f81fb7c4SAndroid Build Coastguard Worker                         break;
504*f81fb7c4SAndroid Build Coastguard Worker                     case 1:
505*f81fb7c4SAndroid Build Coastguard Worker                         pData->restTicks = 0;
506*f81fb7c4SAndroid Build Coastguard Worker                         break;
507*f81fb7c4SAndroid Build Coastguard Worker                     case 2:
508*f81fb7c4SAndroid Build Coastguard Worker                         pData->restTicks = duration >> 1;
509*f81fb7c4SAndroid Build Coastguard Worker                         break;
510*f81fb7c4SAndroid Build Coastguard Worker                     default:
511*f81fb7c4SAndroid Build Coastguard Worker                         { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Unrecognized note style ignored\n"); */ }
512*f81fb7c4SAndroid Build Coastguard Worker                 }
513*f81fb7c4SAndroid Build Coastguard Worker 
514*f81fb7c4SAndroid Build Coastguard Worker                 /* add octave */
515*f81fb7c4SAndroid Build Coastguard Worker                 pData->note += pData->octave;
516*f81fb7c4SAndroid Build Coastguard Worker                 if (parserMode == eParserModePlay)
517*f81fb7c4SAndroid Build Coastguard Worker                     VMStartNote(pEASData->pVoiceMgr, pData->pSynth, OTA_CHANNEL, pData->note, pData->velocity);
518*f81fb7c4SAndroid Build Coastguard Worker                 pData->time += (EAS_I32) duration - (EAS_I32) pData->restTicks;
519*f81fb7c4SAndroid Build Coastguard Worker             }
520*f81fb7c4SAndroid Build Coastguard Worker 
521*f81fb7c4SAndroid Build Coastguard Worker             /* this is a rest */
522*f81fb7c4SAndroid Build Coastguard Worker             else
523*f81fb7c4SAndroid Build Coastguard Worker                 pData->time += (EAS_I32) duration;
524*f81fb7c4SAndroid Build Coastguard Worker             break;
525*f81fb7c4SAndroid Build Coastguard Worker 
526*f81fb7c4SAndroid Build Coastguard Worker         case OTA_SCALE_INST_ID:
527*f81fb7c4SAndroid Build Coastguard Worker             /* fetch octave */
528*f81fb7c4SAndroid Build Coastguard Worker             if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 2, &temp)) != EAS_SUCCESS)
529*f81fb7c4SAndroid Build Coastguard Worker                 return result;
530*f81fb7c4SAndroid Build Coastguard Worker             pData->octave = (EAS_U8) (temp * 12 + 59);
531*f81fb7c4SAndroid Build Coastguard Worker             break;
532*f81fb7c4SAndroid Build Coastguard Worker 
533*f81fb7c4SAndroid Build Coastguard Worker         case OTA_STYLE_INST_ID:
534*f81fb7c4SAndroid Build Coastguard Worker             /* fetch note style */
535*f81fb7c4SAndroid Build Coastguard Worker             if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 2, &pData->style)) != EAS_SUCCESS)
536*f81fb7c4SAndroid Build Coastguard Worker                 return result;
537*f81fb7c4SAndroid Build Coastguard Worker             break;
538*f81fb7c4SAndroid Build Coastguard Worker 
539*f81fb7c4SAndroid Build Coastguard Worker         case OTA_TEMPO_INST_ID:
540*f81fb7c4SAndroid Build Coastguard Worker             /* fetch tempo */
541*f81fb7c4SAndroid Build Coastguard Worker             if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 5, &temp)) != EAS_SUCCESS)
542*f81fb7c4SAndroid Build Coastguard Worker                 return result;
543*f81fb7c4SAndroid Build Coastguard Worker             pData->tick = bpmTable[temp];
544*f81fb7c4SAndroid Build Coastguard Worker             break;
545*f81fb7c4SAndroid Build Coastguard Worker 
546*f81fb7c4SAndroid Build Coastguard Worker         case OTA_VOLUME_INST_ID:
547*f81fb7c4SAndroid Build Coastguard Worker             /* fetch volume */
548*f81fb7c4SAndroid Build Coastguard Worker             if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 4, &temp)) != EAS_SUCCESS)
549*f81fb7c4SAndroid Build Coastguard Worker                 return result;
550*f81fb7c4SAndroid Build Coastguard Worker             pData->velocity = temp ? (EAS_U8) (temp * OTA_VEL_MUL + OTA_VEL_OFS) : 0;
551*f81fb7c4SAndroid Build Coastguard Worker             break;
552*f81fb7c4SAndroid Build Coastguard Worker 
553*f81fb7c4SAndroid Build Coastguard Worker         default:
554*f81fb7c4SAndroid Build Coastguard Worker             { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Unexpected instruction ID in OTA stream\n"); */ }
555*f81fb7c4SAndroid Build Coastguard Worker             return EAS_ERROR_FILE_FORMAT;
556*f81fb7c4SAndroid Build Coastguard Worker     }
557*f81fb7c4SAndroid Build Coastguard Worker 
558*f81fb7c4SAndroid Build Coastguard Worker     /* decrement pattern length */
559*f81fb7c4SAndroid Build Coastguard Worker     pData->current.patternLen--;
560*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
561*f81fb7c4SAndroid Build Coastguard Worker }
562*f81fb7c4SAndroid Build Coastguard Worker 
563*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
564*f81fb7c4SAndroid Build Coastguard Worker  * OTA_State()
565*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
566*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
567*f81fb7c4SAndroid Build Coastguard Worker  * Returns the current state of the stream
568*f81fb7c4SAndroid Build Coastguard Worker  *
569*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
570*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
571*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
572*f81fb7c4SAndroid Build Coastguard Worker  * pState           - pointer to variable to store state
573*f81fb7c4SAndroid Build Coastguard Worker  *
574*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
575*f81fb7c4SAndroid Build Coastguard Worker  *
576*f81fb7c4SAndroid Build Coastguard Worker  *
577*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
578*f81fb7c4SAndroid Build Coastguard Worker  *
579*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
580*f81fb7c4SAndroid Build Coastguard Worker */
581*f81fb7c4SAndroid Build Coastguard Worker /*lint -esym(715, pEASData) common decoder interface - pEASData not used */
OTA_State(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData,EAS_I32 * pState)582*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_State (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 *pState)
583*f81fb7c4SAndroid Build Coastguard Worker {
584*f81fb7c4SAndroid Build Coastguard Worker     S_OTA_DATA* pData;
585*f81fb7c4SAndroid Build Coastguard Worker 
586*f81fb7c4SAndroid Build Coastguard Worker     /* establish pointer to instance data */
587*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_OTA_DATA*) pInstData;
588*f81fb7c4SAndroid Build Coastguard Worker 
589*f81fb7c4SAndroid Build Coastguard Worker     /* if stopping, check to see if synth voices are active */
590*f81fb7c4SAndroid Build Coastguard Worker     if (pData->state == EAS_STATE_STOPPING)
591*f81fb7c4SAndroid Build Coastguard Worker     {
592*f81fb7c4SAndroid Build Coastguard Worker         if (VMActiveVoices(pData->pSynth) == 0)
593*f81fb7c4SAndroid Build Coastguard Worker             pData->state = EAS_STATE_STOPPED;
594*f81fb7c4SAndroid Build Coastguard Worker     }
595*f81fb7c4SAndroid Build Coastguard Worker 
596*f81fb7c4SAndroid Build Coastguard Worker     if (pData->state == EAS_STATE_PAUSING)
597*f81fb7c4SAndroid Build Coastguard Worker     {
598*f81fb7c4SAndroid Build Coastguard Worker         if (VMActiveVoices(pData->pSynth) == 0)
599*f81fb7c4SAndroid Build Coastguard Worker             pData->state = EAS_STATE_PAUSED;
600*f81fb7c4SAndroid Build Coastguard Worker     }
601*f81fb7c4SAndroid Build Coastguard Worker 
602*f81fb7c4SAndroid Build Coastguard Worker     /* return current state */
603*f81fb7c4SAndroid Build Coastguard Worker     *pState = pData->state;
604*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
605*f81fb7c4SAndroid Build Coastguard Worker }
606*f81fb7c4SAndroid Build Coastguard Worker 
607*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
608*f81fb7c4SAndroid Build Coastguard Worker  * OTA_Close()
609*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
610*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
611*f81fb7c4SAndroid Build Coastguard Worker  * Close the file and clean up
612*f81fb7c4SAndroid Build Coastguard Worker  *
613*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
614*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
615*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
616*f81fb7c4SAndroid Build Coastguard Worker  *
617*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
618*f81fb7c4SAndroid Build Coastguard Worker  *
619*f81fb7c4SAndroid Build Coastguard Worker  *
620*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
621*f81fb7c4SAndroid Build Coastguard Worker  *
622*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
623*f81fb7c4SAndroid Build Coastguard Worker */
OTA_Close(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData)624*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_Close (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
625*f81fb7c4SAndroid Build Coastguard Worker {
626*f81fb7c4SAndroid Build Coastguard Worker     S_OTA_DATA* pData;
627*f81fb7c4SAndroid Build Coastguard Worker     EAS_RESULT result;
628*f81fb7c4SAndroid Build Coastguard Worker 
629*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_OTA_DATA*) pInstData;
630*f81fb7c4SAndroid Build Coastguard Worker 
631*f81fb7c4SAndroid Build Coastguard Worker     /* close the file */
632*f81fb7c4SAndroid Build Coastguard Worker     if ((result = EAS_HWCloseFile(pEASData->hwInstData, pData->fileHandle)) != EAS_SUCCESS)
633*f81fb7c4SAndroid Build Coastguard Worker             return result;
634*f81fb7c4SAndroid Build Coastguard Worker 
635*f81fb7c4SAndroid Build Coastguard Worker     /* free the synth */
636*f81fb7c4SAndroid Build Coastguard Worker     if (pData->pSynth != NULL)
637*f81fb7c4SAndroid Build Coastguard Worker         VMMIDIShutdown(pEASData, pData->pSynth);
638*f81fb7c4SAndroid Build Coastguard Worker 
639*f81fb7c4SAndroid Build Coastguard Worker     /* if using dynamic memory, free it */
640*f81fb7c4SAndroid Build Coastguard Worker     if (!pEASData->staticMemoryModel)
641*f81fb7c4SAndroid Build Coastguard Worker         EAS_HWFree(pEASData->hwInstData, pData);
642*f81fb7c4SAndroid Build Coastguard Worker 
643*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
644*f81fb7c4SAndroid Build Coastguard Worker }
645*f81fb7c4SAndroid Build Coastguard Worker 
646*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
647*f81fb7c4SAndroid Build Coastguard Worker  * OTA_Reset()
648*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
649*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
650*f81fb7c4SAndroid Build Coastguard Worker  * Reset the sequencer. Used for locating backwards in the file.
651*f81fb7c4SAndroid Build Coastguard Worker  *
652*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
653*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
654*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
655*f81fb7c4SAndroid Build Coastguard Worker  *
656*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
657*f81fb7c4SAndroid Build Coastguard Worker  *
658*f81fb7c4SAndroid Build Coastguard Worker  *
659*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
660*f81fb7c4SAndroid Build Coastguard Worker  *
661*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
662*f81fb7c4SAndroid Build Coastguard Worker */
OTA_Reset(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData)663*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_Reset (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
664*f81fb7c4SAndroid Build Coastguard Worker {
665*f81fb7c4SAndroid Build Coastguard Worker     S_OTA_DATA* pData;
666*f81fb7c4SAndroid Build Coastguard Worker     EAS_RESULT result;
667*f81fb7c4SAndroid Build Coastguard Worker 
668*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_OTA_DATA*) pInstData;
669*f81fb7c4SAndroid Build Coastguard Worker 
670*f81fb7c4SAndroid Build Coastguard Worker     /* reset the synth */
671*f81fb7c4SAndroid Build Coastguard Worker     VMReset(pEASData->pVoiceMgr, pData->pSynth, EAS_TRUE);
672*f81fb7c4SAndroid Build Coastguard Worker     pData->note = 0;
673*f81fb7c4SAndroid Build Coastguard Worker 
674*f81fb7c4SAndroid Build Coastguard Worker     /* reset file position and re-parse header */
675*f81fb7c4SAndroid Build Coastguard Worker     pData->state = EAS_STATE_ERROR;
676*f81fb7c4SAndroid Build Coastguard Worker     if ((result = OTA_ParseHeader (pEASData,  pData)) != EAS_SUCCESS)
677*f81fb7c4SAndroid Build Coastguard Worker         return result;
678*f81fb7c4SAndroid Build Coastguard Worker 
679*f81fb7c4SAndroid Build Coastguard Worker     pData->state = EAS_STATE_READY;
680*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
681*f81fb7c4SAndroid Build Coastguard Worker }
682*f81fb7c4SAndroid Build Coastguard Worker 
683*f81fb7c4SAndroid Build Coastguard Worker #ifdef JET_INTERFACE
684*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
685*f81fb7c4SAndroid Build Coastguard Worker  * OTA_Pause()
686*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
687*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
688*f81fb7c4SAndroid Build Coastguard Worker  * Pauses the sequencer. Mutes all voices and sets state to pause.
689*f81fb7c4SAndroid Build Coastguard Worker  *
690*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
691*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
692*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
693*f81fb7c4SAndroid Build Coastguard Worker  *
694*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
695*f81fb7c4SAndroid Build Coastguard Worker  *
696*f81fb7c4SAndroid Build Coastguard Worker  *
697*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
698*f81fb7c4SAndroid Build Coastguard Worker  *
699*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
700*f81fb7c4SAndroid Build Coastguard Worker */
OTA_Pause(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData)701*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_Pause (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
702*f81fb7c4SAndroid Build Coastguard Worker {
703*f81fb7c4SAndroid Build Coastguard Worker     S_OTA_DATA *pData;
704*f81fb7c4SAndroid Build Coastguard Worker 
705*f81fb7c4SAndroid Build Coastguard Worker     /* can't pause a stopped stream */
706*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_OTA_DATA*) pInstData;
707*f81fb7c4SAndroid Build Coastguard Worker     if (pData->state == EAS_STATE_STOPPED)
708*f81fb7c4SAndroid Build Coastguard Worker         return EAS_ERROR_ALREADY_STOPPED;
709*f81fb7c4SAndroid Build Coastguard Worker 
710*f81fb7c4SAndroid Build Coastguard Worker     /* mute the synthesizer */
711*f81fb7c4SAndroid Build Coastguard Worker     VMMuteAllVoices(pEASData->pVoiceMgr, pData->pSynth);
712*f81fb7c4SAndroid Build Coastguard Worker     pData->state = EAS_STATE_PAUSING;
713*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
714*f81fb7c4SAndroid Build Coastguard Worker }
715*f81fb7c4SAndroid Build Coastguard Worker 
716*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
717*f81fb7c4SAndroid Build Coastguard Worker  * OTA_Resume()
718*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
719*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
720*f81fb7c4SAndroid Build Coastguard Worker  * Resume playing after a pause, sets state back to playing.
721*f81fb7c4SAndroid Build Coastguard Worker  *
722*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
723*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
724*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
725*f81fb7c4SAndroid Build Coastguard Worker  *
726*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
727*f81fb7c4SAndroid Build Coastguard Worker  *
728*f81fb7c4SAndroid Build Coastguard Worker  *
729*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
730*f81fb7c4SAndroid Build Coastguard Worker  *
731*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
732*f81fb7c4SAndroid Build Coastguard Worker */
733*f81fb7c4SAndroid Build Coastguard Worker /*lint -esym(715, pEASData) common decoder interface - pEASData not used */
OTA_Resume(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData)734*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_Resume (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
735*f81fb7c4SAndroid Build Coastguard Worker {
736*f81fb7c4SAndroid Build Coastguard Worker     S_OTA_DATA *pData;
737*f81fb7c4SAndroid Build Coastguard Worker 
738*f81fb7c4SAndroid Build Coastguard Worker     /* can't resume a stopped stream */
739*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_OTA_DATA*) pInstData;
740*f81fb7c4SAndroid Build Coastguard Worker     if (pData->state == EAS_STATE_STOPPED)
741*f81fb7c4SAndroid Build Coastguard Worker         return EAS_ERROR_ALREADY_STOPPED;
742*f81fb7c4SAndroid Build Coastguard Worker 
743*f81fb7c4SAndroid Build Coastguard Worker     /* nothing to do but resume playback */
744*f81fb7c4SAndroid Build Coastguard Worker     pData->state = EAS_STATE_PLAY;
745*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
746*f81fb7c4SAndroid Build Coastguard Worker }
747*f81fb7c4SAndroid Build Coastguard Worker #endif
748*f81fb7c4SAndroid Build Coastguard Worker 
749*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
750*f81fb7c4SAndroid Build Coastguard Worker  * OTA_SetData()
751*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
752*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
753*f81fb7c4SAndroid Build Coastguard Worker  * Return file type
754*f81fb7c4SAndroid Build Coastguard Worker  *
755*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
756*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
757*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
758*f81fb7c4SAndroid Build Coastguard Worker  *
759*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
760*f81fb7c4SAndroid Build Coastguard Worker  *
761*f81fb7c4SAndroid Build Coastguard Worker  *
762*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
763*f81fb7c4SAndroid Build Coastguard Worker  *
764*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
765*f81fb7c4SAndroid Build Coastguard Worker */
766*f81fb7c4SAndroid Build Coastguard Worker /*lint -esym(715, pEASData) common decoder interface - pEASData not used */
OTA_SetData(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData,EAS_I32 param,EAS_I32 value)767*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_SetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value)
768*f81fb7c4SAndroid Build Coastguard Worker {
769*f81fb7c4SAndroid Build Coastguard Worker     S_OTA_DATA *pData;
770*f81fb7c4SAndroid Build Coastguard Worker 
771*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_OTA_DATA *) pInstData;
772*f81fb7c4SAndroid Build Coastguard Worker     switch (param)
773*f81fb7c4SAndroid Build Coastguard Worker     {
774*f81fb7c4SAndroid Build Coastguard Worker 
775*f81fb7c4SAndroid Build Coastguard Worker         /* set metadata callback */
776*f81fb7c4SAndroid Build Coastguard Worker         case PARSER_DATA_METADATA_CB:
777*f81fb7c4SAndroid Build Coastguard Worker             EAS_HWMemCpy(&pData->metadata, (void*) value, sizeof(S_METADATA_CB));
778*f81fb7c4SAndroid Build Coastguard Worker             break;
779*f81fb7c4SAndroid Build Coastguard Worker 
780*f81fb7c4SAndroid Build Coastguard Worker         default:
781*f81fb7c4SAndroid Build Coastguard Worker             return EAS_ERROR_INVALID_PARAMETER;
782*f81fb7c4SAndroid Build Coastguard Worker     }
783*f81fb7c4SAndroid Build Coastguard Worker 
784*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
785*f81fb7c4SAndroid Build Coastguard Worker }
786*f81fb7c4SAndroid Build Coastguard Worker 
787*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
788*f81fb7c4SAndroid Build Coastguard Worker  * OTA_GetData()
789*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
790*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
791*f81fb7c4SAndroid Build Coastguard Worker  * Return file type
792*f81fb7c4SAndroid Build Coastguard Worker  *
793*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
794*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
795*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
796*f81fb7c4SAndroid Build Coastguard Worker  *
797*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
798*f81fb7c4SAndroid Build Coastguard Worker  *
799*f81fb7c4SAndroid Build Coastguard Worker  *
800*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
801*f81fb7c4SAndroid Build Coastguard Worker  *
802*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
803*f81fb7c4SAndroid Build Coastguard Worker */
804*f81fb7c4SAndroid Build Coastguard Worker /*lint -esym(715, pEASData) common decoder interface - pEASData not used */
OTA_GetData(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData,EAS_I32 param,EAS_I32 * pValue)805*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_GetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue)
806*f81fb7c4SAndroid Build Coastguard Worker {
807*f81fb7c4SAndroid Build Coastguard Worker     S_OTA_DATA *pData;
808*f81fb7c4SAndroid Build Coastguard Worker 
809*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_OTA_DATA*) pInstData;
810*f81fb7c4SAndroid Build Coastguard Worker     switch (param)
811*f81fb7c4SAndroid Build Coastguard Worker     {
812*f81fb7c4SAndroid Build Coastguard Worker         /* return file type as OTA */
813*f81fb7c4SAndroid Build Coastguard Worker         case PARSER_DATA_FILE_TYPE:
814*f81fb7c4SAndroid Build Coastguard Worker             *pValue = EAS_FILE_OTA;
815*f81fb7c4SAndroid Build Coastguard Worker             break;
816*f81fb7c4SAndroid Build Coastguard Worker 
817*f81fb7c4SAndroid Build Coastguard Worker #if 0
818*f81fb7c4SAndroid Build Coastguard Worker         /* set transposition */
819*f81fb7c4SAndroid Build Coastguard Worker         case PARSER_DATA_TRANSPOSITION:
820*f81fb7c4SAndroid Build Coastguard Worker             *pValue = pData->transposition;
821*f81fb7c4SAndroid Build Coastguard Worker             break;
822*f81fb7c4SAndroid Build Coastguard Worker #endif
823*f81fb7c4SAndroid Build Coastguard Worker 
824*f81fb7c4SAndroid Build Coastguard Worker         case PARSER_DATA_SYNTH_HANDLE:
825*f81fb7c4SAndroid Build Coastguard Worker             *pValue = (EAS_I32) pData->pSynth;
826*f81fb7c4SAndroid Build Coastguard Worker             break;
827*f81fb7c4SAndroid Build Coastguard Worker 
828*f81fb7c4SAndroid Build Coastguard Worker         case PARSER_DATA_GAIN_OFFSET:
829*f81fb7c4SAndroid Build Coastguard Worker             *pValue = OTA_GAIN_OFFSET;
830*f81fb7c4SAndroid Build Coastguard Worker             break;
831*f81fb7c4SAndroid Build Coastguard Worker 
832*f81fb7c4SAndroid Build Coastguard Worker         default:
833*f81fb7c4SAndroid Build Coastguard Worker             return EAS_ERROR_INVALID_PARAMETER;
834*f81fb7c4SAndroid Build Coastguard Worker     }
835*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
836*f81fb7c4SAndroid Build Coastguard Worker }
837*f81fb7c4SAndroid Build Coastguard Worker 
838*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
839*f81fb7c4SAndroid Build Coastguard Worker  * OTA_ParseHeader()
840*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
841*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
842*f81fb7c4SAndroid Build Coastguard Worker  * Prepare to parse the file. Allocates instance data (or uses static allocation for
843*f81fb7c4SAndroid Build Coastguard Worker  * static memory model).
844*f81fb7c4SAndroid Build Coastguard Worker  *
845*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
846*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
847*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
848*f81fb7c4SAndroid Build Coastguard Worker  *
849*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
850*f81fb7c4SAndroid Build Coastguard Worker  *
851*f81fb7c4SAndroid Build Coastguard Worker  *
852*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
853*f81fb7c4SAndroid Build Coastguard Worker  *
854*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
855*f81fb7c4SAndroid Build Coastguard Worker */
OTA_ParseHeader(S_EAS_DATA * pEASData,S_OTA_DATA * pData)856*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_ParseHeader (S_EAS_DATA *pEASData, S_OTA_DATA* pData)
857*f81fb7c4SAndroid Build Coastguard Worker {
858*f81fb7c4SAndroid Build Coastguard Worker     EAS_RESULT result;
859*f81fb7c4SAndroid Build Coastguard Worker     EAS_INT i;
860*f81fb7c4SAndroid Build Coastguard Worker     EAS_INT state;
861*f81fb7c4SAndroid Build Coastguard Worker     EAS_U8 temp;
862*f81fb7c4SAndroid Build Coastguard Worker     EAS_U8 titleLen;
863*f81fb7c4SAndroid Build Coastguard Worker 
864*f81fb7c4SAndroid Build Coastguard Worker     /* initialize some data */
865*f81fb7c4SAndroid Build Coastguard Worker     pData->flags = 0;
866*f81fb7c4SAndroid Build Coastguard Worker     pData->time = 0;
867*f81fb7c4SAndroid Build Coastguard Worker     pData->tick = DEFAULT_TICK_CONV;
868*f81fb7c4SAndroid Build Coastguard Worker     pData->patterns[0].fileOffset = pData->patterns[1].fileOffset =
869*f81fb7c4SAndroid Build Coastguard Worker         pData->patterns[2].fileOffset = pData->patterns[3].fileOffset = -1;
870*f81fb7c4SAndroid Build Coastguard Worker     pData->current.bitCount = 0;
871*f81fb7c4SAndroid Build Coastguard Worker     pData->current.patternLen = 0;
872*f81fb7c4SAndroid Build Coastguard Worker     pData->loopCount = 0;
873*f81fb7c4SAndroid Build Coastguard Worker     pData->restore.fileOffset = -1;
874*f81fb7c4SAndroid Build Coastguard Worker     pData->note = 0;
875*f81fb7c4SAndroid Build Coastguard Worker     pData->restTicks = 0;
876*f81fb7c4SAndroid Build Coastguard Worker     pData->velocity = OTA_VEL_DEFAULT;
877*f81fb7c4SAndroid Build Coastguard Worker     pData->style = 0;
878*f81fb7c4SAndroid Build Coastguard Worker     pData->octave = 59;
879*f81fb7c4SAndroid Build Coastguard Worker 
880*f81fb7c4SAndroid Build Coastguard Worker     /* seek to start of data */
881*f81fb7c4SAndroid Build Coastguard Worker     if ((result = EAS_HWFileSeek(pEASData->hwInstData, pData->fileHandle, pData->fileOffset)) != EAS_SUCCESS)
882*f81fb7c4SAndroid Build Coastguard Worker         return result;
883*f81fb7c4SAndroid Build Coastguard Worker 
884*f81fb7c4SAndroid Build Coastguard Worker     /* read the first byte, should be command length */
885*f81fb7c4SAndroid Build Coastguard Worker     if ((result = EAS_HWGetByte(pEASData->hwInstData, pData->fileHandle, &temp)) != EAS_SUCCESS)
886*f81fb7c4SAndroid Build Coastguard Worker         return result;
887*f81fb7c4SAndroid Build Coastguard Worker 
888*f81fb7c4SAndroid Build Coastguard Worker     /* read all the commands */
889*f81fb7c4SAndroid Build Coastguard Worker     i = temp;
890*f81fb7c4SAndroid Build Coastguard Worker     state = 0;
891*f81fb7c4SAndroid Build Coastguard Worker     while (i--)
892*f81fb7c4SAndroid Build Coastguard Worker     {
893*f81fb7c4SAndroid Build Coastguard Worker 
894*f81fb7c4SAndroid Build Coastguard Worker         /* fetch command, always starts on byte boundary */
895*f81fb7c4SAndroid Build Coastguard Worker         pData->current.bitCount = 0;
896*f81fb7c4SAndroid Build Coastguard Worker         if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 7, &temp)) != EAS_SUCCESS)
897*f81fb7c4SAndroid Build Coastguard Worker             return result;
898*f81fb7c4SAndroid Build Coastguard Worker 
899*f81fb7c4SAndroid Build Coastguard Worker         if (state == 0)
900*f81fb7c4SAndroid Build Coastguard Worker         {
901*f81fb7c4SAndroid Build Coastguard Worker             if (temp != OTA_RINGTONE)
902*f81fb7c4SAndroid Build Coastguard Worker             {
903*f81fb7c4SAndroid Build Coastguard Worker                 { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Expected OTA Ring Tone Programming type\n"); */ }
904*f81fb7c4SAndroid Build Coastguard Worker                 return EAS_ERROR_FILE_FORMAT;
905*f81fb7c4SAndroid Build Coastguard Worker             }
906*f81fb7c4SAndroid Build Coastguard Worker             state++;
907*f81fb7c4SAndroid Build Coastguard Worker         }
908*f81fb7c4SAndroid Build Coastguard Worker         else
909*f81fb7c4SAndroid Build Coastguard Worker         {
910*f81fb7c4SAndroid Build Coastguard Worker 
911*f81fb7c4SAndroid Build Coastguard Worker             if (temp == OTA_SOUND)
912*f81fb7c4SAndroid Build Coastguard Worker                 break;
913*f81fb7c4SAndroid Build Coastguard Worker 
914*f81fb7c4SAndroid Build Coastguard Worker             if (temp == OTA_UNICODE)
915*f81fb7c4SAndroid Build Coastguard Worker                 pData->flags |= OTA_FLAGS_UNICODE;
916*f81fb7c4SAndroid Build Coastguard Worker             else
917*f81fb7c4SAndroid Build Coastguard Worker             {
918*f81fb7c4SAndroid Build Coastguard Worker                 { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Expected OTA Sound or Unicode type\n"); */ }
919*f81fb7c4SAndroid Build Coastguard Worker                 return EAS_ERROR_FILE_FORMAT;
920*f81fb7c4SAndroid Build Coastguard Worker             }
921*f81fb7c4SAndroid Build Coastguard Worker         }
922*f81fb7c4SAndroid Build Coastguard Worker     }
923*f81fb7c4SAndroid Build Coastguard Worker 
924*f81fb7c4SAndroid Build Coastguard Worker     /* get song type */
925*f81fb7c4SAndroid Build Coastguard Worker     if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 3, &temp)) != EAS_SUCCESS)
926*f81fb7c4SAndroid Build Coastguard Worker         return result;
927*f81fb7c4SAndroid Build Coastguard Worker 
928*f81fb7c4SAndroid Build Coastguard Worker     /* check for basic song type */
929*f81fb7c4SAndroid Build Coastguard Worker     if (temp == OTA_BASIC_SONG_TYPE)
930*f81fb7c4SAndroid Build Coastguard Worker     {
931*f81fb7c4SAndroid Build Coastguard Worker         /* fetch title length */
932*f81fb7c4SAndroid Build Coastguard Worker         if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 4, &titleLen)) != EAS_SUCCESS)
933*f81fb7c4SAndroid Build Coastguard Worker             return result;
934*f81fb7c4SAndroid Build Coastguard Worker 
935*f81fb7c4SAndroid Build Coastguard Worker         /* if unicode, double the length */
936*f81fb7c4SAndroid Build Coastguard Worker         if (pData->flags & OTA_FLAGS_UNICODE)
937*f81fb7c4SAndroid Build Coastguard Worker             titleLen = (EAS_U8) (titleLen << 1);
938*f81fb7c4SAndroid Build Coastguard Worker 
939*f81fb7c4SAndroid Build Coastguard Worker         /* zero the metadata buffer */
940*f81fb7c4SAndroid Build Coastguard Worker         if (pData->metadata.buffer)
941*f81fb7c4SAndroid Build Coastguard Worker             EAS_HWMemSet(pData->metadata.buffer, 0, pData->metadata.bufferSize);
942*f81fb7c4SAndroid Build Coastguard Worker 
943*f81fb7c4SAndroid Build Coastguard Worker         /* read the song title */
944*f81fb7c4SAndroid Build Coastguard Worker         for (i = 0; i < titleLen; i++)
945*f81fb7c4SAndroid Build Coastguard Worker         {
946*f81fb7c4SAndroid Build Coastguard Worker             /* fetch character */
947*f81fb7c4SAndroid Build Coastguard Worker             if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 8, &temp)) != EAS_SUCCESS)
948*f81fb7c4SAndroid Build Coastguard Worker                 return result;
949*f81fb7c4SAndroid Build Coastguard Worker 
950*f81fb7c4SAndroid Build Coastguard Worker             /* check for metadata callback */
951*f81fb7c4SAndroid Build Coastguard Worker             if (pData->metadata.callback)
952*f81fb7c4SAndroid Build Coastguard Worker             {
953*f81fb7c4SAndroid Build Coastguard Worker                 if (i < (pData->metadata.bufferSize - 1))
954*f81fb7c4SAndroid Build Coastguard Worker                     pData->metadata.buffer[i] = (char) temp;
955*f81fb7c4SAndroid Build Coastguard Worker             }
956*f81fb7c4SAndroid Build Coastguard Worker         }
957*f81fb7c4SAndroid Build Coastguard Worker 
958*f81fb7c4SAndroid Build Coastguard Worker         /* if host has registered callback, call it now */
959*f81fb7c4SAndroid Build Coastguard Worker         if (pData->metadata.callback)
960*f81fb7c4SAndroid Build Coastguard Worker             (*pData->metadata.callback)(EAS_METADATA_TITLE, pData->metadata.buffer, pData->metadata.pUserData);
961*f81fb7c4SAndroid Build Coastguard Worker     }
962*f81fb7c4SAndroid Build Coastguard Worker 
963*f81fb7c4SAndroid Build Coastguard Worker     /* must be temporary song */
964*f81fb7c4SAndroid Build Coastguard Worker     else if (temp != OTA_TEMPORARY_SONG_TYPE)
965*f81fb7c4SAndroid Build Coastguard Worker     {
966*f81fb7c4SAndroid Build Coastguard Worker         { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Expected OTA basic or temporary song type\n"); */ }
967*f81fb7c4SAndroid Build Coastguard Worker         return EAS_ERROR_FILE_FORMAT;
968*f81fb7c4SAndroid Build Coastguard Worker     }
969*f81fb7c4SAndroid Build Coastguard Worker 
970*f81fb7c4SAndroid Build Coastguard Worker     /* get the song length */
971*f81fb7c4SAndroid Build Coastguard Worker     if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 8, &pData->numPatterns)) != EAS_SUCCESS)
972*f81fb7c4SAndroid Build Coastguard Worker         return result;
973*f81fb7c4SAndroid Build Coastguard Worker 
974*f81fb7c4SAndroid Build Coastguard Worker     /* sanity check */
975*f81fb7c4SAndroid Build Coastguard Worker     if (pData->numPatterns == 0)
976*f81fb7c4SAndroid Build Coastguard Worker     {
977*f81fb7c4SAndroid Build Coastguard Worker         { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "OTA number of patterns is zero\n"); */ }
978*f81fb7c4SAndroid Build Coastguard Worker         return EAS_ERROR_FILE_FORMAT;
979*f81fb7c4SAndroid Build Coastguard Worker     }
980*f81fb7c4SAndroid Build Coastguard Worker 
981*f81fb7c4SAndroid Build Coastguard Worker     /* at start of first pattern */
982*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
983*f81fb7c4SAndroid Build Coastguard Worker }
984*f81fb7c4SAndroid Build Coastguard Worker 
985*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
986*f81fb7c4SAndroid Build Coastguard Worker  * OTA_FetchBitField()
987*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
988*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
989*f81fb7c4SAndroid Build Coastguard Worker  * Fetch a specified number of bits from the input stream
990*f81fb7c4SAndroid Build Coastguard Worker  *
991*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
992*f81fb7c4SAndroid Build Coastguard Worker  *
993*f81fb7c4SAndroid Build Coastguard Worker  *
994*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
995*f81fb7c4SAndroid Build Coastguard Worker  *
996*f81fb7c4SAndroid Build Coastguard Worker  *
997*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
998*f81fb7c4SAndroid Build Coastguard Worker  *
999*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1000*f81fb7c4SAndroid Build Coastguard Worker */
OTA_FetchBitField(EAS_HW_DATA_HANDLE hwInstData,S_OTA_DATA * pData,EAS_I32 numBits,EAS_U8 * pValue)1001*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_FetchBitField (EAS_HW_DATA_HANDLE hwInstData, S_OTA_DATA *pData, EAS_I32 numBits, EAS_U8 *pValue)
1002*f81fb7c4SAndroid Build Coastguard Worker {
1003*f81fb7c4SAndroid Build Coastguard Worker     EAS_RESULT result;
1004*f81fb7c4SAndroid Build Coastguard Worker     EAS_I32 bitsLeft;
1005*f81fb7c4SAndroid Build Coastguard Worker     EAS_U8 value;
1006*f81fb7c4SAndroid Build Coastguard Worker 
1007*f81fb7c4SAndroid Build Coastguard Worker     value = 0;
1008*f81fb7c4SAndroid Build Coastguard Worker 
1009*f81fb7c4SAndroid Build Coastguard Worker     /* do we have enough bits? */
1010*f81fb7c4SAndroid Build Coastguard Worker     bitsLeft = pData->current.bitCount - numBits;
1011*f81fb7c4SAndroid Build Coastguard Worker 
1012*f81fb7c4SAndroid Build Coastguard Worker     /* not enough bits, assemble them from 2 characters */
1013*f81fb7c4SAndroid Build Coastguard Worker     if (bitsLeft < 0)
1014*f81fb7c4SAndroid Build Coastguard Worker     {
1015*f81fb7c4SAndroid Build Coastguard Worker         /* grab the remaining bits from the previous byte */
1016*f81fb7c4SAndroid Build Coastguard Worker         if (pData->current.bitCount)
1017*f81fb7c4SAndroid Build Coastguard Worker             /*lint -e{504,734} this is a legitimate shift operation */
1018*f81fb7c4SAndroid Build Coastguard Worker             value = pData->current.dataByte << -bitsLeft;
1019*f81fb7c4SAndroid Build Coastguard Worker 
1020*f81fb7c4SAndroid Build Coastguard Worker         /* read the next byte */
1021*f81fb7c4SAndroid Build Coastguard Worker         if ((result = EAS_HWGetByte(hwInstData, pData->fileHandle, &pData->current.dataByte)) != EAS_SUCCESS)
1022*f81fb7c4SAndroid Build Coastguard Worker             return result;
1023*f81fb7c4SAndroid Build Coastguard Worker         bitsLeft += 8;
1024*f81fb7c4SAndroid Build Coastguard Worker     }
1025*f81fb7c4SAndroid Build Coastguard Worker 
1026*f81fb7c4SAndroid Build Coastguard Worker     /* more bits than needed? */
1027*f81fb7c4SAndroid Build Coastguard Worker     if (bitsLeft > 0)
1028*f81fb7c4SAndroid Build Coastguard Worker     {
1029*f81fb7c4SAndroid Build Coastguard Worker         value |= pData->current.dataByte >> bitsLeft;
1030*f81fb7c4SAndroid Build Coastguard Worker         pData->current.bitCount = (EAS_U8) bitsLeft;
1031*f81fb7c4SAndroid Build Coastguard Worker         pData->current.dataByte = pData->current.dataByte & (0xff >> (8 - bitsLeft));
1032*f81fb7c4SAndroid Build Coastguard Worker     }
1033*f81fb7c4SAndroid Build Coastguard Worker 
1034*f81fb7c4SAndroid Build Coastguard Worker     /* exactly the right number of bits */
1035*f81fb7c4SAndroid Build Coastguard Worker     else
1036*f81fb7c4SAndroid Build Coastguard Worker     {
1037*f81fb7c4SAndroid Build Coastguard Worker         value |= pData->current.dataByte;
1038*f81fb7c4SAndroid Build Coastguard Worker         pData->current.bitCount = 0;
1039*f81fb7c4SAndroid Build Coastguard Worker     }
1040*f81fb7c4SAndroid Build Coastguard Worker 
1041*f81fb7c4SAndroid Build Coastguard Worker     *pValue = value;
1042*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
1043*f81fb7c4SAndroid Build Coastguard Worker }
1044*f81fb7c4SAndroid Build Coastguard Worker 
1045*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1046*f81fb7c4SAndroid Build Coastguard Worker  * OTA_SavePosition()
1047*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1048*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
1049*f81fb7c4SAndroid Build Coastguard Worker  *
1050*f81fb7c4SAndroid Build Coastguard Worker  *
1051*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
1052*f81fb7c4SAndroid Build Coastguard Worker  *
1053*f81fb7c4SAndroid Build Coastguard Worker  *
1054*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
1055*f81fb7c4SAndroid Build Coastguard Worker  *
1056*f81fb7c4SAndroid Build Coastguard Worker  *
1057*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
1058*f81fb7c4SAndroid Build Coastguard Worker  *
1059*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1060*f81fb7c4SAndroid Build Coastguard Worker */
OTA_SavePosition(EAS_HW_DATA_HANDLE hwInstData,S_OTA_DATA * pData,S_OTA_LOC * pLoc)1061*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_SavePosition (EAS_HW_DATA_HANDLE hwInstData, S_OTA_DATA *pData, S_OTA_LOC *pLoc)
1062*f81fb7c4SAndroid Build Coastguard Worker {
1063*f81fb7c4SAndroid Build Coastguard Worker     EAS_HWMemCpy(pLoc, &pData->current, sizeof(S_OTA_LOC));
1064*f81fb7c4SAndroid Build Coastguard Worker     return EAS_HWFilePos(hwInstData, pData->fileHandle, &pLoc->fileOffset);
1065*f81fb7c4SAndroid Build Coastguard Worker }
1066*f81fb7c4SAndroid Build Coastguard Worker 
1067*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1068*f81fb7c4SAndroid Build Coastguard Worker  * OTA_RestorePosition()
1069*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1070*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
1071*f81fb7c4SAndroid Build Coastguard Worker  *
1072*f81fb7c4SAndroid Build Coastguard Worker  *
1073*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
1074*f81fb7c4SAndroid Build Coastguard Worker  *
1075*f81fb7c4SAndroid Build Coastguard Worker  *
1076*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
1077*f81fb7c4SAndroid Build Coastguard Worker  *
1078*f81fb7c4SAndroid Build Coastguard Worker  *
1079*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
1080*f81fb7c4SAndroid Build Coastguard Worker  *
1081*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1082*f81fb7c4SAndroid Build Coastguard Worker */
OTA_RestorePosition(EAS_HW_DATA_HANDLE hwInstData,S_OTA_DATA * pData,S_OTA_LOC * pLoc)1083*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT OTA_RestorePosition (EAS_HW_DATA_HANDLE hwInstData, S_OTA_DATA *pData, S_OTA_LOC *pLoc)
1084*f81fb7c4SAndroid Build Coastguard Worker {
1085*f81fb7c4SAndroid Build Coastguard Worker     EAS_HWMemCpy(&pData->current, pLoc, sizeof(S_OTA_LOC));
1086*f81fb7c4SAndroid Build Coastguard Worker     pData->restore.fileOffset = -1;
1087*f81fb7c4SAndroid Build Coastguard Worker     return EAS_HWFileSeek(hwInstData, pData->fileHandle, pLoc->fileOffset);
1088*f81fb7c4SAndroid Build Coastguard Worker }
1089*f81fb7c4SAndroid Build Coastguard Worker 
1090