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