xref: /aosp_15_r20/external/sonivox/arm-wt-22k/lib_src/eas_imelody.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_imelody.c
5*f81fb7c4SAndroid Build Coastguard Worker  *
6*f81fb7c4SAndroid Build Coastguard Worker  * Contents and purpose:
7*f81fb7c4SAndroid Build Coastguard Worker  * iMelody 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: 797 $
26*f81fb7c4SAndroid Build Coastguard Worker  *   $Date: 2007-08-01 00:15:56 -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 /* lint doesn't like the way some string.h files look */
31*f81fb7c4SAndroid Build Coastguard Worker #ifdef _lint
32*f81fb7c4SAndroid Build Coastguard Worker #include "lint_stdlib.h"
33*f81fb7c4SAndroid Build Coastguard Worker #else
34*f81fb7c4SAndroid Build Coastguard Worker #include <string.h>
35*f81fb7c4SAndroid Build Coastguard Worker #endif
36*f81fb7c4SAndroid Build Coastguard Worker 
37*f81fb7c4SAndroid Build Coastguard Worker #include "eas_data.h"
38*f81fb7c4SAndroid Build Coastguard Worker #include "eas_miditypes.h"
39*f81fb7c4SAndroid Build Coastguard Worker #include "eas_parser.h"
40*f81fb7c4SAndroid Build Coastguard Worker #include "eas_report.h"
41*f81fb7c4SAndroid Build Coastguard Worker #include "eas_host.h"
42*f81fb7c4SAndroid Build Coastguard Worker #include "eas_midi.h"
43*f81fb7c4SAndroid Build Coastguard Worker #include "eas_config.h"
44*f81fb7c4SAndroid Build Coastguard Worker #include "eas_vm_protos.h"
45*f81fb7c4SAndroid Build Coastguard Worker #include "eas_imelodydata.h"
46*f81fb7c4SAndroid Build Coastguard Worker #include "eas_ctype.h"
47*f81fb7c4SAndroid Build Coastguard Worker 
48*f81fb7c4SAndroid Build Coastguard Worker // #define _DEBUG_IMELODY
49*f81fb7c4SAndroid Build Coastguard Worker 
50*f81fb7c4SAndroid Build Coastguard Worker /* increase gain for mono ringtones */
51*f81fb7c4SAndroid Build Coastguard Worker #define IMELODY_GAIN_OFFSET     8
52*f81fb7c4SAndroid Build Coastguard Worker 
53*f81fb7c4SAndroid Build Coastguard Worker /* length of 32nd note in 1/256ths of a msec for 120 BPM tempo */
54*f81fb7c4SAndroid Build Coastguard Worker #define DEFAULT_TICK_CONV       16000
55*f81fb7c4SAndroid Build Coastguard Worker #define TICK_CONVERT            1920000
56*f81fb7c4SAndroid Build Coastguard Worker 
57*f81fb7c4SAndroid Build Coastguard Worker /* default channel and program for iMelody playback */
58*f81fb7c4SAndroid Build Coastguard Worker #define IMELODY_CHANNEL         0
59*f81fb7c4SAndroid Build Coastguard Worker #define IMELODY_PROGRAM         80
60*f81fb7c4SAndroid Build Coastguard Worker #define IMELODY_VEL_MUL         4
61*f81fb7c4SAndroid Build Coastguard Worker #define IMELODY_VEL_OFS         67
62*f81fb7c4SAndroid Build Coastguard Worker 
63*f81fb7c4SAndroid Build Coastguard Worker /* multiplier for fixed point triplet conversion */
64*f81fb7c4SAndroid Build Coastguard Worker #define TRIPLET_MULTIPLIER      683
65*f81fb7c4SAndroid Build Coastguard Worker #define TRIPLET_SHIFT           10
66*f81fb7c4SAndroid Build Coastguard Worker 
67*f81fb7c4SAndroid Build Coastguard Worker static const char* const tokens[] =
68*f81fb7c4SAndroid Build Coastguard Worker {
69*f81fb7c4SAndroid Build Coastguard Worker     "BEGIN:IMELODY",
70*f81fb7c4SAndroid Build Coastguard Worker     "VERSION:",
71*f81fb7c4SAndroid Build Coastguard Worker     "FORMAT:CLASS",
72*f81fb7c4SAndroid Build Coastguard Worker     "NAME:",
73*f81fb7c4SAndroid Build Coastguard Worker     "COMPOSER:",
74*f81fb7c4SAndroid Build Coastguard Worker     "BEAT:",
75*f81fb7c4SAndroid Build Coastguard Worker     "STYLE:",
76*f81fb7c4SAndroid Build Coastguard Worker     "VOLUME:",
77*f81fb7c4SAndroid Build Coastguard Worker     "MELODY:",
78*f81fb7c4SAndroid Build Coastguard Worker     "END:IMELODY"
79*f81fb7c4SAndroid Build Coastguard Worker };
80*f81fb7c4SAndroid Build Coastguard Worker 
81*f81fb7c4SAndroid Build Coastguard Worker /* ledon or ledoff */
82*f81fb7c4SAndroid Build Coastguard Worker static const char ledStr[] = "edo";
83*f81fb7c4SAndroid Build Coastguard Worker 
84*f81fb7c4SAndroid Build Coastguard Worker /* vibeon or vibeoff */
85*f81fb7c4SAndroid Build Coastguard Worker static const char vibeStr[] = "ibeo";
86*f81fb7c4SAndroid Build Coastguard Worker 
87*f81fb7c4SAndroid Build Coastguard Worker /* backon or backoff */
88*f81fb7c4SAndroid Build Coastguard Worker static const char backStr[] = "cko";
89*f81fb7c4SAndroid Build Coastguard Worker 
90*f81fb7c4SAndroid Build Coastguard Worker typedef enum
91*f81fb7c4SAndroid Build Coastguard Worker {
92*f81fb7c4SAndroid Build Coastguard Worker     TOKEN_BEGIN,
93*f81fb7c4SAndroid Build Coastguard Worker     TOKEN_VERSION,
94*f81fb7c4SAndroid Build Coastguard Worker     TOKEN_FORMAT,
95*f81fb7c4SAndroid Build Coastguard Worker     TOKEN_NAME,
96*f81fb7c4SAndroid Build Coastguard Worker     TOKEN_COMPOSER,
97*f81fb7c4SAndroid Build Coastguard Worker     TOKEN_BEAT,
98*f81fb7c4SAndroid Build Coastguard Worker     TOKEN_STYLE,
99*f81fb7c4SAndroid Build Coastguard Worker     TOKEN_VOLUME,
100*f81fb7c4SAndroid Build Coastguard Worker     TOKEN_MELODY,
101*f81fb7c4SAndroid Build Coastguard Worker     TOKEN_END,
102*f81fb7c4SAndroid Build Coastguard Worker     TOKEN_INVALID
103*f81fb7c4SAndroid Build Coastguard Worker } ENUM_IMELODY_TOKENS;
104*f81fb7c4SAndroid Build Coastguard Worker 
105*f81fb7c4SAndroid Build Coastguard Worker /* lookup table for note values */
106*f81fb7c4SAndroid Build Coastguard Worker static const EAS_I8 noteTable[] = { 9, 11, 0, 2, 4, 5, 7 };
107*f81fb7c4SAndroid Build Coastguard Worker 
108*f81fb7c4SAndroid Build Coastguard Worker /* inline functions */
109*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
PutBackChar(S_IMELODY_DATA * pData)110*f81fb7c4SAndroid Build Coastguard Worker static void PutBackChar (S_IMELODY_DATA *pData)
111*f81fb7c4SAndroid Build Coastguard Worker {
112*f81fb7c4SAndroid Build Coastguard Worker     if (pData->index)
113*f81fb7c4SAndroid Build Coastguard Worker         pData->index--;
114*f81fb7c4SAndroid Build Coastguard Worker     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "PutBackChar '%c'\n", pData->buffer[pData->index]); */ }
115*f81fb7c4SAndroid Build Coastguard Worker }
116*f81fb7c4SAndroid Build Coastguard Worker #else
PutBackChar(S_IMELODY_DATA * pData)117*f81fb7c4SAndroid Build Coastguard Worker EAS_INLINE void PutBackChar (S_IMELODY_DATA *pData) { if (pData->index) pData->index--; }
118*f81fb7c4SAndroid Build Coastguard Worker #endif
119*f81fb7c4SAndroid Build Coastguard Worker 
120*f81fb7c4SAndroid Build Coastguard Worker 
121*f81fb7c4SAndroid Build Coastguard Worker /* local prototypes */
122*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT IMY_CheckFileType (S_EAS_DATA *pEASData, EAS_FILE_HANDLE fileHandle, EAS_VOID_PTR *ppHandle, EAS_I32 offset);
123*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT IMY_Prepare (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
124*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT IMY_Time (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_U32 *pTime);
125*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT IMY_Event (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_INT parserMode);
126*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT IMY_State (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_STATE *pState);
127*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT IMY_Close (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
128*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT IMY_Reset (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
129*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT IMY_Pause (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
130*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT IMY_Resume (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
131*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT IMY_SetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value);
132*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT IMY_GetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue);
133*f81fb7c4SAndroid Build Coastguard Worker static EAS_BOOL IMY_PlayNote (S_EAS_DATA *pEASData, S_IMELODY_DATA *pData, EAS_I8 note, EAS_INT parserMode);
134*f81fb7c4SAndroid Build Coastguard Worker static EAS_BOOL IMY_PlayRest (S_EAS_DATA *pEASData, S_IMELODY_DATA *pData);
135*f81fb7c4SAndroid Build Coastguard Worker static EAS_BOOL IMY_GetDuration (EAS_HW_DATA_HANDLE hwInstData, S_IMELODY_DATA *pData, EAS_I32 *pDuration);
136*f81fb7c4SAndroid Build Coastguard Worker static EAS_BOOL IMY_GetLEDState (S_EAS_DATA *pEASData, S_IMELODY_DATA *pData);
137*f81fb7c4SAndroid Build Coastguard Worker static EAS_BOOL IMY_GetVibeState (S_EAS_DATA *pEASData, S_IMELODY_DATA *pData);
138*f81fb7c4SAndroid Build Coastguard Worker static EAS_BOOL IMY_GetBackState (S_EAS_DATA *pEASData, S_IMELODY_DATA *pData);
139*f81fb7c4SAndroid Build Coastguard Worker static EAS_BOOL IMY_GetVolume (EAS_HW_DATA_HANDLE hwInstData, S_IMELODY_DATA *pData, EAS_BOOL inHeader);
140*f81fb7c4SAndroid Build Coastguard Worker static EAS_BOOL IMY_GetNumber (EAS_HW_DATA_HANDLE hwInstData, S_IMELODY_DATA *pData, EAS_INT *temp, EAS_BOOL inHeader);
141*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT IMY_ParseHeader (S_EAS_DATA *pEASData, S_IMELODY_DATA* pData);
142*f81fb7c4SAndroid Build Coastguard Worker static EAS_I8 IMY_GetNextChar (EAS_HW_DATA_HANDLE hwInstData, S_IMELODY_DATA *pData, EAS_BOOL inHeader);
143*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT IMY_ReadLine (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE fileHandle, EAS_I8 *buffer, EAS_I32 *pStartLine);
144*f81fb7c4SAndroid Build Coastguard Worker static EAS_INT IMY_ParseLine (EAS_I8 *buffer, EAS_U8 *pIndex);
145*f81fb7c4SAndroid Build Coastguard Worker 
146*f81fb7c4SAndroid Build Coastguard Worker 
147*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
148*f81fb7c4SAndroid Build Coastguard Worker  *
149*f81fb7c4SAndroid Build Coastguard Worker  * EAS_iMelody_Parser
150*f81fb7c4SAndroid Build Coastguard Worker  *
151*f81fb7c4SAndroid Build Coastguard Worker  * This structure contains the functional interface for the iMelody parser
152*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
153*f81fb7c4SAndroid Build Coastguard Worker */
154*f81fb7c4SAndroid Build Coastguard Worker const S_FILE_PARSER_INTERFACE EAS_iMelody_Parser =
155*f81fb7c4SAndroid Build Coastguard Worker {
156*f81fb7c4SAndroid Build Coastguard Worker     IMY_CheckFileType,
157*f81fb7c4SAndroid Build Coastguard Worker     IMY_Prepare,
158*f81fb7c4SAndroid Build Coastguard Worker     IMY_Time,
159*f81fb7c4SAndroid Build Coastguard Worker     IMY_Event,
160*f81fb7c4SAndroid Build Coastguard Worker     IMY_State,
161*f81fb7c4SAndroid Build Coastguard Worker     IMY_Close,
162*f81fb7c4SAndroid Build Coastguard Worker     IMY_Reset,
163*f81fb7c4SAndroid Build Coastguard Worker #ifdef JET_INTERFACE
164*f81fb7c4SAndroid Build Coastguard Worker     IMY_Pause,
165*f81fb7c4SAndroid Build Coastguard Worker     IMY_Resume,
166*f81fb7c4SAndroid Build Coastguard Worker #else
167*f81fb7c4SAndroid Build Coastguard Worker     NULL,
168*f81fb7c4SAndroid Build Coastguard Worker     NULL,
169*f81fb7c4SAndroid Build Coastguard Worker #endif
170*f81fb7c4SAndroid Build Coastguard Worker     NULL,
171*f81fb7c4SAndroid Build Coastguard Worker     IMY_SetData,
172*f81fb7c4SAndroid Build Coastguard Worker     IMY_GetData,
173*f81fb7c4SAndroid Build Coastguard Worker     NULL
174*f81fb7c4SAndroid Build Coastguard Worker };
175*f81fb7c4SAndroid Build Coastguard Worker 
176*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
177*f81fb7c4SAndroid Build Coastguard Worker  * IMY_CheckFileType()
178*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
179*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
180*f81fb7c4SAndroid Build Coastguard Worker  * Check the file type to see if we can parse it
181*f81fb7c4SAndroid Build Coastguard Worker  *
182*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
183*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
184*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
185*f81fb7c4SAndroid Build Coastguard Worker  *
186*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
187*f81fb7c4SAndroid Build Coastguard Worker  *
188*f81fb7c4SAndroid Build Coastguard Worker  *
189*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
190*f81fb7c4SAndroid Build Coastguard Worker  *
191*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
192*f81fb7c4SAndroid Build Coastguard Worker */
IMY_CheckFileType(S_EAS_DATA * pEASData,EAS_FILE_HANDLE fileHandle,EAS_VOID_PTR * ppHandle,EAS_I32 offset)193*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT IMY_CheckFileType (S_EAS_DATA *pEASData, EAS_FILE_HANDLE fileHandle, EAS_VOID_PTR *ppHandle, EAS_I32 offset)
194*f81fb7c4SAndroid Build Coastguard Worker {
195*f81fb7c4SAndroid Build Coastguard Worker     S_IMELODY_DATA* pData;
196*f81fb7c4SAndroid Build Coastguard Worker     EAS_I8 buffer[MAX_LINE_SIZE+1];
197*f81fb7c4SAndroid Build Coastguard Worker     EAS_U8 index;
198*f81fb7c4SAndroid Build Coastguard Worker 
199*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
200*f81fb7c4SAndroid Build Coastguard Worker     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Enter IMY_CheckFileType\n"); */ }
201*f81fb7c4SAndroid Build Coastguard Worker #endif
202*f81fb7c4SAndroid Build Coastguard Worker 
203*f81fb7c4SAndroid Build Coastguard Worker     /* read the first line of the file */
204*f81fb7c4SAndroid Build Coastguard Worker     *ppHandle = NULL;
205*f81fb7c4SAndroid Build Coastguard Worker     if (IMY_ReadLine(pEASData->hwInstData, fileHandle, buffer, NULL) != EAS_SUCCESS)
206*f81fb7c4SAndroid Build Coastguard Worker         return EAS_SUCCESS;
207*f81fb7c4SAndroid Build Coastguard Worker 
208*f81fb7c4SAndroid Build Coastguard Worker     /* check for header string */
209*f81fb7c4SAndroid Build Coastguard Worker     if (IMY_ParseLine(buffer, &index) == TOKEN_BEGIN)
210*f81fb7c4SAndroid Build Coastguard Worker     {
211*f81fb7c4SAndroid Build Coastguard Worker 
212*f81fb7c4SAndroid Build Coastguard Worker         /* check for static memory allocation */
213*f81fb7c4SAndroid Build Coastguard Worker         if (pEASData->staticMemoryModel)
214*f81fb7c4SAndroid Build Coastguard Worker             pData = EAS_CMEnumData(EAS_CM_IMELODY_DATA);
215*f81fb7c4SAndroid Build Coastguard Worker         else
216*f81fb7c4SAndroid Build Coastguard Worker             pData = EAS_HWMalloc(pEASData->hwInstData, sizeof(S_IMELODY_DATA));
217*f81fb7c4SAndroid Build Coastguard Worker         if (!pData)
218*f81fb7c4SAndroid Build Coastguard Worker             return EAS_ERROR_MALLOC_FAILED;
219*f81fb7c4SAndroid Build Coastguard Worker         EAS_HWMemSet(pData, 0, sizeof(S_IMELODY_DATA));
220*f81fb7c4SAndroid Build Coastguard Worker 
221*f81fb7c4SAndroid Build Coastguard Worker         /* initialize */
222*f81fb7c4SAndroid Build Coastguard Worker         pData->fileHandle = fileHandle;
223*f81fb7c4SAndroid Build Coastguard Worker         pData->fileOffset = offset;
224*f81fb7c4SAndroid Build Coastguard Worker         pData->state = EAS_STATE_ERROR;
225*f81fb7c4SAndroid Build Coastguard Worker         pData->state = EAS_STATE_OPEN;
226*f81fb7c4SAndroid Build Coastguard Worker 
227*f81fb7c4SAndroid Build Coastguard Worker         /* return a pointer to the instance data */
228*f81fb7c4SAndroid Build Coastguard Worker         *ppHandle = pData;
229*f81fb7c4SAndroid Build Coastguard Worker     }
230*f81fb7c4SAndroid Build Coastguard Worker 
231*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
232*f81fb7c4SAndroid Build Coastguard Worker }
233*f81fb7c4SAndroid Build Coastguard Worker 
234*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
235*f81fb7c4SAndroid Build Coastguard Worker  * IMY_Prepare()
236*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
237*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
238*f81fb7c4SAndroid Build Coastguard Worker  * Prepare to parse the file. Allocates instance data (or uses static allocation for
239*f81fb7c4SAndroid Build Coastguard Worker  * static memory model).
240*f81fb7c4SAndroid Build Coastguard Worker  *
241*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
242*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
243*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
244*f81fb7c4SAndroid Build Coastguard Worker  *
245*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
246*f81fb7c4SAndroid Build Coastguard Worker  *
247*f81fb7c4SAndroid Build Coastguard Worker  *
248*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
249*f81fb7c4SAndroid Build Coastguard Worker  *
250*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
251*f81fb7c4SAndroid Build Coastguard Worker */
IMY_Prepare(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData)252*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT IMY_Prepare (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
253*f81fb7c4SAndroid Build Coastguard Worker {
254*f81fb7c4SAndroid Build Coastguard Worker     S_IMELODY_DATA* pData;
255*f81fb7c4SAndroid Build Coastguard Worker     EAS_RESULT result;
256*f81fb7c4SAndroid Build Coastguard Worker 
257*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
258*f81fb7c4SAndroid Build Coastguard Worker     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Enter IMY_Prepare\n"); */ }
259*f81fb7c4SAndroid Build Coastguard Worker #endif
260*f81fb7c4SAndroid Build Coastguard Worker 
261*f81fb7c4SAndroid Build Coastguard Worker     /* check for valid state */
262*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_IMELODY_DATA*) pInstData;
263*f81fb7c4SAndroid Build Coastguard Worker     if (pData->state != EAS_STATE_OPEN)
264*f81fb7c4SAndroid Build Coastguard Worker         return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
265*f81fb7c4SAndroid Build Coastguard Worker 
266*f81fb7c4SAndroid Build Coastguard Worker     /* instantiate a synthesizer */
267*f81fb7c4SAndroid Build Coastguard Worker     if ((result = VMInitMIDI(pEASData, &pData->pSynth)) != EAS_SUCCESS)
268*f81fb7c4SAndroid Build Coastguard Worker     {
269*f81fb7c4SAndroid Build Coastguard Worker         { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "VMInitMIDI returned %d\n", result); */ }
270*f81fb7c4SAndroid Build Coastguard Worker         return result;
271*f81fb7c4SAndroid Build Coastguard Worker     }
272*f81fb7c4SAndroid Build Coastguard Worker 
273*f81fb7c4SAndroid Build Coastguard Worker     /* parse the header */
274*f81fb7c4SAndroid Build Coastguard Worker     if ((result = IMY_ParseHeader(pEASData,  pData)) != EAS_SUCCESS)
275*f81fb7c4SAndroid Build Coastguard Worker         return result;
276*f81fb7c4SAndroid Build Coastguard Worker 
277*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
278*f81fb7c4SAndroid Build Coastguard Worker     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_Prepare: state set to EAS_STATE_READY\n"); */ }
279*f81fb7c4SAndroid Build Coastguard Worker #endif
280*f81fb7c4SAndroid Build Coastguard Worker 
281*f81fb7c4SAndroid Build Coastguard Worker     pData ->state = EAS_STATE_READY;
282*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
283*f81fb7c4SAndroid Build Coastguard Worker }
284*f81fb7c4SAndroid Build Coastguard Worker 
285*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
286*f81fb7c4SAndroid Build Coastguard Worker  * IMY_Time()
287*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
288*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
289*f81fb7c4SAndroid Build Coastguard Worker  * Returns the time of the next event in msecs
290*f81fb7c4SAndroid Build Coastguard Worker  *
291*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
292*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
293*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
294*f81fb7c4SAndroid Build Coastguard Worker  * pTime            - pointer to variable to hold time of next event (in msecs)
295*f81fb7c4SAndroid Build Coastguard Worker  *
296*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
297*f81fb7c4SAndroid Build Coastguard Worker  *
298*f81fb7c4SAndroid Build Coastguard Worker  *
299*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
300*f81fb7c4SAndroid Build Coastguard Worker  *
301*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
302*f81fb7c4SAndroid Build Coastguard Worker */
303*f81fb7c4SAndroid Build Coastguard Worker /*lint -esym(715, pEASData) common decoder interface - pEASData not used */
IMY_Time(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData,EAS_U32 * pTime)304*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT IMY_Time (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_U32 *pTime)
305*f81fb7c4SAndroid Build Coastguard Worker {
306*f81fb7c4SAndroid Build Coastguard Worker     S_IMELODY_DATA *pData;
307*f81fb7c4SAndroid Build Coastguard Worker 
308*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_IMELODY_DATA*) pInstData;
309*f81fb7c4SAndroid Build Coastguard Worker 
310*f81fb7c4SAndroid Build Coastguard Worker     /* return time in milliseconds */
311*f81fb7c4SAndroid Build Coastguard Worker     /*lint -e{704} use shift instead of division */
312*f81fb7c4SAndroid Build Coastguard Worker     *pTime = pData->time >> 8;
313*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
314*f81fb7c4SAndroid Build Coastguard Worker }
315*f81fb7c4SAndroid Build Coastguard Worker 
316*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
317*f81fb7c4SAndroid Build Coastguard Worker  * IMY_Event()
318*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
319*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
320*f81fb7c4SAndroid Build Coastguard Worker  * Parse the next event in the file
321*f81fb7c4SAndroid Build Coastguard Worker  *
322*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
323*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
324*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
325*f81fb7c4SAndroid Build Coastguard Worker  *
326*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
327*f81fb7c4SAndroid Build Coastguard Worker  *
328*f81fb7c4SAndroid Build Coastguard Worker  *
329*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
330*f81fb7c4SAndroid Build Coastguard Worker  *
331*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
332*f81fb7c4SAndroid Build Coastguard Worker */
IMY_Event(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData,EAS_INT parserMode)333*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT IMY_Event (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_INT parserMode)
334*f81fb7c4SAndroid Build Coastguard Worker {
335*f81fb7c4SAndroid Build Coastguard Worker     S_IMELODY_DATA* pData;
336*f81fb7c4SAndroid Build Coastguard Worker     EAS_RESULT result;
337*f81fb7c4SAndroid Build Coastguard Worker     EAS_I8 c;
338*f81fb7c4SAndroid Build Coastguard Worker     EAS_BOOL eof;
339*f81fb7c4SAndroid Build Coastguard Worker     EAS_INT temp;
340*f81fb7c4SAndroid Build Coastguard Worker 
341*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_IMELODY_DATA*) pInstData;
342*f81fb7c4SAndroid Build Coastguard Worker     if (pData->state >= EAS_STATE_OPEN)
343*f81fb7c4SAndroid Build Coastguard Worker         return EAS_SUCCESS;
344*f81fb7c4SAndroid Build Coastguard Worker 
345*f81fb7c4SAndroid Build Coastguard Worker     if (pData->state == EAS_STATE_READY) {
346*f81fb7c4SAndroid Build Coastguard Worker         pData->state = EAS_STATE_PLAY;
347*f81fb7c4SAndroid Build Coastguard Worker     }
348*f81fb7c4SAndroid Build Coastguard Worker 
349*f81fb7c4SAndroid Build Coastguard Worker     /* initialize MIDI channel when the track starts playing */
350*f81fb7c4SAndroid Build Coastguard Worker     if (pData->time == 0)
351*f81fb7c4SAndroid Build Coastguard Worker     {
352*f81fb7c4SAndroid Build Coastguard Worker 
353*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
354*f81fb7c4SAndroid Build Coastguard Worker     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_Event: Reset\n"); */ }
355*f81fb7c4SAndroid Build Coastguard Worker #endif
356*f81fb7c4SAndroid Build Coastguard Worker         /* set program to square lead */
357*f81fb7c4SAndroid Build Coastguard Worker         VMProgramChange(pEASData->pVoiceMgr, pData->pSynth, IMELODY_CHANNEL, IMELODY_PROGRAM);
358*f81fb7c4SAndroid Build Coastguard Worker 
359*f81fb7c4SAndroid Build Coastguard Worker         /* set channel volume to max */
360*f81fb7c4SAndroid Build Coastguard Worker         VMControlChange(pEASData->pVoiceMgr, pData->pSynth, IMELODY_CHANNEL, 7, 127);
361*f81fb7c4SAndroid Build Coastguard Worker     }
362*f81fb7c4SAndroid Build Coastguard Worker 
363*f81fb7c4SAndroid Build Coastguard Worker     /* check for end of note */
364*f81fb7c4SAndroid Build Coastguard Worker     if (pData->note)
365*f81fb7c4SAndroid Build Coastguard Worker     {
366*f81fb7c4SAndroid Build Coastguard Worker 
367*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
368*f81fb7c4SAndroid Build Coastguard Worker     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Stopping note %d\n", pData->note); */ }
369*f81fb7c4SAndroid Build Coastguard Worker #endif
370*f81fb7c4SAndroid Build Coastguard Worker         /* stop the note */
371*f81fb7c4SAndroid Build Coastguard Worker         VMStopNote(pEASData->pVoiceMgr, pData->pSynth, IMELODY_CHANNEL, pData->note, 0);
372*f81fb7c4SAndroid Build Coastguard Worker         pData->note = 0;
373*f81fb7c4SAndroid Build Coastguard Worker 
374*f81fb7c4SAndroid Build Coastguard Worker         /* check for rest between notes */
375*f81fb7c4SAndroid Build Coastguard Worker         if (pData->restTicks)
376*f81fb7c4SAndroid Build Coastguard Worker         {
377*f81fb7c4SAndroid Build Coastguard Worker             pData->time += pData->restTicks;
378*f81fb7c4SAndroid Build Coastguard Worker             pData->restTicks = 0;
379*f81fb7c4SAndroid Build Coastguard Worker             return EAS_SUCCESS;
380*f81fb7c4SAndroid Build Coastguard Worker         }
381*f81fb7c4SAndroid Build Coastguard Worker     }
382*f81fb7c4SAndroid Build Coastguard Worker 
383*f81fb7c4SAndroid Build Coastguard Worker     /* parse the next event */
384*f81fb7c4SAndroid Build Coastguard Worker     eof = EAS_FALSE;
385*f81fb7c4SAndroid Build Coastguard Worker     while (!eof)
386*f81fb7c4SAndroid Build Coastguard Worker     {
387*f81fb7c4SAndroid Build Coastguard Worker 
388*f81fb7c4SAndroid Build Coastguard Worker         /* get next character */
389*f81fb7c4SAndroid Build Coastguard Worker         c = IMY_GetNextChar(pEASData->hwInstData, pData, EAS_FALSE);
390*f81fb7c4SAndroid Build Coastguard Worker 
391*f81fb7c4SAndroid Build Coastguard Worker         switch (c)
392*f81fb7c4SAndroid Build Coastguard Worker         {
393*f81fb7c4SAndroid Build Coastguard Worker             /* start repeat */
394*f81fb7c4SAndroid Build Coastguard Worker             case '(':
395*f81fb7c4SAndroid Build Coastguard Worker 
396*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
397*f81fb7c4SAndroid Build Coastguard Worker                 { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Enter repeat section\n", c); */ }
398*f81fb7c4SAndroid Build Coastguard Worker #endif
399*f81fb7c4SAndroid Build Coastguard Worker 
400*f81fb7c4SAndroid Build Coastguard Worker                 if (pData->repeatOffset < 0)
401*f81fb7c4SAndroid Build Coastguard Worker                 {
402*f81fb7c4SAndroid Build Coastguard Worker                     pData->repeatOffset = pData->startLine + (EAS_I32) pData->index;
403*f81fb7c4SAndroid Build Coastguard Worker 
404*f81fb7c4SAndroid Build Coastguard Worker                     /* save current time and check it later to make sure the loop isn't zero length */
405*f81fb7c4SAndroid Build Coastguard Worker                     pData->repeatTime = pData->time;
406*f81fb7c4SAndroid Build Coastguard Worker 
407*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
408*f81fb7c4SAndroid Build Coastguard Worker                     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Repeat offset = %d\n", pData->repeatOffset); */ }
409*f81fb7c4SAndroid Build Coastguard Worker #endif
410*f81fb7c4SAndroid Build Coastguard Worker                 }
411*f81fb7c4SAndroid Build Coastguard Worker                 else
412*f81fb7c4SAndroid Build Coastguard Worker                     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Ignoring nested repeat section\n"); */ }
413*f81fb7c4SAndroid Build Coastguard Worker                 break;
414*f81fb7c4SAndroid Build Coastguard Worker 
415*f81fb7c4SAndroid Build Coastguard Worker             /* end repeat */
416*f81fb7c4SAndroid Build Coastguard Worker             case ')':
417*f81fb7c4SAndroid Build Coastguard Worker 
418*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
419*f81fb7c4SAndroid Build Coastguard Worker                 { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "End repeat section, repeat offset = %d\n", pData->repeatOffset); */ }
420*f81fb7c4SAndroid Build Coastguard Worker #endif
421*f81fb7c4SAndroid Build Coastguard Worker                 /* ignore zero-length loops */
422*f81fb7c4SAndroid Build Coastguard Worker                 if (pData->repeatTime == pData->time) {
423*f81fb7c4SAndroid Build Coastguard Worker                     pData->repeatCount = -1;
424*f81fb7c4SAndroid Build Coastguard Worker                     pData->repeatOffset = -1;
425*f81fb7c4SAndroid Build Coastguard Worker                 } else if (pData->repeatCount >= 0) {
426*f81fb7c4SAndroid Build Coastguard Worker 
427*f81fb7c4SAndroid Build Coastguard Worker                     /* decrement repeat count (repeatCount == 0 means infinite loop) */
428*f81fb7c4SAndroid Build Coastguard Worker                     if (pData->repeatCount > 0)
429*f81fb7c4SAndroid Build Coastguard Worker                     {
430*f81fb7c4SAndroid Build Coastguard Worker                         if (--pData->repeatCount == 0)
431*f81fb7c4SAndroid Build Coastguard Worker                         {
432*f81fb7c4SAndroid Build Coastguard Worker                             pData->repeatCount = -1;
433*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
434*f81fb7c4SAndroid Build Coastguard Worker                             { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Repeat loop complete\n"); */ }
435*f81fb7c4SAndroid Build Coastguard Worker #endif
436*f81fb7c4SAndroid Build Coastguard Worker                         }
437*f81fb7c4SAndroid Build Coastguard Worker                     }
438*f81fb7c4SAndroid Build Coastguard Worker 
439*f81fb7c4SAndroid Build Coastguard Worker //2 TEMPORARY FIX: If locating, don't do infinite loops.
440*f81fb7c4SAndroid Build Coastguard Worker //3 We need a different mode for metadata parsing where we don't loop at all
441*f81fb7c4SAndroid Build Coastguard Worker                     if ((parserMode == eParserModePlay) || (pData->repeatCount != 0))
442*f81fb7c4SAndroid Build Coastguard Worker                     {
443*f81fb7c4SAndroid Build Coastguard Worker 
444*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
445*f81fb7c4SAndroid Build Coastguard Worker                         { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Rewinding file for repeat\n"); */ }
446*f81fb7c4SAndroid Build Coastguard Worker #endif
447*f81fb7c4SAndroid Build Coastguard Worker                         /* rewind to start of loop */
448*f81fb7c4SAndroid Build Coastguard Worker                         if ((result = EAS_HWFileSeek(pEASData->hwInstData, pData->fileHandle, pData->repeatOffset)) != EAS_SUCCESS)
449*f81fb7c4SAndroid Build Coastguard Worker                             return result;
450*f81fb7c4SAndroid Build Coastguard Worker                         IMY_ReadLine(pEASData->hwInstData, pData->fileHandle, pData->buffer, &pData->startLine);
451*f81fb7c4SAndroid Build Coastguard Worker                         pData->index = 0;
452*f81fb7c4SAndroid Build Coastguard Worker 
453*f81fb7c4SAndroid Build Coastguard Worker                         /* if last loop, prevent future loops */
454*f81fb7c4SAndroid Build Coastguard Worker                         if (pData->repeatCount == -1)
455*f81fb7c4SAndroid Build Coastguard Worker                             pData->repeatOffset = -1;
456*f81fb7c4SAndroid Build Coastguard Worker                     }
457*f81fb7c4SAndroid Build Coastguard Worker                 }
458*f81fb7c4SAndroid Build Coastguard Worker                 break;
459*f81fb7c4SAndroid Build Coastguard Worker 
460*f81fb7c4SAndroid Build Coastguard Worker             /* repeat count */
461*f81fb7c4SAndroid Build Coastguard Worker             case '@':
462*f81fb7c4SAndroid Build Coastguard Worker                 if (!IMY_GetNumber(pEASData->hwInstData, pData, &temp, EAS_FALSE))
463*f81fb7c4SAndroid Build Coastguard Worker                     eof = EAS_TRUE;
464*f81fb7c4SAndroid Build Coastguard Worker                 else if (pData->repeatOffset > 0)
465*f81fb7c4SAndroid Build Coastguard Worker                 {
466*f81fb7c4SAndroid Build Coastguard Worker 
467*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
468*f81fb7c4SAndroid Build Coastguard Worker                     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Repeat count = %dt", pData->repeatCount); */ }
469*f81fb7c4SAndroid Build Coastguard Worker #endif
470*f81fb7c4SAndroid Build Coastguard Worker                     if (pData->repeatCount < 0)
471*f81fb7c4SAndroid Build Coastguard Worker                         pData->repeatCount = (EAS_I16) temp;
472*f81fb7c4SAndroid Build Coastguard Worker                 }
473*f81fb7c4SAndroid Build Coastguard Worker                 break;
474*f81fb7c4SAndroid Build Coastguard Worker 
475*f81fb7c4SAndroid Build Coastguard Worker             /* volume */
476*f81fb7c4SAndroid Build Coastguard Worker             case 'V':
477*f81fb7c4SAndroid Build Coastguard Worker                 if (!IMY_GetVolume(pEASData->hwInstData, pData, EAS_FALSE))
478*f81fb7c4SAndroid Build Coastguard Worker                     eof = EAS_TRUE;
479*f81fb7c4SAndroid Build Coastguard Worker                 break;
480*f81fb7c4SAndroid Build Coastguard Worker 
481*f81fb7c4SAndroid Build Coastguard Worker             /* flat */
482*f81fb7c4SAndroid Build Coastguard Worker             case '&':
483*f81fb7c4SAndroid Build Coastguard Worker                 pData->noteModifier = -1;
484*f81fb7c4SAndroid Build Coastguard Worker                 break;
485*f81fb7c4SAndroid Build Coastguard Worker 
486*f81fb7c4SAndroid Build Coastguard Worker             /* sharp */
487*f81fb7c4SAndroid Build Coastguard Worker             case '#':
488*f81fb7c4SAndroid Build Coastguard Worker                 pData->noteModifier = +1;
489*f81fb7c4SAndroid Build Coastguard Worker                 break;
490*f81fb7c4SAndroid Build Coastguard Worker 
491*f81fb7c4SAndroid Build Coastguard Worker             /* octave */
492*f81fb7c4SAndroid Build Coastguard Worker             case '*':
493*f81fb7c4SAndroid Build Coastguard Worker                 c = IMY_GetNextChar(pEASData->hwInstData, pData, EAS_FALSE);
494*f81fb7c4SAndroid Build Coastguard Worker                 if (IsDigit(c))
495*f81fb7c4SAndroid Build Coastguard Worker                     pData->octave = (EAS_U8) ((c - '0' + 1) * 12);
496*f81fb7c4SAndroid Build Coastguard Worker                 else if (!c)
497*f81fb7c4SAndroid Build Coastguard Worker                     eof = EAS_TRUE;
498*f81fb7c4SAndroid Build Coastguard Worker                 break;
499*f81fb7c4SAndroid Build Coastguard Worker 
500*f81fb7c4SAndroid Build Coastguard Worker             /* ledon or ledoff */
501*f81fb7c4SAndroid Build Coastguard Worker             case 'l':
502*f81fb7c4SAndroid Build Coastguard Worker                 if (!IMY_GetLEDState(pEASData, pData))
503*f81fb7c4SAndroid Build Coastguard Worker                     eof = EAS_TRUE;
504*f81fb7c4SAndroid Build Coastguard Worker                 break;
505*f81fb7c4SAndroid Build Coastguard Worker 
506*f81fb7c4SAndroid Build Coastguard Worker             /* vibeon or vibeoff */
507*f81fb7c4SAndroid Build Coastguard Worker             case 'v':
508*f81fb7c4SAndroid Build Coastguard Worker                 if (!IMY_GetVibeState(pEASData, pData))
509*f81fb7c4SAndroid Build Coastguard Worker                     eof = EAS_TRUE;
510*f81fb7c4SAndroid Build Coastguard Worker                 break;
511*f81fb7c4SAndroid Build Coastguard Worker 
512*f81fb7c4SAndroid Build Coastguard Worker             /* either a B note or backon or backoff */
513*f81fb7c4SAndroid Build Coastguard Worker             case 'b':
514*f81fb7c4SAndroid Build Coastguard Worker                 if (IMY_GetNextChar(pEASData->hwInstData, pData, EAS_FALSE) == 'a')
515*f81fb7c4SAndroid Build Coastguard Worker                 {
516*f81fb7c4SAndroid Build Coastguard Worker                     if (!IMY_GetBackState(pEASData, pData))
517*f81fb7c4SAndroid Build Coastguard Worker                         eof = EAS_TRUE;
518*f81fb7c4SAndroid Build Coastguard Worker                 }
519*f81fb7c4SAndroid Build Coastguard Worker                 else
520*f81fb7c4SAndroid Build Coastguard Worker                 {
521*f81fb7c4SAndroid Build Coastguard Worker                     PutBackChar(pData);
522*f81fb7c4SAndroid Build Coastguard Worker                     if (IMY_PlayNote(pEASData, pData, c, parserMode))
523*f81fb7c4SAndroid Build Coastguard Worker                         return EAS_SUCCESS;
524*f81fb7c4SAndroid Build Coastguard Worker                     eof = EAS_TRUE;
525*f81fb7c4SAndroid Build Coastguard Worker                 }
526*f81fb7c4SAndroid Build Coastguard Worker                 break;
527*f81fb7c4SAndroid Build Coastguard Worker 
528*f81fb7c4SAndroid Build Coastguard Worker             /* rest */
529*f81fb7c4SAndroid Build Coastguard Worker             case 'r':
530*f81fb7c4SAndroid Build Coastguard Worker             case 'R':
531*f81fb7c4SAndroid Build Coastguard Worker                 if (IMY_PlayRest(pEASData, pData))
532*f81fb7c4SAndroid Build Coastguard Worker                     return EAS_SUCCESS;
533*f81fb7c4SAndroid Build Coastguard Worker                 eof = EAS_TRUE;
534*f81fb7c4SAndroid Build Coastguard Worker                 break;
535*f81fb7c4SAndroid Build Coastguard Worker 
536*f81fb7c4SAndroid Build Coastguard Worker             /* EOF */
537*f81fb7c4SAndroid Build Coastguard Worker             case 0:
538*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
539*f81fb7c4SAndroid Build Coastguard Worker                 { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_Event: end of iMelody file detected\n"); */ }
540*f81fb7c4SAndroid Build Coastguard Worker #endif
541*f81fb7c4SAndroid Build Coastguard Worker                 eof = EAS_TRUE;
542*f81fb7c4SAndroid Build Coastguard Worker             break;
543*f81fb7c4SAndroid Build Coastguard Worker 
544*f81fb7c4SAndroid Build Coastguard Worker             /* must be a note */
545*f81fb7c4SAndroid Build Coastguard Worker             default:
546*f81fb7c4SAndroid Build Coastguard Worker                 c = ToLower(c);
547*f81fb7c4SAndroid Build Coastguard Worker                 if ((c >= 'a') && (c <= 'g'))
548*f81fb7c4SAndroid Build Coastguard Worker                 {
549*f81fb7c4SAndroid Build Coastguard Worker                     if (IMY_PlayNote(pEASData, pData, c, parserMode))
550*f81fb7c4SAndroid Build Coastguard Worker                         return EAS_SUCCESS;
551*f81fb7c4SAndroid Build Coastguard Worker                     eof = EAS_TRUE;
552*f81fb7c4SAndroid Build Coastguard Worker                 }
553*f81fb7c4SAndroid Build Coastguard Worker                 else
554*f81fb7c4SAndroid Build Coastguard Worker                     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Ignoring unexpected character '%c' [0x%02x]\n", c, c); */ }
555*f81fb7c4SAndroid Build Coastguard Worker                 break;
556*f81fb7c4SAndroid Build Coastguard Worker         }
557*f81fb7c4SAndroid Build Coastguard Worker     }
558*f81fb7c4SAndroid Build Coastguard Worker 
559*f81fb7c4SAndroid Build Coastguard Worker     /* handle EOF */
560*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
561*f81fb7c4SAndroid Build Coastguard Worker     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_Event: state set to EAS_STATE_STOPPING\n"); */ }
562*f81fb7c4SAndroid Build Coastguard Worker #endif
563*f81fb7c4SAndroid Build Coastguard Worker     pData->state = EAS_STATE_STOPPING;
564*f81fb7c4SAndroid Build Coastguard Worker     VMReleaseAllVoices(pEASData->pVoiceMgr, pData->pSynth);
565*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
566*f81fb7c4SAndroid Build Coastguard Worker }
567*f81fb7c4SAndroid Build Coastguard Worker 
568*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
569*f81fb7c4SAndroid Build Coastguard Worker  * IMY_State()
570*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
571*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
572*f81fb7c4SAndroid Build Coastguard Worker  * Returns the current state of the stream
573*f81fb7c4SAndroid Build Coastguard Worker  *
574*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
575*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
576*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
577*f81fb7c4SAndroid Build Coastguard Worker  * pState           - pointer to variable to store state
578*f81fb7c4SAndroid Build Coastguard Worker  *
579*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
580*f81fb7c4SAndroid Build Coastguard Worker  *
581*f81fb7c4SAndroid Build Coastguard Worker  *
582*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
583*f81fb7c4SAndroid Build Coastguard Worker  *
584*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
585*f81fb7c4SAndroid Build Coastguard Worker */
586*f81fb7c4SAndroid Build Coastguard Worker /*lint -esym(715, pEASData) common decoder interface - pEASData not used */
IMY_State(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData,EAS_I32 * pState)587*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT IMY_State (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 *pState)
588*f81fb7c4SAndroid Build Coastguard Worker {
589*f81fb7c4SAndroid Build Coastguard Worker     S_IMELODY_DATA* pData;
590*f81fb7c4SAndroid Build Coastguard Worker 
591*f81fb7c4SAndroid Build Coastguard Worker     /* establish pointer to instance data */
592*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_IMELODY_DATA*) pInstData;
593*f81fb7c4SAndroid Build Coastguard Worker 
594*f81fb7c4SAndroid Build Coastguard Worker     /* if stopping, check to see if synth voices are active */
595*f81fb7c4SAndroid Build Coastguard Worker     if (pData->state == EAS_STATE_STOPPING)
596*f81fb7c4SAndroid Build Coastguard Worker     {
597*f81fb7c4SAndroid Build Coastguard Worker         if (VMActiveVoices(pData->pSynth) == 0)
598*f81fb7c4SAndroid Build Coastguard Worker         {
599*f81fb7c4SAndroid Build Coastguard Worker             pData->state = EAS_STATE_STOPPED;
600*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
601*f81fb7c4SAndroid Build Coastguard Worker             { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_State: state set to EAS_STATE_STOPPED\n"); */ }
602*f81fb7c4SAndroid Build Coastguard Worker #endif
603*f81fb7c4SAndroid Build Coastguard Worker         }
604*f81fb7c4SAndroid Build Coastguard Worker     }
605*f81fb7c4SAndroid Build Coastguard Worker 
606*f81fb7c4SAndroid Build Coastguard Worker     if (pData->state == EAS_STATE_PAUSING)
607*f81fb7c4SAndroid Build Coastguard Worker     {
608*f81fb7c4SAndroid Build Coastguard Worker         if (VMActiveVoices(pData->pSynth) == 0)
609*f81fb7c4SAndroid Build Coastguard Worker         {
610*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
611*f81fb7c4SAndroid Build Coastguard Worker             { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_State: state set to EAS_STATE_PAUSED\n"); */ }
612*f81fb7c4SAndroid Build Coastguard Worker #endif
613*f81fb7c4SAndroid Build Coastguard Worker             pData->state = EAS_STATE_PAUSED;
614*f81fb7c4SAndroid Build Coastguard Worker         }
615*f81fb7c4SAndroid Build Coastguard Worker     }
616*f81fb7c4SAndroid Build Coastguard Worker 
617*f81fb7c4SAndroid Build Coastguard Worker     /* return current state */
618*f81fb7c4SAndroid Build Coastguard Worker     *pState = pData->state;
619*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
620*f81fb7c4SAndroid Build Coastguard Worker }
621*f81fb7c4SAndroid Build Coastguard Worker 
622*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
623*f81fb7c4SAndroid Build Coastguard Worker  * IMY_Close()
624*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
625*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
626*f81fb7c4SAndroid Build Coastguard Worker  * Close the file and clean up
627*f81fb7c4SAndroid Build Coastguard Worker  *
628*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
629*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
630*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
631*f81fb7c4SAndroid Build Coastguard Worker  *
632*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
633*f81fb7c4SAndroid Build Coastguard Worker  *
634*f81fb7c4SAndroid Build Coastguard Worker  *
635*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
636*f81fb7c4SAndroid Build Coastguard Worker  *
637*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
638*f81fb7c4SAndroid Build Coastguard Worker */
IMY_Close(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData)639*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT IMY_Close (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
640*f81fb7c4SAndroid Build Coastguard Worker {
641*f81fb7c4SAndroid Build Coastguard Worker     S_IMELODY_DATA* pData;
642*f81fb7c4SAndroid Build Coastguard Worker     EAS_RESULT result;
643*f81fb7c4SAndroid Build Coastguard Worker 
644*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
645*f81fb7c4SAndroid Build Coastguard Worker     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_Close: close file\n"); */ }
646*f81fb7c4SAndroid Build Coastguard Worker #endif
647*f81fb7c4SAndroid Build Coastguard Worker 
648*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_IMELODY_DATA*) pInstData;
649*f81fb7c4SAndroid Build Coastguard Worker 
650*f81fb7c4SAndroid Build Coastguard Worker     /* close the file */
651*f81fb7c4SAndroid Build Coastguard Worker     if ((result = EAS_HWCloseFile(pEASData->hwInstData, pData->fileHandle)) != EAS_SUCCESS)
652*f81fb7c4SAndroid Build Coastguard Worker             return result;
653*f81fb7c4SAndroid Build Coastguard Worker 
654*f81fb7c4SAndroid Build Coastguard Worker     /* free the synth */
655*f81fb7c4SAndroid Build Coastguard Worker     if (pData->pSynth != NULL)
656*f81fb7c4SAndroid Build Coastguard Worker         VMMIDIShutdown(pEASData, pData->pSynth);
657*f81fb7c4SAndroid Build Coastguard Worker 
658*f81fb7c4SAndroid Build Coastguard Worker     /* if using dynamic memory, free it */
659*f81fb7c4SAndroid Build Coastguard Worker     if (!pEASData->staticMemoryModel)
660*f81fb7c4SAndroid Build Coastguard Worker         EAS_HWFree(pEASData->hwInstData, pData);
661*f81fb7c4SAndroid Build Coastguard Worker 
662*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
663*f81fb7c4SAndroid Build Coastguard Worker }
664*f81fb7c4SAndroid Build Coastguard Worker 
665*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
666*f81fb7c4SAndroid Build Coastguard Worker  * IMY_Reset()
667*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
668*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
669*f81fb7c4SAndroid Build Coastguard Worker  * Reset the sequencer. Used for locating backwards in the file.
670*f81fb7c4SAndroid Build Coastguard Worker  *
671*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
672*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
673*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
674*f81fb7c4SAndroid Build Coastguard Worker  *
675*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
676*f81fb7c4SAndroid Build Coastguard Worker  *
677*f81fb7c4SAndroid Build Coastguard Worker  *
678*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
679*f81fb7c4SAndroid Build Coastguard Worker  *
680*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
681*f81fb7c4SAndroid Build Coastguard Worker */
IMY_Reset(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData)682*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT IMY_Reset (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
683*f81fb7c4SAndroid Build Coastguard Worker {
684*f81fb7c4SAndroid Build Coastguard Worker     S_IMELODY_DATA* pData;
685*f81fb7c4SAndroid Build Coastguard Worker     EAS_RESULT result;
686*f81fb7c4SAndroid Build Coastguard Worker 
687*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
688*f81fb7c4SAndroid Build Coastguard Worker     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_Reset: reset file\n"); */ }
689*f81fb7c4SAndroid Build Coastguard Worker #endif
690*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_IMELODY_DATA*) pInstData;
691*f81fb7c4SAndroid Build Coastguard Worker 
692*f81fb7c4SAndroid Build Coastguard Worker     /* reset the synth */
693*f81fb7c4SAndroid Build Coastguard Worker     VMReset(pEASData->pVoiceMgr, pData->pSynth, EAS_TRUE);
694*f81fb7c4SAndroid Build Coastguard Worker 
695*f81fb7c4SAndroid Build Coastguard Worker     /* reset time to zero */
696*f81fb7c4SAndroid Build Coastguard Worker     pData->time = 0;
697*f81fb7c4SAndroid Build Coastguard Worker     pData->note = 0;
698*f81fb7c4SAndroid Build Coastguard Worker 
699*f81fb7c4SAndroid Build Coastguard Worker     /* reset file position and re-parse header */
700*f81fb7c4SAndroid Build Coastguard Worker     pData->state = EAS_STATE_ERROR;
701*f81fb7c4SAndroid Build Coastguard Worker     if ((result = EAS_HWFileSeek(pEASData->hwInstData, pData->fileHandle, pData->fileOffset)) != EAS_SUCCESS)
702*f81fb7c4SAndroid Build Coastguard Worker         return result;
703*f81fb7c4SAndroid Build Coastguard Worker     if ((result = IMY_ParseHeader (pEASData,  pData)) != EAS_SUCCESS)
704*f81fb7c4SAndroid Build Coastguard Worker         return result;
705*f81fb7c4SAndroid Build Coastguard Worker 
706*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
707*f81fb7c4SAndroid Build Coastguard Worker     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_Reset: state set to EAS_STATE_ERROR\n"); */ }
708*f81fb7c4SAndroid Build Coastguard Worker #endif
709*f81fb7c4SAndroid Build Coastguard Worker 
710*f81fb7c4SAndroid Build Coastguard Worker     pData->state = EAS_STATE_READY;
711*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
712*f81fb7c4SAndroid Build Coastguard Worker }
713*f81fb7c4SAndroid Build Coastguard Worker 
714*f81fb7c4SAndroid Build Coastguard Worker #ifdef JET_INTERFACE
715*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
716*f81fb7c4SAndroid Build Coastguard Worker  * IMY_Pause()
717*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
718*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
719*f81fb7c4SAndroid Build Coastguard Worker  * Pauses the sequencer. Mutes all voices and sets state to pause.
720*f81fb7c4SAndroid Build Coastguard Worker  *
721*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
722*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
723*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
724*f81fb7c4SAndroid Build Coastguard Worker  *
725*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
726*f81fb7c4SAndroid Build Coastguard Worker  *
727*f81fb7c4SAndroid Build Coastguard Worker  *
728*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
729*f81fb7c4SAndroid Build Coastguard Worker  *
730*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
731*f81fb7c4SAndroid Build Coastguard Worker */
IMY_Pause(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData)732*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT IMY_Pause (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
733*f81fb7c4SAndroid Build Coastguard Worker {
734*f81fb7c4SAndroid Build Coastguard Worker     S_IMELODY_DATA *pData;
735*f81fb7c4SAndroid Build Coastguard Worker 
736*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
737*f81fb7c4SAndroid Build Coastguard Worker     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_Pause: pause file\n"); */ }
738*f81fb7c4SAndroid Build Coastguard Worker #endif
739*f81fb7c4SAndroid Build Coastguard Worker 
740*f81fb7c4SAndroid Build Coastguard Worker     /* can't pause a stopped stream */
741*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_IMELODY_DATA*) pInstData;
742*f81fb7c4SAndroid Build Coastguard Worker     if (pData->state == EAS_STATE_STOPPED)
743*f81fb7c4SAndroid Build Coastguard Worker         return EAS_ERROR_ALREADY_STOPPED;
744*f81fb7c4SAndroid Build Coastguard Worker 
745*f81fb7c4SAndroid Build Coastguard Worker     /* mute the synthesizer */
746*f81fb7c4SAndroid Build Coastguard Worker     VMMuteAllVoices(pEASData->pVoiceMgr, pData->pSynth);
747*f81fb7c4SAndroid Build Coastguard Worker     pData->state = EAS_STATE_PAUSING;
748*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
749*f81fb7c4SAndroid Build Coastguard Worker }
750*f81fb7c4SAndroid Build Coastguard Worker 
751*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
752*f81fb7c4SAndroid Build Coastguard Worker  * IMY_Resume()
753*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
754*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
755*f81fb7c4SAndroid Build Coastguard Worker  * Resume playing after a pause, sets state back to playing.
756*f81fb7c4SAndroid Build Coastguard Worker  *
757*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
758*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
759*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
760*f81fb7c4SAndroid Build Coastguard Worker  *
761*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
762*f81fb7c4SAndroid Build Coastguard Worker  *
763*f81fb7c4SAndroid Build Coastguard Worker  *
764*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
765*f81fb7c4SAndroid Build Coastguard Worker  *
766*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
767*f81fb7c4SAndroid Build Coastguard Worker */
768*f81fb7c4SAndroid Build Coastguard Worker /*lint -esym(715, pEASData) common decoder interface - pEASData not used */
IMY_Resume(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData)769*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT IMY_Resume (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
770*f81fb7c4SAndroid Build Coastguard Worker {
771*f81fb7c4SAndroid Build Coastguard Worker     S_IMELODY_DATA *pData;
772*f81fb7c4SAndroid Build Coastguard Worker 
773*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
774*f81fb7c4SAndroid Build Coastguard Worker     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_Resume: resume file\n"); */ }
775*f81fb7c4SAndroid Build Coastguard Worker #endif
776*f81fb7c4SAndroid Build Coastguard Worker 
777*f81fb7c4SAndroid Build Coastguard Worker     /* can't resume a stopped stream */
778*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_IMELODY_DATA*) pInstData;
779*f81fb7c4SAndroid Build Coastguard Worker     if (pData->state == EAS_STATE_STOPPED)
780*f81fb7c4SAndroid Build Coastguard Worker         return EAS_ERROR_ALREADY_STOPPED;
781*f81fb7c4SAndroid Build Coastguard Worker 
782*f81fb7c4SAndroid Build Coastguard Worker     /* nothing to do but resume playback */
783*f81fb7c4SAndroid Build Coastguard Worker     pData->state = EAS_STATE_PLAY;
784*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
785*f81fb7c4SAndroid Build Coastguard Worker }
786*f81fb7c4SAndroid Build Coastguard Worker #endif
787*f81fb7c4SAndroid Build Coastguard Worker 
788*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
789*f81fb7c4SAndroid Build Coastguard Worker  * IMY_SetData()
790*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
791*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
792*f81fb7c4SAndroid Build Coastguard Worker  * Adjust tempo relative to song tempo
793*f81fb7c4SAndroid Build Coastguard Worker  *
794*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
795*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
796*f81fb7c4SAndroid Build Coastguard Worker  * pInstData        - pointer to iMelody instance data
797*f81fb7c4SAndroid Build Coastguard Worker  * rate             - rate (28-bit fractional amount)
798*f81fb7c4SAndroid Build Coastguard Worker  *
799*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
800*f81fb7c4SAndroid Build Coastguard Worker  *
801*f81fb7c4SAndroid Build Coastguard Worker  *
802*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
803*f81fb7c4SAndroid Build Coastguard Worker  *
804*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
805*f81fb7c4SAndroid Build Coastguard Worker */
806*f81fb7c4SAndroid Build Coastguard Worker /*lint -esym(715, pEASData) common decoder interface - pEASData not used */
IMY_SetData(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData,EAS_I32 param,EAS_I32 value)807*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT IMY_SetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value)
808*f81fb7c4SAndroid Build Coastguard Worker {
809*f81fb7c4SAndroid Build Coastguard Worker     S_IMELODY_DATA *pData;
810*f81fb7c4SAndroid Build Coastguard Worker 
811*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_IMELODY_DATA*) pInstData;
812*f81fb7c4SAndroid Build Coastguard Worker     switch (param)
813*f81fb7c4SAndroid Build Coastguard Worker     {
814*f81fb7c4SAndroid Build Coastguard Worker 
815*f81fb7c4SAndroid Build Coastguard Worker         /* set metadata callback */
816*f81fb7c4SAndroid Build Coastguard Worker         case PARSER_DATA_METADATA_CB:
817*f81fb7c4SAndroid Build Coastguard Worker             EAS_HWMemCpy(&pData->metadata, (void*) value, sizeof(S_METADATA_CB));
818*f81fb7c4SAndroid Build Coastguard Worker             break;
819*f81fb7c4SAndroid Build Coastguard Worker 
820*f81fb7c4SAndroid Build Coastguard Worker         default:
821*f81fb7c4SAndroid Build Coastguard Worker             return EAS_ERROR_INVALID_PARAMETER;
822*f81fb7c4SAndroid Build Coastguard Worker     }
823*f81fb7c4SAndroid Build Coastguard Worker 
824*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
825*f81fb7c4SAndroid Build Coastguard Worker }
826*f81fb7c4SAndroid Build Coastguard Worker 
827*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
828*f81fb7c4SAndroid Build Coastguard Worker  * IMY_GetData()
829*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
830*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
831*f81fb7c4SAndroid Build Coastguard Worker  * Return the file type
832*f81fb7c4SAndroid Build Coastguard Worker  *
833*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
834*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
835*f81fb7c4SAndroid Build Coastguard Worker  * pInstData        - pointer to iMelody instance data
836*f81fb7c4SAndroid Build Coastguard Worker  *
837*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
838*f81fb7c4SAndroid Build Coastguard Worker  *
839*f81fb7c4SAndroid Build Coastguard Worker  *
840*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
841*f81fb7c4SAndroid Build Coastguard Worker  *
842*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
843*f81fb7c4SAndroid Build Coastguard Worker */
844*f81fb7c4SAndroid Build Coastguard Worker /*lint -esym(715, pEASData) common decoder interface - pEASData not used */
IMY_GetData(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData,EAS_I32 param,EAS_I32 * pValue)845*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT IMY_GetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue)
846*f81fb7c4SAndroid Build Coastguard Worker {
847*f81fb7c4SAndroid Build Coastguard Worker     S_IMELODY_DATA *pData;
848*f81fb7c4SAndroid Build Coastguard Worker 
849*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_IMELODY_DATA*) pInstData;
850*f81fb7c4SAndroid Build Coastguard Worker 
851*f81fb7c4SAndroid Build Coastguard Worker     switch (param)
852*f81fb7c4SAndroid Build Coastguard Worker     {
853*f81fb7c4SAndroid Build Coastguard Worker         /* return file type as iMelody */
854*f81fb7c4SAndroid Build Coastguard Worker         case PARSER_DATA_FILE_TYPE:
855*f81fb7c4SAndroid Build Coastguard Worker             *pValue = EAS_FILE_IMELODY;
856*f81fb7c4SAndroid Build Coastguard Worker             break;
857*f81fb7c4SAndroid Build Coastguard Worker 
858*f81fb7c4SAndroid Build Coastguard Worker         case PARSER_DATA_SYNTH_HANDLE:
859*f81fb7c4SAndroid Build Coastguard Worker             *pValue = (EAS_I32) pData->pSynth;
860*f81fb7c4SAndroid Build Coastguard Worker             break;
861*f81fb7c4SAndroid Build Coastguard Worker 
862*f81fb7c4SAndroid Build Coastguard Worker         case PARSER_DATA_GAIN_OFFSET:
863*f81fb7c4SAndroid Build Coastguard Worker             *pValue = IMELODY_GAIN_OFFSET;
864*f81fb7c4SAndroid Build Coastguard Worker             break;
865*f81fb7c4SAndroid Build Coastguard Worker 
866*f81fb7c4SAndroid Build Coastguard Worker         default:
867*f81fb7c4SAndroid Build Coastguard Worker             return EAS_ERROR_INVALID_PARAMETER;
868*f81fb7c4SAndroid Build Coastguard Worker     }
869*f81fb7c4SAndroid Build Coastguard Worker 
870*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
871*f81fb7c4SAndroid Build Coastguard Worker }
872*f81fb7c4SAndroid Build Coastguard Worker 
873*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
874*f81fb7c4SAndroid Build Coastguard Worker  * IMY_PlayNote()
875*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
876*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
877*f81fb7c4SAndroid Build Coastguard Worker  *
878*f81fb7c4SAndroid Build Coastguard Worker  *
879*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
880*f81fb7c4SAndroid Build Coastguard Worker  *
881*f81fb7c4SAndroid Build Coastguard Worker  *
882*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
883*f81fb7c4SAndroid Build Coastguard Worker  *
884*f81fb7c4SAndroid Build Coastguard Worker  *
885*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
886*f81fb7c4SAndroid Build Coastguard Worker  *
887*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
888*f81fb7c4SAndroid Build Coastguard Worker */
IMY_PlayNote(S_EAS_DATA * pEASData,S_IMELODY_DATA * pData,EAS_I8 note,EAS_INT parserMode)889*f81fb7c4SAndroid Build Coastguard Worker static EAS_BOOL IMY_PlayNote (S_EAS_DATA *pEASData, S_IMELODY_DATA *pData, EAS_I8 note, EAS_INT parserMode)
890*f81fb7c4SAndroid Build Coastguard Worker {
891*f81fb7c4SAndroid Build Coastguard Worker     EAS_I32 duration;
892*f81fb7c4SAndroid Build Coastguard Worker     EAS_U8 velocity;
893*f81fb7c4SAndroid Build Coastguard Worker 
894*f81fb7c4SAndroid Build Coastguard Worker 
895*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
896*f81fb7c4SAndroid Build Coastguard Worker     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_PlayNote: start note %d\n", note); */ }
897*f81fb7c4SAndroid Build Coastguard Worker #endif
898*f81fb7c4SAndroid Build Coastguard Worker 
899*f81fb7c4SAndroid Build Coastguard Worker     /* get the duration */
900*f81fb7c4SAndroid Build Coastguard Worker     if (!IMY_GetDuration(pEASData->hwInstData, pData, &duration))
901*f81fb7c4SAndroid Build Coastguard Worker         return EAS_FALSE;
902*f81fb7c4SAndroid Build Coastguard Worker 
903*f81fb7c4SAndroid Build Coastguard Worker     /* save note value */
904*f81fb7c4SAndroid Build Coastguard Worker     pData->note = (EAS_U8) (pData->octave + noteTable[note - 'a'] + pData->noteModifier);
905*f81fb7c4SAndroid Build Coastguard Worker     velocity = (EAS_U8) (pData->volume ? pData->volume * IMELODY_VEL_MUL + IMELODY_VEL_OFS : 0);
906*f81fb7c4SAndroid Build Coastguard Worker 
907*f81fb7c4SAndroid Build Coastguard Worker     /* start note only if in play mode */
908*f81fb7c4SAndroid Build Coastguard Worker     if (parserMode == eParserModePlay)
909*f81fb7c4SAndroid Build Coastguard Worker         VMStartNote(pEASData->pVoiceMgr, pData->pSynth, IMELODY_CHANNEL, pData->note, velocity);
910*f81fb7c4SAndroid Build Coastguard Worker 
911*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
912*f81fb7c4SAndroid Build Coastguard Worker     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_PlayNote: Start note %d, duration %d\n", pData->note, duration); */ }
913*f81fb7c4SAndroid Build Coastguard Worker #endif
914*f81fb7c4SAndroid Build Coastguard Worker 
915*f81fb7c4SAndroid Build Coastguard Worker     /* determine note length */
916*f81fb7c4SAndroid Build Coastguard Worker     switch (pData->style)
917*f81fb7c4SAndroid Build Coastguard Worker     {
918*f81fb7c4SAndroid Build Coastguard Worker         case 0:
919*f81fb7c4SAndroid Build Coastguard Worker             /*lint -e{704} shift for performance */
920*f81fb7c4SAndroid Build Coastguard Worker             pData->restTicks = duration >> 4;
921*f81fb7c4SAndroid Build Coastguard Worker             break;
922*f81fb7c4SAndroid Build Coastguard Worker         case 1:
923*f81fb7c4SAndroid Build Coastguard Worker             pData->restTicks = 0;
924*f81fb7c4SAndroid Build Coastguard Worker             break;
925*f81fb7c4SAndroid Build Coastguard Worker         case 2:
926*f81fb7c4SAndroid Build Coastguard Worker             /*lint -e{704} shift for performance */
927*f81fb7c4SAndroid Build Coastguard Worker             pData->restTicks = duration >> 1;
928*f81fb7c4SAndroid Build Coastguard Worker             break;
929*f81fb7c4SAndroid Build Coastguard Worker         default:
930*f81fb7c4SAndroid Build Coastguard Worker             { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "IMY_PlayNote: Note style out of range: %d\n", pData->style); */ }
931*f81fb7c4SAndroid Build Coastguard Worker             /*lint -e{704} shift for performance */
932*f81fb7c4SAndroid Build Coastguard Worker             pData->restTicks = duration >> 4;
933*f81fb7c4SAndroid Build Coastguard Worker             break;
934*f81fb7c4SAndroid Build Coastguard Worker     }
935*f81fb7c4SAndroid Build Coastguard Worker 
936*f81fb7c4SAndroid Build Coastguard Worker     /* next event is at end of this note */
937*f81fb7c4SAndroid Build Coastguard Worker     pData->time += duration - pData->restTicks;
938*f81fb7c4SAndroid Build Coastguard Worker 
939*f81fb7c4SAndroid Build Coastguard Worker     /* reset the flat/sharp modifier */
940*f81fb7c4SAndroid Build Coastguard Worker     pData->noteModifier = 0;
941*f81fb7c4SAndroid Build Coastguard Worker 
942*f81fb7c4SAndroid Build Coastguard Worker     return EAS_TRUE;
943*f81fb7c4SAndroid Build Coastguard Worker }
944*f81fb7c4SAndroid Build Coastguard Worker 
945*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
946*f81fb7c4SAndroid Build Coastguard Worker  * IMY_PlayRest()
947*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
948*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
949*f81fb7c4SAndroid Build Coastguard Worker  *
950*f81fb7c4SAndroid Build Coastguard Worker  *
951*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
952*f81fb7c4SAndroid Build Coastguard Worker  *
953*f81fb7c4SAndroid Build Coastguard Worker  *
954*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
955*f81fb7c4SAndroid Build Coastguard Worker  *
956*f81fb7c4SAndroid Build Coastguard Worker  *
957*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
958*f81fb7c4SAndroid Build Coastguard Worker  *
959*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
960*f81fb7c4SAndroid Build Coastguard Worker */
IMY_PlayRest(S_EAS_DATA * pEASData,S_IMELODY_DATA * pData)961*f81fb7c4SAndroid Build Coastguard Worker static EAS_BOOL IMY_PlayRest (S_EAS_DATA *pEASData, S_IMELODY_DATA *pData)
962*f81fb7c4SAndroid Build Coastguard Worker {
963*f81fb7c4SAndroid Build Coastguard Worker     EAS_I32 duration;
964*f81fb7c4SAndroid Build Coastguard Worker 
965*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
966*f81fb7c4SAndroid Build Coastguard Worker     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Enter IMY_PlayRest]n"); */ }
967*f81fb7c4SAndroid Build Coastguard Worker #endif
968*f81fb7c4SAndroid Build Coastguard Worker 
969*f81fb7c4SAndroid Build Coastguard Worker     /* get the duration */
970*f81fb7c4SAndroid Build Coastguard Worker     if (!IMY_GetDuration(pEASData->hwInstData, pData, &duration))
971*f81fb7c4SAndroid Build Coastguard Worker         return EAS_FALSE;
972*f81fb7c4SAndroid Build Coastguard Worker 
973*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
974*f81fb7c4SAndroid Build Coastguard Worker     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_PlayRest: note duration %d\n", duration); */ }
975*f81fb7c4SAndroid Build Coastguard Worker #endif
976*f81fb7c4SAndroid Build Coastguard Worker 
977*f81fb7c4SAndroid Build Coastguard Worker     /* next event is at end of this note */
978*f81fb7c4SAndroid Build Coastguard Worker     pData->time += duration;
979*f81fb7c4SAndroid Build Coastguard Worker     return EAS_TRUE;
980*f81fb7c4SAndroid Build Coastguard Worker }
981*f81fb7c4SAndroid Build Coastguard Worker 
982*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
983*f81fb7c4SAndroid Build Coastguard Worker  * IMY_GetDuration()
984*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
985*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
986*f81fb7c4SAndroid Build Coastguard Worker  *
987*f81fb7c4SAndroid Build Coastguard Worker  *
988*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
989*f81fb7c4SAndroid Build Coastguard Worker  *
990*f81fb7c4SAndroid Build Coastguard Worker  *
991*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
992*f81fb7c4SAndroid Build Coastguard Worker  *
993*f81fb7c4SAndroid Build Coastguard Worker  *
994*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
995*f81fb7c4SAndroid Build Coastguard Worker  *
996*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
997*f81fb7c4SAndroid Build Coastguard Worker */
998*f81fb7c4SAndroid Build Coastguard Worker 
IMY_GetDuration(EAS_HW_DATA_HANDLE hwInstData,S_IMELODY_DATA * pData,EAS_I32 * pDuration)999*f81fb7c4SAndroid Build Coastguard Worker static EAS_BOOL IMY_GetDuration (EAS_HW_DATA_HANDLE hwInstData, S_IMELODY_DATA *pData, EAS_I32 *pDuration)
1000*f81fb7c4SAndroid Build Coastguard Worker {
1001*f81fb7c4SAndroid Build Coastguard Worker     EAS_I32 duration;
1002*f81fb7c4SAndroid Build Coastguard Worker     EAS_I8 c;
1003*f81fb7c4SAndroid Build Coastguard Worker 
1004*f81fb7c4SAndroid Build Coastguard Worker     /* get the duration */
1005*f81fb7c4SAndroid Build Coastguard Worker     *pDuration = 0;
1006*f81fb7c4SAndroid Build Coastguard Worker     c = IMY_GetNextChar(hwInstData, pData, EAS_FALSE);
1007*f81fb7c4SAndroid Build Coastguard Worker     if (!c)
1008*f81fb7c4SAndroid Build Coastguard Worker         return EAS_FALSE;
1009*f81fb7c4SAndroid Build Coastguard Worker     if ((c < '0') || (c > '5'))
1010*f81fb7c4SAndroid Build Coastguard Worker     {
1011*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
1012*f81fb7c4SAndroid Build Coastguard Worker         { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetDuration: error in duration '%c'\n", c); */ }
1013*f81fb7c4SAndroid Build Coastguard Worker #endif
1014*f81fb7c4SAndroid Build Coastguard Worker         return EAS_FALSE;
1015*f81fb7c4SAndroid Build Coastguard Worker     }
1016*f81fb7c4SAndroid Build Coastguard Worker 
1017*f81fb7c4SAndroid Build Coastguard Worker     /* calculate total length of note */
1018*f81fb7c4SAndroid Build Coastguard Worker     duration = pData->tick * (1 << ('5' - c));
1019*f81fb7c4SAndroid Build Coastguard Worker 
1020*f81fb7c4SAndroid Build Coastguard Worker     /* check for duration modifier */
1021*f81fb7c4SAndroid Build Coastguard Worker     c = IMY_GetNextChar(hwInstData, pData, EAS_FALSE);
1022*f81fb7c4SAndroid Build Coastguard Worker     if (c)
1023*f81fb7c4SAndroid Build Coastguard Worker     {
1024*f81fb7c4SAndroid Build Coastguard Worker         if (c == '.')
1025*f81fb7c4SAndroid Build Coastguard Worker             /*lint -e{704} shift for performance */
1026*f81fb7c4SAndroid Build Coastguard Worker             duration += duration >> 1;
1027*f81fb7c4SAndroid Build Coastguard Worker         else if (c == ':')
1028*f81fb7c4SAndroid Build Coastguard Worker             /*lint -e{704} shift for performance */
1029*f81fb7c4SAndroid Build Coastguard Worker             duration += (duration >> 1) + (duration >> 2);
1030*f81fb7c4SAndroid Build Coastguard Worker         else if (c == ';')
1031*f81fb7c4SAndroid Build Coastguard Worker             /*lint -e{704} shift for performance */
1032*f81fb7c4SAndroid Build Coastguard Worker             duration = (duration * TRIPLET_MULTIPLIER) >> TRIPLET_SHIFT;
1033*f81fb7c4SAndroid Build Coastguard Worker         else
1034*f81fb7c4SAndroid Build Coastguard Worker             PutBackChar(pData);
1035*f81fb7c4SAndroid Build Coastguard Worker     }
1036*f81fb7c4SAndroid Build Coastguard Worker 
1037*f81fb7c4SAndroid Build Coastguard Worker     *pDuration = duration;
1038*f81fb7c4SAndroid Build Coastguard Worker     return EAS_TRUE;
1039*f81fb7c4SAndroid Build Coastguard Worker }
1040*f81fb7c4SAndroid Build Coastguard Worker 
1041*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1042*f81fb7c4SAndroid Build Coastguard Worker  * IMY_GetLEDState()
1043*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1044*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
1045*f81fb7c4SAndroid Build Coastguard Worker  *
1046*f81fb7c4SAndroid Build Coastguard Worker  *
1047*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
1048*f81fb7c4SAndroid Build Coastguard Worker  *
1049*f81fb7c4SAndroid Build Coastguard Worker  *
1050*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
1051*f81fb7c4SAndroid Build Coastguard Worker  *
1052*f81fb7c4SAndroid Build Coastguard Worker  *
1053*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
1054*f81fb7c4SAndroid Build Coastguard Worker  *
1055*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1056*f81fb7c4SAndroid Build Coastguard Worker */
IMY_GetLEDState(S_EAS_DATA * pEASData,S_IMELODY_DATA * pData)1057*f81fb7c4SAndroid Build Coastguard Worker static EAS_BOOL IMY_GetLEDState (S_EAS_DATA *pEASData, S_IMELODY_DATA *pData)
1058*f81fb7c4SAndroid Build Coastguard Worker {
1059*f81fb7c4SAndroid Build Coastguard Worker     EAS_I8 c;
1060*f81fb7c4SAndroid Build Coastguard Worker     EAS_INT i;
1061*f81fb7c4SAndroid Build Coastguard Worker 
1062*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
1063*f81fb7c4SAndroid Build Coastguard Worker     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Enter IMY_GetLEDState\n"); */ }
1064*f81fb7c4SAndroid Build Coastguard Worker #endif
1065*f81fb7c4SAndroid Build Coastguard Worker 
1066*f81fb7c4SAndroid Build Coastguard Worker     for (i = 0; i < 5; i++)
1067*f81fb7c4SAndroid Build Coastguard Worker     {
1068*f81fb7c4SAndroid Build Coastguard Worker         c = IMY_GetNextChar(pEASData->hwInstData, pData, EAS_FALSE);
1069*f81fb7c4SAndroid Build Coastguard Worker         if (!c)
1070*f81fb7c4SAndroid Build Coastguard Worker             return EAS_FALSE;
1071*f81fb7c4SAndroid Build Coastguard Worker         switch (i)
1072*f81fb7c4SAndroid Build Coastguard Worker         {
1073*f81fb7c4SAndroid Build Coastguard Worker             case 3:
1074*f81fb7c4SAndroid Build Coastguard Worker                 if (c == 'n')
1075*f81fb7c4SAndroid Build Coastguard Worker                 {
1076*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
1077*f81fb7c4SAndroid Build Coastguard Worker                     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetLEDState: LED on\n"); */ }
1078*f81fb7c4SAndroid Build Coastguard Worker #endif
1079*f81fb7c4SAndroid Build Coastguard Worker                     EAS_HWLED(pEASData->hwInstData, EAS_TRUE);
1080*f81fb7c4SAndroid Build Coastguard Worker                     return EAS_TRUE;
1081*f81fb7c4SAndroid Build Coastguard Worker                 }
1082*f81fb7c4SAndroid Build Coastguard Worker                 else if (c != 'f')
1083*f81fb7c4SAndroid Build Coastguard Worker                     return EAS_FALSE;
1084*f81fb7c4SAndroid Build Coastguard Worker                 break;
1085*f81fb7c4SAndroid Build Coastguard Worker 
1086*f81fb7c4SAndroid Build Coastguard Worker             case 4:
1087*f81fb7c4SAndroid Build Coastguard Worker                 if (c == 'f')
1088*f81fb7c4SAndroid Build Coastguard Worker                 {
1089*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
1090*f81fb7c4SAndroid Build Coastguard Worker                     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetLEDState: LED off\n"); */ }
1091*f81fb7c4SAndroid Build Coastguard Worker #endif
1092*f81fb7c4SAndroid Build Coastguard Worker                     EAS_HWLED(pEASData->hwInstData, EAS_FALSE);
1093*f81fb7c4SAndroid Build Coastguard Worker                     return EAS_TRUE;
1094*f81fb7c4SAndroid Build Coastguard Worker                 }
1095*f81fb7c4SAndroid Build Coastguard Worker                 return EAS_FALSE;
1096*f81fb7c4SAndroid Build Coastguard Worker 
1097*f81fb7c4SAndroid Build Coastguard Worker             default:
1098*f81fb7c4SAndroid Build Coastguard Worker                 if (c != ledStr[i])
1099*f81fb7c4SAndroid Build Coastguard Worker                     return EAS_FALSE;
1100*f81fb7c4SAndroid Build Coastguard Worker                 break;
1101*f81fb7c4SAndroid Build Coastguard Worker         }
1102*f81fb7c4SAndroid Build Coastguard Worker     }
1103*f81fb7c4SAndroid Build Coastguard Worker     return EAS_FALSE;
1104*f81fb7c4SAndroid Build Coastguard Worker }
1105*f81fb7c4SAndroid Build Coastguard Worker 
1106*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1107*f81fb7c4SAndroid Build Coastguard Worker  * IMY_GetVibeState()
1108*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1109*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
1110*f81fb7c4SAndroid Build Coastguard Worker  *
1111*f81fb7c4SAndroid Build Coastguard Worker  *
1112*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
1113*f81fb7c4SAndroid Build Coastguard Worker  *
1114*f81fb7c4SAndroid Build Coastguard Worker  *
1115*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
1116*f81fb7c4SAndroid Build Coastguard Worker  *
1117*f81fb7c4SAndroid Build Coastguard Worker  *
1118*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
1119*f81fb7c4SAndroid Build Coastguard Worker  *
1120*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1121*f81fb7c4SAndroid Build Coastguard Worker */
IMY_GetVibeState(S_EAS_DATA * pEASData,S_IMELODY_DATA * pData)1122*f81fb7c4SAndroid Build Coastguard Worker static EAS_BOOL IMY_GetVibeState (S_EAS_DATA *pEASData, S_IMELODY_DATA *pData)
1123*f81fb7c4SAndroid Build Coastguard Worker {
1124*f81fb7c4SAndroid Build Coastguard Worker     EAS_I8 c;
1125*f81fb7c4SAndroid Build Coastguard Worker     EAS_INT i;
1126*f81fb7c4SAndroid Build Coastguard Worker 
1127*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
1128*f81fb7c4SAndroid Build Coastguard Worker     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Enter IMY_GetVibeState\n"); */ }
1129*f81fb7c4SAndroid Build Coastguard Worker #endif
1130*f81fb7c4SAndroid Build Coastguard Worker 
1131*f81fb7c4SAndroid Build Coastguard Worker     for (i = 0; i < 6; i++)
1132*f81fb7c4SAndroid Build Coastguard Worker     {
1133*f81fb7c4SAndroid Build Coastguard Worker         c = IMY_GetNextChar(pEASData->hwInstData, pData, EAS_FALSE);
1134*f81fb7c4SAndroid Build Coastguard Worker         if (!c)
1135*f81fb7c4SAndroid Build Coastguard Worker             return EAS_FALSE;
1136*f81fb7c4SAndroid Build Coastguard Worker         switch (i)
1137*f81fb7c4SAndroid Build Coastguard Worker         {
1138*f81fb7c4SAndroid Build Coastguard Worker             case 4:
1139*f81fb7c4SAndroid Build Coastguard Worker                 if (c == 'n')
1140*f81fb7c4SAndroid Build Coastguard Worker                 {
1141*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
1142*f81fb7c4SAndroid Build Coastguard Worker                     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetVibeState: vibrate on\n"); */ }
1143*f81fb7c4SAndroid Build Coastguard Worker #endif
1144*f81fb7c4SAndroid Build Coastguard Worker                     EAS_HWVibrate(pEASData->hwInstData, EAS_TRUE);
1145*f81fb7c4SAndroid Build Coastguard Worker                     return EAS_TRUE;
1146*f81fb7c4SAndroid Build Coastguard Worker                 }
1147*f81fb7c4SAndroid Build Coastguard Worker                 else if (c != 'f')
1148*f81fb7c4SAndroid Build Coastguard Worker                     return EAS_FALSE;
1149*f81fb7c4SAndroid Build Coastguard Worker                 break;
1150*f81fb7c4SAndroid Build Coastguard Worker 
1151*f81fb7c4SAndroid Build Coastguard Worker             case 5:
1152*f81fb7c4SAndroid Build Coastguard Worker                 if (c == 'f')
1153*f81fb7c4SAndroid Build Coastguard Worker                 {
1154*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
1155*f81fb7c4SAndroid Build Coastguard Worker                     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetVibeState: vibrate off\n"); */ }
1156*f81fb7c4SAndroid Build Coastguard Worker #endif
1157*f81fb7c4SAndroid Build Coastguard Worker                     EAS_HWVibrate(pEASData->hwInstData, EAS_FALSE);
1158*f81fb7c4SAndroid Build Coastguard Worker                     return EAS_TRUE;
1159*f81fb7c4SAndroid Build Coastguard Worker                 }
1160*f81fb7c4SAndroid Build Coastguard Worker                 return EAS_FALSE;
1161*f81fb7c4SAndroid Build Coastguard Worker 
1162*f81fb7c4SAndroid Build Coastguard Worker             default:
1163*f81fb7c4SAndroid Build Coastguard Worker                 if (c != vibeStr[i])
1164*f81fb7c4SAndroid Build Coastguard Worker                     return EAS_FALSE;
1165*f81fb7c4SAndroid Build Coastguard Worker                 break;
1166*f81fb7c4SAndroid Build Coastguard Worker         }
1167*f81fb7c4SAndroid Build Coastguard Worker     }
1168*f81fb7c4SAndroid Build Coastguard Worker     return EAS_FALSE;
1169*f81fb7c4SAndroid Build Coastguard Worker }
1170*f81fb7c4SAndroid Build Coastguard Worker 
1171*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1172*f81fb7c4SAndroid Build Coastguard Worker  * IMY_GetBackState()
1173*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1174*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
1175*f81fb7c4SAndroid Build Coastguard Worker  *
1176*f81fb7c4SAndroid Build Coastguard Worker  *
1177*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
1178*f81fb7c4SAndroid Build Coastguard Worker  *
1179*f81fb7c4SAndroid Build Coastguard Worker  *
1180*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
1181*f81fb7c4SAndroid Build Coastguard Worker  *
1182*f81fb7c4SAndroid Build Coastguard Worker  *
1183*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
1184*f81fb7c4SAndroid Build Coastguard Worker  *
1185*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1186*f81fb7c4SAndroid Build Coastguard Worker */
IMY_GetBackState(S_EAS_DATA * pEASData,S_IMELODY_DATA * pData)1187*f81fb7c4SAndroid Build Coastguard Worker static EAS_BOOL IMY_GetBackState (S_EAS_DATA *pEASData, S_IMELODY_DATA *pData)
1188*f81fb7c4SAndroid Build Coastguard Worker {
1189*f81fb7c4SAndroid Build Coastguard Worker     EAS_I8 c;
1190*f81fb7c4SAndroid Build Coastguard Worker     EAS_INT i;
1191*f81fb7c4SAndroid Build Coastguard Worker 
1192*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
1193*f81fb7c4SAndroid Build Coastguard Worker     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Enter IMY_GetBackState\n"); */ }
1194*f81fb7c4SAndroid Build Coastguard Worker #endif
1195*f81fb7c4SAndroid Build Coastguard Worker 
1196*f81fb7c4SAndroid Build Coastguard Worker     for (i = 0; i < 5; i++)
1197*f81fb7c4SAndroid Build Coastguard Worker     {
1198*f81fb7c4SAndroid Build Coastguard Worker         c = IMY_GetNextChar(pEASData->hwInstData, pData, EAS_FALSE);
1199*f81fb7c4SAndroid Build Coastguard Worker         if (!c)
1200*f81fb7c4SAndroid Build Coastguard Worker             return EAS_FALSE;
1201*f81fb7c4SAndroid Build Coastguard Worker         switch (i)
1202*f81fb7c4SAndroid Build Coastguard Worker         {
1203*f81fb7c4SAndroid Build Coastguard Worker             case 3:
1204*f81fb7c4SAndroid Build Coastguard Worker                 if (c == 'n')
1205*f81fb7c4SAndroid Build Coastguard Worker                 {
1206*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
1207*f81fb7c4SAndroid Build Coastguard Worker                     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetBackState: backlight on\n"); */ }
1208*f81fb7c4SAndroid Build Coastguard Worker #endif
1209*f81fb7c4SAndroid Build Coastguard Worker                     EAS_HWBackLight(pEASData->hwInstData, EAS_TRUE);
1210*f81fb7c4SAndroid Build Coastguard Worker                     return EAS_TRUE;
1211*f81fb7c4SAndroid Build Coastguard Worker                 }
1212*f81fb7c4SAndroid Build Coastguard Worker                 else if (c != 'f')
1213*f81fb7c4SAndroid Build Coastguard Worker                     return EAS_FALSE;
1214*f81fb7c4SAndroid Build Coastguard Worker                 break;
1215*f81fb7c4SAndroid Build Coastguard Worker 
1216*f81fb7c4SAndroid Build Coastguard Worker             case 4:
1217*f81fb7c4SAndroid Build Coastguard Worker                 if (c == 'f')
1218*f81fb7c4SAndroid Build Coastguard Worker                 {
1219*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
1220*f81fb7c4SAndroid Build Coastguard Worker                     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetBackState: backlight off\n"); */ }
1221*f81fb7c4SAndroid Build Coastguard Worker #endif
1222*f81fb7c4SAndroid Build Coastguard Worker                     EAS_HWBackLight(pEASData->hwInstData, EAS_FALSE);
1223*f81fb7c4SAndroid Build Coastguard Worker                     return EAS_TRUE;
1224*f81fb7c4SAndroid Build Coastguard Worker                 }
1225*f81fb7c4SAndroid Build Coastguard Worker                 return EAS_FALSE;
1226*f81fb7c4SAndroid Build Coastguard Worker 
1227*f81fb7c4SAndroid Build Coastguard Worker             default:
1228*f81fb7c4SAndroid Build Coastguard Worker                 if (c != backStr[i])
1229*f81fb7c4SAndroid Build Coastguard Worker                     return EAS_FALSE;
1230*f81fb7c4SAndroid Build Coastguard Worker                 break;
1231*f81fb7c4SAndroid Build Coastguard Worker         }
1232*f81fb7c4SAndroid Build Coastguard Worker     }
1233*f81fb7c4SAndroid Build Coastguard Worker     return EAS_FALSE;
1234*f81fb7c4SAndroid Build Coastguard Worker }
1235*f81fb7c4SAndroid Build Coastguard Worker 
1236*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1237*f81fb7c4SAndroid Build Coastguard Worker  * IMY_GetVolume()
1238*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1239*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
1240*f81fb7c4SAndroid Build Coastguard Worker  *
1241*f81fb7c4SAndroid Build Coastguard Worker  *
1242*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
1243*f81fb7c4SAndroid Build Coastguard Worker  *
1244*f81fb7c4SAndroid Build Coastguard Worker  *
1245*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
1246*f81fb7c4SAndroid Build Coastguard Worker  *
1247*f81fb7c4SAndroid Build Coastguard Worker  *
1248*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
1249*f81fb7c4SAndroid Build Coastguard Worker  *
1250*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1251*f81fb7c4SAndroid Build Coastguard Worker */
IMY_GetVolume(EAS_HW_DATA_HANDLE hwInstData,S_IMELODY_DATA * pData,EAS_BOOL inHeader)1252*f81fb7c4SAndroid Build Coastguard Worker static EAS_BOOL IMY_GetVolume (EAS_HW_DATA_HANDLE hwInstData, S_IMELODY_DATA *pData, EAS_BOOL inHeader)
1253*f81fb7c4SAndroid Build Coastguard Worker {
1254*f81fb7c4SAndroid Build Coastguard Worker     EAS_INT temp;
1255*f81fb7c4SAndroid Build Coastguard Worker     EAS_I8 c;
1256*f81fb7c4SAndroid Build Coastguard Worker 
1257*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
1258*f81fb7c4SAndroid Build Coastguard Worker     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Enter IMY_GetVolume\n"); */ }
1259*f81fb7c4SAndroid Build Coastguard Worker #endif
1260*f81fb7c4SAndroid Build Coastguard Worker 
1261*f81fb7c4SAndroid Build Coastguard Worker     c = IMY_GetNextChar(hwInstData, pData, inHeader);
1262*f81fb7c4SAndroid Build Coastguard Worker     if (c == '+')
1263*f81fb7c4SAndroid Build Coastguard Worker     {
1264*f81fb7c4SAndroid Build Coastguard Worker         if (pData->volume < 15)
1265*f81fb7c4SAndroid Build Coastguard Worker             pData->volume++;
1266*f81fb7c4SAndroid Build Coastguard Worker         return EAS_TRUE;
1267*f81fb7c4SAndroid Build Coastguard Worker     }
1268*f81fb7c4SAndroid Build Coastguard Worker     else if (c == '-')
1269*f81fb7c4SAndroid Build Coastguard Worker     {
1270*f81fb7c4SAndroid Build Coastguard Worker         if (pData->volume > 0)
1271*f81fb7c4SAndroid Build Coastguard Worker             pData->volume--;
1272*f81fb7c4SAndroid Build Coastguard Worker         return EAS_TRUE;
1273*f81fb7c4SAndroid Build Coastguard Worker     }
1274*f81fb7c4SAndroid Build Coastguard Worker     else if (IsDigit(c))
1275*f81fb7c4SAndroid Build Coastguard Worker         temp = c - '0';
1276*f81fb7c4SAndroid Build Coastguard Worker     else
1277*f81fb7c4SAndroid Build Coastguard Worker         return EAS_FALSE;
1278*f81fb7c4SAndroid Build Coastguard Worker 
1279*f81fb7c4SAndroid Build Coastguard Worker     c = IMY_GetNextChar(hwInstData, pData, inHeader);
1280*f81fb7c4SAndroid Build Coastguard Worker     if (IsDigit(c))
1281*f81fb7c4SAndroid Build Coastguard Worker         temp = temp * 10 + c - '0';
1282*f81fb7c4SAndroid Build Coastguard Worker     else if (c)
1283*f81fb7c4SAndroid Build Coastguard Worker         PutBackChar(pData);
1284*f81fb7c4SAndroid Build Coastguard Worker     if ((temp >= 0) && (temp <= 15))
1285*f81fb7c4SAndroid Build Coastguard Worker     {
1286*f81fb7c4SAndroid Build Coastguard Worker         if (inHeader && (temp == 0))
1287*f81fb7c4SAndroid Build Coastguard Worker             { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Ignoring V0 encountered in header\n"); */ }
1288*f81fb7c4SAndroid Build Coastguard Worker         else
1289*f81fb7c4SAndroid Build Coastguard Worker             pData->volume = (EAS_U8) temp;
1290*f81fb7c4SAndroid Build Coastguard Worker     }
1291*f81fb7c4SAndroid Build Coastguard Worker     return EAS_TRUE;
1292*f81fb7c4SAndroid Build Coastguard Worker }
1293*f81fb7c4SAndroid Build Coastguard Worker 
1294*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1295*f81fb7c4SAndroid Build Coastguard Worker  * IMY_GetNumber()
1296*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1297*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
1298*f81fb7c4SAndroid Build Coastguard Worker  *
1299*f81fb7c4SAndroid Build Coastguard Worker  *
1300*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
1301*f81fb7c4SAndroid Build Coastguard Worker  *
1302*f81fb7c4SAndroid Build Coastguard Worker  *
1303*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
1304*f81fb7c4SAndroid Build Coastguard Worker  *
1305*f81fb7c4SAndroid Build Coastguard Worker  *
1306*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
1307*f81fb7c4SAndroid Build Coastguard Worker  *
1308*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1309*f81fb7c4SAndroid Build Coastguard Worker */
IMY_GetNumber(EAS_HW_DATA_HANDLE hwInstData,S_IMELODY_DATA * pData,EAS_INT * temp,EAS_BOOL inHeader)1310*f81fb7c4SAndroid Build Coastguard Worker static EAS_BOOL IMY_GetNumber (EAS_HW_DATA_HANDLE hwInstData, S_IMELODY_DATA *pData, EAS_INT *temp, EAS_BOOL inHeader)
1311*f81fb7c4SAndroid Build Coastguard Worker {
1312*f81fb7c4SAndroid Build Coastguard Worker     EAS_BOOL ok;
1313*f81fb7c4SAndroid Build Coastguard Worker     EAS_I8 c;
1314*f81fb7c4SAndroid Build Coastguard Worker 
1315*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
1316*f81fb7c4SAndroid Build Coastguard Worker     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Enter IMY_GetNumber\n"); */ }
1317*f81fb7c4SAndroid Build Coastguard Worker #endif
1318*f81fb7c4SAndroid Build Coastguard Worker 
1319*f81fb7c4SAndroid Build Coastguard Worker     *temp = 0;
1320*f81fb7c4SAndroid Build Coastguard Worker     ok = EAS_FALSE;
1321*f81fb7c4SAndroid Build Coastguard Worker     for (;;)
1322*f81fb7c4SAndroid Build Coastguard Worker     {
1323*f81fb7c4SAndroid Build Coastguard Worker         c = IMY_GetNextChar(hwInstData, pData, inHeader);
1324*f81fb7c4SAndroid Build Coastguard Worker         if (IsDigit(c))
1325*f81fb7c4SAndroid Build Coastguard Worker         {
1326*f81fb7c4SAndroid Build Coastguard Worker             *temp = *temp * 10 + c - '0';
1327*f81fb7c4SAndroid Build Coastguard Worker             ok = EAS_TRUE;
1328*f81fb7c4SAndroid Build Coastguard Worker         }
1329*f81fb7c4SAndroid Build Coastguard Worker         else
1330*f81fb7c4SAndroid Build Coastguard Worker         {
1331*f81fb7c4SAndroid Build Coastguard Worker             if (c)
1332*f81fb7c4SAndroid Build Coastguard Worker                 PutBackChar(pData);
1333*f81fb7c4SAndroid Build Coastguard Worker 
1334*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
1335*f81fb7c4SAndroid Build Coastguard Worker             { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetNumber: value %d\n", *temp); */ }
1336*f81fb7c4SAndroid Build Coastguard Worker #endif
1337*f81fb7c4SAndroid Build Coastguard Worker 
1338*f81fb7c4SAndroid Build Coastguard Worker             return ok;
1339*f81fb7c4SAndroid Build Coastguard Worker         }
1340*f81fb7c4SAndroid Build Coastguard Worker     }
1341*f81fb7c4SAndroid Build Coastguard Worker }
1342*f81fb7c4SAndroid Build Coastguard Worker 
1343*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1344*f81fb7c4SAndroid Build Coastguard Worker  * IMY_GetVersion()
1345*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1346*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
1347*f81fb7c4SAndroid Build Coastguard Worker  *
1348*f81fb7c4SAndroid Build Coastguard Worker  *
1349*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
1350*f81fb7c4SAndroid Build Coastguard Worker  *
1351*f81fb7c4SAndroid Build Coastguard Worker  *
1352*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
1353*f81fb7c4SAndroid Build Coastguard Worker  *
1354*f81fb7c4SAndroid Build Coastguard Worker  *
1355*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
1356*f81fb7c4SAndroid Build Coastguard Worker  *
1357*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1358*f81fb7c4SAndroid Build Coastguard Worker */
IMY_GetVersion(S_IMELODY_DATA * pData,EAS_INT * pVersion)1359*f81fb7c4SAndroid Build Coastguard Worker static EAS_BOOL IMY_GetVersion (S_IMELODY_DATA *pData, EAS_INT *pVersion)
1360*f81fb7c4SAndroid Build Coastguard Worker {
1361*f81fb7c4SAndroid Build Coastguard Worker     EAS_I8 c;
1362*f81fb7c4SAndroid Build Coastguard Worker     EAS_INT temp;
1363*f81fb7c4SAndroid Build Coastguard Worker     EAS_INT version;
1364*f81fb7c4SAndroid Build Coastguard Worker 
1365*f81fb7c4SAndroid Build Coastguard Worker     version = temp = 0;
1366*f81fb7c4SAndroid Build Coastguard Worker     for (;;)
1367*f81fb7c4SAndroid Build Coastguard Worker     {
1368*f81fb7c4SAndroid Build Coastguard Worker         c = pData->buffer[pData->index++];
1369*f81fb7c4SAndroid Build Coastguard Worker         if ((c == 0) || (c == '.'))
1370*f81fb7c4SAndroid Build Coastguard Worker         {
1371*f81fb7c4SAndroid Build Coastguard Worker             /*lint -e{701} use shift for performance */
1372*f81fb7c4SAndroid Build Coastguard Worker             version = (version << 8) + temp;
1373*f81fb7c4SAndroid Build Coastguard Worker             if (c == 0)
1374*f81fb7c4SAndroid Build Coastguard Worker             {
1375*f81fb7c4SAndroid Build Coastguard Worker 
1376*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
1377*f81fb7c4SAndroid Build Coastguard Worker                 { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetVersion: version 0x%04x\n", version); */ }
1378*f81fb7c4SAndroid Build Coastguard Worker #endif
1379*f81fb7c4SAndroid Build Coastguard Worker 
1380*f81fb7c4SAndroid Build Coastguard Worker                 *pVersion = version;
1381*f81fb7c4SAndroid Build Coastguard Worker                 return EAS_TRUE;
1382*f81fb7c4SAndroid Build Coastguard Worker             }
1383*f81fb7c4SAndroid Build Coastguard Worker             temp = 0;
1384*f81fb7c4SAndroid Build Coastguard Worker         }
1385*f81fb7c4SAndroid Build Coastguard Worker         else if (IsDigit(c))
1386*f81fb7c4SAndroid Build Coastguard Worker             temp = (temp * 10) + c - '0';
1387*f81fb7c4SAndroid Build Coastguard Worker     }
1388*f81fb7c4SAndroid Build Coastguard Worker }
1389*f81fb7c4SAndroid Build Coastguard Worker 
1390*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1391*f81fb7c4SAndroid Build Coastguard Worker  * IMY_MetaData()
1392*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1393*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
1394*f81fb7c4SAndroid Build Coastguard Worker  * Prepare to parse the file. Allocates instance data (or uses static allocation for
1395*f81fb7c4SAndroid Build Coastguard Worker  * static memory model).
1396*f81fb7c4SAndroid Build Coastguard Worker  *
1397*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
1398*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
1399*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
1400*f81fb7c4SAndroid Build Coastguard Worker  *
1401*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
1402*f81fb7c4SAndroid Build Coastguard Worker  *
1403*f81fb7c4SAndroid Build Coastguard Worker  *
1404*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
1405*f81fb7c4SAndroid Build Coastguard Worker  *
1406*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1407*f81fb7c4SAndroid Build Coastguard Worker */
IMY_MetaData(S_IMELODY_DATA * pData,E_EAS_METADATA_TYPE metaType,EAS_I8 * buffer)1408*f81fb7c4SAndroid Build Coastguard Worker static void IMY_MetaData (S_IMELODY_DATA *pData, E_EAS_METADATA_TYPE metaType, EAS_I8 *buffer)
1409*f81fb7c4SAndroid Build Coastguard Worker {
1410*f81fb7c4SAndroid Build Coastguard Worker     EAS_I32 len;
1411*f81fb7c4SAndroid Build Coastguard Worker 
1412*f81fb7c4SAndroid Build Coastguard Worker     /* check for callback */
1413*f81fb7c4SAndroid Build Coastguard Worker     if (!pData->metadata.callback)
1414*f81fb7c4SAndroid Build Coastguard Worker         return;
1415*f81fb7c4SAndroid Build Coastguard Worker 
1416*f81fb7c4SAndroid Build Coastguard Worker     /* copy data to host buffer */
1417*f81fb7c4SAndroid Build Coastguard Worker     len = (EAS_I32) strlen((char*) buffer);
1418*f81fb7c4SAndroid Build Coastguard Worker     if (len >pData->metadata.bufferSize)
1419*f81fb7c4SAndroid Build Coastguard Worker         len = pData->metadata.bufferSize;
1420*f81fb7c4SAndroid Build Coastguard Worker     strncpy((char*) pData->metadata.buffer, (char*) buffer, (size_t) len);
1421*f81fb7c4SAndroid Build Coastguard Worker     pData->metadata.buffer[len] = 0;
1422*f81fb7c4SAndroid Build Coastguard Worker 
1423*f81fb7c4SAndroid Build Coastguard Worker     /* callback to host */
1424*f81fb7c4SAndroid Build Coastguard Worker     pData->metadata.callback(metaType, pData->metadata.buffer, pData->metadata.pUserData);
1425*f81fb7c4SAndroid Build Coastguard Worker }
1426*f81fb7c4SAndroid Build Coastguard Worker 
1427*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1428*f81fb7c4SAndroid Build Coastguard Worker  * IMY_ParseHeader()
1429*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1430*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
1431*f81fb7c4SAndroid Build Coastguard Worker  * Prepare to parse the file. Allocates instance data (or uses static allocation for
1432*f81fb7c4SAndroid Build Coastguard Worker  * static memory model).
1433*f81fb7c4SAndroid Build Coastguard Worker  *
1434*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
1435*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
1436*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
1437*f81fb7c4SAndroid Build Coastguard Worker  *
1438*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
1439*f81fb7c4SAndroid Build Coastguard Worker  *
1440*f81fb7c4SAndroid Build Coastguard Worker  *
1441*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
1442*f81fb7c4SAndroid Build Coastguard Worker  *
1443*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1444*f81fb7c4SAndroid Build Coastguard Worker */
IMY_ParseHeader(S_EAS_DATA * pEASData,S_IMELODY_DATA * pData)1445*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT IMY_ParseHeader (S_EAS_DATA *pEASData, S_IMELODY_DATA* pData)
1446*f81fb7c4SAndroid Build Coastguard Worker {
1447*f81fb7c4SAndroid Build Coastguard Worker     EAS_RESULT result;
1448*f81fb7c4SAndroid Build Coastguard Worker     EAS_INT token;
1449*f81fb7c4SAndroid Build Coastguard Worker     EAS_INT temp;
1450*f81fb7c4SAndroid Build Coastguard Worker     EAS_I8 c;
1451*f81fb7c4SAndroid Build Coastguard Worker 
1452*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
1453*f81fb7c4SAndroid Build Coastguard Worker     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Enter IMY_ParseHeader\n"); */ }
1454*f81fb7c4SAndroid Build Coastguard Worker #endif
1455*f81fb7c4SAndroid Build Coastguard Worker 
1456*f81fb7c4SAndroid Build Coastguard Worker     /* initialize some defaults */
1457*f81fb7c4SAndroid Build Coastguard Worker     pData->time = 0;
1458*f81fb7c4SAndroid Build Coastguard Worker     pData->tick = DEFAULT_TICK_CONV;
1459*f81fb7c4SAndroid Build Coastguard Worker     pData->note = 0;
1460*f81fb7c4SAndroid Build Coastguard Worker     pData->noteModifier = 0;
1461*f81fb7c4SAndroid Build Coastguard Worker     pData ->restTicks = 0;
1462*f81fb7c4SAndroid Build Coastguard Worker     pData->volume = 7;
1463*f81fb7c4SAndroid Build Coastguard Worker     pData->octave = 60;
1464*f81fb7c4SAndroid Build Coastguard Worker     pData->repeatOffset = -1;
1465*f81fb7c4SAndroid Build Coastguard Worker     pData->repeatCount = -1;
1466*f81fb7c4SAndroid Build Coastguard Worker     pData->style = 0;
1467*f81fb7c4SAndroid Build Coastguard Worker 
1468*f81fb7c4SAndroid Build Coastguard Worker     /* force the read of the first line */
1469*f81fb7c4SAndroid Build Coastguard Worker     pData->index = 1;
1470*f81fb7c4SAndroid Build Coastguard Worker 
1471*f81fb7c4SAndroid Build Coastguard Worker     /* read data until we get to melody */
1472*f81fb7c4SAndroid Build Coastguard Worker     for (;;)
1473*f81fb7c4SAndroid Build Coastguard Worker     {
1474*f81fb7c4SAndroid Build Coastguard Worker         /* read a line from the file and parse the token */
1475*f81fb7c4SAndroid Build Coastguard Worker         if (pData->index != 0)
1476*f81fb7c4SAndroid Build Coastguard Worker         {
1477*f81fb7c4SAndroid Build Coastguard Worker             if ((result = IMY_ReadLine(pEASData->hwInstData, pData->fileHandle, pData->buffer, &pData->startLine)) != EAS_SUCCESS)
1478*f81fb7c4SAndroid Build Coastguard Worker             {
1479*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
1480*f81fb7c4SAndroid Build Coastguard Worker                 { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_ParseHeader: IMY_ReadLine returned %d\n", result); */ }
1481*f81fb7c4SAndroid Build Coastguard Worker #endif
1482*f81fb7c4SAndroid Build Coastguard Worker                 return result;
1483*f81fb7c4SAndroid Build Coastguard Worker             }
1484*f81fb7c4SAndroid Build Coastguard Worker         }
1485*f81fb7c4SAndroid Build Coastguard Worker         token = IMY_ParseLine(pData->buffer, &pData->index);
1486*f81fb7c4SAndroid Build Coastguard Worker 
1487*f81fb7c4SAndroid Build Coastguard Worker         switch (token)
1488*f81fb7c4SAndroid Build Coastguard Worker         {
1489*f81fb7c4SAndroid Build Coastguard Worker             /* ignore these valid tokens */
1490*f81fb7c4SAndroid Build Coastguard Worker             case TOKEN_BEGIN:
1491*f81fb7c4SAndroid Build Coastguard Worker                 break;
1492*f81fb7c4SAndroid Build Coastguard Worker 
1493*f81fb7c4SAndroid Build Coastguard Worker             case TOKEN_FORMAT:
1494*f81fb7c4SAndroid Build Coastguard Worker                 if (!IMY_GetVersion(pData, &temp))
1495*f81fb7c4SAndroid Build Coastguard Worker                 {
1496*f81fb7c4SAndroid Build Coastguard Worker                     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Invalid FORMAT field '%s'\n", pData->buffer); */ }
1497*f81fb7c4SAndroid Build Coastguard Worker                     return EAS_ERROR_FILE_FORMAT;
1498*f81fb7c4SAndroid Build Coastguard Worker                 }
1499*f81fb7c4SAndroid Build Coastguard Worker                 if ((temp != 0x0100) && (temp != 0x0200))
1500*f81fb7c4SAndroid Build Coastguard Worker                 {
1501*f81fb7c4SAndroid Build Coastguard Worker                     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Unsupported FORMAT %02x\n", temp); */ }
1502*f81fb7c4SAndroid Build Coastguard Worker                     return EAS_ERROR_UNRECOGNIZED_FORMAT;
1503*f81fb7c4SAndroid Build Coastguard Worker                 }
1504*f81fb7c4SAndroid Build Coastguard Worker                 break;
1505*f81fb7c4SAndroid Build Coastguard Worker 
1506*f81fb7c4SAndroid Build Coastguard Worker             case TOKEN_VERSION:
1507*f81fb7c4SAndroid Build Coastguard Worker                 if (!IMY_GetVersion(pData, &temp))
1508*f81fb7c4SAndroid Build Coastguard Worker                 {
1509*f81fb7c4SAndroid Build Coastguard Worker                     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Invalid VERSION field '%s'\n", pData->buffer); */ }
1510*f81fb7c4SAndroid Build Coastguard Worker                     return EAS_ERROR_FILE_FORMAT;
1511*f81fb7c4SAndroid Build Coastguard Worker                 }
1512*f81fb7c4SAndroid Build Coastguard Worker                 if ((temp != 0x0100) && (temp != 0x0102))
1513*f81fb7c4SAndroid Build Coastguard Worker                 {
1514*f81fb7c4SAndroid Build Coastguard Worker                     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Unsupported VERSION %02x\n", temp); */ }
1515*f81fb7c4SAndroid Build Coastguard Worker                     return EAS_ERROR_UNRECOGNIZED_FORMAT;
1516*f81fb7c4SAndroid Build Coastguard Worker                 }
1517*f81fb7c4SAndroid Build Coastguard Worker                 break;
1518*f81fb7c4SAndroid Build Coastguard Worker 
1519*f81fb7c4SAndroid Build Coastguard Worker             case TOKEN_NAME:
1520*f81fb7c4SAndroid Build Coastguard Worker                 IMY_MetaData(pData, EAS_METADATA_TITLE, pData->buffer + pData->index);
1521*f81fb7c4SAndroid Build Coastguard Worker                 break;
1522*f81fb7c4SAndroid Build Coastguard Worker 
1523*f81fb7c4SAndroid Build Coastguard Worker             case TOKEN_COMPOSER:
1524*f81fb7c4SAndroid Build Coastguard Worker                 IMY_MetaData(pData, EAS_METADATA_AUTHOR, pData->buffer + pData->index);
1525*f81fb7c4SAndroid Build Coastguard Worker                 break;
1526*f81fb7c4SAndroid Build Coastguard Worker 
1527*f81fb7c4SAndroid Build Coastguard Worker             /* handle beat */
1528*f81fb7c4SAndroid Build Coastguard Worker             case TOKEN_BEAT:
1529*f81fb7c4SAndroid Build Coastguard Worker                 IMY_GetNumber(pEASData->hwInstData, pData, &temp, EAS_TRUE);
1530*f81fb7c4SAndroid Build Coastguard Worker                 if ((temp >= 25) && (temp <= 900))
1531*f81fb7c4SAndroid Build Coastguard Worker                     pData->tick = TICK_CONVERT / temp;
1532*f81fb7c4SAndroid Build Coastguard Worker                 break;
1533*f81fb7c4SAndroid Build Coastguard Worker 
1534*f81fb7c4SAndroid Build Coastguard Worker             /* handle style */
1535*f81fb7c4SAndroid Build Coastguard Worker             case TOKEN_STYLE:
1536*f81fb7c4SAndroid Build Coastguard Worker                 c = IMY_GetNextChar(pEASData->hwInstData, pData, EAS_TRUE);
1537*f81fb7c4SAndroid Build Coastguard Worker                 if (c == 'S')
1538*f81fb7c4SAndroid Build Coastguard Worker                     c = IMY_GetNextChar(pEASData->hwInstData, pData, EAS_TRUE);
1539*f81fb7c4SAndroid Build Coastguard Worker                 if ((c >= '0') && (c <= '2'))
1540*f81fb7c4SAndroid Build Coastguard Worker                     pData->style = (EAS_U8) (c - '0');
1541*f81fb7c4SAndroid Build Coastguard Worker                 else
1542*f81fb7c4SAndroid Build Coastguard Worker                 {
1543*f81fb7c4SAndroid Build Coastguard Worker                     PutBackChar(pData);
1544*f81fb7c4SAndroid Build Coastguard Worker                     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Error in style command: %s\n", pData->buffer); */ }
1545*f81fb7c4SAndroid Build Coastguard Worker                 }
1546*f81fb7c4SAndroid Build Coastguard Worker                 break;
1547*f81fb7c4SAndroid Build Coastguard Worker 
1548*f81fb7c4SAndroid Build Coastguard Worker             /* handle volume */
1549*f81fb7c4SAndroid Build Coastguard Worker             case TOKEN_VOLUME:
1550*f81fb7c4SAndroid Build Coastguard Worker                 c = IMY_GetNextChar(pEASData->hwInstData, pData, EAS_TRUE);
1551*f81fb7c4SAndroid Build Coastguard Worker                 if (c != 'V')
1552*f81fb7c4SAndroid Build Coastguard Worker                 {
1553*f81fb7c4SAndroid Build Coastguard Worker                     PutBackChar(pData);
1554*f81fb7c4SAndroid Build Coastguard Worker                     if (!IsDigit(c))
1555*f81fb7c4SAndroid Build Coastguard Worker                     {
1556*f81fb7c4SAndroid Build Coastguard Worker                         { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Error in volume command: %s\n", pData->buffer); */ }
1557*f81fb7c4SAndroid Build Coastguard Worker                         break;
1558*f81fb7c4SAndroid Build Coastguard Worker                     }
1559*f81fb7c4SAndroid Build Coastguard Worker                 }
1560*f81fb7c4SAndroid Build Coastguard Worker                 IMY_GetVolume(pEASData->hwInstData, pData, EAS_TRUE);
1561*f81fb7c4SAndroid Build Coastguard Worker                 break;
1562*f81fb7c4SAndroid Build Coastguard Worker 
1563*f81fb7c4SAndroid Build Coastguard Worker             case TOKEN_MELODY:
1564*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
1565*f81fb7c4SAndroid Build Coastguard Worker                 { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Header successfully parsed\n"); */ }
1566*f81fb7c4SAndroid Build Coastguard Worker #endif
1567*f81fb7c4SAndroid Build Coastguard Worker                 return EAS_SUCCESS;
1568*f81fb7c4SAndroid Build Coastguard Worker 
1569*f81fb7c4SAndroid Build Coastguard Worker             case TOKEN_END:
1570*f81fb7c4SAndroid Build Coastguard Worker                 { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Unexpected END:IMELODY encountered\n"); */ }
1571*f81fb7c4SAndroid Build Coastguard Worker                 return EAS_ERROR_FILE_FORMAT;
1572*f81fb7c4SAndroid Build Coastguard Worker 
1573*f81fb7c4SAndroid Build Coastguard Worker             default:
1574*f81fb7c4SAndroid Build Coastguard Worker                 /* force a read of the next line */
1575*f81fb7c4SAndroid Build Coastguard Worker                 pData->index = 1;
1576*f81fb7c4SAndroid Build Coastguard Worker                 { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Ignoring unrecognized token in iMelody file: %s\n", pData->buffer); */ }
1577*f81fb7c4SAndroid Build Coastguard Worker                 break;
1578*f81fb7c4SAndroid Build Coastguard Worker         }
1579*f81fb7c4SAndroid Build Coastguard Worker     }
1580*f81fb7c4SAndroid Build Coastguard Worker }
1581*f81fb7c4SAndroid Build Coastguard Worker 
1582*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1583*f81fb7c4SAndroid Build Coastguard Worker  * IMY_GetNextChar()
1584*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1585*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
1586*f81fb7c4SAndroid Build Coastguard Worker  *
1587*f81fb7c4SAndroid Build Coastguard Worker  *
1588*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
1589*f81fb7c4SAndroid Build Coastguard Worker  *
1590*f81fb7c4SAndroid Build Coastguard Worker  *
1591*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
1592*f81fb7c4SAndroid Build Coastguard Worker  *
1593*f81fb7c4SAndroid Build Coastguard Worker  *
1594*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
1595*f81fb7c4SAndroid Build Coastguard Worker  *
1596*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1597*f81fb7c4SAndroid Build Coastguard Worker */
IMY_GetNextChar(EAS_HW_DATA_HANDLE hwInstData,S_IMELODY_DATA * pData,EAS_BOOL inHeader)1598*f81fb7c4SAndroid Build Coastguard Worker static EAS_I8 IMY_GetNextChar (EAS_HW_DATA_HANDLE hwInstData, S_IMELODY_DATA *pData, EAS_BOOL inHeader)
1599*f81fb7c4SAndroid Build Coastguard Worker {
1600*f81fb7c4SAndroid Build Coastguard Worker     EAS_I8 c;
1601*f81fb7c4SAndroid Build Coastguard Worker     EAS_U8 index;
1602*f81fb7c4SAndroid Build Coastguard Worker 
1603*f81fb7c4SAndroid Build Coastguard Worker     for (;;)
1604*f81fb7c4SAndroid Build Coastguard Worker     {
1605*f81fb7c4SAndroid Build Coastguard Worker         /* get next character */
1606*f81fb7c4SAndroid Build Coastguard Worker         c = pData->buffer[pData->index++];
1607*f81fb7c4SAndroid Build Coastguard Worker 
1608*f81fb7c4SAndroid Build Coastguard Worker         /* buffer empty, read more */
1609*f81fb7c4SAndroid Build Coastguard Worker         if (!c)
1610*f81fb7c4SAndroid Build Coastguard Worker         {
1611*f81fb7c4SAndroid Build Coastguard Worker             /* don't read the next line in the header */
1612*f81fb7c4SAndroid Build Coastguard Worker             if (inHeader)
1613*f81fb7c4SAndroid Build Coastguard Worker                 return 0;
1614*f81fb7c4SAndroid Build Coastguard Worker 
1615*f81fb7c4SAndroid Build Coastguard Worker             pData->index = 0;
1616*f81fb7c4SAndroid Build Coastguard Worker             pData->buffer[0] = 0;
1617*f81fb7c4SAndroid Build Coastguard Worker             if (IMY_ReadLine(hwInstData, pData->fileHandle, pData->buffer, &pData->startLine) != EAS_SUCCESS)
1618*f81fb7c4SAndroid Build Coastguard Worker             {
1619*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
1620*f81fb7c4SAndroid Build Coastguard Worker                 { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetNextChar: EOF\n"); */ }
1621*f81fb7c4SAndroid Build Coastguard Worker #endif
1622*f81fb7c4SAndroid Build Coastguard Worker                 return 0;
1623*f81fb7c4SAndroid Build Coastguard Worker             }
1624*f81fb7c4SAndroid Build Coastguard Worker 
1625*f81fb7c4SAndroid Build Coastguard Worker             /* check for END:IMELODY token */
1626*f81fb7c4SAndroid Build Coastguard Worker             if (IMY_ParseLine(pData->buffer, &index) == TOKEN_END)
1627*f81fb7c4SAndroid Build Coastguard Worker             {
1628*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
1629*f81fb7c4SAndroid Build Coastguard Worker                 { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetNextChar: found END:IMELODY\n"); */ }
1630*f81fb7c4SAndroid Build Coastguard Worker #endif
1631*f81fb7c4SAndroid Build Coastguard Worker                 pData->buffer[0] = 0;
1632*f81fb7c4SAndroid Build Coastguard Worker                 return 0;
1633*f81fb7c4SAndroid Build Coastguard Worker             }
1634*f81fb7c4SAndroid Build Coastguard Worker             continue;
1635*f81fb7c4SAndroid Build Coastguard Worker         }
1636*f81fb7c4SAndroid Build Coastguard Worker 
1637*f81fb7c4SAndroid Build Coastguard Worker         /* ignore white space */
1638*f81fb7c4SAndroid Build Coastguard Worker         if (!IsSpace(c))
1639*f81fb7c4SAndroid Build Coastguard Worker         {
1640*f81fb7c4SAndroid Build Coastguard Worker 
1641*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
1642*f81fb7c4SAndroid Build Coastguard Worker     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetNextChar returned '%c'\n", c); */ }
1643*f81fb7c4SAndroid Build Coastguard Worker #endif
1644*f81fb7c4SAndroid Build Coastguard Worker             return c;
1645*f81fb7c4SAndroid Build Coastguard Worker         }
1646*f81fb7c4SAndroid Build Coastguard Worker     }
1647*f81fb7c4SAndroid Build Coastguard Worker }
1648*f81fb7c4SAndroid Build Coastguard Worker 
1649*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1650*f81fb7c4SAndroid Build Coastguard Worker  * IMY_ReadLine()
1651*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1652*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
1653*f81fb7c4SAndroid Build Coastguard Worker  * Reads a line of input from the file, discarding the CR/LF
1654*f81fb7c4SAndroid Build Coastguard Worker  *
1655*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
1656*f81fb7c4SAndroid Build Coastguard Worker  *
1657*f81fb7c4SAndroid Build Coastguard Worker  *
1658*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
1659*f81fb7c4SAndroid Build Coastguard Worker  *
1660*f81fb7c4SAndroid Build Coastguard Worker  *
1661*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
1662*f81fb7c4SAndroid Build Coastguard Worker  *
1663*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1664*f81fb7c4SAndroid Build Coastguard Worker */
IMY_ReadLine(EAS_HW_DATA_HANDLE hwInstData,EAS_FILE_HANDLE fileHandle,EAS_I8 * buffer,EAS_I32 * pStartLine)1665*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT IMY_ReadLine (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE fileHandle, EAS_I8 *buffer, EAS_I32 *pStartLine)
1666*f81fb7c4SAndroid Build Coastguard Worker {
1667*f81fb7c4SAndroid Build Coastguard Worker     EAS_RESULT result;
1668*f81fb7c4SAndroid Build Coastguard Worker     EAS_INT i;
1669*f81fb7c4SAndroid Build Coastguard Worker     EAS_I8 c;
1670*f81fb7c4SAndroid Build Coastguard Worker 
1671*f81fb7c4SAndroid Build Coastguard Worker     /* fetch current file position and save it */
1672*f81fb7c4SAndroid Build Coastguard Worker     if (pStartLine != NULL)
1673*f81fb7c4SAndroid Build Coastguard Worker     {
1674*f81fb7c4SAndroid Build Coastguard Worker         if ((result = EAS_HWFilePos(hwInstData, fileHandle, pStartLine)) != EAS_SUCCESS)
1675*f81fb7c4SAndroid Build Coastguard Worker         {
1676*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
1677*f81fb7c4SAndroid Build Coastguard Worker             { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_ParseHeader: EAS_HWFilePos returned %d\n", result); */ }
1678*f81fb7c4SAndroid Build Coastguard Worker #endif
1679*f81fb7c4SAndroid Build Coastguard Worker             return result;
1680*f81fb7c4SAndroid Build Coastguard Worker         }
1681*f81fb7c4SAndroid Build Coastguard Worker     }
1682*f81fb7c4SAndroid Build Coastguard Worker 
1683*f81fb7c4SAndroid Build Coastguard Worker     buffer[0] = 0;
1684*f81fb7c4SAndroid Build Coastguard Worker     for (i = 0; i < MAX_LINE_SIZE; )
1685*f81fb7c4SAndroid Build Coastguard Worker     {
1686*f81fb7c4SAndroid Build Coastguard Worker         if ((result = EAS_HWGetByte(hwInstData, fileHandle, &c)) != EAS_SUCCESS)
1687*f81fb7c4SAndroid Build Coastguard Worker         {
1688*f81fb7c4SAndroid Build Coastguard Worker             if ((result == EAS_EOF) && (i > 0))
1689*f81fb7c4SAndroid Build Coastguard Worker                 break;
1690*f81fb7c4SAndroid Build Coastguard Worker             return result;
1691*f81fb7c4SAndroid Build Coastguard Worker         }
1692*f81fb7c4SAndroid Build Coastguard Worker 
1693*f81fb7c4SAndroid Build Coastguard Worker         /* return on LF or end of data */
1694*f81fb7c4SAndroid Build Coastguard Worker         if (c == '\n')
1695*f81fb7c4SAndroid Build Coastguard Worker             break;
1696*f81fb7c4SAndroid Build Coastguard Worker 
1697*f81fb7c4SAndroid Build Coastguard Worker         /* store characters in buffer */
1698*f81fb7c4SAndroid Build Coastguard Worker         if (c != '\r')
1699*f81fb7c4SAndroid Build Coastguard Worker             buffer[i++] = c;
1700*f81fb7c4SAndroid Build Coastguard Worker     }
1701*f81fb7c4SAndroid Build Coastguard Worker     buffer[i] = 0;
1702*f81fb7c4SAndroid Build Coastguard Worker 
1703*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
1704*f81fb7c4SAndroid Build Coastguard Worker     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_ReadLine read %s\n", buffer); */ }
1705*f81fb7c4SAndroid Build Coastguard Worker #endif
1706*f81fb7c4SAndroid Build Coastguard Worker 
1707*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
1708*f81fb7c4SAndroid Build Coastguard Worker }
1709*f81fb7c4SAndroid Build Coastguard Worker 
1710*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1711*f81fb7c4SAndroid Build Coastguard Worker  * IMY_ParseLine()
1712*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1713*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
1714*f81fb7c4SAndroid Build Coastguard Worker  *
1715*f81fb7c4SAndroid Build Coastguard Worker  *
1716*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
1717*f81fb7c4SAndroid Build Coastguard Worker  *
1718*f81fb7c4SAndroid Build Coastguard Worker  *
1719*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
1720*f81fb7c4SAndroid Build Coastguard Worker  *
1721*f81fb7c4SAndroid Build Coastguard Worker  *
1722*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
1723*f81fb7c4SAndroid Build Coastguard Worker  *
1724*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1725*f81fb7c4SAndroid Build Coastguard Worker */
IMY_ParseLine(EAS_I8 * buffer,EAS_U8 * pIndex)1726*f81fb7c4SAndroid Build Coastguard Worker static EAS_INT IMY_ParseLine (EAS_I8 *buffer, EAS_U8 *pIndex)
1727*f81fb7c4SAndroid Build Coastguard Worker {
1728*f81fb7c4SAndroid Build Coastguard Worker     EAS_INT i;
1729*f81fb7c4SAndroid Build Coastguard Worker     EAS_INT j;
1730*f81fb7c4SAndroid Build Coastguard Worker 
1731*f81fb7c4SAndroid Build Coastguard Worker     /* there's no strnicmp() in stdlib, so we have to roll our own */
1732*f81fb7c4SAndroid Build Coastguard Worker     for (i = 0; i < TOKEN_INVALID; i++)
1733*f81fb7c4SAndroid Build Coastguard Worker     {
1734*f81fb7c4SAndroid Build Coastguard Worker         for (j = 0; ; j++)
1735*f81fb7c4SAndroid Build Coastguard Worker         {
1736*f81fb7c4SAndroid Build Coastguard Worker             /* end of token, must be a match */
1737*f81fb7c4SAndroid Build Coastguard Worker             if (tokens[i][j] == 0)
1738*f81fb7c4SAndroid Build Coastguard Worker             {
1739*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
1740*f81fb7c4SAndroid Build Coastguard Worker                 { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_ParseLine found token %d\n", i); */ }
1741*f81fb7c4SAndroid Build Coastguard Worker #endif
1742*f81fb7c4SAndroid Build Coastguard Worker                 *pIndex = (EAS_U8) j;
1743*f81fb7c4SAndroid Build Coastguard Worker                 return i;
1744*f81fb7c4SAndroid Build Coastguard Worker             }
1745*f81fb7c4SAndroid Build Coastguard Worker             if (tokens[i][j] != ToUpper(buffer[j]))
1746*f81fb7c4SAndroid Build Coastguard Worker                 break;
1747*f81fb7c4SAndroid Build Coastguard Worker         }
1748*f81fb7c4SAndroid Build Coastguard Worker     }
1749*f81fb7c4SAndroid Build Coastguard Worker #ifdef _DEBUG_IMELODY
1750*f81fb7c4SAndroid Build Coastguard Worker     { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_ParseLine: no token found\n"); */ }
1751*f81fb7c4SAndroid Build Coastguard Worker #endif
1752*f81fb7c4SAndroid Build Coastguard Worker     return TOKEN_INVALID;
1753*f81fb7c4SAndroid Build Coastguard Worker }
1754*f81fb7c4SAndroid Build Coastguard Worker 
1755