1*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
2*f81fb7c4SAndroid Build Coastguard Worker *
3*f81fb7c4SAndroid Build Coastguard Worker * File:
4*f81fb7c4SAndroid Build Coastguard Worker * eas_public.c
5*f81fb7c4SAndroid Build Coastguard Worker *
6*f81fb7c4SAndroid Build Coastguard Worker * Contents and purpose:
7*f81fb7c4SAndroid Build Coastguard Worker * Contains EAS library public interface
8*f81fb7c4SAndroid Build Coastguard Worker *
9*f81fb7c4SAndroid Build Coastguard Worker * Copyright Sonic Network Inc. 2004
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: 842 $
26*f81fb7c4SAndroid Build Coastguard Worker * $Date: 2007-08-23 14:32:31 -0700 (Thu, 23 Aug 2007) $
27*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
28*f81fb7c4SAndroid Build Coastguard Worker */
29*f81fb7c4SAndroid Build Coastguard Worker
30*f81fb7c4SAndroid Build Coastguard Worker #define LOG_TAG "Sonivox"
31*f81fb7c4SAndroid Build Coastguard Worker #include "log/log.h"
32*f81fb7c4SAndroid Build Coastguard Worker
33*f81fb7c4SAndroid Build Coastguard Worker #include "eas_synthcfg.h"
34*f81fb7c4SAndroid Build Coastguard Worker #include "eas.h"
35*f81fb7c4SAndroid Build Coastguard Worker #include "eas_config.h"
36*f81fb7c4SAndroid Build Coastguard Worker #include "eas_host.h"
37*f81fb7c4SAndroid Build Coastguard Worker #include "eas_report.h"
38*f81fb7c4SAndroid Build Coastguard Worker #include "eas_data.h"
39*f81fb7c4SAndroid Build Coastguard Worker #include "eas_parser.h"
40*f81fb7c4SAndroid Build Coastguard Worker #include "eas_pcm.h"
41*f81fb7c4SAndroid Build Coastguard Worker #include "eas_midi.h"
42*f81fb7c4SAndroid Build Coastguard Worker #include "eas_mixer.h"
43*f81fb7c4SAndroid Build Coastguard Worker #include "eas_build.h"
44*f81fb7c4SAndroid Build Coastguard Worker #include "eas_vm_protos.h"
45*f81fb7c4SAndroid Build Coastguard Worker #include "eas_math.h"
46*f81fb7c4SAndroid Build Coastguard Worker
47*f81fb7c4SAndroid Build Coastguard Worker #ifdef JET_INTERFACE
48*f81fb7c4SAndroid Build Coastguard Worker #include "jet_data.h"
49*f81fb7c4SAndroid Build Coastguard Worker #endif
50*f81fb7c4SAndroid Build Coastguard Worker
51*f81fb7c4SAndroid Build Coastguard Worker #ifdef DLS_SYNTHESIZER
52*f81fb7c4SAndroid Build Coastguard Worker #include "eas_mdls.h"
53*f81fb7c4SAndroid Build Coastguard Worker #endif
54*f81fb7c4SAndroid Build Coastguard Worker
55*f81fb7c4SAndroid Build Coastguard Worker /* number of events to parse before calling EAS_HWYield function */
56*f81fb7c4SAndroid Build Coastguard Worker #define YIELD_EVENT_COUNT 10
57*f81fb7c4SAndroid Build Coastguard Worker
58*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
59*f81fb7c4SAndroid Build Coastguard Worker * easLibConfig
60*f81fb7c4SAndroid Build Coastguard Worker *
61*f81fb7c4SAndroid Build Coastguard Worker * This structure is available through the EAS public interface to allow
62*f81fb7c4SAndroid Build Coastguard Worker * the user to check the configuration of the library.
63*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
64*f81fb7c4SAndroid Build Coastguard Worker */
65*f81fb7c4SAndroid Build Coastguard Worker static const S_EAS_LIB_CONFIG easLibConfig =
66*f81fb7c4SAndroid Build Coastguard Worker {
67*f81fb7c4SAndroid Build Coastguard Worker LIB_VERSION,
68*f81fb7c4SAndroid Build Coastguard Worker #ifdef _CHECKED_BUILD
69*f81fb7c4SAndroid Build Coastguard Worker EAS_TRUE,
70*f81fb7c4SAndroid Build Coastguard Worker #else
71*f81fb7c4SAndroid Build Coastguard Worker EAS_FALSE,
72*f81fb7c4SAndroid Build Coastguard Worker #endif
73*f81fb7c4SAndroid Build Coastguard Worker MAX_SYNTH_VOICES,
74*f81fb7c4SAndroid Build Coastguard Worker NUM_OUTPUT_CHANNELS,
75*f81fb7c4SAndroid Build Coastguard Worker _OUTPUT_SAMPLE_RATE,
76*f81fb7c4SAndroid Build Coastguard Worker BUFFER_SIZE_IN_MONO_SAMPLES,
77*f81fb7c4SAndroid Build Coastguard Worker #ifdef _FILTER_ENABLED
78*f81fb7c4SAndroid Build Coastguard Worker EAS_TRUE,
79*f81fb7c4SAndroid Build Coastguard Worker #else
80*f81fb7c4SAndroid Build Coastguard Worker EAS_FALSE,
81*f81fb7c4SAndroid Build Coastguard Worker #endif
82*f81fb7c4SAndroid Build Coastguard Worker _BUILD_TIME_,
83*f81fb7c4SAndroid Build Coastguard Worker _BUILD_VERSION_
84*f81fb7c4SAndroid Build Coastguard Worker };
85*f81fb7c4SAndroid Build Coastguard Worker
86*f81fb7c4SAndroid Build Coastguard Worker /* local prototypes */
87*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT EAS_ParseEvents (S_EAS_DATA *pEASData, S_EAS_STREAM *pStream, EAS_U32 endTime, EAS_INT parseMode);
88*f81fb7c4SAndroid Build Coastguard Worker
89*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
90*f81fb7c4SAndroid Build Coastguard Worker * EAS_SetStreamParameter
91*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
92*f81fb7c4SAndroid Build Coastguard Worker * Sets the specified parameter in the stream. Allows access to
93*f81fb7c4SAndroid Build Coastguard Worker * customizable settings within the individual file parsers.
94*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
95*f81fb7c4SAndroid Build Coastguard Worker * pEASData - pointer to EAS persistent data object
96*f81fb7c4SAndroid Build Coastguard Worker * pStream - stream handle
97*f81fb7c4SAndroid Build Coastguard Worker * param - enumerated parameter (see eas_parser.h)
98*f81fb7c4SAndroid Build Coastguard Worker * value - new value
99*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
100*f81fb7c4SAndroid Build Coastguard Worker */
EAS_SetStreamParameter(S_EAS_DATA * pEASData,EAS_HANDLE pStream,EAS_I32 param,EAS_I32 value)101*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT EAS_SetStreamParameter (S_EAS_DATA *pEASData, EAS_HANDLE pStream, EAS_I32 param, EAS_I32 value)
102*f81fb7c4SAndroid Build Coastguard Worker {
103*f81fb7c4SAndroid Build Coastguard Worker S_FILE_PARSER_INTERFACE *pParserModule;
104*f81fb7c4SAndroid Build Coastguard Worker
105*f81fb7c4SAndroid Build Coastguard Worker pParserModule = (S_FILE_PARSER_INTERFACE*) pStream->pParserModule;
106*f81fb7c4SAndroid Build Coastguard Worker if (pParserModule->pfSetData)
107*f81fb7c4SAndroid Build Coastguard Worker return (*pParserModule->pfSetData)(pEASData, pStream->handle, param, value);
108*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_FEATURE_NOT_AVAILABLE;
109*f81fb7c4SAndroid Build Coastguard Worker }
110*f81fb7c4SAndroid Build Coastguard Worker
111*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
112*f81fb7c4SAndroid Build Coastguard Worker * EAS_GetStreamParameter
113*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
114*f81fb7c4SAndroid Build Coastguard Worker * Sets the specified parameter in the stream. Allows access to
115*f81fb7c4SAndroid Build Coastguard Worker * customizable settings within the individual file parsers.
116*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
117*f81fb7c4SAndroid Build Coastguard Worker * pEASData - pointer to EAS persistent data object
118*f81fb7c4SAndroid Build Coastguard Worker * pStream - stream handle
119*f81fb7c4SAndroid Build Coastguard Worker * param - enumerated parameter (see eas_parser.h)
120*f81fb7c4SAndroid Build Coastguard Worker * pValue - pointer to variable to receive current setting
121*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
122*f81fb7c4SAndroid Build Coastguard Worker */
EAS_GetStreamParameter(S_EAS_DATA * pEASData,EAS_HANDLE pStream,EAS_I32 param,EAS_I32 * pValue)123*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT EAS_GetStreamParameter (S_EAS_DATA *pEASData, EAS_HANDLE pStream, EAS_I32 param, EAS_I32 *pValue)
124*f81fb7c4SAndroid Build Coastguard Worker {
125*f81fb7c4SAndroid Build Coastguard Worker S_FILE_PARSER_INTERFACE *pParserModule;
126*f81fb7c4SAndroid Build Coastguard Worker
127*f81fb7c4SAndroid Build Coastguard Worker pParserModule = (S_FILE_PARSER_INTERFACE*) pStream->pParserModule;
128*f81fb7c4SAndroid Build Coastguard Worker if (pParserModule->pfGetData)
129*f81fb7c4SAndroid Build Coastguard Worker return (*pParserModule->pfGetData)(pEASData, pStream->handle, param, pValue);
130*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_FEATURE_NOT_AVAILABLE;
131*f81fb7c4SAndroid Build Coastguard Worker }
132*f81fb7c4SAndroid Build Coastguard Worker
133*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
134*f81fb7c4SAndroid Build Coastguard Worker * EAS_StreamReady()
135*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
136*f81fb7c4SAndroid Build Coastguard Worker * This routine sets common parameters like transpose, volume, etc.
137*f81fb7c4SAndroid Build Coastguard Worker * First, it attempts to use the parser EAS_SetStreamParameter interface. If that
138*f81fb7c4SAndroid Build Coastguard Worker * fails, it attempts to get the synth handle from the parser and
139*f81fb7c4SAndroid Build Coastguard Worker * set the parameter directly on the synth. This eliminates duplicate
140*f81fb7c4SAndroid Build Coastguard Worker * code in the parser.
141*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
142*f81fb7c4SAndroid Build Coastguard Worker */
EAS_StreamReady(S_EAS_DATA * pEASData,EAS_HANDLE pStream)143*f81fb7c4SAndroid Build Coastguard Worker EAS_BOOL EAS_StreamReady (S_EAS_DATA *pEASData, EAS_HANDLE pStream)
144*f81fb7c4SAndroid Build Coastguard Worker {
145*f81fb7c4SAndroid Build Coastguard Worker S_FILE_PARSER_INTERFACE *pParserModule;
146*f81fb7c4SAndroid Build Coastguard Worker EAS_STATE state;
147*f81fb7c4SAndroid Build Coastguard Worker
148*f81fb7c4SAndroid Build Coastguard Worker pParserModule = (S_FILE_PARSER_INTERFACE*) pStream->pParserModule;
149*f81fb7c4SAndroid Build Coastguard Worker if (pParserModule->pfState(pEASData, pStream->handle, &state) != EAS_SUCCESS)
150*f81fb7c4SAndroid Build Coastguard Worker return EAS_FALSE;
151*f81fb7c4SAndroid Build Coastguard Worker return (state < EAS_STATE_OPEN);
152*f81fb7c4SAndroid Build Coastguard Worker }
153*f81fb7c4SAndroid Build Coastguard Worker
154*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
155*f81fb7c4SAndroid Build Coastguard Worker * EAS_IntSetStrmParam()
156*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
157*f81fb7c4SAndroid Build Coastguard Worker * This routine sets common parameters like transpose, volume, etc.
158*f81fb7c4SAndroid Build Coastguard Worker * First, it attempts to use the parser EAS_SetStreamParameter interface. If that
159*f81fb7c4SAndroid Build Coastguard Worker * fails, it attempts to get the synth handle from the parser and
160*f81fb7c4SAndroid Build Coastguard Worker * set the parameter directly on the synth. This eliminates duplicate
161*f81fb7c4SAndroid Build Coastguard Worker * code in the parser.
162*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
163*f81fb7c4SAndroid Build Coastguard Worker */
EAS_IntSetStrmParam(S_EAS_DATA * pEASData,EAS_HANDLE pStream,EAS_INT param,EAS_I32 value)164*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT EAS_IntSetStrmParam (S_EAS_DATA *pEASData, EAS_HANDLE pStream, EAS_INT param, EAS_I32 value)
165*f81fb7c4SAndroid Build Coastguard Worker {
166*f81fb7c4SAndroid Build Coastguard Worker S_SYNTH *pSynth;
167*f81fb7c4SAndroid Build Coastguard Worker
168*f81fb7c4SAndroid Build Coastguard Worker /* try to set the parameter using stream interface */
169*f81fb7c4SAndroid Build Coastguard Worker if (EAS_SetStreamParameter(pEASData, pStream, param, value) == EAS_SUCCESS)
170*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
171*f81fb7c4SAndroid Build Coastguard Worker
172*f81fb7c4SAndroid Build Coastguard Worker /* get a pointer to the synth object and set it directly */
173*f81fb7c4SAndroid Build Coastguard Worker /*lint -e{740} we are cheating by passing a pointer through this interface */
174*f81fb7c4SAndroid Build Coastguard Worker if (EAS_GetStreamParameter(pEASData, pStream, PARSER_DATA_SYNTH_HANDLE, (EAS_I32*) &pSynth) != EAS_SUCCESS)
175*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_INVALID_PARAMETER;
176*f81fb7c4SAndroid Build Coastguard Worker
177*f81fb7c4SAndroid Build Coastguard Worker if (pSynth == NULL)
178*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_INVALID_PARAMETER;
179*f81fb7c4SAndroid Build Coastguard Worker
180*f81fb7c4SAndroid Build Coastguard Worker switch (param)
181*f81fb7c4SAndroid Build Coastguard Worker {
182*f81fb7c4SAndroid Build Coastguard Worker
183*f81fb7c4SAndroid Build Coastguard Worker #ifdef DLS_SYNTHESIZER
184*f81fb7c4SAndroid Build Coastguard Worker case PARSER_DATA_DLS_COLLECTION:
185*f81fb7c4SAndroid Build Coastguard Worker {
186*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result = VMSetDLSLib(pSynth, (EAS_DLSLIB_HANDLE) value);
187*f81fb7c4SAndroid Build Coastguard Worker if (result == EAS_SUCCESS)
188*f81fb7c4SAndroid Build Coastguard Worker {
189*f81fb7c4SAndroid Build Coastguard Worker DLSAddRef((S_DLS*) value);
190*f81fb7c4SAndroid Build Coastguard Worker VMInitializeAllChannels(pEASData->pVoiceMgr, pSynth);
191*f81fb7c4SAndroid Build Coastguard Worker }
192*f81fb7c4SAndroid Build Coastguard Worker return result;
193*f81fb7c4SAndroid Build Coastguard Worker }
194*f81fb7c4SAndroid Build Coastguard Worker #endif
195*f81fb7c4SAndroid Build Coastguard Worker
196*f81fb7c4SAndroid Build Coastguard Worker case PARSER_DATA_EAS_LIBRARY:
197*f81fb7c4SAndroid Build Coastguard Worker return VMSetEASLib(pSynth, (EAS_SNDLIB_HANDLE) value);
198*f81fb7c4SAndroid Build Coastguard Worker
199*f81fb7c4SAndroid Build Coastguard Worker case PARSER_DATA_POLYPHONY:
200*f81fb7c4SAndroid Build Coastguard Worker return VMSetPolyphony(pEASData->pVoiceMgr, pSynth, value);
201*f81fb7c4SAndroid Build Coastguard Worker
202*f81fb7c4SAndroid Build Coastguard Worker case PARSER_DATA_PRIORITY:
203*f81fb7c4SAndroid Build Coastguard Worker return VMSetPriority(pEASData->pVoiceMgr, pSynth, value);
204*f81fb7c4SAndroid Build Coastguard Worker
205*f81fb7c4SAndroid Build Coastguard Worker case PARSER_DATA_TRANSPOSITION:
206*f81fb7c4SAndroid Build Coastguard Worker VMSetTranposition(pSynth, value);
207*f81fb7c4SAndroid Build Coastguard Worker break;
208*f81fb7c4SAndroid Build Coastguard Worker
209*f81fb7c4SAndroid Build Coastguard Worker case PARSER_DATA_VOLUME:
210*f81fb7c4SAndroid Build Coastguard Worker VMSetVolume(pSynth, (EAS_U16) value);
211*f81fb7c4SAndroid Build Coastguard Worker break;
212*f81fb7c4SAndroid Build Coastguard Worker
213*f81fb7c4SAndroid Build Coastguard Worker default:
214*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Invalid paramter %d in call to EAS_IntSetStrmParam", param); */ }
215*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_INVALID_PARAMETER;
216*f81fb7c4SAndroid Build Coastguard Worker }
217*f81fb7c4SAndroid Build Coastguard Worker
218*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
219*f81fb7c4SAndroid Build Coastguard Worker }
220*f81fb7c4SAndroid Build Coastguard Worker
221*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
222*f81fb7c4SAndroid Build Coastguard Worker * EAS_AllocateStream()
223*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
224*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
225*f81fb7c4SAndroid Build Coastguard Worker * Allocates a stream handle
226*f81fb7c4SAndroid Build Coastguard Worker *
227*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
228*f81fb7c4SAndroid Build Coastguard Worker *
229*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
230*f81fb7c4SAndroid Build Coastguard Worker *
231*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
232*f81fb7c4SAndroid Build Coastguard Worker */
EAS_AllocateStream(EAS_DATA_HANDLE pEASData)233*f81fb7c4SAndroid Build Coastguard Worker static EAS_INT EAS_AllocateStream (EAS_DATA_HANDLE pEASData)
234*f81fb7c4SAndroid Build Coastguard Worker {
235*f81fb7c4SAndroid Build Coastguard Worker EAS_INT streamNum;
236*f81fb7c4SAndroid Build Coastguard Worker
237*f81fb7c4SAndroid Build Coastguard Worker /* check for static allocation, only one stream allowed */
238*f81fb7c4SAndroid Build Coastguard Worker if (pEASData->staticMemoryModel)
239*f81fb7c4SAndroid Build Coastguard Worker {
240*f81fb7c4SAndroid Build Coastguard Worker if (pEASData->streams[0].handle != NULL)
241*f81fb7c4SAndroid Build Coastguard Worker {
242*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Attempt to open multiple streams in static model\n"); */ }
243*f81fb7c4SAndroid Build Coastguard Worker return -1;
244*f81fb7c4SAndroid Build Coastguard Worker }
245*f81fb7c4SAndroid Build Coastguard Worker return 0;
246*f81fb7c4SAndroid Build Coastguard Worker }
247*f81fb7c4SAndroid Build Coastguard Worker
248*f81fb7c4SAndroid Build Coastguard Worker /* dynamic model */
249*f81fb7c4SAndroid Build Coastguard Worker for (streamNum = 0; streamNum < MAX_NUMBER_STREAMS; streamNum++)
250*f81fb7c4SAndroid Build Coastguard Worker if (pEASData->streams[streamNum].handle == NULL)
251*f81fb7c4SAndroid Build Coastguard Worker break;
252*f81fb7c4SAndroid Build Coastguard Worker if (streamNum == MAX_NUMBER_STREAMS)
253*f81fb7c4SAndroid Build Coastguard Worker {
254*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Exceeded maximum number of open streams\n"); */ }
255*f81fb7c4SAndroid Build Coastguard Worker return -1;
256*f81fb7c4SAndroid Build Coastguard Worker }
257*f81fb7c4SAndroid Build Coastguard Worker return streamNum;
258*f81fb7c4SAndroid Build Coastguard Worker }
259*f81fb7c4SAndroid Build Coastguard Worker
260*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
261*f81fb7c4SAndroid Build Coastguard Worker * EAS_InitStream()
262*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
263*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
264*f81fb7c4SAndroid Build Coastguard Worker * Initialize a stream
265*f81fb7c4SAndroid Build Coastguard Worker *
266*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
267*f81fb7c4SAndroid Build Coastguard Worker *
268*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
269*f81fb7c4SAndroid Build Coastguard Worker *
270*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
271*f81fb7c4SAndroid Build Coastguard Worker */
EAS_InitStream(S_EAS_STREAM * pStream,EAS_VOID_PTR pParserModule,EAS_VOID_PTR streamHandle)272*f81fb7c4SAndroid Build Coastguard Worker static void EAS_InitStream (S_EAS_STREAM *pStream, EAS_VOID_PTR pParserModule, EAS_VOID_PTR streamHandle)
273*f81fb7c4SAndroid Build Coastguard Worker {
274*f81fb7c4SAndroid Build Coastguard Worker pStream->pParserModule = pParserModule;
275*f81fb7c4SAndroid Build Coastguard Worker pStream->handle = streamHandle;
276*f81fb7c4SAndroid Build Coastguard Worker pStream->time = 0;
277*f81fb7c4SAndroid Build Coastguard Worker pStream->frameLength = AUDIO_FRAME_LENGTH;
278*f81fb7c4SAndroid Build Coastguard Worker pStream->repeatCount = 0;
279*f81fb7c4SAndroid Build Coastguard Worker pStream->volume = DEFAULT_STREAM_VOLUME;
280*f81fb7c4SAndroid Build Coastguard Worker pStream->streamFlags = 0;
281*f81fb7c4SAndroid Build Coastguard Worker }
282*f81fb7c4SAndroid Build Coastguard Worker
283*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
284*f81fb7c4SAndroid Build Coastguard Worker * EAS_Config()
285*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
286*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
287*f81fb7c4SAndroid Build Coastguard Worker * Returns a pointer to a structure containing the configuration options
288*f81fb7c4SAndroid Build Coastguard Worker * in this library build.
289*f81fb7c4SAndroid Build Coastguard Worker *
290*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
291*f81fb7c4SAndroid Build Coastguard Worker *
292*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
293*f81fb7c4SAndroid Build Coastguard Worker *
294*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
295*f81fb7c4SAndroid Build Coastguard Worker */
EAS_Config(void)296*f81fb7c4SAndroid Build Coastguard Worker EAS_PUBLIC const S_EAS_LIB_CONFIG *EAS_Config (void)
297*f81fb7c4SAndroid Build Coastguard Worker {
298*f81fb7c4SAndroid Build Coastguard Worker return &easLibConfig;
299*f81fb7c4SAndroid Build Coastguard Worker }
300*f81fb7c4SAndroid Build Coastguard Worker
301*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
302*f81fb7c4SAndroid Build Coastguard Worker * EAS_Init()
303*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
304*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
305*f81fb7c4SAndroid Build Coastguard Worker * Initialize the synthesizer library
306*f81fb7c4SAndroid Build Coastguard Worker *
307*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
308*f81fb7c4SAndroid Build Coastguard Worker * ppEASData - pointer to data handle variable for this instance
309*f81fb7c4SAndroid Build Coastguard Worker *
310*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
311*f81fb7c4SAndroid Build Coastguard Worker *
312*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
313*f81fb7c4SAndroid Build Coastguard Worker */
EAS_Init(EAS_DATA_HANDLE * ppEASData)314*f81fb7c4SAndroid Build Coastguard Worker EAS_PUBLIC EAS_RESULT EAS_Init (EAS_DATA_HANDLE *ppEASData)
315*f81fb7c4SAndroid Build Coastguard Worker {
316*f81fb7c4SAndroid Build Coastguard Worker EAS_HW_DATA_HANDLE pHWInstData;
317*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
318*f81fb7c4SAndroid Build Coastguard Worker S_EAS_DATA *pEASData;
319*f81fb7c4SAndroid Build Coastguard Worker EAS_INT module;
320*f81fb7c4SAndroid Build Coastguard Worker EAS_BOOL staticMemoryModel;
321*f81fb7c4SAndroid Build Coastguard Worker
322*f81fb7c4SAndroid Build Coastguard Worker /* get the memory model */
323*f81fb7c4SAndroid Build Coastguard Worker staticMemoryModel = EAS_CMStaticMemoryModel();
324*f81fb7c4SAndroid Build Coastguard Worker
325*f81fb7c4SAndroid Build Coastguard Worker /* initialize the host wrapper interface */
326*f81fb7c4SAndroid Build Coastguard Worker *ppEASData = NULL;
327*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWInit(&pHWInstData)) != EAS_SUCCESS)
328*f81fb7c4SAndroid Build Coastguard Worker return result;
329*f81fb7c4SAndroid Build Coastguard Worker
330*f81fb7c4SAndroid Build Coastguard Worker /* check Configuration Module for S_EAS_DATA allocation */
331*f81fb7c4SAndroid Build Coastguard Worker if (staticMemoryModel)
332*f81fb7c4SAndroid Build Coastguard Worker pEASData = EAS_CMEnumData(EAS_CM_EAS_DATA);
333*f81fb7c4SAndroid Build Coastguard Worker else
334*f81fb7c4SAndroid Build Coastguard Worker pEASData = EAS_HWMalloc(pHWInstData, sizeof(S_EAS_DATA));
335*f81fb7c4SAndroid Build Coastguard Worker if (!pEASData)
336*f81fb7c4SAndroid Build Coastguard Worker {
337*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_FATAL, "Failed to allocate EAS library memory\n"); */ }
338*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_MALLOC_FAILED;
339*f81fb7c4SAndroid Build Coastguard Worker }
340*f81fb7c4SAndroid Build Coastguard Worker
341*f81fb7c4SAndroid Build Coastguard Worker /* initialize some data */
342*f81fb7c4SAndroid Build Coastguard Worker EAS_HWMemSet(pEASData, 0, sizeof(S_EAS_DATA));
343*f81fb7c4SAndroid Build Coastguard Worker pEASData->staticMemoryModel = (EAS_BOOL8) staticMemoryModel;
344*f81fb7c4SAndroid Build Coastguard Worker pEASData->hwInstData = pHWInstData;
345*f81fb7c4SAndroid Build Coastguard Worker pEASData->renderTime = 0;
346*f81fb7c4SAndroid Build Coastguard Worker
347*f81fb7c4SAndroid Build Coastguard Worker /* set header search flag */
348*f81fb7c4SAndroid Build Coastguard Worker #ifdef FILE_HEADER_SEARCH
349*f81fb7c4SAndroid Build Coastguard Worker pEASData->searchHeaderFlag = EAS_TRUE;
350*f81fb7c4SAndroid Build Coastguard Worker #endif
351*f81fb7c4SAndroid Build Coastguard Worker
352*f81fb7c4SAndroid Build Coastguard Worker /* initalize parameters */
353*f81fb7c4SAndroid Build Coastguard Worker EAS_SetVolume(pEASData, NULL, DEFAULT_VOLUME);
354*f81fb7c4SAndroid Build Coastguard Worker
355*f81fb7c4SAndroid Build Coastguard Worker #ifdef _METRICS_ENABLED
356*f81fb7c4SAndroid Build Coastguard Worker /* initalize the metrics module */
357*f81fb7c4SAndroid Build Coastguard Worker pEASData->pMetricsModule = EAS_CMEnumOptModules(EAS_MODULE_METRICS);
358*f81fb7c4SAndroid Build Coastguard Worker if (pEASData->pMetricsModule != NULL)
359*f81fb7c4SAndroid Build Coastguard Worker {
360*f81fb7c4SAndroid Build Coastguard Worker if ((result = (*pEASData->pMetricsModule->pfInit)(pEASData, &pEASData->pMetricsData)) != EAS_SUCCESS)
361*f81fb7c4SAndroid Build Coastguard Worker {
362*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Error %ld initializing metrics module\n", result); */ }
363*f81fb7c4SAndroid Build Coastguard Worker return result;
364*f81fb7c4SAndroid Build Coastguard Worker }
365*f81fb7c4SAndroid Build Coastguard Worker }
366*f81fb7c4SAndroid Build Coastguard Worker #endif
367*f81fb7c4SAndroid Build Coastguard Worker
368*f81fb7c4SAndroid Build Coastguard Worker /* initailize the voice manager & synthesizer */
369*f81fb7c4SAndroid Build Coastguard Worker if ((result = VMInitialize(pEASData)) != EAS_SUCCESS)
370*f81fb7c4SAndroid Build Coastguard Worker return result;
371*f81fb7c4SAndroid Build Coastguard Worker
372*f81fb7c4SAndroid Build Coastguard Worker /* initialize mix engine */
373*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_MixEngineInit(pEASData)) != EAS_SUCCESS)
374*f81fb7c4SAndroid Build Coastguard Worker {
375*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Error %ld starting up mix engine\n", result); */ }
376*f81fb7c4SAndroid Build Coastguard Worker return result;
377*f81fb7c4SAndroid Build Coastguard Worker }
378*f81fb7c4SAndroid Build Coastguard Worker
379*f81fb7c4SAndroid Build Coastguard Worker /* initialize effects modules */
380*f81fb7c4SAndroid Build Coastguard Worker for (module = 0; module < NUM_EFFECTS_MODULES; module++)
381*f81fb7c4SAndroid Build Coastguard Worker {
382*f81fb7c4SAndroid Build Coastguard Worker pEASData->effectsModules[module].effect = EAS_CMEnumFXModules(module);
383*f81fb7c4SAndroid Build Coastguard Worker if (pEASData->effectsModules[module].effect != NULL)
384*f81fb7c4SAndroid Build Coastguard Worker {
385*f81fb7c4SAndroid Build Coastguard Worker if ((result = (*pEASData->effectsModules[module].effect->pfInit)(pEASData, &pEASData->effectsModules[module].effectData)) != EAS_SUCCESS)
386*f81fb7c4SAndroid Build Coastguard Worker {
387*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_FATAL, "Initialization of effects module %d returned %d\n", module, result); */ }
388*f81fb7c4SAndroid Build Coastguard Worker return result;
389*f81fb7c4SAndroid Build Coastguard Worker }
390*f81fb7c4SAndroid Build Coastguard Worker }
391*f81fb7c4SAndroid Build Coastguard Worker }
392*f81fb7c4SAndroid Build Coastguard Worker
393*f81fb7c4SAndroid Build Coastguard Worker /* initialize PCM engine */
394*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_PEInit(pEASData)) != EAS_SUCCESS)
395*f81fb7c4SAndroid Build Coastguard Worker {
396*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_FATAL, "EAS_PEInit failed with error code %ld\n", result); */ }
397*f81fb7c4SAndroid Build Coastguard Worker return result;
398*f81fb7c4SAndroid Build Coastguard Worker }
399*f81fb7c4SAndroid Build Coastguard Worker
400*f81fb7c4SAndroid Build Coastguard Worker /* return instance data pointer to host */
401*f81fb7c4SAndroid Build Coastguard Worker *ppEASData = pEASData;
402*f81fb7c4SAndroid Build Coastguard Worker
403*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
404*f81fb7c4SAndroid Build Coastguard Worker }
405*f81fb7c4SAndroid Build Coastguard Worker
406*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
407*f81fb7c4SAndroid Build Coastguard Worker * EAS_Shutdown()
408*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
409*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
410*f81fb7c4SAndroid Build Coastguard Worker * Shuts down the library. Deallocates any memory associated with the
411*f81fb7c4SAndroid Build Coastguard Worker * synthesizer (dynamic memory model only)
412*f81fb7c4SAndroid Build Coastguard Worker *
413*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
414*f81fb7c4SAndroid Build Coastguard Worker * pEASData - handle to data for this instance
415*f81fb7c4SAndroid Build Coastguard Worker *
416*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
417*f81fb7c4SAndroid Build Coastguard Worker *
418*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
419*f81fb7c4SAndroid Build Coastguard Worker */
EAS_Shutdown(EAS_DATA_HANDLE pEASData)420*f81fb7c4SAndroid Build Coastguard Worker EAS_PUBLIC EAS_RESULT EAS_Shutdown (EAS_DATA_HANDLE pEASData)
421*f81fb7c4SAndroid Build Coastguard Worker {
422*f81fb7c4SAndroid Build Coastguard Worker /* check for NULL handle */
423*f81fb7c4SAndroid Build Coastguard Worker if (!pEASData)
424*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_HANDLE_INTEGRITY;
425*f81fb7c4SAndroid Build Coastguard Worker
426*f81fb7c4SAndroid Build Coastguard Worker /* establish pointers */
427*f81fb7c4SAndroid Build Coastguard Worker EAS_HW_DATA_HANDLE hwInstData = pEASData->hwInstData;
428*f81fb7c4SAndroid Build Coastguard Worker
429*f81fb7c4SAndroid Build Coastguard Worker /* if there are streams open, close them */
430*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT reportResult = EAS_SUCCESS;
431*f81fb7c4SAndroid Build Coastguard Worker
432*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
433*f81fb7c4SAndroid Build Coastguard Worker EAS_INT i;
434*f81fb7c4SAndroid Build Coastguard Worker for (i = 0; i < MAX_NUMBER_STREAMS; i++)
435*f81fb7c4SAndroid Build Coastguard Worker {
436*f81fb7c4SAndroid Build Coastguard Worker if (pEASData->streams[i].pParserModule && pEASData->streams[i].handle)
437*f81fb7c4SAndroid Build Coastguard Worker {
438*f81fb7c4SAndroid Build Coastguard Worker if ((result = (*((S_FILE_PARSER_INTERFACE*)(pEASData->streams[i].pParserModule))->pfClose)(pEASData, pEASData->streams[i].handle)) != EAS_SUCCESS)
439*f81fb7c4SAndroid Build Coastguard Worker {
440*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Error %ld shutting down parser module\n", result); */ }
441*f81fb7c4SAndroid Build Coastguard Worker reportResult = result;
442*f81fb7c4SAndroid Build Coastguard Worker }
443*f81fb7c4SAndroid Build Coastguard Worker }
444*f81fb7c4SAndroid Build Coastguard Worker }
445*f81fb7c4SAndroid Build Coastguard Worker
446*f81fb7c4SAndroid Build Coastguard Worker /* shutdown PCM engine */
447*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_PEShutdown(pEASData)) != EAS_SUCCESS)
448*f81fb7c4SAndroid Build Coastguard Worker {
449*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Error %ld shutting down PCM engine\n", result); */ }
450*f81fb7c4SAndroid Build Coastguard Worker if (reportResult == EAS_SUCCESS)
451*f81fb7c4SAndroid Build Coastguard Worker reportResult = result;
452*f81fb7c4SAndroid Build Coastguard Worker }
453*f81fb7c4SAndroid Build Coastguard Worker
454*f81fb7c4SAndroid Build Coastguard Worker /* shutdown mix engine */
455*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_MixEngineShutdown(pEASData)) != EAS_SUCCESS)
456*f81fb7c4SAndroid Build Coastguard Worker {
457*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Error %ld shutting down mix engine\n", result); */ }
458*f81fb7c4SAndroid Build Coastguard Worker if (reportResult == EAS_SUCCESS)
459*f81fb7c4SAndroid Build Coastguard Worker reportResult = result;
460*f81fb7c4SAndroid Build Coastguard Worker }
461*f81fb7c4SAndroid Build Coastguard Worker
462*f81fb7c4SAndroid Build Coastguard Worker /* shutdown effects modules */
463*f81fb7c4SAndroid Build Coastguard Worker for (i = 0; i < NUM_EFFECTS_MODULES; i++)
464*f81fb7c4SAndroid Build Coastguard Worker {
465*f81fb7c4SAndroid Build Coastguard Worker if (pEASData->effectsModules[i].effect)
466*f81fb7c4SAndroid Build Coastguard Worker {
467*f81fb7c4SAndroid Build Coastguard Worker if ((result = (*pEASData->effectsModules[i].effect->pfShutdown)(pEASData, pEASData->effectsModules[i].effectData)) != EAS_SUCCESS)
468*f81fb7c4SAndroid Build Coastguard Worker {
469*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_FATAL, "Shutdown of effects module %d returned %d\n", i, result); */ }
470*f81fb7c4SAndroid Build Coastguard Worker if (reportResult == EAS_SUCCESS)
471*f81fb7c4SAndroid Build Coastguard Worker reportResult = result;
472*f81fb7c4SAndroid Build Coastguard Worker }
473*f81fb7c4SAndroid Build Coastguard Worker }
474*f81fb7c4SAndroid Build Coastguard Worker }
475*f81fb7c4SAndroid Build Coastguard Worker
476*f81fb7c4SAndroid Build Coastguard Worker /* shutdown the voice manager & synthesizer */
477*f81fb7c4SAndroid Build Coastguard Worker VMShutdown(pEASData);
478*f81fb7c4SAndroid Build Coastguard Worker
479*f81fb7c4SAndroid Build Coastguard Worker #ifdef _METRICS_ENABLED
480*f81fb7c4SAndroid Build Coastguard Worker /* shutdown the metrics module */
481*f81fb7c4SAndroid Build Coastguard Worker if (pEASData->pMetricsModule != NULL)
482*f81fb7c4SAndroid Build Coastguard Worker {
483*f81fb7c4SAndroid Build Coastguard Worker if ((result = (*pEASData->pMetricsModule->pfShutdown)(pEASData, pEASData->pMetricsData)) != EAS_SUCCESS)
484*f81fb7c4SAndroid Build Coastguard Worker {
485*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Error %ld shutting down metrics module\n", result); */ }
486*f81fb7c4SAndroid Build Coastguard Worker if (reportResult == EAS_SUCCESS)
487*f81fb7c4SAndroid Build Coastguard Worker reportResult = result;
488*f81fb7c4SAndroid Build Coastguard Worker }
489*f81fb7c4SAndroid Build Coastguard Worker }
490*f81fb7c4SAndroid Build Coastguard Worker #endif
491*f81fb7c4SAndroid Build Coastguard Worker
492*f81fb7c4SAndroid Build Coastguard Worker /* release allocated memory */
493*f81fb7c4SAndroid Build Coastguard Worker if (!pEASData->staticMemoryModel)
494*f81fb7c4SAndroid Build Coastguard Worker EAS_HWFree(hwInstData, pEASData);
495*f81fb7c4SAndroid Build Coastguard Worker
496*f81fb7c4SAndroid Build Coastguard Worker /* shutdown host wrappers */
497*f81fb7c4SAndroid Build Coastguard Worker if (hwInstData)
498*f81fb7c4SAndroid Build Coastguard Worker {
499*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWShutdown(hwInstData)) != EAS_SUCCESS)
500*f81fb7c4SAndroid Build Coastguard Worker {
501*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Error %ld shutting down host wrappers\n", result); */ }
502*f81fb7c4SAndroid Build Coastguard Worker if (reportResult == EAS_SUCCESS)
503*f81fb7c4SAndroid Build Coastguard Worker reportResult = result;
504*f81fb7c4SAndroid Build Coastguard Worker }
505*f81fb7c4SAndroid Build Coastguard Worker }
506*f81fb7c4SAndroid Build Coastguard Worker
507*f81fb7c4SAndroid Build Coastguard Worker return reportResult;
508*f81fb7c4SAndroid Build Coastguard Worker }
509*f81fb7c4SAndroid Build Coastguard Worker
510*f81fb7c4SAndroid Build Coastguard Worker #ifdef JET_INTERFACE
511*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
512*f81fb7c4SAndroid Build Coastguard Worker * EAS_OpenJETStream()
513*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
514*f81fb7c4SAndroid Build Coastguard Worker * Private interface for JET to open an SMF stream with an offset
515*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
516*f81fb7c4SAndroid Build Coastguard Worker */
EAS_OpenJETStream(EAS_DATA_HANDLE pEASData,EAS_FILE_HANDLE fileHandle,EAS_I32 offset,EAS_HANDLE * ppStream)517*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT EAS_OpenJETStream (EAS_DATA_HANDLE pEASData, EAS_FILE_HANDLE fileHandle, EAS_I32 offset, EAS_HANDLE *ppStream)
518*f81fb7c4SAndroid Build Coastguard Worker {
519*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
520*f81fb7c4SAndroid Build Coastguard Worker EAS_VOID_PTR streamHandle;
521*f81fb7c4SAndroid Build Coastguard Worker S_FILE_PARSER_INTERFACE *pParserModule;
522*f81fb7c4SAndroid Build Coastguard Worker EAS_INT streamNum;
523*f81fb7c4SAndroid Build Coastguard Worker
524*f81fb7c4SAndroid Build Coastguard Worker /* allocate a stream */
525*f81fb7c4SAndroid Build Coastguard Worker if ((streamNum = EAS_AllocateStream(pEASData)) < 0)
526*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_MAX_STREAMS_OPEN;
527*f81fb7c4SAndroid Build Coastguard Worker
528*f81fb7c4SAndroid Build Coastguard Worker /* check Configuration Module for SMF parser */
529*f81fb7c4SAndroid Build Coastguard Worker *ppStream = NULL;
530*f81fb7c4SAndroid Build Coastguard Worker streamHandle = NULL;
531*f81fb7c4SAndroid Build Coastguard Worker pParserModule = (S_FILE_PARSER_INTERFACE *) EAS_CMEnumModules(0);
532*f81fb7c4SAndroid Build Coastguard Worker if (pParserModule == NULL)
533*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_UNRECOGNIZED_FORMAT;
534*f81fb7c4SAndroid Build Coastguard Worker
535*f81fb7c4SAndroid Build Coastguard Worker /* see if SMF parser recognizes the file */
536*f81fb7c4SAndroid Build Coastguard Worker if ((result = (*pParserModule->pfCheckFileType)(pEASData, fileHandle, &streamHandle, offset)) != EAS_SUCCESS)
537*f81fb7c4SAndroid Build Coastguard Worker {
538*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "CheckFileType returned error %ld\n", result); */ }
539*f81fb7c4SAndroid Build Coastguard Worker return result;
540*f81fb7c4SAndroid Build Coastguard Worker }
541*f81fb7c4SAndroid Build Coastguard Worker
542*f81fb7c4SAndroid Build Coastguard Worker /* parser recognized the file, return the handle */
543*f81fb7c4SAndroid Build Coastguard Worker if (streamHandle)
544*f81fb7c4SAndroid Build Coastguard Worker {
545*f81fb7c4SAndroid Build Coastguard Worker EAS_InitStream(&pEASData->streams[streamNum], pParserModule, streamHandle);
546*f81fb7c4SAndroid Build Coastguard Worker *ppStream = &pEASData->streams[streamNum];
547*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
548*f81fb7c4SAndroid Build Coastguard Worker }
549*f81fb7c4SAndroid Build Coastguard Worker
550*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_UNRECOGNIZED_FORMAT;
551*f81fb7c4SAndroid Build Coastguard Worker }
552*f81fb7c4SAndroid Build Coastguard Worker #endif
553*f81fb7c4SAndroid Build Coastguard Worker
554*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
555*f81fb7c4SAndroid Build Coastguard Worker * EAS_OpenFile()
556*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
557*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
558*f81fb7c4SAndroid Build Coastguard Worker * Opens a file for audio playback.
559*f81fb7c4SAndroid Build Coastguard Worker *
560*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
561*f81fb7c4SAndroid Build Coastguard Worker * pEASData - pointer to overall EAS data structure
562*f81fb7c4SAndroid Build Coastguard Worker * pHandle - pointer to file handle
563*f81fb7c4SAndroid Build Coastguard Worker *
564*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
565*f81fb7c4SAndroid Build Coastguard Worker *
566*f81fb7c4SAndroid Build Coastguard Worker *
567*f81fb7c4SAndroid Build Coastguard Worker * Side Effects:
568*f81fb7c4SAndroid Build Coastguard Worker *
569*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
570*f81fb7c4SAndroid Build Coastguard Worker */
EAS_OpenFile(EAS_DATA_HANDLE pEASData,EAS_FILE_LOCATOR locator,EAS_HANDLE * ppStream)571*f81fb7c4SAndroid Build Coastguard Worker EAS_PUBLIC EAS_RESULT EAS_OpenFile (EAS_DATA_HANDLE pEASData, EAS_FILE_LOCATOR locator, EAS_HANDLE *ppStream)
572*f81fb7c4SAndroid Build Coastguard Worker {
573*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
574*f81fb7c4SAndroid Build Coastguard Worker EAS_FILE_HANDLE fileHandle;
575*f81fb7c4SAndroid Build Coastguard Worker EAS_VOID_PTR streamHandle;
576*f81fb7c4SAndroid Build Coastguard Worker S_FILE_PARSER_INTERFACE *pParserModule;
577*f81fb7c4SAndroid Build Coastguard Worker EAS_INT streamNum;
578*f81fb7c4SAndroid Build Coastguard Worker EAS_INT moduleNum;
579*f81fb7c4SAndroid Build Coastguard Worker
580*f81fb7c4SAndroid Build Coastguard Worker /* open the file */
581*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWOpenFile(pEASData->hwInstData, locator, &fileHandle, EAS_FILE_READ)) != EAS_SUCCESS)
582*f81fb7c4SAndroid Build Coastguard Worker return result;
583*f81fb7c4SAndroid Build Coastguard Worker
584*f81fb7c4SAndroid Build Coastguard Worker /* allocate a stream */
585*f81fb7c4SAndroid Build Coastguard Worker if ((streamNum = EAS_AllocateStream(pEASData)) < 0)
586*f81fb7c4SAndroid Build Coastguard Worker {
587*f81fb7c4SAndroid Build Coastguard Worker /* Closing the opened file as stream allocation failed */
588*f81fb7c4SAndroid Build Coastguard Worker EAS_HWCloseFile(pEASData->hwInstData, fileHandle);
589*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_MAX_STREAMS_OPEN;
590*f81fb7c4SAndroid Build Coastguard Worker }
591*f81fb7c4SAndroid Build Coastguard Worker /* check Configuration Module for file parsers */
592*f81fb7c4SAndroid Build Coastguard Worker pParserModule = NULL;
593*f81fb7c4SAndroid Build Coastguard Worker *ppStream = NULL;
594*f81fb7c4SAndroid Build Coastguard Worker streamHandle = NULL;
595*f81fb7c4SAndroid Build Coastguard Worker for (moduleNum = 0; ; moduleNum++)
596*f81fb7c4SAndroid Build Coastguard Worker {
597*f81fb7c4SAndroid Build Coastguard Worker pParserModule = (S_FILE_PARSER_INTERFACE *) EAS_CMEnumModules(moduleNum);
598*f81fb7c4SAndroid Build Coastguard Worker if (pParserModule == NULL)
599*f81fb7c4SAndroid Build Coastguard Worker break;
600*f81fb7c4SAndroid Build Coastguard Worker
601*f81fb7c4SAndroid Build Coastguard Worker /* see if this parser recognizes it */
602*f81fb7c4SAndroid Build Coastguard Worker if ((result = (*pParserModule->pfCheckFileType)(pEASData, fileHandle, &streamHandle, 0L)) != EAS_SUCCESS)
603*f81fb7c4SAndroid Build Coastguard Worker {
604*f81fb7c4SAndroid Build Coastguard Worker /* Closing the opened file as file type check failed */
605*f81fb7c4SAndroid Build Coastguard Worker EAS_HWCloseFile(pEASData->hwInstData, fileHandle);
606*f81fb7c4SAndroid Build Coastguard Worker
607*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "CheckFileType returned error %ld\n", result); */ }
608*f81fb7c4SAndroid Build Coastguard Worker return result;
609*f81fb7c4SAndroid Build Coastguard Worker }
610*f81fb7c4SAndroid Build Coastguard Worker
611*f81fb7c4SAndroid Build Coastguard Worker /* parser recognized the file, return the handle */
612*f81fb7c4SAndroid Build Coastguard Worker if (streamHandle)
613*f81fb7c4SAndroid Build Coastguard Worker {
614*f81fb7c4SAndroid Build Coastguard Worker
615*f81fb7c4SAndroid Build Coastguard Worker /* save the parser pointer and file handle */
616*f81fb7c4SAndroid Build Coastguard Worker EAS_InitStream(&pEASData->streams[streamNum], pParserModule, streamHandle);
617*f81fb7c4SAndroid Build Coastguard Worker *ppStream = &pEASData->streams[streamNum];
618*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
619*f81fb7c4SAndroid Build Coastguard Worker }
620*f81fb7c4SAndroid Build Coastguard Worker
621*f81fb7c4SAndroid Build Coastguard Worker /* rewind the file for the next parser */
622*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_HWFileSeek(pEASData->hwInstData, fileHandle, 0L)) != EAS_SUCCESS)
623*f81fb7c4SAndroid Build Coastguard Worker {
624*f81fb7c4SAndroid Build Coastguard Worker /* Closing the opened file as file seek failed */
625*f81fb7c4SAndroid Build Coastguard Worker EAS_HWCloseFile(pEASData->hwInstData, fileHandle);
626*f81fb7c4SAndroid Build Coastguard Worker
627*f81fb7c4SAndroid Build Coastguard Worker return result;
628*f81fb7c4SAndroid Build Coastguard Worker }
629*f81fb7c4SAndroid Build Coastguard Worker }
630*f81fb7c4SAndroid Build Coastguard Worker
631*f81fb7c4SAndroid Build Coastguard Worker /* no parser was able to recognize the file, close it and return an error */
632*f81fb7c4SAndroid Build Coastguard Worker EAS_HWCloseFile(pEASData->hwInstData, fileHandle);
633*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "No parser recognized the requested file\n"); */ }
634*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_UNRECOGNIZED_FORMAT;
635*f81fb7c4SAndroid Build Coastguard Worker }
636*f81fb7c4SAndroid Build Coastguard Worker
637*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
638*f81fb7c4SAndroid Build Coastguard Worker * EAS_Prepare()
639*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
640*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
641*f81fb7c4SAndroid Build Coastguard Worker * Prepares the synthesizer to play the file or stream. Parses the first
642*f81fb7c4SAndroid Build Coastguard Worker * frame of data from the file and arms the synthesizer.
643*f81fb7c4SAndroid Build Coastguard Worker *
644*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
645*f81fb7c4SAndroid Build Coastguard Worker * pEASData - pointer to overall EAS data structure
646*f81fb7c4SAndroid Build Coastguard Worker * handle - file or stream handle
647*f81fb7c4SAndroid Build Coastguard Worker *
648*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
649*f81fb7c4SAndroid Build Coastguard Worker *
650*f81fb7c4SAndroid Build Coastguard Worker *
651*f81fb7c4SAndroid Build Coastguard Worker * Side Effects:
652*f81fb7c4SAndroid Build Coastguard Worker *
653*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
654*f81fb7c4SAndroid Build Coastguard Worker */
EAS_Prepare(EAS_DATA_HANDLE pEASData,EAS_HANDLE pStream)655*f81fb7c4SAndroid Build Coastguard Worker EAS_PUBLIC EAS_RESULT EAS_Prepare (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream)
656*f81fb7c4SAndroid Build Coastguard Worker {
657*f81fb7c4SAndroid Build Coastguard Worker S_FILE_PARSER_INTERFACE *pParserModule;
658*f81fb7c4SAndroid Build Coastguard Worker EAS_STATE state;
659*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
660*f81fb7c4SAndroid Build Coastguard Worker
661*f81fb7c4SAndroid Build Coastguard Worker pParserModule = (S_FILE_PARSER_INTERFACE*) pStream->pParserModule;
662*f81fb7c4SAndroid Build Coastguard Worker if (pParserModule == NULL)
663*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_FEATURE_NOT_AVAILABLE;
664*f81fb7c4SAndroid Build Coastguard Worker
665*f81fb7c4SAndroid Build Coastguard Worker /* check for valid state */
666*f81fb7c4SAndroid Build Coastguard Worker result = pParserModule->pfState(pEASData, pStream->handle, &state);
667*f81fb7c4SAndroid Build Coastguard Worker if (result == EAS_SUCCESS)
668*f81fb7c4SAndroid Build Coastguard Worker {
669*f81fb7c4SAndroid Build Coastguard Worker /* prepare the stream */
670*f81fb7c4SAndroid Build Coastguard Worker if (state == EAS_STATE_OPEN)
671*f81fb7c4SAndroid Build Coastguard Worker {
672*f81fb7c4SAndroid Build Coastguard Worker pParserModule = (S_FILE_PARSER_INTERFACE*) pStream->pParserModule;
673*f81fb7c4SAndroid Build Coastguard Worker result = (*pParserModule->pfPrepare)(pEASData, pStream->handle);
674*f81fb7c4SAndroid Build Coastguard Worker
675*f81fb7c4SAndroid Build Coastguard Worker /* set volume */
676*f81fb7c4SAndroid Build Coastguard Worker if (result == EAS_SUCCESS)
677*f81fb7c4SAndroid Build Coastguard Worker result = EAS_SetVolume(pEASData, pStream, pStream->volume);
678*f81fb7c4SAndroid Build Coastguard Worker }
679*f81fb7c4SAndroid Build Coastguard Worker else
680*f81fb7c4SAndroid Build Coastguard Worker result = EAS_ERROR_NOT_VALID_IN_THIS_STATE;
681*f81fb7c4SAndroid Build Coastguard Worker
682*f81fb7c4SAndroid Build Coastguard Worker }
683*f81fb7c4SAndroid Build Coastguard Worker
684*f81fb7c4SAndroid Build Coastguard Worker return result;
685*f81fb7c4SAndroid Build Coastguard Worker }
686*f81fb7c4SAndroid Build Coastguard Worker
687*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
688*f81fb7c4SAndroid Build Coastguard Worker * EAS_Render()
689*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
690*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
691*f81fb7c4SAndroid Build Coastguard Worker * Parse the Midi data and render PCM audio data.
692*f81fb7c4SAndroid Build Coastguard Worker *
693*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
694*f81fb7c4SAndroid Build Coastguard Worker * pEASData - buffer for internal EAS data
695*f81fb7c4SAndroid Build Coastguard Worker * pOut - output buffer pointer
696*f81fb7c4SAndroid Build Coastguard Worker * nNumRequested - requested num samples to generate
697*f81fb7c4SAndroid Build Coastguard Worker * pnNumGenerated - actual number of samples generated
698*f81fb7c4SAndroid Build Coastguard Worker *
699*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
700*f81fb7c4SAndroid Build Coastguard Worker * EAS_SUCCESS if PCM data was successfully rendered
701*f81fb7c4SAndroid Build Coastguard Worker *
702*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
703*f81fb7c4SAndroid Build Coastguard Worker */
EAS_Render(EAS_DATA_HANDLE pEASData,EAS_PCM * pOut,EAS_I32 numRequested,EAS_I32 * pNumGenerated)704*f81fb7c4SAndroid Build Coastguard Worker EAS_PUBLIC EAS_RESULT EAS_Render (EAS_DATA_HANDLE pEASData, EAS_PCM *pOut, EAS_I32 numRequested, EAS_I32 *pNumGenerated)
705*f81fb7c4SAndroid Build Coastguard Worker {
706*f81fb7c4SAndroid Build Coastguard Worker S_FILE_PARSER_INTERFACE *pParserModule;
707*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
708*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 voicesRendered;
709*f81fb7c4SAndroid Build Coastguard Worker EAS_STATE parserState;
710*f81fb7c4SAndroid Build Coastguard Worker EAS_INT streamNum;
711*f81fb7c4SAndroid Build Coastguard Worker
712*f81fb7c4SAndroid Build Coastguard Worker /* assume no samples generated and reset workload */
713*f81fb7c4SAndroid Build Coastguard Worker *pNumGenerated = 0;
714*f81fb7c4SAndroid Build Coastguard Worker VMInitWorkload(pEASData->pVoiceMgr);
715*f81fb7c4SAndroid Build Coastguard Worker
716*f81fb7c4SAndroid Build Coastguard Worker /* no support for other buffer sizes yet */
717*f81fb7c4SAndroid Build Coastguard Worker if (numRequested != BUFFER_SIZE_IN_MONO_SAMPLES)
718*f81fb7c4SAndroid Build Coastguard Worker {
719*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "This library supports only %ld samples in buffer, host requested %ld samples\n",
720*f81fb7c4SAndroid Build Coastguard Worker (EAS_I32) BUFFER_SIZE_IN_MONO_SAMPLES, numRequested); */ }
721*f81fb7c4SAndroid Build Coastguard Worker return EAS_BUFFER_SIZE_MISMATCH;
722*f81fb7c4SAndroid Build Coastguard Worker }
723*f81fb7c4SAndroid Build Coastguard Worker
724*f81fb7c4SAndroid Build Coastguard Worker #ifdef _METRICS_ENABLED
725*f81fb7c4SAndroid Build Coastguard Worker /* start performance counter */
726*f81fb7c4SAndroid Build Coastguard Worker if (pEASData->pMetricsData)
727*f81fb7c4SAndroid Build Coastguard Worker (*pEASData->pMetricsModule->pfStartTimer)(pEASData->pMetricsData, EAS_PM_TOTAL_TIME);
728*f81fb7c4SAndroid Build Coastguard Worker #endif
729*f81fb7c4SAndroid Build Coastguard Worker
730*f81fb7c4SAndroid Build Coastguard Worker /* prep the frame buffer, do mix engine prep only if TRUE */
731*f81fb7c4SAndroid Build Coastguard Worker #ifdef _SPLIT_ARCHITECTURE
732*f81fb7c4SAndroid Build Coastguard Worker if (VMStartFrame(pEASData))
733*f81fb7c4SAndroid Build Coastguard Worker EAS_MixEnginePrep(pEASData, numRequested);
734*f81fb7c4SAndroid Build Coastguard Worker #else
735*f81fb7c4SAndroid Build Coastguard Worker /* prep the mix engine */
736*f81fb7c4SAndroid Build Coastguard Worker EAS_MixEnginePrep(pEASData, numRequested);
737*f81fb7c4SAndroid Build Coastguard Worker #endif
738*f81fb7c4SAndroid Build Coastguard Worker
739*f81fb7c4SAndroid Build Coastguard Worker /* save the output buffer pointer */
740*f81fb7c4SAndroid Build Coastguard Worker pEASData->pOutputAudioBuffer = pOut;
741*f81fb7c4SAndroid Build Coastguard Worker
742*f81fb7c4SAndroid Build Coastguard Worker
743*f81fb7c4SAndroid Build Coastguard Worker #ifdef _METRICS_ENABLED
744*f81fb7c4SAndroid Build Coastguard Worker /* start performance counter */
745*f81fb7c4SAndroid Build Coastguard Worker if (pEASData->pMetricsData)
746*f81fb7c4SAndroid Build Coastguard Worker (*pEASData->pMetricsModule->pfStartTimer)(pEASData->pMetricsData, EAS_PM_PARSE_TIME);
747*f81fb7c4SAndroid Build Coastguard Worker #endif
748*f81fb7c4SAndroid Build Coastguard Worker
749*f81fb7c4SAndroid Build Coastguard Worker /* if we haven't finished parsing from last time, do it now */
750*f81fb7c4SAndroid Build Coastguard Worker /* need to parse another frame of events before we render again */
751*f81fb7c4SAndroid Build Coastguard Worker for (streamNum = 0; streamNum < MAX_NUMBER_STREAMS; streamNum++)
752*f81fb7c4SAndroid Build Coastguard Worker {
753*f81fb7c4SAndroid Build Coastguard Worker /* clear the locate flag */
754*f81fb7c4SAndroid Build Coastguard Worker pEASData->streams[streamNum].streamFlags &= ~STREAM_FLAGS_LOCATE;
755*f81fb7c4SAndroid Build Coastguard Worker
756*f81fb7c4SAndroid Build Coastguard Worker if (pEASData->streams[streamNum].pParserModule)
757*f81fb7c4SAndroid Build Coastguard Worker {
758*f81fb7c4SAndroid Build Coastguard Worker
759*f81fb7c4SAndroid Build Coastguard Worker /* establish pointer to parser module */
760*f81fb7c4SAndroid Build Coastguard Worker pParserModule = pEASData->streams[streamNum].pParserModule;
761*f81fb7c4SAndroid Build Coastguard Worker
762*f81fb7c4SAndroid Build Coastguard Worker #ifdef JET_INTERFACE
763*f81fb7c4SAndroid Build Coastguard Worker /* handle pause */
764*f81fb7c4SAndroid Build Coastguard Worker if (pEASData->streams[streamNum].streamFlags & STREAM_FLAGS_PAUSE)
765*f81fb7c4SAndroid Build Coastguard Worker {
766*f81fb7c4SAndroid Build Coastguard Worker if (pParserModule->pfPause)
767*f81fb7c4SAndroid Build Coastguard Worker result = pParserModule->pfPause(pEASData, pEASData->streams[streamNum].handle);
768*f81fb7c4SAndroid Build Coastguard Worker pEASData->streams[streamNum].streamFlags &= ~STREAM_FLAGS_PAUSE;
769*f81fb7c4SAndroid Build Coastguard Worker }
770*f81fb7c4SAndroid Build Coastguard Worker #endif
771*f81fb7c4SAndroid Build Coastguard Worker
772*f81fb7c4SAndroid Build Coastguard Worker /* get current state */
773*f81fb7c4SAndroid Build Coastguard Worker if ((result = (*pParserModule->pfState)(pEASData, pEASData->streams[streamNum].handle, &parserState)) != EAS_SUCCESS)
774*f81fb7c4SAndroid Build Coastguard Worker return result;
775*f81fb7c4SAndroid Build Coastguard Worker
776*f81fb7c4SAndroid Build Coastguard Worker #ifdef JET_INTERFACE
777*f81fb7c4SAndroid Build Coastguard Worker /* handle resume */
778*f81fb7c4SAndroid Build Coastguard Worker if (parserState == EAS_STATE_PAUSED)
779*f81fb7c4SAndroid Build Coastguard Worker {
780*f81fb7c4SAndroid Build Coastguard Worker if (pEASData->streams[streamNum].streamFlags & STREAM_FLAGS_RESUME)
781*f81fb7c4SAndroid Build Coastguard Worker {
782*f81fb7c4SAndroid Build Coastguard Worker if (pParserModule->pfResume)
783*f81fb7c4SAndroid Build Coastguard Worker result = pParserModule->pfResume(pEASData, pEASData->streams[streamNum].handle);
784*f81fb7c4SAndroid Build Coastguard Worker pEASData->streams[streamNum].streamFlags &= ~STREAM_FLAGS_RESUME;
785*f81fb7c4SAndroid Build Coastguard Worker }
786*f81fb7c4SAndroid Build Coastguard Worker }
787*f81fb7c4SAndroid Build Coastguard Worker #endif
788*f81fb7c4SAndroid Build Coastguard Worker
789*f81fb7c4SAndroid Build Coastguard Worker /* if necessary, parse stream */
790*f81fb7c4SAndroid Build Coastguard Worker if ((pEASData->streams[streamNum].streamFlags & STREAM_FLAGS_PARSED) == 0)
791*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_ParseEvents(pEASData, &pEASData->streams[streamNum], pEASData->streams[streamNum].time + pEASData->streams[streamNum].frameLength, eParserModePlay)) != EAS_SUCCESS)
792*f81fb7c4SAndroid Build Coastguard Worker return result;
793*f81fb7c4SAndroid Build Coastguard Worker
794*f81fb7c4SAndroid Build Coastguard Worker /* check for an early abort */
795*f81fb7c4SAndroid Build Coastguard Worker if ((pEASData->streams[streamNum].streamFlags) == 0)
796*f81fb7c4SAndroid Build Coastguard Worker {
797*f81fb7c4SAndroid Build Coastguard Worker
798*f81fb7c4SAndroid Build Coastguard Worker #ifdef _METRICS_ENABLED
799*f81fb7c4SAndroid Build Coastguard Worker /* stop performance counter */
800*f81fb7c4SAndroid Build Coastguard Worker if (pEASData->pMetricsData)
801*f81fb7c4SAndroid Build Coastguard Worker (*pEASData->pMetricsModule->pfStartTimer)(pEASData->pMetricsData, EAS_PM_TOTAL_TIME);
802*f81fb7c4SAndroid Build Coastguard Worker #endif
803*f81fb7c4SAndroid Build Coastguard Worker
804*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
805*f81fb7c4SAndroid Build Coastguard Worker }
806*f81fb7c4SAndroid Build Coastguard Worker
807*f81fb7c4SAndroid Build Coastguard Worker /* check for repeat */
808*f81fb7c4SAndroid Build Coastguard Worker if (pEASData->streams[streamNum].repeatCount)
809*f81fb7c4SAndroid Build Coastguard Worker {
810*f81fb7c4SAndroid Build Coastguard Worker
811*f81fb7c4SAndroid Build Coastguard Worker /* check for stopped state */
812*f81fb7c4SAndroid Build Coastguard Worker if ((result = (*pParserModule->pfState)(pEASData, pEASData->streams[streamNum].handle, &parserState)) != EAS_SUCCESS)
813*f81fb7c4SAndroid Build Coastguard Worker return result;
814*f81fb7c4SAndroid Build Coastguard Worker if (parserState == EAS_STATE_STOPPED)
815*f81fb7c4SAndroid Build Coastguard Worker {
816*f81fb7c4SAndroid Build Coastguard Worker
817*f81fb7c4SAndroid Build Coastguard Worker /* decrement repeat count, unless it is negative */
818*f81fb7c4SAndroid Build Coastguard Worker if (pEASData->streams[streamNum].repeatCount > 0)
819*f81fb7c4SAndroid Build Coastguard Worker pEASData->streams[streamNum].repeatCount--;
820*f81fb7c4SAndroid Build Coastguard Worker
821*f81fb7c4SAndroid Build Coastguard Worker /* reset the parser */
822*f81fb7c4SAndroid Build Coastguard Worker if ((result = (*pParserModule->pfReset)(pEASData, pEASData->streams[streamNum].handle)) != EAS_SUCCESS)
823*f81fb7c4SAndroid Build Coastguard Worker return result;
824*f81fb7c4SAndroid Build Coastguard Worker pEASData->streams[streamNum].time = 0;
825*f81fb7c4SAndroid Build Coastguard Worker }
826*f81fb7c4SAndroid Build Coastguard Worker }
827*f81fb7c4SAndroid Build Coastguard Worker }
828*f81fb7c4SAndroid Build Coastguard Worker }
829*f81fb7c4SAndroid Build Coastguard Worker
830*f81fb7c4SAndroid Build Coastguard Worker #ifdef _METRICS_ENABLED
831*f81fb7c4SAndroid Build Coastguard Worker /* stop performance counter */
832*f81fb7c4SAndroid Build Coastguard Worker if (pEASData->pMetricsData)
833*f81fb7c4SAndroid Build Coastguard Worker (void)(*pEASData->pMetricsModule->pfStopTimer)(pEASData->pMetricsData, EAS_PM_PARSE_TIME);
834*f81fb7c4SAndroid Build Coastguard Worker #endif
835*f81fb7c4SAndroid Build Coastguard Worker
836*f81fb7c4SAndroid Build Coastguard Worker #ifdef _METRICS_ENABLED
837*f81fb7c4SAndroid Build Coastguard Worker /* start the render timer */
838*f81fb7c4SAndroid Build Coastguard Worker if (pEASData->pMetricsData)
839*f81fb7c4SAndroid Build Coastguard Worker (*pEASData->pMetricsModule->pfStartTimer)(pEASData->pMetricsData, EAS_PM_RENDER_TIME);
840*f81fb7c4SAndroid Build Coastguard Worker #endif
841*f81fb7c4SAndroid Build Coastguard Worker
842*f81fb7c4SAndroid Build Coastguard Worker /* render audio */
843*f81fb7c4SAndroid Build Coastguard Worker if ((result = VMRender(pEASData->pVoiceMgr, BUFFER_SIZE_IN_MONO_SAMPLES, pEASData->pMixBuffer, &voicesRendered)) != EAS_SUCCESS)
844*f81fb7c4SAndroid Build Coastguard Worker {
845*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "pfRender function returned error %ld\n", result); */ }
846*f81fb7c4SAndroid Build Coastguard Worker return result;
847*f81fb7c4SAndroid Build Coastguard Worker }
848*f81fb7c4SAndroid Build Coastguard Worker
849*f81fb7c4SAndroid Build Coastguard Worker #ifdef _METRICS_ENABLED
850*f81fb7c4SAndroid Build Coastguard Worker /* stop the render timer */
851*f81fb7c4SAndroid Build Coastguard Worker if (pEASData->pMetricsData) {
852*f81fb7c4SAndroid Build Coastguard Worker (*pEASData->pMetricsModule->pfIncrementCounter)(pEASData->pMetricsData, EAS_PM_FRAME_COUNT, 1);
853*f81fb7c4SAndroid Build Coastguard Worker (void)(*pEASData->pMetricsModule->pfStopTimer)(pEASData->pMetricsData, EAS_PM_RENDER_TIME);
854*f81fb7c4SAndroid Build Coastguard Worker (*pEASData->pMetricsModule->pfIncrementCounter)(pEASData->pMetricsData, EAS_PM_TOTAL_VOICE_COUNT, (EAS_U32) voicesRendered);
855*f81fb7c4SAndroid Build Coastguard Worker (void)(*pEASData->pMetricsModule->pfRecordMaxValue)(pEASData->pMetricsData, EAS_PM_MAX_VOICES, (EAS_U32) voicesRendered);
856*f81fb7c4SAndroid Build Coastguard Worker }
857*f81fb7c4SAndroid Build Coastguard Worker #endif
858*f81fb7c4SAndroid Build Coastguard Worker
859*f81fb7c4SAndroid Build Coastguard Worker //2 Do we really need frameParsed?
860*f81fb7c4SAndroid Build Coastguard Worker /* need to parse another frame of events before we render again */
861*f81fb7c4SAndroid Build Coastguard Worker for (streamNum = 0; streamNum < MAX_NUMBER_STREAMS; streamNum++)
862*f81fb7c4SAndroid Build Coastguard Worker if (pEASData->streams[streamNum].pParserModule != NULL)
863*f81fb7c4SAndroid Build Coastguard Worker pEASData->streams[streamNum].streamFlags &= ~STREAM_FLAGS_PARSED;
864*f81fb7c4SAndroid Build Coastguard Worker
865*f81fb7c4SAndroid Build Coastguard Worker #ifdef _METRICS_ENABLED
866*f81fb7c4SAndroid Build Coastguard Worker /* start performance counter */
867*f81fb7c4SAndroid Build Coastguard Worker if (pEASData->pMetricsData)
868*f81fb7c4SAndroid Build Coastguard Worker (*pEASData->pMetricsModule->pfStartTimer)(pEASData->pMetricsData, EAS_PM_STREAM_TIME);
869*f81fb7c4SAndroid Build Coastguard Worker #endif
870*f81fb7c4SAndroid Build Coastguard Worker
871*f81fb7c4SAndroid Build Coastguard Worker #ifdef _METRICS_ENABLED
872*f81fb7c4SAndroid Build Coastguard Worker /* stop the stream timer */
873*f81fb7c4SAndroid Build Coastguard Worker if (pEASData->pMetricsData)
874*f81fb7c4SAndroid Build Coastguard Worker (void)(*pEASData->pMetricsModule->pfStopTimer)(pEASData->pMetricsData, EAS_PM_STREAM_TIME);
875*f81fb7c4SAndroid Build Coastguard Worker #endif
876*f81fb7c4SAndroid Build Coastguard Worker
877*f81fb7c4SAndroid Build Coastguard Worker #ifdef _METRICS_ENABLED
878*f81fb7c4SAndroid Build Coastguard Worker /* start the post timer */
879*f81fb7c4SAndroid Build Coastguard Worker if (pEASData->pMetricsData)
880*f81fb7c4SAndroid Build Coastguard Worker (*pEASData->pMetricsModule->pfStartTimer)(pEASData->pMetricsData, EAS_PM_POST_TIME);
881*f81fb7c4SAndroid Build Coastguard Worker #endif
882*f81fb7c4SAndroid Build Coastguard Worker
883*f81fb7c4SAndroid Build Coastguard Worker /* for split architecture, send DSP vectors. Do post only if return is TRUE */
884*f81fb7c4SAndroid Build Coastguard Worker #ifdef _SPLIT_ARCHITECTURE
885*f81fb7c4SAndroid Build Coastguard Worker if (VMEndFrame(pEASData))
886*f81fb7c4SAndroid Build Coastguard Worker {
887*f81fb7c4SAndroid Build Coastguard Worker /* now do post-processing */
888*f81fb7c4SAndroid Build Coastguard Worker EAS_MixEnginePost(pEASData, numRequested);
889*f81fb7c4SAndroid Build Coastguard Worker *pNumGenerated = numRequested;
890*f81fb7c4SAndroid Build Coastguard Worker }
891*f81fb7c4SAndroid Build Coastguard Worker #else
892*f81fb7c4SAndroid Build Coastguard Worker /* now do post-processing */
893*f81fb7c4SAndroid Build Coastguard Worker EAS_MixEnginePost(pEASData, numRequested);
894*f81fb7c4SAndroid Build Coastguard Worker *pNumGenerated = numRequested;
895*f81fb7c4SAndroid Build Coastguard Worker #endif
896*f81fb7c4SAndroid Build Coastguard Worker
897*f81fb7c4SAndroid Build Coastguard Worker #ifdef _METRICS_ENABLED
898*f81fb7c4SAndroid Build Coastguard Worker /* stop the post timer */
899*f81fb7c4SAndroid Build Coastguard Worker if (pEASData->pMetricsData)
900*f81fb7c4SAndroid Build Coastguard Worker (void)(*pEASData->pMetricsModule->pfStopTimer)(pEASData->pMetricsData, EAS_PM_POST_TIME);
901*f81fb7c4SAndroid Build Coastguard Worker #endif
902*f81fb7c4SAndroid Build Coastguard Worker
903*f81fb7c4SAndroid Build Coastguard Worker /* advance render time */
904*f81fb7c4SAndroid Build Coastguard Worker pEASData->renderTime += AUDIO_FRAME_LENGTH;
905*f81fb7c4SAndroid Build Coastguard Worker
906*f81fb7c4SAndroid Build Coastguard Worker #if 0
907*f81fb7c4SAndroid Build Coastguard Worker /* dump workload for debug */
908*f81fb7c4SAndroid Build Coastguard Worker if (pEASData->pVoiceMgr->workload)
909*f81fb7c4SAndroid Build Coastguard Worker { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Workload = %d\n", pEASData->pVoiceMgr->workload); */ }
910*f81fb7c4SAndroid Build Coastguard Worker #endif
911*f81fb7c4SAndroid Build Coastguard Worker
912*f81fb7c4SAndroid Build Coastguard Worker #ifdef _METRICS_ENABLED
913*f81fb7c4SAndroid Build Coastguard Worker /* stop performance counter */
914*f81fb7c4SAndroid Build Coastguard Worker if (pEASData->pMetricsData)
915*f81fb7c4SAndroid Build Coastguard Worker {
916*f81fb7c4SAndroid Build Coastguard Worker PERF_TIMER temp;
917*f81fb7c4SAndroid Build Coastguard Worker temp = (*pEASData->pMetricsModule->pfStopTimer)(pEASData->pMetricsData, EAS_PM_TOTAL_TIME);
918*f81fb7c4SAndroid Build Coastguard Worker
919*f81fb7c4SAndroid Build Coastguard Worker /* if max render time, record the number of voices and time */
920*f81fb7c4SAndroid Build Coastguard Worker if ((*pEASData->pMetricsModule->pfRecordMaxValue)
921*f81fb7c4SAndroid Build Coastguard Worker (pEASData->pMetricsData, EAS_PM_MAX_CYCLES, (EAS_U32) temp))
922*f81fb7c4SAndroid Build Coastguard Worker {
923*f81fb7c4SAndroid Build Coastguard Worker (*pEASData->pMetricsModule->pfRecordValue)(pEASData->pMetricsData, EAS_PM_MAX_CYCLES_VOICES, (EAS_U32) voicesRendered);
924*f81fb7c4SAndroid Build Coastguard Worker (*pEASData->pMetricsModule->pfRecordValue)(pEASData->pMetricsData, EAS_PM_MAX_CYCLES_TIME, (EAS_I32) (pEASData->renderTime >> 8));
925*f81fb7c4SAndroid Build Coastguard Worker }
926*f81fb7c4SAndroid Build Coastguard Worker }
927*f81fb7c4SAndroid Build Coastguard Worker #endif
928*f81fb7c4SAndroid Build Coastguard Worker
929*f81fb7c4SAndroid Build Coastguard Worker #ifdef JET_INTERFACE
930*f81fb7c4SAndroid Build Coastguard Worker /* let JET to do its thing */
931*f81fb7c4SAndroid Build Coastguard Worker if (pEASData->jetHandle != NULL)
932*f81fb7c4SAndroid Build Coastguard Worker {
933*f81fb7c4SAndroid Build Coastguard Worker result = JET_Process(pEASData);
934*f81fb7c4SAndroid Build Coastguard Worker if (result != EAS_SUCCESS)
935*f81fb7c4SAndroid Build Coastguard Worker return result;
936*f81fb7c4SAndroid Build Coastguard Worker }
937*f81fb7c4SAndroid Build Coastguard Worker #endif
938*f81fb7c4SAndroid Build Coastguard Worker
939*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
940*f81fb7c4SAndroid Build Coastguard Worker }
941*f81fb7c4SAndroid Build Coastguard Worker
942*f81fb7c4SAndroid Build Coastguard Worker #ifdef JET_INTERFACE
943*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
944*f81fb7c4SAndroid Build Coastguard Worker * EAS_SetTransposition)
945*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
946*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
947*f81fb7c4SAndroid Build Coastguard Worker * Sets the key tranposition for the synthesizer. Transposes all
948*f81fb7c4SAndroid Build Coastguard Worker * melodic instruments by the specified amount. Range is limited
949*f81fb7c4SAndroid Build Coastguard Worker * to +/-12 semitones.
950*f81fb7c4SAndroid Build Coastguard Worker *
951*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
952*f81fb7c4SAndroid Build Coastguard Worker * pEASData - handle to data for this instance
953*f81fb7c4SAndroid Build Coastguard Worker * handle - handle to stream
954*f81fb7c4SAndroid Build Coastguard Worker * transposition - +/-12 semitones
955*f81fb7c4SAndroid Build Coastguard Worker *
956*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
957*f81fb7c4SAndroid Build Coastguard Worker *
958*f81fb7c4SAndroid Build Coastguard Worker * Side Effects:
959*f81fb7c4SAndroid Build Coastguard Worker *
960*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
961*f81fb7c4SAndroid Build Coastguard Worker */
EAS_SetTransposition(EAS_DATA_HANDLE pEASData,EAS_HANDLE pStream,EAS_I32 transposition)962*f81fb7c4SAndroid Build Coastguard Worker EAS_PUBLIC EAS_RESULT EAS_SetTransposition (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream, EAS_I32 transposition)
963*f81fb7c4SAndroid Build Coastguard Worker {
964*f81fb7c4SAndroid Build Coastguard Worker
965*f81fb7c4SAndroid Build Coastguard Worker /* check range */
966*f81fb7c4SAndroid Build Coastguard Worker if ((transposition < -12) || (transposition > 12))
967*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_INVALID_PARAMETER;
968*f81fb7c4SAndroid Build Coastguard Worker
969*f81fb7c4SAndroid Build Coastguard Worker if (!EAS_StreamReady(pEASData, pStream))
970*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
971*f81fb7c4SAndroid Build Coastguard Worker return EAS_IntSetStrmParam(pEASData, pStream, PARSER_DATA_TRANSPOSITION, transposition);
972*f81fb7c4SAndroid Build Coastguard Worker }
973*f81fb7c4SAndroid Build Coastguard Worker #endif
974*f81fb7c4SAndroid Build Coastguard Worker
975*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
976*f81fb7c4SAndroid Build Coastguard Worker * EAS_ParseEvents()
977*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
978*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
979*f81fb7c4SAndroid Build Coastguard Worker * Parse events in the current streams until the desired time is reached.
980*f81fb7c4SAndroid Build Coastguard Worker *
981*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
982*f81fb7c4SAndroid Build Coastguard Worker * pEASData - buffer for internal EAS data
983*f81fb7c4SAndroid Build Coastguard Worker * endTime - stop parsing if this time is reached
984*f81fb7c4SAndroid Build Coastguard Worker * parseMode - play, locate, or metadata
985*f81fb7c4SAndroid Build Coastguard Worker *
986*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
987*f81fb7c4SAndroid Build Coastguard Worker * EAS_SUCCESS if PCM data was successfully rendered
988*f81fb7c4SAndroid Build Coastguard Worker *
989*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
990*f81fb7c4SAndroid Build Coastguard Worker */
EAS_ParseEvents(S_EAS_DATA * pEASData,EAS_HANDLE pStream,EAS_U32 endTime,EAS_INT parseMode)991*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT EAS_ParseEvents (S_EAS_DATA *pEASData, EAS_HANDLE pStream, EAS_U32 endTime, EAS_INT parseMode)
992*f81fb7c4SAndroid Build Coastguard Worker {
993*f81fb7c4SAndroid Build Coastguard Worker S_FILE_PARSER_INTERFACE *pParserModule;
994*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
995*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 parserState;
996*f81fb7c4SAndroid Build Coastguard Worker EAS_BOOL done;
997*f81fb7c4SAndroid Build Coastguard Worker EAS_INT yieldCount = YIELD_EVENT_COUNT;
998*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 time = 0;
999*f81fb7c4SAndroid Build Coastguard Worker
1000*f81fb7c4SAndroid Build Coastguard Worker // This constant is the maximum number of events that can be processed in a single time slice.
1001*f81fb7c4SAndroid Build Coastguard Worker // A typical ringtone will contain a few events per time slice.
1002*f81fb7c4SAndroid Build Coastguard Worker // Extremely dense ringtones might go up to 50 events.
1003*f81fb7c4SAndroid Build Coastguard Worker // If we see this many events then the file is probably stuck in an infinite loop
1004*f81fb7c4SAndroid Build Coastguard Worker // and should be aborted.
1005*f81fb7c4SAndroid Build Coastguard Worker static const EAS_INT MAX_EVENT_COUNT = 100000;
1006*f81fb7c4SAndroid Build Coastguard Worker EAS_INT eventCount = 0;
1007*f81fb7c4SAndroid Build Coastguard Worker
1008*f81fb7c4SAndroid Build Coastguard Worker /* does this parser have a time function? */
1009*f81fb7c4SAndroid Build Coastguard Worker pParserModule = pStream->pParserModule;
1010*f81fb7c4SAndroid Build Coastguard Worker if (pParserModule->pfTime == NULL)
1011*f81fb7c4SAndroid Build Coastguard Worker {
1012*f81fb7c4SAndroid Build Coastguard Worker /* check state */
1013*f81fb7c4SAndroid Build Coastguard Worker if ((result = (*pParserModule->pfState)(pEASData, pStream->handle, &parserState)) != EAS_SUCCESS)
1014*f81fb7c4SAndroid Build Coastguard Worker return result;
1015*f81fb7c4SAndroid Build Coastguard Worker /* if play state, advance time */
1016*f81fb7c4SAndroid Build Coastguard Worker if ((parserState >= EAS_STATE_READY) && (parserState <= EAS_STATE_PAUSING))
1017*f81fb7c4SAndroid Build Coastguard Worker pStream->time += pStream->frameLength;
1018*f81fb7c4SAndroid Build Coastguard Worker done = EAS_TRUE;
1019*f81fb7c4SAndroid Build Coastguard Worker }
1020*f81fb7c4SAndroid Build Coastguard Worker
1021*f81fb7c4SAndroid Build Coastguard Worker /* assume we're not done, in case we abort out */
1022*f81fb7c4SAndroid Build Coastguard Worker else
1023*f81fb7c4SAndroid Build Coastguard Worker {
1024*f81fb7c4SAndroid Build Coastguard Worker pStream->streamFlags &= ~STREAM_FLAGS_PARSED;
1025*f81fb7c4SAndroid Build Coastguard Worker done = EAS_FALSE;
1026*f81fb7c4SAndroid Build Coastguard Worker }
1027*f81fb7c4SAndroid Build Coastguard Worker
1028*f81fb7c4SAndroid Build Coastguard Worker while (!done)
1029*f81fb7c4SAndroid Build Coastguard Worker {
1030*f81fb7c4SAndroid Build Coastguard Worker
1031*f81fb7c4SAndroid Build Coastguard Worker /* check for stopped state */
1032*f81fb7c4SAndroid Build Coastguard Worker if ((result = (*pParserModule->pfState)(pEASData, pStream->handle, &parserState)) != EAS_SUCCESS)
1033*f81fb7c4SAndroid Build Coastguard Worker return result;
1034*f81fb7c4SAndroid Build Coastguard Worker if (parserState > EAS_STATE_PLAY)
1035*f81fb7c4SAndroid Build Coastguard Worker {
1036*f81fb7c4SAndroid Build Coastguard Worker /* save current time if we're not in play mode */
1037*f81fb7c4SAndroid Build Coastguard Worker if (parseMode != eParserModePlay)
1038*f81fb7c4SAndroid Build Coastguard Worker pStream->time = time << 8;
1039*f81fb7c4SAndroid Build Coastguard Worker done = EAS_TRUE;
1040*f81fb7c4SAndroid Build Coastguard Worker break;
1041*f81fb7c4SAndroid Build Coastguard Worker }
1042*f81fb7c4SAndroid Build Coastguard Worker
1043*f81fb7c4SAndroid Build Coastguard Worker /* get the next event time */
1044*f81fb7c4SAndroid Build Coastguard Worker if (pParserModule->pfTime)
1045*f81fb7c4SAndroid Build Coastguard Worker {
1046*f81fb7c4SAndroid Build Coastguard Worker if ((result = (*pParserModule->pfTime)(pEASData, pStream->handle, &time)) != EAS_SUCCESS)
1047*f81fb7c4SAndroid Build Coastguard Worker return result;
1048*f81fb7c4SAndroid Build Coastguard Worker
1049*f81fb7c4SAndroid Build Coastguard Worker /* if next event is within this frame, parse it */
1050*f81fb7c4SAndroid Build Coastguard Worker if (time < (endTime >> 8))
1051*f81fb7c4SAndroid Build Coastguard Worker {
1052*f81fb7c4SAndroid Build Coastguard Worker
1053*f81fb7c4SAndroid Build Coastguard Worker /* parse the next event */
1054*f81fb7c4SAndroid Build Coastguard Worker if (pParserModule->pfEvent) {
1055*f81fb7c4SAndroid Build Coastguard Worker if ((result = (*pParserModule->pfEvent)(pEASData, pStream->handle, parseMode))
1056*f81fb7c4SAndroid Build Coastguard Worker != EAS_SUCCESS) {
1057*f81fb7c4SAndroid Build Coastguard Worker ALOGE("%s() pfEvent returned %ld", __func__, result);
1058*f81fb7c4SAndroid Build Coastguard Worker return result;
1059*f81fb7c4SAndroid Build Coastguard Worker }
1060*f81fb7c4SAndroid Build Coastguard Worker }
1061*f81fb7c4SAndroid Build Coastguard Worker
1062*f81fb7c4SAndroid Build Coastguard Worker // An infinite loop within a ringtone file can cause this function
1063*f81fb7c4SAndroid Build Coastguard Worker // to loop forever. Try to detect that and return an error.
1064*f81fb7c4SAndroid Build Coastguard Worker // Only check when playing. Otherwise a very large file could be rejected
1065*f81fb7c4SAndroid Build Coastguard Worker // when scanning the entire file in a single call to this function.
1066*f81fb7c4SAndroid Build Coastguard Worker // OTA files will only do infinite loops when in eParserModePlay.
1067*f81fb7c4SAndroid Build Coastguard Worker if (++eventCount >= MAX_EVENT_COUNT && parseMode == eParserModePlay) {
1068*f81fb7c4SAndroid Build Coastguard Worker ALOGE("%s() aborting, %d events. Infinite loop in song file?!",
1069*f81fb7c4SAndroid Build Coastguard Worker __func__, eventCount);
1070*f81fb7c4SAndroid Build Coastguard Worker android_errorWriteLog(0x534e4554, "68664359");
1071*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_FILE_POS;
1072*f81fb7c4SAndroid Build Coastguard Worker }
1073*f81fb7c4SAndroid Build Coastguard Worker }
1074*f81fb7c4SAndroid Build Coastguard Worker
1075*f81fb7c4SAndroid Build Coastguard Worker /* no more events in this frame, advance time */
1076*f81fb7c4SAndroid Build Coastguard Worker else
1077*f81fb7c4SAndroid Build Coastguard Worker {
1078*f81fb7c4SAndroid Build Coastguard Worker pStream->time = endTime;
1079*f81fb7c4SAndroid Build Coastguard Worker done = EAS_TRUE;
1080*f81fb7c4SAndroid Build Coastguard Worker }
1081*f81fb7c4SAndroid Build Coastguard Worker }
1082*f81fb7c4SAndroid Build Coastguard Worker
1083*f81fb7c4SAndroid Build Coastguard Worker /* check for max workload exceeded */
1084*f81fb7c4SAndroid Build Coastguard Worker if (VMCheckWorkload(pEASData->pVoiceMgr))
1085*f81fb7c4SAndroid Build Coastguard Worker {
1086*f81fb7c4SAndroid Build Coastguard Worker /* stop even though we may not have parsed
1087*f81fb7c4SAndroid Build Coastguard Worker * all the events in this frame. The parser will try to
1088*f81fb7c4SAndroid Build Coastguard Worker * catch up on the next frame.
1089*f81fb7c4SAndroid Build Coastguard Worker */
1090*f81fb7c4SAndroid Build Coastguard Worker break;
1091*f81fb7c4SAndroid Build Coastguard Worker }
1092*f81fb7c4SAndroid Build Coastguard Worker
1093*f81fb7c4SAndroid Build Coastguard Worker /* give host a chance for an early abort */
1094*f81fb7c4SAndroid Build Coastguard Worker if (--yieldCount == 0)
1095*f81fb7c4SAndroid Build Coastguard Worker {
1096*f81fb7c4SAndroid Build Coastguard Worker if (EAS_HWYield(pEASData->hwInstData))
1097*f81fb7c4SAndroid Build Coastguard Worker break;
1098*f81fb7c4SAndroid Build Coastguard Worker yieldCount = YIELD_EVENT_COUNT;
1099*f81fb7c4SAndroid Build Coastguard Worker }
1100*f81fb7c4SAndroid Build Coastguard Worker }
1101*f81fb7c4SAndroid Build Coastguard Worker
1102*f81fb7c4SAndroid Build Coastguard Worker /* if no early abort, parsing is complete for this frame */
1103*f81fb7c4SAndroid Build Coastguard Worker if (done)
1104*f81fb7c4SAndroid Build Coastguard Worker pStream->streamFlags |= STREAM_FLAGS_PARSED;
1105*f81fb7c4SAndroid Build Coastguard Worker
1106*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
1107*f81fb7c4SAndroid Build Coastguard Worker }
1108*f81fb7c4SAndroid Build Coastguard Worker
1109*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1110*f81fb7c4SAndroid Build Coastguard Worker * EAS_ParseMetaData()
1111*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1112*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
1113*f81fb7c4SAndroid Build Coastguard Worker *
1114*f81fb7c4SAndroid Build Coastguard Worker *
1115*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
1116*f81fb7c4SAndroid Build Coastguard Worker * pEASData - pointer to overall EAS data structure
1117*f81fb7c4SAndroid Build Coastguard Worker * handle - file or stream handle
1118*f81fb7c4SAndroid Build Coastguard Worker * playLength - pointer to variable to store the play length (in msecs)
1119*f81fb7c4SAndroid Build Coastguard Worker *
1120*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
1121*f81fb7c4SAndroid Build Coastguard Worker *
1122*f81fb7c4SAndroid Build Coastguard Worker *
1123*f81fb7c4SAndroid Build Coastguard Worker * Side Effects:
1124*f81fb7c4SAndroid Build Coastguard Worker * - resets the parser to the start of the file
1125*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1126*f81fb7c4SAndroid Build Coastguard Worker */
EAS_ParseMetaData(EAS_DATA_HANDLE pEASData,EAS_HANDLE pStream,EAS_I32 * playLength)1127*f81fb7c4SAndroid Build Coastguard Worker EAS_PUBLIC EAS_RESULT EAS_ParseMetaData (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream, EAS_I32 *playLength)
1128*f81fb7c4SAndroid Build Coastguard Worker {
1129*f81fb7c4SAndroid Build Coastguard Worker S_FILE_PARSER_INTERFACE *pParserModule;
1130*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
1131*f81fb7c4SAndroid Build Coastguard Worker EAS_STATE state;
1132*f81fb7c4SAndroid Build Coastguard Worker
1133*f81fb7c4SAndroid Build Coastguard Worker pParserModule = (S_FILE_PARSER_INTERFACE*) pStream->pParserModule;
1134*f81fb7c4SAndroid Build Coastguard Worker if (pParserModule == NULL)
1135*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_FEATURE_NOT_AVAILABLE;
1136*f81fb7c4SAndroid Build Coastguard Worker
1137*f81fb7c4SAndroid Build Coastguard Worker /* check parser state */
1138*f81fb7c4SAndroid Build Coastguard Worker if ((result = (*pParserModule->pfState)(pEASData, pStream->handle, &state)) != EAS_SUCCESS)
1139*f81fb7c4SAndroid Build Coastguard Worker return result;
1140*f81fb7c4SAndroid Build Coastguard Worker if (state >= EAS_STATE_OPEN)
1141*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
1142*f81fb7c4SAndroid Build Coastguard Worker
1143*f81fb7c4SAndroid Build Coastguard Worker /* if parser has metadata function, use that */
1144*f81fb7c4SAndroid Build Coastguard Worker if (pParserModule->pfGetMetaData != NULL)
1145*f81fb7c4SAndroid Build Coastguard Worker return pParserModule->pfGetMetaData(pEASData, pStream->handle, playLength);
1146*f81fb7c4SAndroid Build Coastguard Worker
1147*f81fb7c4SAndroid Build Coastguard Worker /* reset the parser to the beginning */
1148*f81fb7c4SAndroid Build Coastguard Worker if ((result = (*pParserModule->pfReset)(pEASData, pStream->handle)) != EAS_SUCCESS)
1149*f81fb7c4SAndroid Build Coastguard Worker return result;
1150*f81fb7c4SAndroid Build Coastguard Worker
1151*f81fb7c4SAndroid Build Coastguard Worker /* parse the file to end */
1152*f81fb7c4SAndroid Build Coastguard Worker pStream->time = 0;
1153*f81fb7c4SAndroid Build Coastguard Worker VMInitWorkload(pEASData->pVoiceMgr);
1154*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_ParseEvents(pEASData, pStream, 0x7fffffff, eParserModeMetaData)) != EAS_SUCCESS)
1155*f81fb7c4SAndroid Build Coastguard Worker return result;
1156*f81fb7c4SAndroid Build Coastguard Worker
1157*f81fb7c4SAndroid Build Coastguard Worker /* get the parser time */
1158*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_GetLocation(pEASData, pStream, playLength)) != EAS_SUCCESS)
1159*f81fb7c4SAndroid Build Coastguard Worker return result;
1160*f81fb7c4SAndroid Build Coastguard Worker
1161*f81fb7c4SAndroid Build Coastguard Worker /* reset the parser to the beginning */
1162*f81fb7c4SAndroid Build Coastguard Worker pStream->time = 0;
1163*f81fb7c4SAndroid Build Coastguard Worker return (*pParserModule->pfReset)(pEASData, pStream->handle);
1164*f81fb7c4SAndroid Build Coastguard Worker }
1165*f81fb7c4SAndroid Build Coastguard Worker
1166*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1167*f81fb7c4SAndroid Build Coastguard Worker * EAS_CloseFile()
1168*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1169*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
1170*f81fb7c4SAndroid Build Coastguard Worker * Closes an audio file or stream. Playback should have either paused or
1171*f81fb7c4SAndroid Build Coastguard Worker * completed (EAS_State returns EAS_PAUSED or EAS_STOPPED).
1172*f81fb7c4SAndroid Build Coastguard Worker *
1173*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
1174*f81fb7c4SAndroid Build Coastguard Worker * pEASData - pointer to overall EAS data structure
1175*f81fb7c4SAndroid Build Coastguard Worker * handle - file or stream handle
1176*f81fb7c4SAndroid Build Coastguard Worker *
1177*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
1178*f81fb7c4SAndroid Build Coastguard Worker *
1179*f81fb7c4SAndroid Build Coastguard Worker *
1180*f81fb7c4SAndroid Build Coastguard Worker * Side Effects:
1181*f81fb7c4SAndroid Build Coastguard Worker *
1182*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1183*f81fb7c4SAndroid Build Coastguard Worker */
EAS_CloseFile(EAS_DATA_HANDLE pEASData,EAS_HANDLE pStream)1184*f81fb7c4SAndroid Build Coastguard Worker EAS_PUBLIC EAS_RESULT EAS_CloseFile (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream)
1185*f81fb7c4SAndroid Build Coastguard Worker {
1186*f81fb7c4SAndroid Build Coastguard Worker S_FILE_PARSER_INTERFACE *pParserModule;
1187*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
1188*f81fb7c4SAndroid Build Coastguard Worker
1189*f81fb7c4SAndroid Build Coastguard Worker /* call the close function */
1190*f81fb7c4SAndroid Build Coastguard Worker pParserModule = (S_FILE_PARSER_INTERFACE*) pStream->pParserModule;
1191*f81fb7c4SAndroid Build Coastguard Worker if (pParserModule == NULL)
1192*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_FEATURE_NOT_AVAILABLE;
1193*f81fb7c4SAndroid Build Coastguard Worker
1194*f81fb7c4SAndroid Build Coastguard Worker result = (*pParserModule->pfClose)(pEASData, pStream->handle);
1195*f81fb7c4SAndroid Build Coastguard Worker
1196*f81fb7c4SAndroid Build Coastguard Worker /* clear the handle and parser interface pointer */
1197*f81fb7c4SAndroid Build Coastguard Worker pStream->handle = NULL;
1198*f81fb7c4SAndroid Build Coastguard Worker pStream->pParserModule = NULL;
1199*f81fb7c4SAndroid Build Coastguard Worker return result;
1200*f81fb7c4SAndroid Build Coastguard Worker }
1201*f81fb7c4SAndroid Build Coastguard Worker
1202*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1203*f81fb7c4SAndroid Build Coastguard Worker * EAS_State()
1204*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1205*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
1206*f81fb7c4SAndroid Build Coastguard Worker * Returns the state of an audio file or stream.
1207*f81fb7c4SAndroid Build Coastguard Worker *
1208*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
1209*f81fb7c4SAndroid Build Coastguard Worker * pEASData - pointer to overall EAS data structure
1210*f81fb7c4SAndroid Build Coastguard Worker * handle - file or stream handle
1211*f81fb7c4SAndroid Build Coastguard Worker *
1212*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
1213*f81fb7c4SAndroid Build Coastguard Worker *
1214*f81fb7c4SAndroid Build Coastguard Worker *
1215*f81fb7c4SAndroid Build Coastguard Worker * Side Effects:
1216*f81fb7c4SAndroid Build Coastguard Worker *
1217*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1218*f81fb7c4SAndroid Build Coastguard Worker */
EAS_State(EAS_DATA_HANDLE pEASData,EAS_HANDLE pStream,EAS_STATE * pState)1219*f81fb7c4SAndroid Build Coastguard Worker EAS_PUBLIC EAS_RESULT EAS_State (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream, EAS_STATE *pState)
1220*f81fb7c4SAndroid Build Coastguard Worker {
1221*f81fb7c4SAndroid Build Coastguard Worker S_FILE_PARSER_INTERFACE *pParserModule;
1222*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
1223*f81fb7c4SAndroid Build Coastguard Worker
1224*f81fb7c4SAndroid Build Coastguard Worker /* call the parser to return state */
1225*f81fb7c4SAndroid Build Coastguard Worker pParserModule = (S_FILE_PARSER_INTERFACE*) pStream->pParserModule;
1226*f81fb7c4SAndroid Build Coastguard Worker if (pParserModule == NULL)
1227*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_FEATURE_NOT_AVAILABLE;
1228*f81fb7c4SAndroid Build Coastguard Worker
1229*f81fb7c4SAndroid Build Coastguard Worker if ((result = (*pParserModule->pfState)(pEASData, pStream->handle, pState)) != EAS_SUCCESS)
1230*f81fb7c4SAndroid Build Coastguard Worker return result;
1231*f81fb7c4SAndroid Build Coastguard Worker
1232*f81fb7c4SAndroid Build Coastguard Worker /* if repeat count is set for this parser, mask the stopped state from the application */
1233*f81fb7c4SAndroid Build Coastguard Worker if (pStream->repeatCount && (*pState == EAS_STATE_STOPPED))
1234*f81fb7c4SAndroid Build Coastguard Worker *pState = EAS_STATE_PLAY;
1235*f81fb7c4SAndroid Build Coastguard Worker
1236*f81fb7c4SAndroid Build Coastguard Worker /* if we're not paused or pausing, we don't need to hide state from host */
1237*f81fb7c4SAndroid Build Coastguard Worker if (*pState != EAS_STATE_PAUSED && *pState != EAS_STATE_PAUSING)
1238*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
1239*f81fb7c4SAndroid Build Coastguard Worker
1240*f81fb7c4SAndroid Build Coastguard Worker /* if stream is about to be paused, report it as paused */
1241*f81fb7c4SAndroid Build Coastguard Worker if (pStream->streamFlags & STREAM_FLAGS_PAUSE)
1242*f81fb7c4SAndroid Build Coastguard Worker {
1243*f81fb7c4SAndroid Build Coastguard Worker if (pStream->streamFlags & STREAM_FLAGS_LOCATE)
1244*f81fb7c4SAndroid Build Coastguard Worker *pState = EAS_STATE_PAUSED;
1245*f81fb7c4SAndroid Build Coastguard Worker else
1246*f81fb7c4SAndroid Build Coastguard Worker *pState = EAS_STATE_PAUSING;
1247*f81fb7c4SAndroid Build Coastguard Worker }
1248*f81fb7c4SAndroid Build Coastguard Worker
1249*f81fb7c4SAndroid Build Coastguard Worker /* if stream is about to resume, report it as playing */
1250*f81fb7c4SAndroid Build Coastguard Worker if (pStream->streamFlags & STREAM_FLAGS_RESUME)
1251*f81fb7c4SAndroid Build Coastguard Worker *pState = EAS_STATE_PLAY;
1252*f81fb7c4SAndroid Build Coastguard Worker
1253*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
1254*f81fb7c4SAndroid Build Coastguard Worker }
1255*f81fb7c4SAndroid Build Coastguard Worker
1256*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1257*f81fb7c4SAndroid Build Coastguard Worker * EAS_SetVolume()
1258*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1259*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
1260*f81fb7c4SAndroid Build Coastguard Worker * Set the master gain for the mix engine in 1dB increments
1261*f81fb7c4SAndroid Build Coastguard Worker *
1262*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
1263*f81fb7c4SAndroid Build Coastguard Worker * pEASData - pointer to overall EAS data structure
1264*f81fb7c4SAndroid Build Coastguard Worker * volume - the desired master gain (100 is max)
1265*f81fb7c4SAndroid Build Coastguard Worker * handle - file or stream handle
1266*f81fb7c4SAndroid Build Coastguard Worker *
1267*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
1268*f81fb7c4SAndroid Build Coastguard Worker *
1269*f81fb7c4SAndroid Build Coastguard Worker *
1270*f81fb7c4SAndroid Build Coastguard Worker * Side Effects:
1271*f81fb7c4SAndroid Build Coastguard Worker * overrides any previously set master volume from sysex
1272*f81fb7c4SAndroid Build Coastguard Worker *
1273*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1274*f81fb7c4SAndroid Build Coastguard Worker */
EAS_SetVolume(EAS_DATA_HANDLE pEASData,EAS_HANDLE pStream,EAS_I32 volume)1275*f81fb7c4SAndroid Build Coastguard Worker EAS_PUBLIC EAS_RESULT EAS_SetVolume (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream, EAS_I32 volume)
1276*f81fb7c4SAndroid Build Coastguard Worker {
1277*f81fb7c4SAndroid Build Coastguard Worker EAS_I16 gain;
1278*f81fb7c4SAndroid Build Coastguard Worker
1279*f81fb7c4SAndroid Build Coastguard Worker /* check range */
1280*f81fb7c4SAndroid Build Coastguard Worker if ((volume < 0) || (volume > EAS_MAX_VOLUME))
1281*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_PARAMETER_RANGE;
1282*f81fb7c4SAndroid Build Coastguard Worker
1283*f81fb7c4SAndroid Build Coastguard Worker /* stream volume */
1284*f81fb7c4SAndroid Build Coastguard Worker if (pStream != NULL)
1285*f81fb7c4SAndroid Build Coastguard Worker {
1286*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 gainOffset;
1287*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
1288*f81fb7c4SAndroid Build Coastguard Worker
1289*f81fb7c4SAndroid Build Coastguard Worker if (!EAS_StreamReady(pEASData, pStream))
1290*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
1291*f81fb7c4SAndroid Build Coastguard Worker
1292*f81fb7c4SAndroid Build Coastguard Worker /* get gain offset */
1293*f81fb7c4SAndroid Build Coastguard Worker pStream->volume = (EAS_U8) volume;
1294*f81fb7c4SAndroid Build Coastguard Worker result = EAS_GetStreamParameter(pEASData, pStream, PARSER_DATA_GAIN_OFFSET, &gainOffset);
1295*f81fb7c4SAndroid Build Coastguard Worker if (result == EAS_SUCCESS)
1296*f81fb7c4SAndroid Build Coastguard Worker volume += gainOffset;
1297*f81fb7c4SAndroid Build Coastguard Worker
1298*f81fb7c4SAndroid Build Coastguard Worker /* set stream volume */
1299*f81fb7c4SAndroid Build Coastguard Worker gain = EAS_VolumeToGain(volume - STREAM_VOLUME_HEADROOM);
1300*f81fb7c4SAndroid Build Coastguard Worker
1301*f81fb7c4SAndroid Build Coastguard Worker /* convert to linear scalar */
1302*f81fb7c4SAndroid Build Coastguard Worker return EAS_IntSetStrmParam(pEASData, pStream, PARSER_DATA_VOLUME, gain);
1303*f81fb7c4SAndroid Build Coastguard Worker }
1304*f81fb7c4SAndroid Build Coastguard Worker
1305*f81fb7c4SAndroid Build Coastguard Worker /* master volume */
1306*f81fb7c4SAndroid Build Coastguard Worker pEASData->masterVolume = (EAS_U8) volume;
1307*f81fb7c4SAndroid Build Coastguard Worker #if (NUM_OUTPUT_CHANNELS == 1)
1308*f81fb7c4SAndroid Build Coastguard Worker /* leave 3dB headroom for mono output */
1309*f81fb7c4SAndroid Build Coastguard Worker volume -= 3;
1310*f81fb7c4SAndroid Build Coastguard Worker #endif
1311*f81fb7c4SAndroid Build Coastguard Worker
1312*f81fb7c4SAndroid Build Coastguard Worker gain = EAS_VolumeToGain(volume - STREAM_VOLUME_HEADROOM);
1313*f81fb7c4SAndroid Build Coastguard Worker pEASData->masterGain = gain;
1314*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
1315*f81fb7c4SAndroid Build Coastguard Worker }
1316*f81fb7c4SAndroid Build Coastguard Worker
1317*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1318*f81fb7c4SAndroid Build Coastguard Worker * EAS_Locate()
1319*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1320*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
1321*f81fb7c4SAndroid Build Coastguard Worker * Locate into the file associated with the handle.
1322*f81fb7c4SAndroid Build Coastguard Worker *
1323*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
1324*f81fb7c4SAndroid Build Coastguard Worker * pEASData - pointer to overall EAS data structure
1325*f81fb7c4SAndroid Build Coastguard Worker * handle - file handle
1326*f81fb7c4SAndroid Build Coastguard Worker * milliseconds - playback offset from start of file in milliseconds
1327*f81fb7c4SAndroid Build Coastguard Worker *
1328*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
1329*f81fb7c4SAndroid Build Coastguard Worker *
1330*f81fb7c4SAndroid Build Coastguard Worker *
1331*f81fb7c4SAndroid Build Coastguard Worker * Side Effects:
1332*f81fb7c4SAndroid Build Coastguard Worker * the actual offset will be quantized to the closest update period, typically
1333*f81fb7c4SAndroid Build Coastguard Worker * a resolution of 5.9ms. Notes that are started prior to this time will not
1334*f81fb7c4SAndroid Build Coastguard Worker * sound. Any notes currently playing will be shut off.
1335*f81fb7c4SAndroid Build Coastguard Worker *
1336*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1337*f81fb7c4SAndroid Build Coastguard Worker */
EAS_Locate(EAS_DATA_HANDLE pEASData,EAS_HANDLE pStream,EAS_I32 milliseconds,EAS_BOOL offset)1338*f81fb7c4SAndroid Build Coastguard Worker EAS_PUBLIC EAS_RESULT EAS_Locate (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream, EAS_I32 milliseconds, EAS_BOOL offset)
1339*f81fb7c4SAndroid Build Coastguard Worker {
1340*f81fb7c4SAndroid Build Coastguard Worker S_FILE_PARSER_INTERFACE *pParserModule;
1341*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
1342*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 requestedTime;
1343*f81fb7c4SAndroid Build Coastguard Worker EAS_STATE state;
1344*f81fb7c4SAndroid Build Coastguard Worker
1345*f81fb7c4SAndroid Build Coastguard Worker /* get pointer to parser function table */
1346*f81fb7c4SAndroid Build Coastguard Worker pParserModule = (S_FILE_PARSER_INTERFACE*) pStream->pParserModule;
1347*f81fb7c4SAndroid Build Coastguard Worker if (pParserModule == NULL)
1348*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_FEATURE_NOT_AVAILABLE;
1349*f81fb7c4SAndroid Build Coastguard Worker
1350*f81fb7c4SAndroid Build Coastguard Worker if ((result = (*pParserModule->pfState)(pEASData, pStream->handle, &state)) != EAS_SUCCESS)
1351*f81fb7c4SAndroid Build Coastguard Worker return result;
1352*f81fb7c4SAndroid Build Coastguard Worker if (state >= EAS_STATE_OPEN)
1353*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
1354*f81fb7c4SAndroid Build Coastguard Worker
1355*f81fb7c4SAndroid Build Coastguard Worker /* handle offset and limit to start of file */
1356*f81fb7c4SAndroid Build Coastguard Worker /*lint -e{704} use shift for performance*/
1357*f81fb7c4SAndroid Build Coastguard Worker if (offset)
1358*f81fb7c4SAndroid Build Coastguard Worker milliseconds += (EAS_I32) pStream->time >> 8;
1359*f81fb7c4SAndroid Build Coastguard Worker if (milliseconds < 0)
1360*f81fb7c4SAndroid Build Coastguard Worker milliseconds = 0;
1361*f81fb7c4SAndroid Build Coastguard Worker
1362*f81fb7c4SAndroid Build Coastguard Worker /* check to see if the request is different from the current time */
1363*f81fb7c4SAndroid Build Coastguard Worker requestedTime = (EAS_U32) milliseconds;
1364*f81fb7c4SAndroid Build Coastguard Worker if (requestedTime == (pStream->time >> 8))
1365*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
1366*f81fb7c4SAndroid Build Coastguard Worker
1367*f81fb7c4SAndroid Build Coastguard Worker /* set the locate flag */
1368*f81fb7c4SAndroid Build Coastguard Worker pStream->streamFlags |= STREAM_FLAGS_LOCATE;
1369*f81fb7c4SAndroid Build Coastguard Worker
1370*f81fb7c4SAndroid Build Coastguard Worker /* use the parser locate function, if available */
1371*f81fb7c4SAndroid Build Coastguard Worker if (pParserModule->pfLocate != NULL)
1372*f81fb7c4SAndroid Build Coastguard Worker {
1373*f81fb7c4SAndroid Build Coastguard Worker EAS_BOOL parserLocate = EAS_FALSE;
1374*f81fb7c4SAndroid Build Coastguard Worker result = pParserModule->pfLocate(pEASData, pStream->handle, (EAS_I32) requestedTime, &parserLocate);
1375*f81fb7c4SAndroid Build Coastguard Worker if (!parserLocate)
1376*f81fb7c4SAndroid Build Coastguard Worker {
1377*f81fb7c4SAndroid Build Coastguard Worker if (result == EAS_SUCCESS)
1378*f81fb7c4SAndroid Build Coastguard Worker pStream->time = requestedTime << 8;
1379*f81fb7c4SAndroid Build Coastguard Worker return result;
1380*f81fb7c4SAndroid Build Coastguard Worker }
1381*f81fb7c4SAndroid Build Coastguard Worker }
1382*f81fb7c4SAndroid Build Coastguard Worker
1383*f81fb7c4SAndroid Build Coastguard Worker /* if we were paused and not going to resume, set pause request flag */
1384*f81fb7c4SAndroid Build Coastguard Worker if (((state == EAS_STATE_PAUSING) || (state == EAS_STATE_PAUSED)) && ((pStream->streamFlags & STREAM_FLAGS_RESUME) == 0))
1385*f81fb7c4SAndroid Build Coastguard Worker pStream->streamFlags |= STREAM_FLAGS_PAUSE;
1386*f81fb7c4SAndroid Build Coastguard Worker
1387*f81fb7c4SAndroid Build Coastguard Worker /* reset the synth and parser */
1388*f81fb7c4SAndroid Build Coastguard Worker if ((result = (*pParserModule->pfReset)(pEASData, pStream->handle)) != EAS_SUCCESS)
1389*f81fb7c4SAndroid Build Coastguard Worker return result;
1390*f81fb7c4SAndroid Build Coastguard Worker pStream->time = 0;
1391*f81fb7c4SAndroid Build Coastguard Worker
1392*f81fb7c4SAndroid Build Coastguard Worker /* locating forward, clear parsed flag and parse data until we get to the requested location */
1393*f81fb7c4SAndroid Build Coastguard Worker if ((result = EAS_ParseEvents(pEASData, pStream, requestedTime << 8, eParserModeLocate)) != EAS_SUCCESS)
1394*f81fb7c4SAndroid Build Coastguard Worker return result;
1395*f81fb7c4SAndroid Build Coastguard Worker
1396*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
1397*f81fb7c4SAndroid Build Coastguard Worker }
1398*f81fb7c4SAndroid Build Coastguard Worker
1399*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1400*f81fb7c4SAndroid Build Coastguard Worker * EAS_GetLocation()
1401*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1402*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
1403*f81fb7c4SAndroid Build Coastguard Worker * Returns the current playback offset
1404*f81fb7c4SAndroid Build Coastguard Worker *
1405*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
1406*f81fb7c4SAndroid Build Coastguard Worker * pEASData - pointer to overall EAS data structure
1407*f81fb7c4SAndroid Build Coastguard Worker * handle - file handle
1408*f81fb7c4SAndroid Build Coastguard Worker *
1409*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
1410*f81fb7c4SAndroid Build Coastguard Worker * The offset in milliseconds from the start of the current sequence, quantized
1411*f81fb7c4SAndroid Build Coastguard Worker * to the nearest update period. Actual resolution is typically 5.9 ms.
1412*f81fb7c4SAndroid Build Coastguard Worker *
1413*f81fb7c4SAndroid Build Coastguard Worker * Side Effects:
1414*f81fb7c4SAndroid Build Coastguard Worker *
1415*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1416*f81fb7c4SAndroid Build Coastguard Worker */
1417*f81fb7c4SAndroid Build Coastguard Worker /*lint -esym(715, pEASData) reserved for future use */
EAS_GetLocation(EAS_DATA_HANDLE pEASData,EAS_HANDLE pStream,EAS_I32 * pTime)1418*f81fb7c4SAndroid Build Coastguard Worker EAS_PUBLIC EAS_RESULT EAS_GetLocation (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream, EAS_I32 *pTime)
1419*f81fb7c4SAndroid Build Coastguard Worker {
1420*f81fb7c4SAndroid Build Coastguard Worker if (!EAS_StreamReady(pEASData, pStream))
1421*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
1422*f81fb7c4SAndroid Build Coastguard Worker
1423*f81fb7c4SAndroid Build Coastguard Worker *pTime = pStream->time >> 8;
1424*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
1425*f81fb7c4SAndroid Build Coastguard Worker }
1426*f81fb7c4SAndroid Build Coastguard Worker
1427*f81fb7c4SAndroid Build Coastguard Worker #ifdef JET_INTERFACE
1428*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1429*f81fb7c4SAndroid Build Coastguard Worker * EAS_Pause()
1430*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1431*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
1432*f81fb7c4SAndroid Build Coastguard Worker * Pauses the playback of the data associated with this handle. The audio
1433*f81fb7c4SAndroid Build Coastguard Worker * is gracefully ramped down to prevent clicks and pops. It may take several
1434*f81fb7c4SAndroid Build Coastguard Worker * buffers of audio before the audio is muted.
1435*f81fb7c4SAndroid Build Coastguard Worker *
1436*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
1437*f81fb7c4SAndroid Build Coastguard Worker * psEASData - pointer to overall EAS data structure
1438*f81fb7c4SAndroid Build Coastguard Worker * handle - file or stream handle
1439*f81fb7c4SAndroid Build Coastguard Worker *
1440*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
1441*f81fb7c4SAndroid Build Coastguard Worker *
1442*f81fb7c4SAndroid Build Coastguard Worker *
1443*f81fb7c4SAndroid Build Coastguard Worker * Side Effects:
1444*f81fb7c4SAndroid Build Coastguard Worker *
1445*f81fb7c4SAndroid Build Coastguard Worker *
1446*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1447*f81fb7c4SAndroid Build Coastguard Worker */
EAS_Pause(EAS_DATA_HANDLE pEASData,EAS_HANDLE pStream)1448*f81fb7c4SAndroid Build Coastguard Worker EAS_PUBLIC EAS_RESULT EAS_Pause (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream)
1449*f81fb7c4SAndroid Build Coastguard Worker {
1450*f81fb7c4SAndroid Build Coastguard Worker S_FILE_PARSER_INTERFACE *pParserModule;
1451*f81fb7c4SAndroid Build Coastguard Worker EAS_STATE state;
1452*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
1453*f81fb7c4SAndroid Build Coastguard Worker
1454*f81fb7c4SAndroid Build Coastguard Worker pParserModule = (S_FILE_PARSER_INTERFACE*) pStream->pParserModule;
1455*f81fb7c4SAndroid Build Coastguard Worker if (pParserModule == NULL)
1456*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_FEATURE_NOT_AVAILABLE;
1457*f81fb7c4SAndroid Build Coastguard Worker
1458*f81fb7c4SAndroid Build Coastguard Worker /* check for valid state */
1459*f81fb7c4SAndroid Build Coastguard Worker result = pParserModule->pfState(pEASData, pStream->handle, &state);
1460*f81fb7c4SAndroid Build Coastguard Worker if (result == EAS_SUCCESS)
1461*f81fb7c4SAndroid Build Coastguard Worker {
1462*f81fb7c4SAndroid Build Coastguard Worker if ((state != EAS_STATE_PLAY) && (state != EAS_STATE_READY) && ((pStream->streamFlags & STREAM_FLAGS_RESUME) == 0))
1463*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
1464*f81fb7c4SAndroid Build Coastguard Worker
1465*f81fb7c4SAndroid Build Coastguard Worker /* make sure parser implements pause */
1466*f81fb7c4SAndroid Build Coastguard Worker if (pParserModule->pfPause == NULL)
1467*f81fb7c4SAndroid Build Coastguard Worker result = EAS_ERROR_NOT_IMPLEMENTED;
1468*f81fb7c4SAndroid Build Coastguard Worker
1469*f81fb7c4SAndroid Build Coastguard Worker /* clear resume flag */
1470*f81fb7c4SAndroid Build Coastguard Worker pStream->streamFlags &= ~STREAM_FLAGS_RESUME;
1471*f81fb7c4SAndroid Build Coastguard Worker
1472*f81fb7c4SAndroid Build Coastguard Worker /* set pause flag */
1473*f81fb7c4SAndroid Build Coastguard Worker pStream->streamFlags |= STREAM_FLAGS_PAUSE;
1474*f81fb7c4SAndroid Build Coastguard Worker
1475*f81fb7c4SAndroid Build Coastguard Worker #if 0
1476*f81fb7c4SAndroid Build Coastguard Worker /* pause the stream */
1477*f81fb7c4SAndroid Build Coastguard Worker if (pParserModule->pfPause)
1478*f81fb7c4SAndroid Build Coastguard Worker result = pParserModule->pfPause(pEASData, pStream->handle);
1479*f81fb7c4SAndroid Build Coastguard Worker else
1480*f81fb7c4SAndroid Build Coastguard Worker result = EAS_ERROR_NOT_IMPLEMENTED;
1481*f81fb7c4SAndroid Build Coastguard Worker #endif
1482*f81fb7c4SAndroid Build Coastguard Worker }
1483*f81fb7c4SAndroid Build Coastguard Worker
1484*f81fb7c4SAndroid Build Coastguard Worker return result;
1485*f81fb7c4SAndroid Build Coastguard Worker }
1486*f81fb7c4SAndroid Build Coastguard Worker
1487*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1488*f81fb7c4SAndroid Build Coastguard Worker * EAS_Resume()
1489*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1490*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
1491*f81fb7c4SAndroid Build Coastguard Worker * Resumes the playback of the data associated with this handle. The audio
1492*f81fb7c4SAndroid Build Coastguard Worker * is gracefully ramped up to prevent clicks and pops.
1493*f81fb7c4SAndroid Build Coastguard Worker *
1494*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
1495*f81fb7c4SAndroid Build Coastguard Worker * psEASData - pointer to overall EAS data structure
1496*f81fb7c4SAndroid Build Coastguard Worker * handle - file or stream handle
1497*f81fb7c4SAndroid Build Coastguard Worker *
1498*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
1499*f81fb7c4SAndroid Build Coastguard Worker *
1500*f81fb7c4SAndroid Build Coastguard Worker *
1501*f81fb7c4SAndroid Build Coastguard Worker * Side Effects:
1502*f81fb7c4SAndroid Build Coastguard Worker *
1503*f81fb7c4SAndroid Build Coastguard Worker *
1504*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1505*f81fb7c4SAndroid Build Coastguard Worker */
EAS_Resume(EAS_DATA_HANDLE pEASData,EAS_HANDLE pStream)1506*f81fb7c4SAndroid Build Coastguard Worker EAS_PUBLIC EAS_RESULT EAS_Resume (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream)
1507*f81fb7c4SAndroid Build Coastguard Worker {
1508*f81fb7c4SAndroid Build Coastguard Worker S_FILE_PARSER_INTERFACE *pParserModule;
1509*f81fb7c4SAndroid Build Coastguard Worker EAS_STATE state;
1510*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
1511*f81fb7c4SAndroid Build Coastguard Worker
1512*f81fb7c4SAndroid Build Coastguard Worker pParserModule = (S_FILE_PARSER_INTERFACE*) pStream->pParserModule;
1513*f81fb7c4SAndroid Build Coastguard Worker if (pParserModule == NULL)
1514*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_FEATURE_NOT_AVAILABLE;
1515*f81fb7c4SAndroid Build Coastguard Worker
1516*f81fb7c4SAndroid Build Coastguard Worker /* check for valid state */
1517*f81fb7c4SAndroid Build Coastguard Worker result = pParserModule->pfState(pEASData, pStream->handle, &state);
1518*f81fb7c4SAndroid Build Coastguard Worker if (result == EAS_SUCCESS)
1519*f81fb7c4SAndroid Build Coastguard Worker {
1520*f81fb7c4SAndroid Build Coastguard Worker if ((state != EAS_STATE_PAUSED) && (state != EAS_STATE_PAUSING) && ((pStream->streamFlags & STREAM_FLAGS_PAUSE) == 0))
1521*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
1522*f81fb7c4SAndroid Build Coastguard Worker
1523*f81fb7c4SAndroid Build Coastguard Worker /* make sure parser implements this function */
1524*f81fb7c4SAndroid Build Coastguard Worker if (pParserModule->pfResume == NULL)
1525*f81fb7c4SAndroid Build Coastguard Worker result = EAS_ERROR_NOT_IMPLEMENTED;
1526*f81fb7c4SAndroid Build Coastguard Worker
1527*f81fb7c4SAndroid Build Coastguard Worker /* clear pause flag */
1528*f81fb7c4SAndroid Build Coastguard Worker pStream->streamFlags &= ~STREAM_FLAGS_PAUSE;
1529*f81fb7c4SAndroid Build Coastguard Worker
1530*f81fb7c4SAndroid Build Coastguard Worker /* set resume flag */
1531*f81fb7c4SAndroid Build Coastguard Worker pStream->streamFlags |= STREAM_FLAGS_RESUME;
1532*f81fb7c4SAndroid Build Coastguard Worker
1533*f81fb7c4SAndroid Build Coastguard Worker #if 0
1534*f81fb7c4SAndroid Build Coastguard Worker /* resume the stream */
1535*f81fb7c4SAndroid Build Coastguard Worker if (pParserModule->pfResume)
1536*f81fb7c4SAndroid Build Coastguard Worker result = pParserModule->pfResume(pEASData, pStream->handle);
1537*f81fb7c4SAndroid Build Coastguard Worker else
1538*f81fb7c4SAndroid Build Coastguard Worker result = EAS_ERROR_NOT_IMPLEMENTED;
1539*f81fb7c4SAndroid Build Coastguard Worker #endif
1540*f81fb7c4SAndroid Build Coastguard Worker }
1541*f81fb7c4SAndroid Build Coastguard Worker
1542*f81fb7c4SAndroid Build Coastguard Worker return result;
1543*f81fb7c4SAndroid Build Coastguard Worker }
1544*f81fb7c4SAndroid Build Coastguard Worker #endif
1545*f81fb7c4SAndroid Build Coastguard Worker
1546*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1547*f81fb7c4SAndroid Build Coastguard Worker * EAS_SetParameter()
1548*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1549*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
1550*f81fb7c4SAndroid Build Coastguard Worker * Set the parameter of a module. See E_MODULES for a list of modules
1551*f81fb7c4SAndroid Build Coastguard Worker * and the header files of the modules for a list of parameters.
1552*f81fb7c4SAndroid Build Coastguard Worker *
1553*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
1554*f81fb7c4SAndroid Build Coastguard Worker * psEASData - pointer to overall EAS data structure
1555*f81fb7c4SAndroid Build Coastguard Worker * handle - file or stream handle
1556*f81fb7c4SAndroid Build Coastguard Worker * module - enumerated module number
1557*f81fb7c4SAndroid Build Coastguard Worker * param - enumerated parameter number
1558*f81fb7c4SAndroid Build Coastguard Worker * value - new parameter value
1559*f81fb7c4SAndroid Build Coastguard Worker *
1560*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
1561*f81fb7c4SAndroid Build Coastguard Worker *
1562*f81fb7c4SAndroid Build Coastguard Worker *
1563*f81fb7c4SAndroid Build Coastguard Worker * Side Effects:
1564*f81fb7c4SAndroid Build Coastguard Worker *
1565*f81fb7c4SAndroid Build Coastguard Worker *
1566*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1567*f81fb7c4SAndroid Build Coastguard Worker */
EAS_SetParameter(EAS_DATA_HANDLE pEASData,EAS_I32 module,EAS_I32 param,EAS_I32 value)1568*f81fb7c4SAndroid Build Coastguard Worker EAS_PUBLIC EAS_RESULT EAS_SetParameter (EAS_DATA_HANDLE pEASData, EAS_I32 module, EAS_I32 param, EAS_I32 value)
1569*f81fb7c4SAndroid Build Coastguard Worker {
1570*f81fb7c4SAndroid Build Coastguard Worker
1571*f81fb7c4SAndroid Build Coastguard Worker if (module >= NUM_EFFECTS_MODULES)
1572*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_INVALID_MODULE;
1573*f81fb7c4SAndroid Build Coastguard Worker
1574*f81fb7c4SAndroid Build Coastguard Worker if (pEASData->effectsModules[module].effectData == NULL)
1575*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_INVALID_MODULE;
1576*f81fb7c4SAndroid Build Coastguard Worker
1577*f81fb7c4SAndroid Build Coastguard Worker return (*pEASData->effectsModules[module].effect->pFSetParam)
1578*f81fb7c4SAndroid Build Coastguard Worker (pEASData->effectsModules[module].effectData, param, value);
1579*f81fb7c4SAndroid Build Coastguard Worker }
1580*f81fb7c4SAndroid Build Coastguard Worker
1581*f81fb7c4SAndroid Build Coastguard Worker #ifdef _METRICS_ENABLED
1582*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1583*f81fb7c4SAndroid Build Coastguard Worker * EAS_MetricsReport()
1584*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1585*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
1586*f81fb7c4SAndroid Build Coastguard Worker * Displays the current metrics through the metrics interface.
1587*f81fb7c4SAndroid Build Coastguard Worker *
1588*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
1589*f81fb7c4SAndroid Build Coastguard Worker * p - instance data handle
1590*f81fb7c4SAndroid Build Coastguard Worker *
1591*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
1592*f81fb7c4SAndroid Build Coastguard Worker *
1593*f81fb7c4SAndroid Build Coastguard Worker *
1594*f81fb7c4SAndroid Build Coastguard Worker * Side Effects:
1595*f81fb7c4SAndroid Build Coastguard Worker *
1596*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1597*f81fb7c4SAndroid Build Coastguard Worker */
EAS_MetricsReport(EAS_DATA_HANDLE pEASData)1598*f81fb7c4SAndroid Build Coastguard Worker EAS_PUBLIC EAS_RESULT EAS_MetricsReport (EAS_DATA_HANDLE pEASData)
1599*f81fb7c4SAndroid Build Coastguard Worker {
1600*f81fb7c4SAndroid Build Coastguard Worker if (!pEASData->pMetricsModule)
1601*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_INVALID_MODULE;
1602*f81fb7c4SAndroid Build Coastguard Worker
1603*f81fb7c4SAndroid Build Coastguard Worker return (*pEASData->pMetricsModule->pfReport)(pEASData->pMetricsData);
1604*f81fb7c4SAndroid Build Coastguard Worker }
1605*f81fb7c4SAndroid Build Coastguard Worker
1606*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1607*f81fb7c4SAndroid Build Coastguard Worker * EAS_MetricsReset()
1608*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1609*f81fb7c4SAndroid Build Coastguard Worker * Purpose:
1610*f81fb7c4SAndroid Build Coastguard Worker * Resets the metrics.
1611*f81fb7c4SAndroid Build Coastguard Worker *
1612*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
1613*f81fb7c4SAndroid Build Coastguard Worker * p - instance data handle
1614*f81fb7c4SAndroid Build Coastguard Worker *
1615*f81fb7c4SAndroid Build Coastguard Worker * Outputs:
1616*f81fb7c4SAndroid Build Coastguard Worker *
1617*f81fb7c4SAndroid Build Coastguard Worker *
1618*f81fb7c4SAndroid Build Coastguard Worker * Side Effects:
1619*f81fb7c4SAndroid Build Coastguard Worker *
1620*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1621*f81fb7c4SAndroid Build Coastguard Worker */
EAS_MetricsReset(EAS_DATA_HANDLE pEASData)1622*f81fb7c4SAndroid Build Coastguard Worker EAS_PUBLIC EAS_RESULT EAS_MetricsReset (EAS_DATA_HANDLE pEASData)
1623*f81fb7c4SAndroid Build Coastguard Worker {
1624*f81fb7c4SAndroid Build Coastguard Worker
1625*f81fb7c4SAndroid Build Coastguard Worker if (!pEASData->pMetricsModule)
1626*f81fb7c4SAndroid Build Coastguard Worker return EAS_ERROR_INVALID_MODULE;
1627*f81fb7c4SAndroid Build Coastguard Worker
1628*f81fb7c4SAndroid Build Coastguard Worker return (*pEASData->pMetricsModule->pfReset)(pEASData->pMetricsData);
1629*f81fb7c4SAndroid Build Coastguard Worker }
1630*f81fb7c4SAndroid Build Coastguard Worker #endif
1631*f81fb7c4SAndroid Build Coastguard Worker
1632*f81fb7c4SAndroid Build Coastguard Worker #ifdef FILE_HEADER_SEARCH
1633*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1634*f81fb7c4SAndroid Build Coastguard Worker * EAS_SearchFile
1635*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1636*f81fb7c4SAndroid Build Coastguard Worker * Search file for specific sequence starting at current file
1637*f81fb7c4SAndroid Build Coastguard Worker * position. Returns offset to start of sequence.
1638*f81fb7c4SAndroid Build Coastguard Worker *
1639*f81fb7c4SAndroid Build Coastguard Worker * Inputs:
1640*f81fb7c4SAndroid Build Coastguard Worker * pEASData - pointer to EAS persistent data object
1641*f81fb7c4SAndroid Build Coastguard Worker * fileHandle - file handle
1642*f81fb7c4SAndroid Build Coastguard Worker * searchString - pointer to search sequence
1643*f81fb7c4SAndroid Build Coastguard Worker * len - length of search sequence
1644*f81fb7c4SAndroid Build Coastguard Worker * pOffset - pointer to variable to store offset to sequence
1645*f81fb7c4SAndroid Build Coastguard Worker *
1646*f81fb7c4SAndroid Build Coastguard Worker * Returns EAS_EOF if end-of-file is reached
1647*f81fb7c4SAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1648*f81fb7c4SAndroid Build Coastguard Worker */
EAS_SearchFile(S_EAS_DATA * pEASData,EAS_FILE_HANDLE fileHandle,const EAS_U8 * searchString,EAS_I32 len,EAS_I32 * pOffset)1649*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT EAS_SearchFile (S_EAS_DATA *pEASData, EAS_FILE_HANDLE fileHandle, const EAS_U8 *searchString, EAS_I32 len, EAS_I32 *pOffset)
1650*f81fb7c4SAndroid Build Coastguard Worker {
1651*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT result;
1652*f81fb7c4SAndroid Build Coastguard Worker EAS_INT index;
1653*f81fb7c4SAndroid Build Coastguard Worker EAS_U8 c;
1654*f81fb7c4SAndroid Build Coastguard Worker
1655*f81fb7c4SAndroid Build Coastguard Worker *pOffset = -1;
1656*f81fb7c4SAndroid Build Coastguard Worker index = 0;
1657*f81fb7c4SAndroid Build Coastguard Worker for (;;)
1658*f81fb7c4SAndroid Build Coastguard Worker {
1659*f81fb7c4SAndroid Build Coastguard Worker result = EAS_HWGetByte(pEASData->hwInstData, fileHandle, &c);
1660*f81fb7c4SAndroid Build Coastguard Worker if (result != EAS_SUCCESS)
1661*f81fb7c4SAndroid Build Coastguard Worker return result;
1662*f81fb7c4SAndroid Build Coastguard Worker if (c == searchString[index])
1663*f81fb7c4SAndroid Build Coastguard Worker {
1664*f81fb7c4SAndroid Build Coastguard Worker index++;
1665*f81fb7c4SAndroid Build Coastguard Worker if (index == 4)
1666*f81fb7c4SAndroid Build Coastguard Worker {
1667*f81fb7c4SAndroid Build Coastguard Worker result = EAS_HWFilePos(pEASData->hwInstData, fileHandle, pOffset);
1668*f81fb7c4SAndroid Build Coastguard Worker if (result != EAS_SUCCESS)
1669*f81fb7c4SAndroid Build Coastguard Worker return result;
1670*f81fb7c4SAndroid Build Coastguard Worker *pOffset -= len;
1671*f81fb7c4SAndroid Build Coastguard Worker break;
1672*f81fb7c4SAndroid Build Coastguard Worker }
1673*f81fb7c4SAndroid Build Coastguard Worker }
1674*f81fb7c4SAndroid Build Coastguard Worker else
1675*f81fb7c4SAndroid Build Coastguard Worker index = 0;
1676*f81fb7c4SAndroid Build Coastguard Worker }
1677*f81fb7c4SAndroid Build Coastguard Worker return EAS_SUCCESS;
1678*f81fb7c4SAndroid Build Coastguard Worker }
1679*f81fb7c4SAndroid Build Coastguard Worker #endif
1680*f81fb7c4SAndroid Build Coastguard Worker
1681*f81fb7c4SAndroid Build Coastguard Worker
1682