xref: /aosp_15_r20/external/sonivox/arm-wt-22k/lib_src/eas_rtttl.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_rtttl.c
5*f81fb7c4SAndroid Build Coastguard Worker  *
6*f81fb7c4SAndroid Build Coastguard Worker  * Contents and purpose:
7*f81fb7c4SAndroid Build Coastguard Worker  * RTTTL parser
8*f81fb7c4SAndroid Build Coastguard Worker  *
9*f81fb7c4SAndroid Build Coastguard Worker  * Copyright Sonic Network Inc. 2005
10*f81fb7c4SAndroid Build Coastguard Worker 
11*f81fb7c4SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
12*f81fb7c4SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
13*f81fb7c4SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
14*f81fb7c4SAndroid Build Coastguard Worker  *
15*f81fb7c4SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
16*f81fb7c4SAndroid Build Coastguard Worker  *
17*f81fb7c4SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
18*f81fb7c4SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
19*f81fb7c4SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20*f81fb7c4SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
21*f81fb7c4SAndroid Build Coastguard Worker  * limitations under the License.
22*f81fb7c4SAndroid Build Coastguard Worker  *
23*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
24*f81fb7c4SAndroid Build Coastguard Worker  * Revision Control:
25*f81fb7c4SAndroid Build Coastguard Worker  *   $Revision: 795 $
26*f81fb7c4SAndroid Build Coastguard Worker  *   $Date: 2007-08-01 00:14:45 -0700 (Wed, 01 Aug 2007) $
27*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
28*f81fb7c4SAndroid Build Coastguard Worker */
29*f81fb7c4SAndroid Build Coastguard Worker 
30*f81fb7c4SAndroid Build Coastguard Worker #include "eas_data.h"
31*f81fb7c4SAndroid Build Coastguard Worker #include "eas_miditypes.h"
32*f81fb7c4SAndroid Build Coastguard Worker #include "eas_parser.h"
33*f81fb7c4SAndroid Build Coastguard Worker #include "eas_report.h"
34*f81fb7c4SAndroid Build Coastguard Worker #include "eas_host.h"
35*f81fb7c4SAndroid Build Coastguard Worker #include "eas_midi.h"
36*f81fb7c4SAndroid Build Coastguard Worker #include "eas_config.h"
37*f81fb7c4SAndroid Build Coastguard Worker #include "eas_vm_protos.h"
38*f81fb7c4SAndroid Build Coastguard Worker #include "eas_rtttldata.h"
39*f81fb7c4SAndroid Build Coastguard Worker #include "eas_ctype.h"
40*f81fb7c4SAndroid Build Coastguard Worker 
41*f81fb7c4SAndroid Build Coastguard Worker /* increase gain for mono ringtones */
42*f81fb7c4SAndroid Build Coastguard Worker #define RTTTL_GAIN_OFFSET       8
43*f81fb7c4SAndroid Build Coastguard Worker 
44*f81fb7c4SAndroid Build Coastguard Worker /* maximum title length including colon separator */
45*f81fb7c4SAndroid Build Coastguard Worker #define RTTTL_MAX_TITLE_LEN     32
46*f81fb7c4SAndroid Build Coastguard Worker #define RTTTL_INFINITE_LOOP     15
47*f81fb7c4SAndroid Build Coastguard Worker 
48*f81fb7c4SAndroid Build Coastguard Worker /* length of 32nd note in 1/256ths of a msec for 63 BPM tempo */
49*f81fb7c4SAndroid Build Coastguard Worker #define DEFAULT_TICK_CONV       30476
50*f81fb7c4SAndroid Build Coastguard Worker #define TICK_CONVERT            1920000
51*f81fb7c4SAndroid Build Coastguard Worker 
52*f81fb7c4SAndroid Build Coastguard Worker /* default channel and program for RTTTL playback */
53*f81fb7c4SAndroid Build Coastguard Worker #define RTTTL_CHANNEL           0
54*f81fb7c4SAndroid Build Coastguard Worker #define RTTTL_PROGRAM           80
55*f81fb7c4SAndroid Build Coastguard Worker #define RTTTL_VELOCITY          127
56*f81fb7c4SAndroid Build Coastguard Worker 
57*f81fb7c4SAndroid Build Coastguard Worker /* note used for rest */
58*f81fb7c4SAndroid Build Coastguard Worker #define RTTTL_REST              1
59*f81fb7c4SAndroid Build Coastguard Worker 
60*f81fb7c4SAndroid Build Coastguard Worker /* multiplier for fixed point triplet conversion */
61*f81fb7c4SAndroid Build Coastguard Worker #define TRIPLET_MULTIPLIER      683
62*f81fb7c4SAndroid Build Coastguard Worker #define TRIPLET_SHIFT           10
63*f81fb7c4SAndroid Build Coastguard Worker 
64*f81fb7c4SAndroid Build Coastguard Worker /* local prototypes */
65*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_CheckFileType (S_EAS_DATA *pEASData, EAS_FILE_HANDLE fileHandle, EAS_VOID_PTR *ppHandle, EAS_I32 offset);
66*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_Prepare (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
67*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_Time (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_U32 *pTime);
68*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_Event (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_INT parserMode);
69*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_State (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_STATE *pState);
70*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_Close (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
71*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_Reset (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
72*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_Pause (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
73*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_Resume (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
74*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_SetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value);
75*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_GetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue);
76*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_GetStyle (EAS_HW_DATA_HANDLE hwInstData, S_RTTTL_DATA *pData);
77*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_GetDuration (EAS_HW_DATA_HANDLE hwInstData, S_RTTTL_DATA *pData, EAS_I8 *pDuration);
78*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_GetOctave (EAS_HW_DATA_HANDLE hwInstData, S_RTTTL_DATA *pData, EAS_U8 *pOctave);
79*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_GetTempo (EAS_HW_DATA_HANDLE hwInstData, S_RTTTL_DATA *pData);
80*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_GetNumber (EAS_HW_DATA_HANDLE hwInstData, S_RTTTL_DATA *pData, EAS_I32 *pValue);
81*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_ParseHeader (S_EAS_DATA *pEASData, S_RTTTL_DATA* pData, EAS_BOOL metaData);
82*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_GetNextChar (EAS_HW_DATA_HANDLE hwInstData, S_RTTTL_DATA *pData, EAS_I8 *pValue);
83*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_PeekNextChar (EAS_HW_DATA_HANDLE hwInstData, S_RTTTL_DATA *pData, EAS_I8 *pValue);
84*f81fb7c4SAndroid Build Coastguard Worker 
85*f81fb7c4SAndroid Build Coastguard Worker /* inline functions */
RTTTL_PutBackChar(S_RTTTL_DATA * pData,EAS_I8 value)86*f81fb7c4SAndroid Build Coastguard Worker EAS_INLINE void RTTTL_PutBackChar (S_RTTTL_DATA *pData, EAS_I8 value) { pData->dataByte = value; }
87*f81fb7c4SAndroid Build Coastguard Worker 
88*f81fb7c4SAndroid Build Coastguard Worker 
89*f81fb7c4SAndroid Build Coastguard Worker /* lookup table for note values */
90*f81fb7c4SAndroid Build Coastguard Worker static const EAS_U8 noteTable[] = { 21, 23, 12, 14, 16, 17, 19, 23 };
91*f81fb7c4SAndroid Build Coastguard Worker 
92*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
93*f81fb7c4SAndroid Build Coastguard Worker  *
94*f81fb7c4SAndroid Build Coastguard Worker  * EAS_RTTTL_Parser
95*f81fb7c4SAndroid Build Coastguard Worker  *
96*f81fb7c4SAndroid Build Coastguard Worker  * This structure contains the functional interface for the iMelody parser
97*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
98*f81fb7c4SAndroid Build Coastguard Worker */
99*f81fb7c4SAndroid Build Coastguard Worker const S_FILE_PARSER_INTERFACE EAS_RTTTL_Parser =
100*f81fb7c4SAndroid Build Coastguard Worker {
101*f81fb7c4SAndroid Build Coastguard Worker     RTTTL_CheckFileType,
102*f81fb7c4SAndroid Build Coastguard Worker     RTTTL_Prepare,
103*f81fb7c4SAndroid Build Coastguard Worker     RTTTL_Time,
104*f81fb7c4SAndroid Build Coastguard Worker     RTTTL_Event,
105*f81fb7c4SAndroid Build Coastguard Worker     RTTTL_State,
106*f81fb7c4SAndroid Build Coastguard Worker     RTTTL_Close,
107*f81fb7c4SAndroid Build Coastguard Worker     RTTTL_Reset,
108*f81fb7c4SAndroid Build Coastguard Worker #ifdef JET_INTERFACE
109*f81fb7c4SAndroid Build Coastguard Worker     RTTTL_Pause,
110*f81fb7c4SAndroid Build Coastguard Worker     RTTTL_Resume,
111*f81fb7c4SAndroid Build Coastguard Worker #else
112*f81fb7c4SAndroid Build Coastguard Worker     NULL,
113*f81fb7c4SAndroid Build Coastguard Worker     NULL,
114*f81fb7c4SAndroid Build Coastguard Worker #endif
115*f81fb7c4SAndroid Build Coastguard Worker     NULL,
116*f81fb7c4SAndroid Build Coastguard Worker     RTTTL_SetData,
117*f81fb7c4SAndroid Build Coastguard Worker     RTTTL_GetData,
118*f81fb7c4SAndroid Build Coastguard Worker     NULL
119*f81fb7c4SAndroid Build Coastguard Worker };
120*f81fb7c4SAndroid Build Coastguard Worker 
121*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
122*f81fb7c4SAndroid Build Coastguard Worker  * RTTTL_CheckFileType()
123*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
124*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
125*f81fb7c4SAndroid Build Coastguard Worker  * Check the file type to see if we can parse it
126*f81fb7c4SAndroid Build Coastguard Worker  *
127*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
128*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
129*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
130*f81fb7c4SAndroid Build Coastguard Worker  *
131*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
132*f81fb7c4SAndroid Build Coastguard Worker  *
133*f81fb7c4SAndroid Build Coastguard Worker  *
134*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
135*f81fb7c4SAndroid Build Coastguard Worker  *
136*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
137*f81fb7c4SAndroid Build Coastguard Worker */
RTTTL_CheckFileType(S_EAS_DATA * pEASData,EAS_FILE_HANDLE fileHandle,EAS_VOID_PTR * ppHandle,EAS_I32 offset)138*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_CheckFileType (S_EAS_DATA *pEASData, EAS_FILE_HANDLE fileHandle, EAS_VOID_PTR *ppHandle, EAS_I32 offset)
139*f81fb7c4SAndroid Build Coastguard Worker {
140*f81fb7c4SAndroid Build Coastguard Worker     S_RTTTL_DATA data = {0};
141*f81fb7c4SAndroid Build Coastguard Worker     S_RTTTL_DATA *pData;
142*f81fb7c4SAndroid Build Coastguard Worker 
143*f81fb7c4SAndroid Build Coastguard Worker     /* see if we can parse the header */
144*f81fb7c4SAndroid Build Coastguard Worker     data.fileHandle = fileHandle;
145*f81fb7c4SAndroid Build Coastguard Worker     data.fileOffset = offset;
146*f81fb7c4SAndroid Build Coastguard Worker     *ppHandle= NULL;
147*f81fb7c4SAndroid Build Coastguard Worker     if (RTTTL_ParseHeader (pEASData, &data, EAS_FALSE) == EAS_SUCCESS)
148*f81fb7c4SAndroid Build Coastguard Worker     {
149*f81fb7c4SAndroid Build Coastguard Worker 
150*f81fb7c4SAndroid Build Coastguard Worker         /* check for static memory allocation */
151*f81fb7c4SAndroid Build Coastguard Worker         if (pEASData->staticMemoryModel)
152*f81fb7c4SAndroid Build Coastguard Worker             pData = EAS_CMEnumData(EAS_CM_RTTTL_DATA);
153*f81fb7c4SAndroid Build Coastguard Worker         else
154*f81fb7c4SAndroid Build Coastguard Worker             pData = EAS_HWMalloc(pEASData->hwInstData, sizeof(S_RTTTL_DATA));
155*f81fb7c4SAndroid Build Coastguard Worker         if (!pData)
156*f81fb7c4SAndroid Build Coastguard Worker             return EAS_ERROR_MALLOC_FAILED;
157*f81fb7c4SAndroid Build Coastguard Worker         EAS_HWMemSet(pData, 0, sizeof(S_RTTTL_DATA));
158*f81fb7c4SAndroid Build Coastguard Worker 
159*f81fb7c4SAndroid Build Coastguard Worker         /* return a pointer to the instance data */
160*f81fb7c4SAndroid Build Coastguard Worker         pData->fileHandle = fileHandle;
161*f81fb7c4SAndroid Build Coastguard Worker         pData->fileOffset = offset;
162*f81fb7c4SAndroid Build Coastguard Worker         pData->state = EAS_STATE_OPEN;
163*f81fb7c4SAndroid Build Coastguard Worker         *ppHandle = pData;
164*f81fb7c4SAndroid Build Coastguard Worker     }
165*f81fb7c4SAndroid Build Coastguard Worker 
166*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
167*f81fb7c4SAndroid Build Coastguard Worker }
168*f81fb7c4SAndroid Build Coastguard Worker 
169*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
170*f81fb7c4SAndroid Build Coastguard Worker  * RTTTL_Prepare()
171*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
172*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
173*f81fb7c4SAndroid Build Coastguard Worker  * Prepare to parse the file. Allocates instance data (or uses static allocation for
174*f81fb7c4SAndroid Build Coastguard Worker  * static memory model).
175*f81fb7c4SAndroid Build Coastguard Worker  *
176*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
177*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
178*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
179*f81fb7c4SAndroid Build Coastguard Worker  *
180*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
181*f81fb7c4SAndroid Build Coastguard Worker  *
182*f81fb7c4SAndroid Build Coastguard Worker  *
183*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
184*f81fb7c4SAndroid Build Coastguard Worker  *
185*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
186*f81fb7c4SAndroid Build Coastguard Worker */
RTTTL_Prepare(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData)187*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_Prepare (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
188*f81fb7c4SAndroid Build Coastguard Worker {
189*f81fb7c4SAndroid Build Coastguard Worker     S_RTTTL_DATA* pData;
190*f81fb7c4SAndroid Build Coastguard Worker     EAS_RESULT result;
191*f81fb7c4SAndroid Build Coastguard Worker 
192*f81fb7c4SAndroid Build Coastguard Worker     /* check for valid state */
193*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_RTTTL_DATA*) pInstData;
194*f81fb7c4SAndroid Build Coastguard Worker     if (pData->state != EAS_STATE_OPEN)
195*f81fb7c4SAndroid Build Coastguard Worker         return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
196*f81fb7c4SAndroid Build Coastguard Worker 
197*f81fb7c4SAndroid Build Coastguard Worker     /* instantiate a synthesizer */
198*f81fb7c4SAndroid Build Coastguard Worker     if ((result = VMInitMIDI(pEASData, &pData->pSynth)) != EAS_SUCCESS)
199*f81fb7c4SAndroid Build Coastguard Worker     {
200*f81fb7c4SAndroid Build Coastguard Worker         { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "VMInitMIDI returned %d\n", result); */ }
201*f81fb7c4SAndroid Build Coastguard Worker         return result;
202*f81fb7c4SAndroid Build Coastguard Worker     }
203*f81fb7c4SAndroid Build Coastguard Worker 
204*f81fb7c4SAndroid Build Coastguard Worker     pData->state = EAS_STATE_ERROR;
205*f81fb7c4SAndroid Build Coastguard Worker     if ((result = RTTTL_ParseHeader (pEASData,  pData, (EAS_BOOL) (pData->metadata.callback != NULL))) != EAS_SUCCESS)
206*f81fb7c4SAndroid Build Coastguard Worker     {
207*f81fb7c4SAndroid Build Coastguard Worker         /* if using dynamic memory, free it */
208*f81fb7c4SAndroid Build Coastguard Worker         if (!pEASData->staticMemoryModel)
209*f81fb7c4SAndroid Build Coastguard Worker             EAS_HWFree(pEASData->hwInstData, pData);
210*f81fb7c4SAndroid Build Coastguard Worker         return result;
211*f81fb7c4SAndroid Build Coastguard Worker     }
212*f81fb7c4SAndroid Build Coastguard Worker 
213*f81fb7c4SAndroid Build Coastguard Worker     pData->state = EAS_STATE_READY;
214*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
215*f81fb7c4SAndroid Build Coastguard Worker }
216*f81fb7c4SAndroid Build Coastguard Worker 
217*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
218*f81fb7c4SAndroid Build Coastguard Worker  * RTTTL_Time()
219*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
220*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
221*f81fb7c4SAndroid Build Coastguard Worker  * Returns the time of the next event in msecs
222*f81fb7c4SAndroid Build Coastguard Worker  *
223*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
224*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
225*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
226*f81fb7c4SAndroid Build Coastguard Worker  * pTime            - pointer to variable to hold time of next event (in msecs)
227*f81fb7c4SAndroid Build Coastguard Worker  *
228*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
229*f81fb7c4SAndroid Build Coastguard Worker  *
230*f81fb7c4SAndroid Build Coastguard Worker  *
231*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
232*f81fb7c4SAndroid Build Coastguard Worker  *
233*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
234*f81fb7c4SAndroid Build Coastguard Worker */
235*f81fb7c4SAndroid Build Coastguard Worker /*lint -esym(715, pEASData) reserved for future use */
RTTTL_Time(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData,EAS_U32 * pTime)236*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_Time (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_U32 *pTime)
237*f81fb7c4SAndroid Build Coastguard Worker {
238*f81fb7c4SAndroid Build Coastguard Worker     S_RTTTL_DATA *pData;
239*f81fb7c4SAndroid Build Coastguard Worker 
240*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_RTTTL_DATA*) pInstData;
241*f81fb7c4SAndroid Build Coastguard Worker 
242*f81fb7c4SAndroid Build Coastguard Worker     /* return time in milliseconds */
243*f81fb7c4SAndroid Build Coastguard Worker     /*lint -e{704} use shift instead of division */
244*f81fb7c4SAndroid Build Coastguard Worker     *pTime = pData->time >> 8;
245*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
246*f81fb7c4SAndroid Build Coastguard Worker }
247*f81fb7c4SAndroid Build Coastguard Worker 
248*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
249*f81fb7c4SAndroid Build Coastguard Worker  * RTTTL_Event()
250*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
251*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
252*f81fb7c4SAndroid Build Coastguard Worker  * Parse the next event in the file
253*f81fb7c4SAndroid Build Coastguard Worker  *
254*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
255*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
256*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
257*f81fb7c4SAndroid Build Coastguard Worker  *
258*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
259*f81fb7c4SAndroid Build Coastguard Worker  *
260*f81fb7c4SAndroid Build Coastguard Worker  *
261*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
262*f81fb7c4SAndroid Build Coastguard Worker  *
263*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
264*f81fb7c4SAndroid Build Coastguard Worker */
RTTTL_Event(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData,EAS_INT parserMode)265*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_Event (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_INT parserMode)
266*f81fb7c4SAndroid Build Coastguard Worker {
267*f81fb7c4SAndroid Build Coastguard Worker     S_RTTTL_DATA* pData;
268*f81fb7c4SAndroid Build Coastguard Worker     EAS_RESULT result;
269*f81fb7c4SAndroid Build Coastguard Worker     EAS_I32 ticks;
270*f81fb7c4SAndroid Build Coastguard Worker     EAS_I32 temp;
271*f81fb7c4SAndroid Build Coastguard Worker     EAS_I8 c;
272*f81fb7c4SAndroid Build Coastguard Worker     EAS_U8 note;
273*f81fb7c4SAndroid Build Coastguard Worker     EAS_U8 octave;
274*f81fb7c4SAndroid Build Coastguard Worker 
275*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_RTTTL_DATA*) pInstData;
276*f81fb7c4SAndroid Build Coastguard Worker     if (pData->state >= EAS_STATE_OPEN)
277*f81fb7c4SAndroid Build Coastguard Worker         return EAS_SUCCESS;
278*f81fb7c4SAndroid Build Coastguard Worker 
279*f81fb7c4SAndroid Build Coastguard Worker     /* initialize MIDI channel when the track starts playing */
280*f81fb7c4SAndroid Build Coastguard Worker     if (pData->time == 0)
281*f81fb7c4SAndroid Build Coastguard Worker     {
282*f81fb7c4SAndroid Build Coastguard Worker         /* set program to square lead */
283*f81fb7c4SAndroid Build Coastguard Worker         VMProgramChange(pEASData->pVoiceMgr, pData->pSynth, RTTTL_CHANNEL, RTTTL_PROGRAM);
284*f81fb7c4SAndroid Build Coastguard Worker 
285*f81fb7c4SAndroid Build Coastguard Worker         /* set channel volume to max */
286*f81fb7c4SAndroid Build Coastguard Worker         VMControlChange(pEASData->pVoiceMgr, pData->pSynth, RTTTL_CHANNEL, 7, 127);
287*f81fb7c4SAndroid Build Coastguard Worker     }
288*f81fb7c4SAndroid Build Coastguard Worker 
289*f81fb7c4SAndroid Build Coastguard Worker     /* check for end of note */
290*f81fb7c4SAndroid Build Coastguard Worker     if (pData->note)
291*f81fb7c4SAndroid Build Coastguard Worker     {
292*f81fb7c4SAndroid Build Coastguard Worker         /* stop the note */
293*f81fb7c4SAndroid Build Coastguard Worker         VMStopNote(pEASData->pVoiceMgr, pData->pSynth, RTTTL_CHANNEL, pData->note, 0);
294*f81fb7c4SAndroid Build Coastguard Worker         pData->note = 0;
295*f81fb7c4SAndroid Build Coastguard Worker 
296*f81fb7c4SAndroid Build Coastguard Worker         /* check for rest between notes */
297*f81fb7c4SAndroid Build Coastguard Worker         if (pData->restTicks)
298*f81fb7c4SAndroid Build Coastguard Worker         {
299*f81fb7c4SAndroid Build Coastguard Worker             pData->time += pData->restTicks;
300*f81fb7c4SAndroid Build Coastguard Worker             pData->restTicks = 0;
301*f81fb7c4SAndroid Build Coastguard Worker             return EAS_SUCCESS;
302*f81fb7c4SAndroid Build Coastguard Worker         }
303*f81fb7c4SAndroid Build Coastguard Worker     }
304*f81fb7c4SAndroid Build Coastguard Worker 
305*f81fb7c4SAndroid Build Coastguard Worker     /* parse the next event */
306*f81fb7c4SAndroid Build Coastguard Worker     octave = pData->octave;
307*f81fb7c4SAndroid Build Coastguard Worker     note = 0;
308*f81fb7c4SAndroid Build Coastguard Worker     ticks = pData->duration * pData->tick;
309*f81fb7c4SAndroid Build Coastguard Worker     for (;;)
310*f81fb7c4SAndroid Build Coastguard Worker     {
311*f81fb7c4SAndroid Build Coastguard Worker 
312*f81fb7c4SAndroid Build Coastguard Worker         /* get next character */
313*f81fb7c4SAndroid Build Coastguard Worker         if ((result = RTTTL_GetNextChar(pEASData->hwInstData, pData, &c)) != EAS_SUCCESS)
314*f81fb7c4SAndroid Build Coastguard Worker         {
315*f81fb7c4SAndroid Build Coastguard Worker             if (result != EAS_EOF)
316*f81fb7c4SAndroid Build Coastguard Worker                 return result;
317*f81fb7c4SAndroid Build Coastguard Worker 
318*f81fb7c4SAndroid Build Coastguard Worker             /* end of file, if no notes to process, check for looping */
319*f81fb7c4SAndroid Build Coastguard Worker             if (!note)
320*f81fb7c4SAndroid Build Coastguard Worker             {
321*f81fb7c4SAndroid Build Coastguard Worker                 /* if no loop set state to stopping */
322*f81fb7c4SAndroid Build Coastguard Worker                 if (pData->repeatCount == 0)
323*f81fb7c4SAndroid Build Coastguard Worker                 {
324*f81fb7c4SAndroid Build Coastguard Worker                     pData->state = EAS_STATE_STOPPING;
325*f81fb7c4SAndroid Build Coastguard Worker                     VMReleaseAllVoices(pEASData->pVoiceMgr, pData->pSynth);
326*f81fb7c4SAndroid Build Coastguard Worker                     return EAS_SUCCESS;
327*f81fb7c4SAndroid Build Coastguard Worker                 }
328*f81fb7c4SAndroid Build Coastguard Worker 
329*f81fb7c4SAndroid Build Coastguard Worker                 /* decrement loop count */
330*f81fb7c4SAndroid Build Coastguard Worker                 if (pData->repeatCount != RTTTL_INFINITE_LOOP)
331*f81fb7c4SAndroid Build Coastguard Worker                     pData->repeatCount--;
332*f81fb7c4SAndroid Build Coastguard Worker 
333*f81fb7c4SAndroid Build Coastguard Worker                 /* if locating, ignore infinite loops */
334*f81fb7c4SAndroid Build Coastguard Worker                 else if (parserMode != eParserModePlay)
335*f81fb7c4SAndroid Build Coastguard Worker                 {
336*f81fb7c4SAndroid Build Coastguard Worker                     pData->state = EAS_STATE_STOPPING;
337*f81fb7c4SAndroid Build Coastguard Worker                     VMReleaseAllVoices(pEASData->pVoiceMgr, pData->pSynth);
338*f81fb7c4SAndroid Build Coastguard Worker                     return EAS_SUCCESS;
339*f81fb7c4SAndroid Build Coastguard Worker                 }
340*f81fb7c4SAndroid Build Coastguard Worker 
341*f81fb7c4SAndroid Build Coastguard Worker                 /* loop back to start of notes */
342*f81fb7c4SAndroid Build Coastguard Worker                 if (pData->notePlayedSinceRepeat == 0) {
343*f81fb7c4SAndroid Build Coastguard Worker                     return EAS_ERROR_FILE_FORMAT;
344*f81fb7c4SAndroid Build Coastguard Worker                 }
345*f81fb7c4SAndroid Build Coastguard Worker                 if ((result = EAS_HWFileSeek(pEASData->hwInstData, pData->fileHandle, pData->repeatOffset)) != EAS_SUCCESS)
346*f81fb7c4SAndroid Build Coastguard Worker                     return result;
347*f81fb7c4SAndroid Build Coastguard Worker                 pData->notePlayedSinceRepeat = 0;
348*f81fb7c4SAndroid Build Coastguard Worker                 continue;
349*f81fb7c4SAndroid Build Coastguard Worker             }
350*f81fb7c4SAndroid Build Coastguard Worker 
351*f81fb7c4SAndroid Build Coastguard Worker             /* still have a note to process */
352*f81fb7c4SAndroid Build Coastguard Worker             else
353*f81fb7c4SAndroid Build Coastguard Worker                 c = ',';
354*f81fb7c4SAndroid Build Coastguard Worker         }
355*f81fb7c4SAndroid Build Coastguard Worker 
356*f81fb7c4SAndroid Build Coastguard Worker         /* bpm */
357*f81fb7c4SAndroid Build Coastguard Worker         if (c == 'b')
358*f81fb7c4SAndroid Build Coastguard Worker         {
359*f81fb7c4SAndroid Build Coastguard Worker             /* peek at next character */
360*f81fb7c4SAndroid Build Coastguard Worker             if ((result = RTTTL_PeekNextChar(pEASData->hwInstData, pData, &c)) != EAS_SUCCESS)
361*f81fb7c4SAndroid Build Coastguard Worker                 return result;
362*f81fb7c4SAndroid Build Coastguard Worker 
363*f81fb7c4SAndroid Build Coastguard Worker             /* if a number, must be octave or tempo */
364*f81fb7c4SAndroid Build Coastguard Worker             if (IsDigit(c))
365*f81fb7c4SAndroid Build Coastguard Worker             {
366*f81fb7c4SAndroid Build Coastguard Worker                 if ((result = RTTTL_GetNumber(pEASData->hwInstData, pData, &temp)) != EAS_SUCCESS)
367*f81fb7c4SAndroid Build Coastguard Worker                     return result;
368*f81fb7c4SAndroid Build Coastguard Worker 
369*f81fb7c4SAndroid Build Coastguard Worker                 /* check for octave first */
370*f81fb7c4SAndroid Build Coastguard Worker                 if ((temp >= 4) && (temp <= 7))
371*f81fb7c4SAndroid Build Coastguard Worker                 {
372*f81fb7c4SAndroid Build Coastguard Worker                     octave = (EAS_U8) temp;
373*f81fb7c4SAndroid Build Coastguard Worker                 }
374*f81fb7c4SAndroid Build Coastguard Worker 
375*f81fb7c4SAndroid Build Coastguard Worker                 /* check for tempo */
376*f81fb7c4SAndroid Build Coastguard Worker                 else if ((temp >= 25) && (temp <= 900))
377*f81fb7c4SAndroid Build Coastguard Worker                 {
378*f81fb7c4SAndroid Build Coastguard Worker                     pData->tick = TICK_CONVERT / (EAS_U32) temp;
379*f81fb7c4SAndroid Build Coastguard Worker                 }
380*f81fb7c4SAndroid Build Coastguard Worker 
381*f81fb7c4SAndroid Build Coastguard Worker                 /* don't know what it was */
382*f81fb7c4SAndroid Build Coastguard Worker                 else
383*f81fb7c4SAndroid Build Coastguard Worker                     return EAS_ERROR_FILE_FORMAT;
384*f81fb7c4SAndroid Build Coastguard Worker             }
385*f81fb7c4SAndroid Build Coastguard Worker 
386*f81fb7c4SAndroid Build Coastguard Worker             /* must be a note */
387*f81fb7c4SAndroid Build Coastguard Worker             else
388*f81fb7c4SAndroid Build Coastguard Worker             {
389*f81fb7c4SAndroid Build Coastguard Worker                 note = noteTable[1];
390*f81fb7c4SAndroid Build Coastguard Worker             }
391*f81fb7c4SAndroid Build Coastguard Worker         }
392*f81fb7c4SAndroid Build Coastguard Worker 
393*f81fb7c4SAndroid Build Coastguard Worker         /* octave */
394*f81fb7c4SAndroid Build Coastguard Worker         else if (c == 'o')
395*f81fb7c4SAndroid Build Coastguard Worker         {
396*f81fb7c4SAndroid Build Coastguard Worker             if ((result = RTTTL_GetOctave(pEASData->hwInstData, pData, &pData->octave)) != EAS_SUCCESS)
397*f81fb7c4SAndroid Build Coastguard Worker                 return result;
398*f81fb7c4SAndroid Build Coastguard Worker         }
399*f81fb7c4SAndroid Build Coastguard Worker 
400*f81fb7c4SAndroid Build Coastguard Worker         /* style */
401*f81fb7c4SAndroid Build Coastguard Worker         else if (c == 's')
402*f81fb7c4SAndroid Build Coastguard Worker         {
403*f81fb7c4SAndroid Build Coastguard Worker             if ((result = RTTTL_GetStyle(pEASData->hwInstData, pData)) != EAS_SUCCESS)
404*f81fb7c4SAndroid Build Coastguard Worker                 return result;
405*f81fb7c4SAndroid Build Coastguard Worker         }
406*f81fb7c4SAndroid Build Coastguard Worker 
407*f81fb7c4SAndroid Build Coastguard Worker         /* duration or octave */
408*f81fb7c4SAndroid Build Coastguard Worker         else if (IsDigit(c))
409*f81fb7c4SAndroid Build Coastguard Worker         {
410*f81fb7c4SAndroid Build Coastguard Worker             RTTTL_PutBackChar(pData, c);
411*f81fb7c4SAndroid Build Coastguard Worker 
412*f81fb7c4SAndroid Build Coastguard Worker             /* duration comes before note */
413*f81fb7c4SAndroid Build Coastguard Worker             if (!note)
414*f81fb7c4SAndroid Build Coastguard Worker             {
415*f81fb7c4SAndroid Build Coastguard Worker                 if ((result = RTTTL_GetDuration(pEASData->hwInstData, pData, &c)) != EAS_SUCCESS)
416*f81fb7c4SAndroid Build Coastguard Worker                     return result;
417*f81fb7c4SAndroid Build Coastguard Worker                 ticks = c * pData->tick;
418*f81fb7c4SAndroid Build Coastguard Worker             }
419*f81fb7c4SAndroid Build Coastguard Worker 
420*f81fb7c4SAndroid Build Coastguard Worker             /* octave comes after note */
421*f81fb7c4SAndroid Build Coastguard Worker             else
422*f81fb7c4SAndroid Build Coastguard Worker             {
423*f81fb7c4SAndroid Build Coastguard Worker                 if ((result = RTTTL_GetOctave(pEASData->hwInstData, pData, &octave)) != EAS_SUCCESS)
424*f81fb7c4SAndroid Build Coastguard Worker                     return result;
425*f81fb7c4SAndroid Build Coastguard Worker             }
426*f81fb7c4SAndroid Build Coastguard Worker         }
427*f81fb7c4SAndroid Build Coastguard Worker 
428*f81fb7c4SAndroid Build Coastguard Worker         /* note or rest */
429*f81fb7c4SAndroid Build Coastguard Worker         else if ((c >= 'a') && (c <= 'h'))
430*f81fb7c4SAndroid Build Coastguard Worker         {
431*f81fb7c4SAndroid Build Coastguard Worker             note = noteTable[c - 'a'];
432*f81fb7c4SAndroid Build Coastguard Worker         }
433*f81fb7c4SAndroid Build Coastguard Worker 
434*f81fb7c4SAndroid Build Coastguard Worker         else if (c == 'p')
435*f81fb7c4SAndroid Build Coastguard Worker         {
436*f81fb7c4SAndroid Build Coastguard Worker             note = RTTTL_REST;
437*f81fb7c4SAndroid Build Coastguard Worker         }
438*f81fb7c4SAndroid Build Coastguard Worker 
439*f81fb7c4SAndroid Build Coastguard Worker         /* dotted note */
440*f81fb7c4SAndroid Build Coastguard Worker         else if (c == '.')
441*f81fb7c4SAndroid Build Coastguard Worker         {
442*f81fb7c4SAndroid Build Coastguard Worker             /* Number of ticks must not be greater than 32-bits */
443*f81fb7c4SAndroid Build Coastguard Worker             if ((ticks >> 1) > (INT32_MAX - ticks))
444*f81fb7c4SAndroid Build Coastguard Worker             {
445*f81fb7c4SAndroid Build Coastguard Worker                 return EAS_ERROR_FILE_FORMAT;
446*f81fb7c4SAndroid Build Coastguard Worker             }
447*f81fb7c4SAndroid Build Coastguard Worker 
448*f81fb7c4SAndroid Build Coastguard Worker             /*lint -e{704} shift for performance */
449*f81fb7c4SAndroid Build Coastguard Worker             ticks += ticks >> 1;
450*f81fb7c4SAndroid Build Coastguard Worker         }
451*f81fb7c4SAndroid Build Coastguard Worker 
452*f81fb7c4SAndroid Build Coastguard Worker         /* accidental */
453*f81fb7c4SAndroid Build Coastguard Worker         else if (c == '#')
454*f81fb7c4SAndroid Build Coastguard Worker         {
455*f81fb7c4SAndroid Build Coastguard Worker             if (note)
456*f81fb7c4SAndroid Build Coastguard Worker                 note++;
457*f81fb7c4SAndroid Build Coastguard Worker         }
458*f81fb7c4SAndroid Build Coastguard Worker 
459*f81fb7c4SAndroid Build Coastguard Worker         /* end of event */
460*f81fb7c4SAndroid Build Coastguard Worker         else if ((c == ',') && note)
461*f81fb7c4SAndroid Build Coastguard Worker         {
462*f81fb7c4SAndroid Build Coastguard Worker             pData->notePlayedSinceRepeat = 1;
463*f81fb7c4SAndroid Build Coastguard Worker 
464*f81fb7c4SAndroid Build Coastguard Worker             /* handle note events */
465*f81fb7c4SAndroid Build Coastguard Worker             if (note != RTTTL_REST)
466*f81fb7c4SAndroid Build Coastguard Worker             {
467*f81fb7c4SAndroid Build Coastguard Worker 
468*f81fb7c4SAndroid Build Coastguard Worker                 /* save note and start it */
469*f81fb7c4SAndroid Build Coastguard Worker                 pData->note = note + octave;
470*f81fb7c4SAndroid Build Coastguard Worker                 if (parserMode == eParserModePlay)
471*f81fb7c4SAndroid Build Coastguard Worker                     VMStartNote(pEASData->pVoiceMgr, pData->pSynth, RTTTL_CHANNEL, pData->note, RTTTL_VELOCITY);
472*f81fb7c4SAndroid Build Coastguard Worker 
473*f81fb7c4SAndroid Build Coastguard Worker                 /* determine note length */
474*f81fb7c4SAndroid Build Coastguard Worker                 switch (pData->style)
475*f81fb7c4SAndroid Build Coastguard Worker                 {
476*f81fb7c4SAndroid Build Coastguard Worker                     /* natural */
477*f81fb7c4SAndroid Build Coastguard Worker                     case 'n':
478*f81fb7c4SAndroid Build Coastguard Worker                         /*lint -e{704} shift for performance */
479*f81fb7c4SAndroid Build Coastguard Worker                         pData->restTicks = ticks >> 4;
480*f81fb7c4SAndroid Build Coastguard Worker                         break;
481*f81fb7c4SAndroid Build Coastguard Worker                     /* continuous */
482*f81fb7c4SAndroid Build Coastguard Worker 
483*f81fb7c4SAndroid Build Coastguard Worker                     case 'c':
484*f81fb7c4SAndroid Build Coastguard Worker                         pData->restTicks = 0;
485*f81fb7c4SAndroid Build Coastguard Worker                         break;
486*f81fb7c4SAndroid Build Coastguard Worker 
487*f81fb7c4SAndroid Build Coastguard Worker                     /* staccato */
488*f81fb7c4SAndroid Build Coastguard Worker                     case 's':
489*f81fb7c4SAndroid Build Coastguard Worker                         /*lint -e{704} shift for performance */
490*f81fb7c4SAndroid Build Coastguard Worker                         pData->restTicks = ticks >> 1;
491*f81fb7c4SAndroid Build Coastguard Worker                         break;
492*f81fb7c4SAndroid Build Coastguard Worker 
493*f81fb7c4SAndroid Build Coastguard Worker                     default:
494*f81fb7c4SAndroid Build Coastguard Worker                         { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "RTTTL_Event: Unexpected style type %c\n", pData->style); */ }
495*f81fb7c4SAndroid Build Coastguard Worker                         break;
496*f81fb7c4SAndroid Build Coastguard Worker                 }
497*f81fb7c4SAndroid Build Coastguard Worker 
498*f81fb7c4SAndroid Build Coastguard Worker                 /* next event is at end of this note */
499*f81fb7c4SAndroid Build Coastguard Worker                 if ((ticks - pData->restTicks) > (INT32_MAX - pData->time))
500*f81fb7c4SAndroid Build Coastguard Worker                 {
501*f81fb7c4SAndroid Build Coastguard Worker                     return EAS_ERROR_FILE_FORMAT;
502*f81fb7c4SAndroid Build Coastguard Worker                 }
503*f81fb7c4SAndroid Build Coastguard Worker                 pData->time += ticks - pData->restTicks;
504*f81fb7c4SAndroid Build Coastguard Worker             }
505*f81fb7c4SAndroid Build Coastguard Worker 
506*f81fb7c4SAndroid Build Coastguard Worker             /* rest */
507*f81fb7c4SAndroid Build Coastguard Worker             else
508*f81fb7c4SAndroid Build Coastguard Worker             {
509*f81fb7c4SAndroid Build Coastguard Worker                 if (ticks > (INT32_MAX - pData->time))
510*f81fb7c4SAndroid Build Coastguard Worker                 {
511*f81fb7c4SAndroid Build Coastguard Worker                     return EAS_ERROR_FILE_FORMAT;
512*f81fb7c4SAndroid Build Coastguard Worker                 }
513*f81fb7c4SAndroid Build Coastguard Worker                 pData->time += ticks;
514*f81fb7c4SAndroid Build Coastguard Worker             }
515*f81fb7c4SAndroid Build Coastguard Worker 
516*f81fb7c4SAndroid Build Coastguard Worker             /* event found, return to caller */
517*f81fb7c4SAndroid Build Coastguard Worker             break;
518*f81fb7c4SAndroid Build Coastguard Worker         }
519*f81fb7c4SAndroid Build Coastguard Worker     }
520*f81fb7c4SAndroid Build Coastguard Worker 
521*f81fb7c4SAndroid Build Coastguard Worker     pData->state = EAS_STATE_PLAY;
522*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
523*f81fb7c4SAndroid Build Coastguard Worker }
524*f81fb7c4SAndroid Build Coastguard Worker 
525*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
526*f81fb7c4SAndroid Build Coastguard Worker  * RTTTL_State()
527*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
528*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
529*f81fb7c4SAndroid Build Coastguard Worker  * Returns the current state of the stream
530*f81fb7c4SAndroid Build Coastguard Worker  *
531*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
532*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
533*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
534*f81fb7c4SAndroid Build Coastguard Worker  * pState           - pointer to variable to store state
535*f81fb7c4SAndroid Build Coastguard Worker  *
536*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
537*f81fb7c4SAndroid Build Coastguard Worker  *
538*f81fb7c4SAndroid Build Coastguard Worker  *
539*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
540*f81fb7c4SAndroid Build Coastguard Worker  *
541*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
542*f81fb7c4SAndroid Build Coastguard Worker */
543*f81fb7c4SAndroid Build Coastguard Worker /*lint -esym(715, pEASData) reserved for future use */
RTTTL_State(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData,EAS_I32 * pState)544*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_State (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 *pState)
545*f81fb7c4SAndroid Build Coastguard Worker {
546*f81fb7c4SAndroid Build Coastguard Worker     S_RTTTL_DATA* pData;
547*f81fb7c4SAndroid Build Coastguard Worker 
548*f81fb7c4SAndroid Build Coastguard Worker     /* establish pointer to instance data */
549*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_RTTTL_DATA*) pInstData;
550*f81fb7c4SAndroid Build Coastguard Worker 
551*f81fb7c4SAndroid Build Coastguard Worker     /* if stopping, check to see if synth voices are active */
552*f81fb7c4SAndroid Build Coastguard Worker     if (pData->state == EAS_STATE_STOPPING)
553*f81fb7c4SAndroid Build Coastguard Worker     {
554*f81fb7c4SAndroid Build Coastguard Worker         if (VMActiveVoices(pData->pSynth) == 0)
555*f81fb7c4SAndroid Build Coastguard Worker             pData->state = EAS_STATE_STOPPED;
556*f81fb7c4SAndroid Build Coastguard Worker     }
557*f81fb7c4SAndroid Build Coastguard Worker 
558*f81fb7c4SAndroid Build Coastguard Worker     if (pData->state == EAS_STATE_PAUSING)
559*f81fb7c4SAndroid Build Coastguard Worker     {
560*f81fb7c4SAndroid Build Coastguard Worker         if (VMActiveVoices(pData->pSynth) == 0)
561*f81fb7c4SAndroid Build Coastguard Worker             pData->state = EAS_STATE_PAUSED;
562*f81fb7c4SAndroid Build Coastguard Worker     }
563*f81fb7c4SAndroid Build Coastguard Worker 
564*f81fb7c4SAndroid Build Coastguard Worker     /* return current state */
565*f81fb7c4SAndroid Build Coastguard Worker     *pState = pData->state;
566*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
567*f81fb7c4SAndroid Build Coastguard Worker }
568*f81fb7c4SAndroid Build Coastguard Worker 
569*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
570*f81fb7c4SAndroid Build Coastguard Worker  * RTTTL_Close()
571*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
572*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
573*f81fb7c4SAndroid Build Coastguard Worker  * Close the file and clean up
574*f81fb7c4SAndroid Build Coastguard Worker  *
575*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
576*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
577*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
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 */
RTTTL_Close(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData)586*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_Close (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
587*f81fb7c4SAndroid Build Coastguard Worker {
588*f81fb7c4SAndroid Build Coastguard Worker     S_RTTTL_DATA* pData;
589*f81fb7c4SAndroid Build Coastguard Worker     EAS_RESULT result;
590*f81fb7c4SAndroid Build Coastguard Worker 
591*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_RTTTL_DATA*) pInstData;
592*f81fb7c4SAndroid Build Coastguard Worker 
593*f81fb7c4SAndroid Build Coastguard Worker     /* close the file */
594*f81fb7c4SAndroid Build Coastguard Worker     if ((result = EAS_HWCloseFile(pEASData->hwInstData, pData->fileHandle)) != EAS_SUCCESS)
595*f81fb7c4SAndroid Build Coastguard Worker             return result;
596*f81fb7c4SAndroid Build Coastguard Worker 
597*f81fb7c4SAndroid Build Coastguard Worker     /* free the synth */
598*f81fb7c4SAndroid Build Coastguard Worker     if (pData->pSynth != NULL)
599*f81fb7c4SAndroid Build Coastguard Worker         VMMIDIShutdown(pEASData, pData->pSynth);
600*f81fb7c4SAndroid Build Coastguard Worker 
601*f81fb7c4SAndroid Build Coastguard Worker     /* if using dynamic memory, free it */
602*f81fb7c4SAndroid Build Coastguard Worker     if (!pEASData->staticMemoryModel)
603*f81fb7c4SAndroid Build Coastguard Worker         EAS_HWFree(pEASData->hwInstData, pData);
604*f81fb7c4SAndroid Build Coastguard Worker 
605*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
606*f81fb7c4SAndroid Build Coastguard Worker }
607*f81fb7c4SAndroid Build Coastguard Worker 
608*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
609*f81fb7c4SAndroid Build Coastguard Worker  * RTTTL_Reset()
610*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
611*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
612*f81fb7c4SAndroid Build Coastguard Worker  * Reset the sequencer. Used for locating backwards in the file.
613*f81fb7c4SAndroid Build Coastguard Worker  *
614*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
615*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
616*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
617*f81fb7c4SAndroid Build Coastguard Worker  *
618*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
619*f81fb7c4SAndroid Build Coastguard Worker  *
620*f81fb7c4SAndroid Build Coastguard Worker  *
621*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
622*f81fb7c4SAndroid Build Coastguard Worker  *
623*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
624*f81fb7c4SAndroid Build Coastguard Worker */
RTTTL_Reset(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData)625*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_Reset (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
626*f81fb7c4SAndroid Build Coastguard Worker {
627*f81fb7c4SAndroid Build Coastguard Worker     S_RTTTL_DATA* pData;
628*f81fb7c4SAndroid Build Coastguard Worker     EAS_RESULT result;
629*f81fb7c4SAndroid Build Coastguard Worker 
630*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_RTTTL_DATA*) pInstData;
631*f81fb7c4SAndroid Build Coastguard Worker 
632*f81fb7c4SAndroid Build Coastguard Worker     /* reset the synth */
633*f81fb7c4SAndroid Build Coastguard Worker     VMReset(pEASData->pVoiceMgr, pData->pSynth, EAS_TRUE);
634*f81fb7c4SAndroid Build Coastguard Worker 
635*f81fb7c4SAndroid Build Coastguard Worker     /* reset time to zero */
636*f81fb7c4SAndroid Build Coastguard Worker     pData->time = 0;
637*f81fb7c4SAndroid Build Coastguard Worker     pData->note = 0;
638*f81fb7c4SAndroid Build Coastguard Worker 
639*f81fb7c4SAndroid Build Coastguard Worker     /* reset file position and re-parse header */
640*f81fb7c4SAndroid Build Coastguard Worker     pData->state = EAS_STATE_ERROR;
641*f81fb7c4SAndroid Build Coastguard Worker     if ((result = EAS_HWFileSeek(pEASData->hwInstData, pData->fileHandle, pData->fileOffset)) != EAS_SUCCESS)
642*f81fb7c4SAndroid Build Coastguard Worker         return result;
643*f81fb7c4SAndroid Build Coastguard Worker     if ((result = RTTTL_ParseHeader (pEASData,  pData, EAS_TRUE)) != EAS_SUCCESS)
644*f81fb7c4SAndroid Build Coastguard Worker         return result;
645*f81fb7c4SAndroid Build Coastguard Worker 
646*f81fb7c4SAndroid Build Coastguard Worker     pData->state = EAS_STATE_READY;
647*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
648*f81fb7c4SAndroid Build Coastguard Worker }
649*f81fb7c4SAndroid Build Coastguard Worker 
650*f81fb7c4SAndroid Build Coastguard Worker #ifdef JET_INTERFACE
651*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
652*f81fb7c4SAndroid Build Coastguard Worker  * RTTTL_Pause()
653*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
654*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
655*f81fb7c4SAndroid Build Coastguard Worker  * Pauses the sequencer. Mutes all voices and sets state to pause.
656*f81fb7c4SAndroid Build Coastguard Worker  *
657*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
658*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
659*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
660*f81fb7c4SAndroid Build Coastguard Worker  *
661*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
662*f81fb7c4SAndroid Build Coastguard Worker  *
663*f81fb7c4SAndroid Build Coastguard Worker  *
664*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
665*f81fb7c4SAndroid Build Coastguard Worker  *
666*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
667*f81fb7c4SAndroid Build Coastguard Worker */
RTTTL_Pause(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData)668*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_Pause (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
669*f81fb7c4SAndroid Build Coastguard Worker {
670*f81fb7c4SAndroid Build Coastguard Worker     S_RTTTL_DATA *pData;
671*f81fb7c4SAndroid Build Coastguard Worker 
672*f81fb7c4SAndroid Build Coastguard Worker     /* can't pause a stopped stream */
673*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_RTTTL_DATA*) pInstData;
674*f81fb7c4SAndroid Build Coastguard Worker     if (pData->state == EAS_STATE_STOPPED)
675*f81fb7c4SAndroid Build Coastguard Worker         return EAS_ERROR_ALREADY_STOPPED;
676*f81fb7c4SAndroid Build Coastguard Worker 
677*f81fb7c4SAndroid Build Coastguard Worker     /* mute the synthesizer */
678*f81fb7c4SAndroid Build Coastguard Worker     VMMuteAllVoices(pEASData->pVoiceMgr, pData->pSynth);
679*f81fb7c4SAndroid Build Coastguard Worker     pData->state = EAS_STATE_PAUSING;
680*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
681*f81fb7c4SAndroid Build Coastguard Worker }
682*f81fb7c4SAndroid Build Coastguard Worker 
683*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
684*f81fb7c4SAndroid Build Coastguard Worker  * RTTTL_Resume()
685*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
686*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
687*f81fb7c4SAndroid Build Coastguard Worker  * Resume playing after a pause, sets state back to playing.
688*f81fb7c4SAndroid Build Coastguard Worker  *
689*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
690*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
691*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
692*f81fb7c4SAndroid Build Coastguard Worker  *
693*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
694*f81fb7c4SAndroid Build Coastguard Worker  *
695*f81fb7c4SAndroid Build Coastguard Worker  *
696*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
697*f81fb7c4SAndroid Build Coastguard Worker  *
698*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
699*f81fb7c4SAndroid Build Coastguard Worker */
700*f81fb7c4SAndroid Build Coastguard Worker /*lint -esym(715, pEASData) reserved for future use */
RTTTL_Resume(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData)701*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_Resume (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
702*f81fb7c4SAndroid Build Coastguard Worker {
703*f81fb7c4SAndroid Build Coastguard Worker     S_RTTTL_DATA *pData;
704*f81fb7c4SAndroid Build Coastguard Worker 
705*f81fb7c4SAndroid Build Coastguard Worker     /* can't resume a stopped stream */
706*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_RTTTL_DATA*) pInstData;
707*f81fb7c4SAndroid Build Coastguard Worker     if (pData->state == EAS_STATE_STOPPED)
708*f81fb7c4SAndroid Build Coastguard Worker         return EAS_ERROR_ALREADY_STOPPED;
709*f81fb7c4SAndroid Build Coastguard Worker 
710*f81fb7c4SAndroid Build Coastguard Worker     /* nothing to do but resume playback */
711*f81fb7c4SAndroid Build Coastguard Worker     pData->state = EAS_STATE_PLAY;
712*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
713*f81fb7c4SAndroid Build Coastguard Worker }
714*f81fb7c4SAndroid Build Coastguard Worker #endif
715*f81fb7c4SAndroid Build Coastguard Worker 
716*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
717*f81fb7c4SAndroid Build Coastguard Worker  * RTTTL_SetData()
718*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
719*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
720*f81fb7c4SAndroid Build Coastguard Worker  * Return file type
721*f81fb7c4SAndroid Build Coastguard Worker  *
722*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
723*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
724*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
725*f81fb7c4SAndroid Build Coastguard Worker  *
726*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
727*f81fb7c4SAndroid Build Coastguard Worker  *
728*f81fb7c4SAndroid Build Coastguard Worker  *
729*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
730*f81fb7c4SAndroid Build Coastguard Worker  *
731*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
732*f81fb7c4SAndroid Build Coastguard Worker */
733*f81fb7c4SAndroid Build Coastguard Worker /*lint -esym(715, pEASData) reserved for future use */
RTTTL_SetData(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData,EAS_I32 param,EAS_I32 value)734*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_SetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value)
735*f81fb7c4SAndroid Build Coastguard Worker {
736*f81fb7c4SAndroid Build Coastguard Worker     S_RTTTL_DATA *pData;
737*f81fb7c4SAndroid Build Coastguard Worker 
738*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_RTTTL_DATA *) pInstData;
739*f81fb7c4SAndroid Build Coastguard Worker     switch (param)
740*f81fb7c4SAndroid Build Coastguard Worker     {
741*f81fb7c4SAndroid Build Coastguard Worker 
742*f81fb7c4SAndroid Build Coastguard Worker         /* set metadata callback */
743*f81fb7c4SAndroid Build Coastguard Worker         case PARSER_DATA_METADATA_CB:
744*f81fb7c4SAndroid Build Coastguard Worker             EAS_HWMemCpy(&pData->metadata, (void*) value, sizeof(S_METADATA_CB));
745*f81fb7c4SAndroid Build Coastguard Worker             break;
746*f81fb7c4SAndroid Build Coastguard Worker 
747*f81fb7c4SAndroid Build Coastguard Worker         default:
748*f81fb7c4SAndroid Build Coastguard Worker             return EAS_ERROR_INVALID_PARAMETER;
749*f81fb7c4SAndroid Build Coastguard Worker     }
750*f81fb7c4SAndroid Build Coastguard Worker 
751*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
752*f81fb7c4SAndroid Build Coastguard Worker }
753*f81fb7c4SAndroid Build Coastguard Worker 
754*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
755*f81fb7c4SAndroid Build Coastguard Worker  * RTTTL_GetData()
756*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
757*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
758*f81fb7c4SAndroid Build Coastguard Worker  * Return file type
759*f81fb7c4SAndroid Build Coastguard Worker  *
760*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
761*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
762*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
763*f81fb7c4SAndroid Build Coastguard Worker  *
764*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
765*f81fb7c4SAndroid Build Coastguard Worker  *
766*f81fb7c4SAndroid Build Coastguard Worker  *
767*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
768*f81fb7c4SAndroid Build Coastguard Worker  *
769*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
770*f81fb7c4SAndroid Build Coastguard Worker */
771*f81fb7c4SAndroid Build Coastguard Worker /*lint -esym(715, pEASData) reserved for future use */
RTTTL_GetData(S_EAS_DATA * pEASData,EAS_VOID_PTR pInstData,EAS_I32 param,EAS_I32 * pValue)772*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_GetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue)
773*f81fb7c4SAndroid Build Coastguard Worker {
774*f81fb7c4SAndroid Build Coastguard Worker     S_RTTTL_DATA *pData;
775*f81fb7c4SAndroid Build Coastguard Worker 
776*f81fb7c4SAndroid Build Coastguard Worker     pData = (S_RTTTL_DATA *) pInstData;
777*f81fb7c4SAndroid Build Coastguard Worker     switch (param)
778*f81fb7c4SAndroid Build Coastguard Worker     {
779*f81fb7c4SAndroid Build Coastguard Worker         /* return file type as RTTTL */
780*f81fb7c4SAndroid Build Coastguard Worker         case PARSER_DATA_FILE_TYPE:
781*f81fb7c4SAndroid Build Coastguard Worker             *pValue = EAS_FILE_RTTTL;
782*f81fb7c4SAndroid Build Coastguard Worker             break;
783*f81fb7c4SAndroid Build Coastguard Worker 
784*f81fb7c4SAndroid Build Coastguard Worker #if 0
785*f81fb7c4SAndroid Build Coastguard Worker         /* set transposition */
786*f81fb7c4SAndroid Build Coastguard Worker         case PARSER_DATA_TRANSPOSITION:
787*f81fb7c4SAndroid Build Coastguard Worker             *pValue = pData->transposition;
788*f81fb7c4SAndroid Build Coastguard Worker             break;
789*f81fb7c4SAndroid Build Coastguard Worker #endif
790*f81fb7c4SAndroid Build Coastguard Worker 
791*f81fb7c4SAndroid Build Coastguard Worker         case PARSER_DATA_SYNTH_HANDLE:
792*f81fb7c4SAndroid Build Coastguard Worker             *pValue = (EAS_I32) pData->pSynth;
793*f81fb7c4SAndroid Build Coastguard Worker             break;
794*f81fb7c4SAndroid Build Coastguard Worker 
795*f81fb7c4SAndroid Build Coastguard Worker         case PARSER_DATA_GAIN_OFFSET:
796*f81fb7c4SAndroid Build Coastguard Worker             *pValue = RTTTL_GAIN_OFFSET;
797*f81fb7c4SAndroid Build Coastguard Worker             break;
798*f81fb7c4SAndroid Build Coastguard Worker 
799*f81fb7c4SAndroid Build Coastguard Worker     default:
800*f81fb7c4SAndroid Build Coastguard Worker             return EAS_ERROR_INVALID_PARAMETER;
801*f81fb7c4SAndroid Build Coastguard Worker     }
802*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
803*f81fb7c4SAndroid Build Coastguard Worker }
804*f81fb7c4SAndroid Build Coastguard Worker 
805*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
806*f81fb7c4SAndroid Build Coastguard Worker  * RTTTL_GetStyle()
807*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
808*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
809*f81fb7c4SAndroid Build Coastguard Worker  *
810*f81fb7c4SAndroid Build Coastguard Worker  *
811*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
812*f81fb7c4SAndroid Build Coastguard Worker  *
813*f81fb7c4SAndroid Build Coastguard Worker  *
814*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
815*f81fb7c4SAndroid Build Coastguard Worker  *
816*f81fb7c4SAndroid Build Coastguard Worker  *
817*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
818*f81fb7c4SAndroid Build Coastguard Worker  *
819*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
820*f81fb7c4SAndroid Build Coastguard Worker */
RTTTL_GetStyle(EAS_HW_DATA_HANDLE hwInstData,S_RTTTL_DATA * pData)821*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_GetStyle (EAS_HW_DATA_HANDLE hwInstData, S_RTTTL_DATA *pData)
822*f81fb7c4SAndroid Build Coastguard Worker {
823*f81fb7c4SAndroid Build Coastguard Worker     EAS_RESULT result;
824*f81fb7c4SAndroid Build Coastguard Worker     EAS_I8 style;
825*f81fb7c4SAndroid Build Coastguard Worker 
826*f81fb7c4SAndroid Build Coastguard Worker     /* get style */
827*f81fb7c4SAndroid Build Coastguard Worker     if ((result = RTTTL_GetNextChar(hwInstData, pData, &style)) != EAS_SUCCESS)
828*f81fb7c4SAndroid Build Coastguard Worker         return result;
829*f81fb7c4SAndroid Build Coastguard Worker 
830*f81fb7c4SAndroid Build Coastguard Worker     if ((style != 's')  && (style != 'n') && (style != 'c'))
831*f81fb7c4SAndroid Build Coastguard Worker         return EAS_ERROR_FILE_FORMAT;
832*f81fb7c4SAndroid Build Coastguard Worker 
833*f81fb7c4SAndroid Build Coastguard Worker     pData->style = style;
834*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
835*f81fb7c4SAndroid Build Coastguard Worker }
836*f81fb7c4SAndroid Build Coastguard Worker 
837*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
838*f81fb7c4SAndroid Build Coastguard Worker  * RTTTL_GetDuration()
839*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
840*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
841*f81fb7c4SAndroid Build Coastguard Worker  *
842*f81fb7c4SAndroid Build Coastguard Worker  *
843*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
844*f81fb7c4SAndroid Build Coastguard Worker  *
845*f81fb7c4SAndroid Build Coastguard Worker  *
846*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
847*f81fb7c4SAndroid Build Coastguard Worker  *
848*f81fb7c4SAndroid Build Coastguard Worker  *
849*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
850*f81fb7c4SAndroid Build Coastguard Worker  *
851*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
852*f81fb7c4SAndroid Build Coastguard Worker */
RTTTL_GetDuration(EAS_HW_DATA_HANDLE hwInstData,S_RTTTL_DATA * pData,EAS_I8 * pDuration)853*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_GetDuration (EAS_HW_DATA_HANDLE hwInstData, S_RTTTL_DATA *pData, EAS_I8 *pDuration)
854*f81fb7c4SAndroid Build Coastguard Worker {
855*f81fb7c4SAndroid Build Coastguard Worker     EAS_RESULT result;
856*f81fb7c4SAndroid Build Coastguard Worker     EAS_I32 duration;
857*f81fb7c4SAndroid Build Coastguard Worker     EAS_I8 temp;
858*f81fb7c4SAndroid Build Coastguard Worker 
859*f81fb7c4SAndroid Build Coastguard Worker     /* get the duration */
860*f81fb7c4SAndroid Build Coastguard Worker     if ((result = RTTTL_GetNumber(hwInstData, pData, &duration)) != EAS_SUCCESS)
861*f81fb7c4SAndroid Build Coastguard Worker         return result;
862*f81fb7c4SAndroid Build Coastguard Worker 
863*f81fb7c4SAndroid Build Coastguard Worker     if ((duration != 1) && (duration != 2) && (duration != 4) && (duration != 8) && (duration != 16) && (duration != 32))
864*f81fb7c4SAndroid Build Coastguard Worker         return EAS_ERROR_FILE_FORMAT;
865*f81fb7c4SAndroid Build Coastguard Worker 
866*f81fb7c4SAndroid Build Coastguard Worker     temp = 64;
867*f81fb7c4SAndroid Build Coastguard Worker     while (duration)
868*f81fb7c4SAndroid Build Coastguard Worker     {
869*f81fb7c4SAndroid Build Coastguard Worker         /*lint -e{704} shift for performance */
870*f81fb7c4SAndroid Build Coastguard Worker         duration = duration >> 1;
871*f81fb7c4SAndroid Build Coastguard Worker         /*lint -e{702} use shift for performance */
872*f81fb7c4SAndroid Build Coastguard Worker         temp = temp >> 1;
873*f81fb7c4SAndroid Build Coastguard Worker     }
874*f81fb7c4SAndroid Build Coastguard Worker 
875*f81fb7c4SAndroid Build Coastguard Worker     *pDuration = temp;
876*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
877*f81fb7c4SAndroid Build Coastguard Worker }
878*f81fb7c4SAndroid Build Coastguard Worker 
879*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
880*f81fb7c4SAndroid Build Coastguard Worker  * RTTTL_GetOctave()
881*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
882*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
883*f81fb7c4SAndroid Build Coastguard Worker  *
884*f81fb7c4SAndroid Build Coastguard Worker  *
885*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
886*f81fb7c4SAndroid Build Coastguard Worker  *
887*f81fb7c4SAndroid Build Coastguard Worker  *
888*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
889*f81fb7c4SAndroid Build Coastguard Worker  *
890*f81fb7c4SAndroid Build Coastguard Worker  *
891*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
892*f81fb7c4SAndroid Build Coastguard Worker  *
893*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
894*f81fb7c4SAndroid Build Coastguard Worker */
RTTTL_GetOctave(EAS_HW_DATA_HANDLE hwInstData,S_RTTTL_DATA * pData,EAS_U8 * pOctave)895*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_GetOctave (EAS_HW_DATA_HANDLE hwInstData, S_RTTTL_DATA *pData, EAS_U8 *pOctave)
896*f81fb7c4SAndroid Build Coastguard Worker {
897*f81fb7c4SAndroid Build Coastguard Worker     EAS_RESULT result;
898*f81fb7c4SAndroid Build Coastguard Worker     EAS_I32 octave;
899*f81fb7c4SAndroid Build Coastguard Worker 
900*f81fb7c4SAndroid Build Coastguard Worker     /* get the tempo */
901*f81fb7c4SAndroid Build Coastguard Worker     if ((result = RTTTL_GetNumber(hwInstData, pData, &octave)) != EAS_SUCCESS)
902*f81fb7c4SAndroid Build Coastguard Worker         return result;
903*f81fb7c4SAndroid Build Coastguard Worker 
904*f81fb7c4SAndroid Build Coastguard Worker     if ((octave < 4) || (octave > 7))
905*f81fb7c4SAndroid Build Coastguard Worker         return EAS_ERROR_FILE_FORMAT;
906*f81fb7c4SAndroid Build Coastguard Worker 
907*f81fb7c4SAndroid Build Coastguard Worker     *pOctave = (EAS_U8) (octave * 12);
908*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
909*f81fb7c4SAndroid Build Coastguard Worker }
910*f81fb7c4SAndroid Build Coastguard Worker 
911*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
912*f81fb7c4SAndroid Build Coastguard Worker  * RTTTL_GetTempo()
913*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
914*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
915*f81fb7c4SAndroid Build Coastguard Worker  *
916*f81fb7c4SAndroid Build Coastguard Worker  *
917*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
918*f81fb7c4SAndroid Build Coastguard Worker  *
919*f81fb7c4SAndroid Build Coastguard Worker  *
920*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
921*f81fb7c4SAndroid Build Coastguard Worker  *
922*f81fb7c4SAndroid Build Coastguard Worker  *
923*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
924*f81fb7c4SAndroid Build Coastguard Worker  *
925*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
926*f81fb7c4SAndroid Build Coastguard Worker */
RTTTL_GetTempo(EAS_HW_DATA_HANDLE hwInstData,S_RTTTL_DATA * pData)927*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_GetTempo (EAS_HW_DATA_HANDLE hwInstData, S_RTTTL_DATA *pData)
928*f81fb7c4SAndroid Build Coastguard Worker {
929*f81fb7c4SAndroid Build Coastguard Worker     EAS_RESULT result;
930*f81fb7c4SAndroid Build Coastguard Worker     EAS_I32 tempo;
931*f81fb7c4SAndroid Build Coastguard Worker 
932*f81fb7c4SAndroid Build Coastguard Worker     /* get the tempo */
933*f81fb7c4SAndroid Build Coastguard Worker     if ((result = RTTTL_GetNumber(hwInstData, pData, &tempo)) != EAS_SUCCESS)
934*f81fb7c4SAndroid Build Coastguard Worker         return result;
935*f81fb7c4SAndroid Build Coastguard Worker 
936*f81fb7c4SAndroid Build Coastguard Worker     if ((tempo < 25) || (tempo > 900))
937*f81fb7c4SAndroid Build Coastguard Worker         return EAS_ERROR_FILE_FORMAT;
938*f81fb7c4SAndroid Build Coastguard Worker 
939*f81fb7c4SAndroid Build Coastguard Worker     pData->tick = TICK_CONVERT / (EAS_U32) tempo;
940*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
941*f81fb7c4SAndroid Build Coastguard Worker }
942*f81fb7c4SAndroid Build Coastguard Worker 
943*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
944*f81fb7c4SAndroid Build Coastguard Worker  * RTTTL_GetNumber()
945*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
946*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
947*f81fb7c4SAndroid Build Coastguard Worker  *
948*f81fb7c4SAndroid Build Coastguard Worker  *
949*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
950*f81fb7c4SAndroid Build Coastguard Worker  *
951*f81fb7c4SAndroid Build Coastguard Worker  *
952*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
953*f81fb7c4SAndroid Build Coastguard Worker  *
954*f81fb7c4SAndroid Build Coastguard Worker  *
955*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
956*f81fb7c4SAndroid Build Coastguard Worker  *
957*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
958*f81fb7c4SAndroid Build Coastguard Worker */
RTTTL_GetNumber(EAS_HW_DATA_HANDLE hwInstData,S_RTTTL_DATA * pData,EAS_I32 * pValue)959*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_GetNumber (EAS_HW_DATA_HANDLE hwInstData, S_RTTTL_DATA *pData, EAS_I32 *pValue)
960*f81fb7c4SAndroid Build Coastguard Worker {
961*f81fb7c4SAndroid Build Coastguard Worker     EAS_RESULT result;
962*f81fb7c4SAndroid Build Coastguard Worker     EAS_INT temp;
963*f81fb7c4SAndroid Build Coastguard Worker     EAS_I8 c;
964*f81fb7c4SAndroid Build Coastguard Worker 
965*f81fb7c4SAndroid Build Coastguard Worker     *pValue = -1;
966*f81fb7c4SAndroid Build Coastguard Worker     temp = 0;
967*f81fb7c4SAndroid Build Coastguard Worker     for (;;)
968*f81fb7c4SAndroid Build Coastguard Worker     {
969*f81fb7c4SAndroid Build Coastguard Worker         if ((result = RTTTL_PeekNextChar(hwInstData, pData, &c)) != EAS_SUCCESS)
970*f81fb7c4SAndroid Build Coastguard Worker         {
971*f81fb7c4SAndroid Build Coastguard Worker             if ((result == EAS_EOF) && (*pValue != -1))
972*f81fb7c4SAndroid Build Coastguard Worker                 return EAS_SUCCESS;
973*f81fb7c4SAndroid Build Coastguard Worker             return result;
974*f81fb7c4SAndroid Build Coastguard Worker         }
975*f81fb7c4SAndroid Build Coastguard Worker 
976*f81fb7c4SAndroid Build Coastguard Worker         if (IsDigit(c))
977*f81fb7c4SAndroid Build Coastguard Worker         {
978*f81fb7c4SAndroid Build Coastguard Worker             pData->dataByte = 0;
979*f81fb7c4SAndroid Build Coastguard Worker             if (temp > 100) {
980*f81fb7c4SAndroid Build Coastguard Worker                 // This is just to prevent overflows in case of a really large number
981*f81fb7c4SAndroid Build Coastguard Worker                 // in the file, but rather than allowing the number to grow up to INT_MAX,
982*f81fb7c4SAndroid Build Coastguard Worker                 // we limit it to a much smaller number since the numbers in an RTTTL file
983*f81fb7c4SAndroid Build Coastguard Worker                 // are supposed to be at most in the hundreds, not millions or billions.
984*f81fb7c4SAndroid Build Coastguard Worker                 // There are more specific checks in the callers of this function to enforce
985*f81fb7c4SAndroid Build Coastguard Worker                 // the various limits for notes, octaves, tempo, etc.
986*f81fb7c4SAndroid Build Coastguard Worker                 return EAS_FAILURE;
987*f81fb7c4SAndroid Build Coastguard Worker             }
988*f81fb7c4SAndroid Build Coastguard Worker             temp = temp * 10 + c - '0';
989*f81fb7c4SAndroid Build Coastguard Worker             *pValue = temp;
990*f81fb7c4SAndroid Build Coastguard Worker         }
991*f81fb7c4SAndroid Build Coastguard Worker         else
992*f81fb7c4SAndroid Build Coastguard Worker             return EAS_SUCCESS;
993*f81fb7c4SAndroid Build Coastguard Worker     }
994*f81fb7c4SAndroid Build Coastguard Worker }
995*f81fb7c4SAndroid Build Coastguard Worker 
996*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
997*f81fb7c4SAndroid Build Coastguard Worker  * RTTTL_ParseHeader()
998*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
999*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
1000*f81fb7c4SAndroid Build Coastguard Worker  * Prepare to parse the file. Allocates instance data (or uses static allocation for
1001*f81fb7c4SAndroid Build Coastguard Worker  * static memory model).
1002*f81fb7c4SAndroid Build Coastguard Worker  *
1003*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
1004*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - pointer to overall EAS data structure
1005*f81fb7c4SAndroid Build Coastguard Worker  * handle           - pointer to file handle
1006*f81fb7c4SAndroid Build Coastguard Worker  *
1007*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
1008*f81fb7c4SAndroid Build Coastguard Worker  *
1009*f81fb7c4SAndroid Build Coastguard Worker  *
1010*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
1011*f81fb7c4SAndroid Build Coastguard Worker  *
1012*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1013*f81fb7c4SAndroid Build Coastguard Worker */
RTTTL_ParseHeader(S_EAS_DATA * pEASData,S_RTTTL_DATA * pData,EAS_BOOL metaData)1014*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_ParseHeader (S_EAS_DATA *pEASData, S_RTTTL_DATA* pData, EAS_BOOL metaData)
1015*f81fb7c4SAndroid Build Coastguard Worker {
1016*f81fb7c4SAndroid Build Coastguard Worker     EAS_RESULT result;
1017*f81fb7c4SAndroid Build Coastguard Worker     EAS_I32 i;
1018*f81fb7c4SAndroid Build Coastguard Worker     EAS_I8 temp;
1019*f81fb7c4SAndroid Build Coastguard Worker     EAS_I8 control;
1020*f81fb7c4SAndroid Build Coastguard Worker 
1021*f81fb7c4SAndroid Build Coastguard Worker     /* initialize some defaults */
1022*f81fb7c4SAndroid Build Coastguard Worker     pData->time = 0;
1023*f81fb7c4SAndroid Build Coastguard Worker     pData->tick = DEFAULT_TICK_CONV;
1024*f81fb7c4SAndroid Build Coastguard Worker     pData->note = 0;
1025*f81fb7c4SAndroid Build Coastguard Worker     pData->duration = 4;
1026*f81fb7c4SAndroid Build Coastguard Worker     pData ->restTicks = 0;
1027*f81fb7c4SAndroid Build Coastguard Worker     pData->octave = 60;
1028*f81fb7c4SAndroid Build Coastguard Worker     pData->repeatOffset = -1;
1029*f81fb7c4SAndroid Build Coastguard Worker     pData->repeatCount = 0;
1030*f81fb7c4SAndroid Build Coastguard Worker     pData->style = 'n';
1031*f81fb7c4SAndroid Build Coastguard Worker     pData->dataByte = 0;
1032*f81fb7c4SAndroid Build Coastguard Worker 
1033*f81fb7c4SAndroid Build Coastguard Worker     metaData = metaData && (pData->metadata.buffer != NULL) && (pData->metadata.callback != NULL);
1034*f81fb7c4SAndroid Build Coastguard Worker 
1035*f81fb7c4SAndroid Build Coastguard Worker     /* seek to start of data */
1036*f81fb7c4SAndroid Build Coastguard Worker     if ((result = EAS_HWFileSeek(pEASData->hwInstData, pData->fileHandle, pData->fileOffset)) != EAS_SUCCESS)
1037*f81fb7c4SAndroid Build Coastguard Worker         return result;
1038*f81fb7c4SAndroid Build Coastguard Worker 
1039*f81fb7c4SAndroid Build Coastguard Worker     /* zero the metadata buffer */
1040*f81fb7c4SAndroid Build Coastguard Worker     if (metaData)
1041*f81fb7c4SAndroid Build Coastguard Worker         EAS_HWMemSet(pData->metadata.buffer, 0, pData->metadata.bufferSize);
1042*f81fb7c4SAndroid Build Coastguard Worker 
1043*f81fb7c4SAndroid Build Coastguard Worker     /* read the title */
1044*f81fb7c4SAndroid Build Coastguard Worker     for (i = 0; i < RTTTL_MAX_TITLE_LEN; i++)
1045*f81fb7c4SAndroid Build Coastguard Worker     {
1046*f81fb7c4SAndroid Build Coastguard Worker         if ((result = EAS_HWGetByte(pEASData->hwInstData, pData->fileHandle, &temp)) != EAS_SUCCESS)
1047*f81fb7c4SAndroid Build Coastguard Worker             return result;
1048*f81fb7c4SAndroid Build Coastguard Worker 
1049*f81fb7c4SAndroid Build Coastguard Worker         if (temp == ':')
1050*f81fb7c4SAndroid Build Coastguard Worker             break;
1051*f81fb7c4SAndroid Build Coastguard Worker 
1052*f81fb7c4SAndroid Build Coastguard Worker         /* pass along metadata */
1053*f81fb7c4SAndroid Build Coastguard Worker         if (metaData)
1054*f81fb7c4SAndroid Build Coastguard Worker         {
1055*f81fb7c4SAndroid Build Coastguard Worker             if (i < (pData->metadata.bufferSize- 1))
1056*f81fb7c4SAndroid Build Coastguard Worker                 pData->metadata.buffer[i] = (char) temp;
1057*f81fb7c4SAndroid Build Coastguard Worker         }
1058*f81fb7c4SAndroid Build Coastguard Worker     }
1059*f81fb7c4SAndroid Build Coastguard Worker 
1060*f81fb7c4SAndroid Build Coastguard Worker     /* check for error in title */
1061*f81fb7c4SAndroid Build Coastguard Worker     if (i == RTTTL_MAX_TITLE_LEN)
1062*f81fb7c4SAndroid Build Coastguard Worker         return EAS_ERROR_FILE_FORMAT;
1063*f81fb7c4SAndroid Build Coastguard Worker 
1064*f81fb7c4SAndroid Build Coastguard Worker     /* pass along metadata */
1065*f81fb7c4SAndroid Build Coastguard Worker     if (metaData)
1066*f81fb7c4SAndroid Build Coastguard Worker         (*pData->metadata.callback)(EAS_METADATA_TITLE, pData->metadata.buffer, pData->metadata.pUserData);
1067*f81fb7c4SAndroid Build Coastguard Worker 
1068*f81fb7c4SAndroid Build Coastguard Worker     /* control fields */
1069*f81fb7c4SAndroid Build Coastguard Worker     for (;;)
1070*f81fb7c4SAndroid Build Coastguard Worker     {
1071*f81fb7c4SAndroid Build Coastguard Worker 
1072*f81fb7c4SAndroid Build Coastguard Worker         /* get control type */
1073*f81fb7c4SAndroid Build Coastguard Worker         if ((result = RTTTL_GetNextChar(pEASData->hwInstData, pData, &control)) != EAS_SUCCESS)
1074*f81fb7c4SAndroid Build Coastguard Worker             return result;
1075*f81fb7c4SAndroid Build Coastguard Worker 
1076*f81fb7c4SAndroid Build Coastguard Worker         /* next char should be equal sign */
1077*f81fb7c4SAndroid Build Coastguard Worker         if ((result = RTTTL_GetNextChar(pEASData->hwInstData, pData, &temp)) != EAS_SUCCESS)
1078*f81fb7c4SAndroid Build Coastguard Worker             return result;
1079*f81fb7c4SAndroid Build Coastguard Worker         if (temp != '=')
1080*f81fb7c4SAndroid Build Coastguard Worker             return EAS_ERROR_FILE_FORMAT;
1081*f81fb7c4SAndroid Build Coastguard Worker 
1082*f81fb7c4SAndroid Build Coastguard Worker         /* get the control value */
1083*f81fb7c4SAndroid Build Coastguard Worker         switch (control)
1084*f81fb7c4SAndroid Build Coastguard Worker         {
1085*f81fb7c4SAndroid Build Coastguard Worker 
1086*f81fb7c4SAndroid Build Coastguard Worker             /* bpm */
1087*f81fb7c4SAndroid Build Coastguard Worker             case 'b':
1088*f81fb7c4SAndroid Build Coastguard Worker                 if ((result = RTTTL_GetTempo(pEASData->hwInstData, pData)) != EAS_SUCCESS)
1089*f81fb7c4SAndroid Build Coastguard Worker                     return result;
1090*f81fb7c4SAndroid Build Coastguard Worker                 break;
1091*f81fb7c4SAndroid Build Coastguard Worker 
1092*f81fb7c4SAndroid Build Coastguard Worker             /* duration */
1093*f81fb7c4SAndroid Build Coastguard Worker             case 'd':
1094*f81fb7c4SAndroid Build Coastguard Worker                 if ((result = RTTTL_GetDuration(pEASData->hwInstData, pData, &temp)) != EAS_SUCCESS)
1095*f81fb7c4SAndroid Build Coastguard Worker                     return result;
1096*f81fb7c4SAndroid Build Coastguard Worker                 pData->duration = temp;
1097*f81fb7c4SAndroid Build Coastguard Worker                 break;
1098*f81fb7c4SAndroid Build Coastguard Worker 
1099*f81fb7c4SAndroid Build Coastguard Worker             /* loop */
1100*f81fb7c4SAndroid Build Coastguard Worker             case 'l':
1101*f81fb7c4SAndroid Build Coastguard Worker                 if ((result = RTTTL_GetNumber(pEASData->hwInstData, pData, &i)) != EAS_SUCCESS)
1102*f81fb7c4SAndroid Build Coastguard Worker                     return result;
1103*f81fb7c4SAndroid Build Coastguard Worker                 if ((i < 0) || (i > 15))
1104*f81fb7c4SAndroid Build Coastguard Worker                     return EAS_ERROR_FILE_FORMAT;
1105*f81fb7c4SAndroid Build Coastguard Worker                 pData->repeatCount = (EAS_U8) i;
1106*f81fb7c4SAndroid Build Coastguard Worker                 break;
1107*f81fb7c4SAndroid Build Coastguard Worker 
1108*f81fb7c4SAndroid Build Coastguard Worker             /* octave */
1109*f81fb7c4SAndroid Build Coastguard Worker             case 'o':
1110*f81fb7c4SAndroid Build Coastguard Worker                 if ((result = RTTTL_GetOctave(pEASData->hwInstData, pData, &pData->octave)) != EAS_SUCCESS)
1111*f81fb7c4SAndroid Build Coastguard Worker                     return result;
1112*f81fb7c4SAndroid Build Coastguard Worker                 break;
1113*f81fb7c4SAndroid Build Coastguard Worker 
1114*f81fb7c4SAndroid Build Coastguard Worker             /* get style */
1115*f81fb7c4SAndroid Build Coastguard Worker             case 's':
1116*f81fb7c4SAndroid Build Coastguard Worker                 if ((result = RTTTL_GetStyle(pEASData->hwInstData, pData)) != EAS_SUCCESS)
1117*f81fb7c4SAndroid Build Coastguard Worker                     return result;
1118*f81fb7c4SAndroid Build Coastguard Worker                 break;
1119*f81fb7c4SAndroid Build Coastguard Worker 
1120*f81fb7c4SAndroid Build Coastguard Worker             /* unrecognized control */
1121*f81fb7c4SAndroid Build Coastguard Worker             default:
1122*f81fb7c4SAndroid Build Coastguard Worker                 return EAS_ERROR_FILE_FORMAT;
1123*f81fb7c4SAndroid Build Coastguard Worker         }
1124*f81fb7c4SAndroid Build Coastguard Worker 
1125*f81fb7c4SAndroid Build Coastguard Worker         /* next character should be comma or colon */
1126*f81fb7c4SAndroid Build Coastguard Worker         if ((result = RTTTL_GetNextChar(pEASData->hwInstData, pData, &temp)) != EAS_SUCCESS)
1127*f81fb7c4SAndroid Build Coastguard Worker             return result;
1128*f81fb7c4SAndroid Build Coastguard Worker 
1129*f81fb7c4SAndroid Build Coastguard Worker         /* check for end of control field */
1130*f81fb7c4SAndroid Build Coastguard Worker         if (temp == ':')
1131*f81fb7c4SAndroid Build Coastguard Worker             break;
1132*f81fb7c4SAndroid Build Coastguard Worker 
1133*f81fb7c4SAndroid Build Coastguard Worker         /* must be a comma */
1134*f81fb7c4SAndroid Build Coastguard Worker         if (temp != ',')
1135*f81fb7c4SAndroid Build Coastguard Worker             return EAS_ERROR_FILE_FORMAT;
1136*f81fb7c4SAndroid Build Coastguard Worker     }
1137*f81fb7c4SAndroid Build Coastguard Worker 
1138*f81fb7c4SAndroid Build Coastguard Worker     /* should be at the start of the music block */
1139*f81fb7c4SAndroid Build Coastguard Worker     if ((result = EAS_HWFilePos(pEASData->hwInstData, pData->fileHandle, &pData->repeatOffset)) != EAS_SUCCESS)
1140*f81fb7c4SAndroid Build Coastguard Worker         return result;
1141*f81fb7c4SAndroid Build Coastguard Worker 
1142*f81fb7c4SAndroid Build Coastguard Worker     pData->notePlayedSinceRepeat = 0;
1143*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
1144*f81fb7c4SAndroid Build Coastguard Worker }
1145*f81fb7c4SAndroid Build Coastguard Worker 
1146*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1147*f81fb7c4SAndroid Build Coastguard Worker  * RTTTL_GetNextChar()
1148*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1149*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
1150*f81fb7c4SAndroid Build Coastguard Worker  *
1151*f81fb7c4SAndroid Build Coastguard Worker  *
1152*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
1153*f81fb7c4SAndroid Build Coastguard Worker  *
1154*f81fb7c4SAndroid Build Coastguard Worker  *
1155*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
1156*f81fb7c4SAndroid Build Coastguard Worker  *
1157*f81fb7c4SAndroid Build Coastguard Worker  *
1158*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
1159*f81fb7c4SAndroid Build Coastguard Worker  *
1160*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1161*f81fb7c4SAndroid Build Coastguard Worker */
RTTTL_GetNextChar(EAS_HW_DATA_HANDLE hwInstData,S_RTTTL_DATA * pData,EAS_I8 * pValue)1162*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_GetNextChar (EAS_HW_DATA_HANDLE hwInstData, S_RTTTL_DATA *pData, EAS_I8 *pValue)
1163*f81fb7c4SAndroid Build Coastguard Worker {
1164*f81fb7c4SAndroid Build Coastguard Worker     EAS_RESULT result;
1165*f81fb7c4SAndroid Build Coastguard Worker     EAS_I8 temp;
1166*f81fb7c4SAndroid Build Coastguard Worker 
1167*f81fb7c4SAndroid Build Coastguard Worker     *pValue = 0;
1168*f81fb7c4SAndroid Build Coastguard Worker     for(;;)
1169*f81fb7c4SAndroid Build Coastguard Worker     {
1170*f81fb7c4SAndroid Build Coastguard Worker 
1171*f81fb7c4SAndroid Build Coastguard Worker         /* check for character that has been put back */
1172*f81fb7c4SAndroid Build Coastguard Worker         if (pData->dataByte)
1173*f81fb7c4SAndroid Build Coastguard Worker         {
1174*f81fb7c4SAndroid Build Coastguard Worker             temp = pData->dataByte;
1175*f81fb7c4SAndroid Build Coastguard Worker             pData->dataByte = 0;
1176*f81fb7c4SAndroid Build Coastguard Worker         }
1177*f81fb7c4SAndroid Build Coastguard Worker         else
1178*f81fb7c4SAndroid Build Coastguard Worker         {
1179*f81fb7c4SAndroid Build Coastguard Worker             if ((result = EAS_HWGetByte(hwInstData, pData->fileHandle, &temp)) != EAS_SUCCESS)
1180*f81fb7c4SAndroid Build Coastguard Worker                 return result;
1181*f81fb7c4SAndroid Build Coastguard Worker         }
1182*f81fb7c4SAndroid Build Coastguard Worker 
1183*f81fb7c4SAndroid Build Coastguard Worker         /* ignore white space */
1184*f81fb7c4SAndroid Build Coastguard Worker         if (!IsSpace(temp))
1185*f81fb7c4SAndroid Build Coastguard Worker         {
1186*f81fb7c4SAndroid Build Coastguard Worker             *pValue = ToLower(temp);
1187*f81fb7c4SAndroid Build Coastguard Worker             return EAS_SUCCESS;
1188*f81fb7c4SAndroid Build Coastguard Worker         }
1189*f81fb7c4SAndroid Build Coastguard Worker     }
1190*f81fb7c4SAndroid Build Coastguard Worker }
1191*f81fb7c4SAndroid Build Coastguard Worker 
1192*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1193*f81fb7c4SAndroid Build Coastguard Worker  * RTTTL_PeekNextChar()
1194*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1195*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
1196*f81fb7c4SAndroid Build Coastguard Worker  *
1197*f81fb7c4SAndroid Build Coastguard Worker  *
1198*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
1199*f81fb7c4SAndroid Build Coastguard Worker  *
1200*f81fb7c4SAndroid Build Coastguard Worker  *
1201*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
1202*f81fb7c4SAndroid Build Coastguard Worker  *
1203*f81fb7c4SAndroid Build Coastguard Worker  *
1204*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
1205*f81fb7c4SAndroid Build Coastguard Worker  *
1206*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
1207*f81fb7c4SAndroid Build Coastguard Worker */
RTTTL_PeekNextChar(EAS_HW_DATA_HANDLE hwInstData,S_RTTTL_DATA * pData,EAS_I8 * pValue)1208*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT RTTTL_PeekNextChar (EAS_HW_DATA_HANDLE hwInstData, S_RTTTL_DATA *pData, EAS_I8 *pValue)
1209*f81fb7c4SAndroid Build Coastguard Worker {
1210*f81fb7c4SAndroid Build Coastguard Worker     EAS_RESULT result;
1211*f81fb7c4SAndroid Build Coastguard Worker     EAS_I8 temp;
1212*f81fb7c4SAndroid Build Coastguard Worker 
1213*f81fb7c4SAndroid Build Coastguard Worker     *pValue = 0;
1214*f81fb7c4SAndroid Build Coastguard Worker     for(;;)
1215*f81fb7c4SAndroid Build Coastguard Worker     {
1216*f81fb7c4SAndroid Build Coastguard Worker 
1217*f81fb7c4SAndroid Build Coastguard Worker         /* read a character from the file, if necessary */
1218*f81fb7c4SAndroid Build Coastguard Worker         if (!pData->dataByte)
1219*f81fb7c4SAndroid Build Coastguard Worker         {
1220*f81fb7c4SAndroid Build Coastguard Worker             if ((result = EAS_HWGetByte(hwInstData, pData->fileHandle, &pData->dataByte)) != EAS_SUCCESS)
1221*f81fb7c4SAndroid Build Coastguard Worker                 return result;
1222*f81fb7c4SAndroid Build Coastguard Worker 
1223*f81fb7c4SAndroid Build Coastguard Worker         }
1224*f81fb7c4SAndroid Build Coastguard Worker         temp = pData->dataByte;
1225*f81fb7c4SAndroid Build Coastguard Worker 
1226*f81fb7c4SAndroid Build Coastguard Worker         /* ignore white space */
1227*f81fb7c4SAndroid Build Coastguard Worker         if (!IsSpace(temp))
1228*f81fb7c4SAndroid Build Coastguard Worker         {
1229*f81fb7c4SAndroid Build Coastguard Worker             *pValue = ToLower(temp);
1230*f81fb7c4SAndroid Build Coastguard Worker             return EAS_SUCCESS;
1231*f81fb7c4SAndroid Build Coastguard Worker         }
1232*f81fb7c4SAndroid Build Coastguard Worker         pData->dataByte = 0;
1233*f81fb7c4SAndroid Build Coastguard Worker     }
1234*f81fb7c4SAndroid Build Coastguard Worker }
1235*f81fb7c4SAndroid Build Coastguard Worker 
1236