156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * File:
456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * eas_public.c
556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Contents and purpose:
756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Contains EAS library public interface
856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Copyright Sonic Network Inc. 2004
107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * you may not use this file except in compliance with the License.
137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * You may obtain a copy of the License at
147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * See the License for the specific language governing permissions and
217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * limitations under the License.
2256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
2356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
2456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Revision Control:
2556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *   $Revision: 842 $
2656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *   $Date: 2007-08-23 14:32:31 -0700 (Thu, 23 Aug 2007) $
2756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
2856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
2956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
3056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_synthcfg.h"
3156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas.h"
3256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_config.h"
3356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_host.h"
3456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_report.h"
3556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_data.h"
3656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_parser.h"
3756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_pcm.h"
3856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_midi.h"
3956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_mixer.h"
4056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_build.h"
4156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_vm_protos.h"
4256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_math.h"
4356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
4456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef JET_INTERFACE
4556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "jet_data.h"
4656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
4756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
4856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef DLS_SYNTHESIZER
4956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_mdls.h"
5056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
5156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
5256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* number of events to parse before calling EAS_HWYield function */
5356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define YIELD_EVENT_COUNT       10
5456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
5556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
5656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * easLibConfig
5756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
5856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * This structure is available through the EAS public interface to allow
5956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * the user to check the configuration of the library.
6056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
6156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
6256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic const S_EAS_LIB_CONFIG easLibConfig =
6356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
6456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    LIB_VERSION,
6556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _CHECKED_BUILD
6656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_TRUE,
6756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#else
6856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_FALSE,
6956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
7056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    MAX_SYNTH_VOICES,
7156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    NUM_OUTPUT_CHANNELS,
7256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    _OUTPUT_SAMPLE_RATE,
7356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    BUFFER_SIZE_IN_MONO_SAMPLES,
7456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _FILTER_ENABLED
7556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_TRUE,
7656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#else
7756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_FALSE,
7856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
7956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    _BUILD_TIME_,
8056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    _BUILD_VERSION_
8156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks};
8256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
8356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* local prototypes */
8456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT EAS_ParseEvents (S_EAS_DATA *pEASData, S_EAS_STREAM *pStream, EAS_U32 endTime, EAS_INT parseMode);
8556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
8656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
8756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_SetStreamParameter
8856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
8956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Sets the specified parameter in the stream. Allows access to
9056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * customizable settings within the individual file parsers.
9156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
9256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to EAS persistent data object
9356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pStream          - stream handle
9456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * param            - enumerated parameter (see eas_parser.h)
9556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * value            - new value
9656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
9756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
9856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_SetStreamParameter (S_EAS_DATA *pEASData, EAS_HANDLE pStream, EAS_I32 param, EAS_I32 value)
9956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
10056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_FILE_PARSER_INTERFACE *pParserModule;
10156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
10256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pParserModule = (S_FILE_PARSER_INTERFACE*) pStream->pParserModule;
10356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pParserModule->pfSetData)
10456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return (*pParserModule->pfSetData)(pEASData, pStream->handle, param, value);
10556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_ERROR_FEATURE_NOT_AVAILABLE;
10656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
10756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
10856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
10956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_GetStreamParameter
11056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
11156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Sets the specified parameter in the stream. Allows access to
11256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * customizable settings within the individual file parsers.
11356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
11456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to EAS persistent data object
11556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pStream          - stream handle
11656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * param            - enumerated parameter (see eas_parser.h)
11756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pValue           - pointer to variable to receive current setting
11856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
11956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
12056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_GetStreamParameter (S_EAS_DATA *pEASData, EAS_HANDLE pStream, EAS_I32 param, EAS_I32 *pValue)
12156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
12256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_FILE_PARSER_INTERFACE *pParserModule;
12356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
12456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pParserModule = (S_FILE_PARSER_INTERFACE*) pStream->pParserModule;
12556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pParserModule->pfGetData)
12656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return (*pParserModule->pfGetData)(pEASData, pStream->handle, param, pValue);
12756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_ERROR_FEATURE_NOT_AVAILABLE;
12856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
12956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
13056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
13156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_StreamReady()
13256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
13356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * This routine sets common parameters like transpose, volume, etc.
13456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * First, it attempts to use the parser EAS_SetStreamParameter interface. If that
13556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * fails, it attempts to get the synth handle from the parser and
13656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * set the parameter directly on the synth. This eliminates duplicate
13756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * code in the parser.
13856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
13956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
14056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_BOOL EAS_StreamReady (S_EAS_DATA *pEASData, EAS_HANDLE pStream)
14156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
14256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_FILE_PARSER_INTERFACE *pParserModule;
14356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_STATE state;
14456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
14556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pParserModule = (S_FILE_PARSER_INTERFACE*) pStream->pParserModule;
14656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pParserModule->pfState(pEASData, pStream->handle, &state) != EAS_SUCCESS)
14756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_FALSE;
14856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return (state < EAS_STATE_OPEN);
14956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
15056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
15156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
15256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_IntSetStrmParam()
15356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
15456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * This routine sets common parameters like transpose, volume, etc.
15556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * First, it attempts to use the parser EAS_SetStreamParameter interface. If that
15656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * fails, it attempts to get the synth handle from the parser and
15756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * set the parameter directly on the synth. This eliminates duplicate
15856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * code in the parser.
15956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
16056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
16156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_IntSetStrmParam (S_EAS_DATA *pEASData, EAS_HANDLE pStream, EAS_INT param, EAS_I32 value)
16256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
16356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_SYNTH *pSynth;
16456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
16556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* try to set the parameter using stream interface */
16656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (EAS_SetStreamParameter(pEASData, pStream, param, value) == EAS_SUCCESS)
16756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_SUCCESS;
16856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
16956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get a pointer to the synth object and set it directly */
17056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e{740} we are cheating by passing a pointer through this interface */
17156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (EAS_GetStreamParameter(pEASData, pStream, PARSER_DATA_SYNTH_HANDLE, (EAS_I32*) &pSynth) != EAS_SUCCESS)
17256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_INVALID_PARAMETER;
17356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
17456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pSynth == NULL)
17556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_INVALID_PARAMETER;
17656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
17756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    switch (param)
17856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
17956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
18056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef DLS_SYNTHESIZER
18156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_DLS_COLLECTION:
18256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
18356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                EAS_RESULT result = VMSetDLSLib(pSynth, (EAS_DLSLIB_HANDLE) value);
18456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (result == EAS_SUCCESS)
18556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
18656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    DLSAddRef((S_DLS*) value);
18756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    VMInitializeAllChannels(pEASData->pVoiceMgr, pSynth);
18856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
18956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
19056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
19156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
19256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
19356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_EAS_LIBRARY:
19456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return VMSetEASLib(pSynth, (EAS_SNDLIB_HANDLE) value);
19556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
19656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_POLYPHONY:
19756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return VMSetPolyphony(pEASData->pVoiceMgr, pSynth, value);
19856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
19956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_PRIORITY:
20056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return VMSetPriority(pEASData->pVoiceMgr, pSynth, value);
20156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
20256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_TRANSPOSITION:
20356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            VMSetTranposition(pSynth, value);
20456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
20556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
20656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_VOLUME:
20756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            VMSetVolume(pSynth, (EAS_U16) value);
20856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
20956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
21056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        default:
21156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Invalid paramter %d in call to EAS_IntSetStrmParam", param); */ }
21256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_INVALID_PARAMETER;
21356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
21456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
21556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
21656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
21756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
21856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
21956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_IntGetStrmParam()
22056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
22156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * This routine gets common parameters like transpose, volume, etc.
22256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * First, it attempts to use the parser EAS_GetStreamParameter interface. If that
22356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * fails, it attempts to get the synth handle from the parser and
22456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * get the parameter directly on the synth.
22556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
22656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
22756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_IntGetStrmParam (S_EAS_DATA *pEASData, EAS_HANDLE pStream, EAS_INT param, EAS_I32 *pValue)
22856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
22956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_SYNTH *pSynth;
23056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
23156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* try to set the parameter */
23256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (EAS_GetStreamParameter(pEASData, pStream, param, pValue) == EAS_SUCCESS)
23356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_SUCCESS;
23456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
23556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get a pointer to the synth object and retrieve data directly */
23656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e{740} we are cheating by passing a pointer through this interface */
23756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (EAS_GetStreamParameter(pEASData, pStream, PARSER_DATA_SYNTH_HANDLE, (EAS_I32*) &pSynth) != EAS_SUCCESS)
23856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_INVALID_PARAMETER;
23956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
24056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pSynth == NULL)
24156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_INVALID_PARAMETER;
24256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
24356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    switch (param)
24456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
24556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_POLYPHONY:
24656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return VMGetPolyphony(pEASData->pVoiceMgr, pSynth, pValue);
24756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
24856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_PRIORITY:
24956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return VMGetPriority(pEASData->pVoiceMgr, pSynth, pValue);
25056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
25156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_TRANSPOSITION:
25256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            VMGetTranposition(pSynth, pValue);
25356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
25456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
25556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_NOTE_COUNT:
25656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            *pValue = VMGetNoteCount(pSynth);
25756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
25856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
25956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        default:
26056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Invalid paramter %d in call to EAS_IntSetStrmParam", param); */ }
26156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_INVALID_PARAMETER;
26256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
26356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
26456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
26556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
26656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
26756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
26856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_AllocateStream()
26956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
27056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
27156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Allocates a stream handle
27256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
27356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
27456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
27556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
27656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
27756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
27856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
27956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_INT EAS_AllocateStream (EAS_DATA_HANDLE pEASData)
28056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
28156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT streamNum;
28256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
28356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check for static allocation, only one stream allowed */
28456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->staticMemoryModel)
28556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
28656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pEASData->streams[0].handle != NULL)
28756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
28856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Attempt to open multiple streams in static model\n"); */ }
28956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return -1;
29056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
29156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return 0;
29256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
29356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
29456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* dynamic model */
29556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (streamNum = 0; streamNum < MAX_NUMBER_STREAMS; streamNum++)
29656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pEASData->streams[streamNum].handle == NULL)
29756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
29856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (streamNum == MAX_NUMBER_STREAMS)
29956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
30056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Exceeded maximum number of open streams\n"); */ }
30156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return -1;
30256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
30356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return streamNum;
30456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
30556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
30656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
30756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_InitStream()
30856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
30956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
31056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Initialize a stream
31156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
31256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
31356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
31456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
31556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
31656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
31756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
31856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic void EAS_InitStream (S_EAS_STREAM *pStream, EAS_VOID_PTR pParserModule, EAS_VOID_PTR streamHandle)
31956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
32056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pStream->pParserModule = pParserModule;
32156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pStream->handle = streamHandle;
32256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pStream->time = 0;
32356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pStream->frameLength = AUDIO_FRAME_LENGTH;
32456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pStream->repeatCount = 0;
32556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pStream->volume = DEFAULT_STREAM_VOLUME;
32656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
32756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
32856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
32956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_Config()
33056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
33156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
33256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns a pointer to a structure containing the configuration options
33356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * in this library build.
33456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
33556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
33656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
33756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
33856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
33956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
34056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
34156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC const S_EAS_LIB_CONFIG *EAS_Config (void)
34256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
34356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return &easLibConfig;
34456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
34556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
34656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
34756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_Init()
34856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
34956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
35056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Initialize the synthesizer library
35156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
35256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
35356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  ppEASData       - pointer to data handle variable for this instance
35456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
35556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
35656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
35756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
35856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
35956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_Init (EAS_DATA_HANDLE *ppEASData)
36056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
36156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_HW_DATA_HANDLE pHWInstData;
36256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
36356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_EAS_DATA *pEASData;
36456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT module;
36556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_BOOL staticMemoryModel;
36656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
36756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the memory model */
36856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    staticMemoryModel = EAS_CMStaticMemoryModel();
36956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
37056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* initialize the host wrapper interface */
37156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *ppEASData = NULL;
37256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWInit(&pHWInstData)) != EAS_SUCCESS)
37356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
37456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
37556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check Configuration Module for S_EAS_DATA allocation */
37656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (staticMemoryModel)
37756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pEASData = EAS_CMEnumData(EAS_CM_EAS_DATA);
37856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else
37956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pEASData = EAS_HWMalloc(pHWInstData, sizeof(S_EAS_DATA));
38056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!pEASData)
38156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
38256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_FATAL, "Failed to allocate EAS library memory\n"); */ }
38356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_MALLOC_FAILED;
38456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
38556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
38656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* initialize some data */
38756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_HWMemSet(pEASData, 0, sizeof(S_EAS_DATA));
38856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pEASData->staticMemoryModel = (EAS_BOOL8) staticMemoryModel;
38956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pEASData->hwInstData = pHWInstData;
39056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pEASData->renderTime = 0;
39156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
39256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* set header search flag */
39356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef FILE_HEADER_SEARCH
39456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pEASData->searchHeaderFlag = EAS_TRUE;
39556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
39656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
39756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* initalize parameters */
39856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_SetVolume(pEASData, NULL, DEFAULT_VOLUME);
39956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
40056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _METRICS_ENABLED
40156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* initalize the metrics module */
40256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pEASData->pMetricsModule = EAS_CMEnumOptModules(EAS_MODULE_METRICS);
40356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->pMetricsModule != NULL)
40456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
40556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = (*pEASData->pMetricsModule->pfInit)(pEASData, &pEASData->pMetricsData)) != EAS_SUCCESS)
40656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
40756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Error %ld initializing metrics module\n", result); */ }
40856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
40956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
41056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
41156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
41256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
41356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* initailize the voice manager & synthesizer */
41456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = VMInitialize(pEASData)) != EAS_SUCCESS)
41556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
41656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
41756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* initialize mix engine */
41856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_MixEngineInit(pEASData)) != EAS_SUCCESS)
41956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
42056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Error %ld starting up mix engine\n", result); */ }
42156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
42256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
42356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
42456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* initialize effects modules */
42556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (module = 0; module < NUM_EFFECTS_MODULES; module++)
42656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
42756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pEASData->effectsModules[module].effect = EAS_CMEnumFXModules(module);
42856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pEASData->effectsModules[module].effect != NULL)
42956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
43056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = (*pEASData->effectsModules[module].effect->pfInit)(pEASData, &pEASData->effectsModules[module].effectData)) != EAS_SUCCESS)
43156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
43256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                { /* dpp: EAS_ReportEx(_EAS_SEVERITY_FATAL, "Initialization of effects module %d returned %d\n", module, result); */ }
43356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
43456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
43556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
43656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
43756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
43856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* initialize PCM engine */
43956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_PEInit(pEASData)) != EAS_SUCCESS)
44056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
44156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_FATAL, "EAS_PEInit failed with error code %ld\n", result); */ }
44256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
44356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
44456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
44556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* return instance data pointer to host */
44656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *ppEASData = pEASData;
44756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
44856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
44956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
45056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
45156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
45256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_Shutdown()
45356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
45456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
45556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Shuts down the library. Deallocates any memory associated with the
45656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * synthesizer (dynamic memory model only)
45756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
45856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
45956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  pEASData        - handle to data for this instance
46056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
46156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
46256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
46356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
46456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
46556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_Shutdown (EAS_DATA_HANDLE pEASData)
46656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
46756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_HW_DATA_HANDLE hwInstData;
46856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result, reportResult;
46956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT i;
47056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
47156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* establish pointers */
47256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    hwInstData = pEASData->hwInstData;
47356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
47456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check for NULL handle */
47556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!pEASData)
47656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_HANDLE_INTEGRITY;
47756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
47856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if there are streams open, close them */
47956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    reportResult = EAS_SUCCESS;
48056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (i = 0; i < MAX_NUMBER_STREAMS; i++)
48156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
48256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pEASData->streams[i].pParserModule && pEASData->streams[i].handle)
48356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
48456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = (*((S_FILE_PARSER_INTERFACE*)(pEASData->streams[i].pParserModule))->pfClose)(pEASData, pEASData->streams[i].handle)) != EAS_SUCCESS)
48556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
48656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Error %ld shutting down parser module\n", result); */ }
48756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                reportResult = result;
48856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
48956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
49056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
49156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
49256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* shutdown PCM engine */
49356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_PEShutdown(pEASData)) != EAS_SUCCESS)
49456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
49556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Error %ld shutting down PCM engine\n", result); */ }
49656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (reportResult == EAS_SUCCESS)
49756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            reportResult = result;
49856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
49956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
50056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* shutdown mix engine */
50156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_MixEngineShutdown(pEASData)) != EAS_SUCCESS)
50256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
50356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Error %ld shutting down mix engine\n", result); */ }
50456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (reportResult == EAS_SUCCESS)
50556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            reportResult = result;
50656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
50756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
50856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* shutdown effects modules */
50956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (i = 0; i < NUM_EFFECTS_MODULES; i++)
51056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
51156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pEASData->effectsModules[i].effect)
51256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
51356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = (*pEASData->effectsModules[i].effect->pfShutdown)(pEASData, pEASData->effectsModules[i].effectData)) != EAS_SUCCESS)
51456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
51556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                { /* dpp: EAS_ReportEx(_EAS_SEVERITY_FATAL, "Shutdown of effects module %d returned %d\n", i, result); */ }
51656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (reportResult == EAS_SUCCESS)
51756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    reportResult = result;
51856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
51956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
52056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
52156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
52256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* shutdown the voice manager & synthesizer */
52356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    VMShutdown(pEASData);
52456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
52556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _METRICS_ENABLED
52656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* shutdown the metrics module */
52756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->pMetricsModule != NULL)
52856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
52956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = (*pEASData->pMetricsModule->pfShutdown)(pEASData, pEASData->pMetricsData)) != EAS_SUCCESS)
53056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
53156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Error %ld shutting down metrics module\n", result); */ }
53256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (reportResult == EAS_SUCCESS)
53356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                reportResult = result;
53456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
53556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
53656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
53756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
53856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* release allocated memory */
53956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!pEASData->staticMemoryModel)
54056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_HWFree(hwInstData, pEASData);
54156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
54256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* shutdown host wrappers */
54356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (hwInstData)
54456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
54556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWShutdown(hwInstData)) != EAS_SUCCESS)
54656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
54756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Error %ld shutting down host wrappers\n", result); */ }
54856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (reportResult == EAS_SUCCESS)
54956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                reportResult = result;
55056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
55156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
55256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
55356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return reportResult;
55456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
55556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
55656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef JET_INTERFACE
55756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
55856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_OpenJETStream()
55956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
56056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Private interface for JET to open an SMF stream with an offset
56156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
56256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
56356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_OpenJETStream (EAS_DATA_HANDLE pEASData, EAS_FILE_HANDLE fileHandle, EAS_I32 offset, EAS_HANDLE *ppStream)
56456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
56556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
56656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_VOID_PTR streamHandle;
56756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_FILE_PARSER_INTERFACE *pParserModule;
56856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT streamNum;
56956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
57056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* allocate a stream */
57156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((streamNum = EAS_AllocateStream(pEASData)) < 0)
57256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_MAX_STREAMS_OPEN;
57356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
57456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check Configuration Module for SMF parser */
57556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *ppStream = NULL;
57656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    streamHandle = NULL;
57756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pParserModule = (S_FILE_PARSER_INTERFACE *) EAS_CMEnumModules(0);
57856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pParserModule == NULL)
57956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_UNRECOGNIZED_FORMAT;
58056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
58156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* see if SMF parser recognizes the file */
58256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = (*pParserModule->pfCheckFileType)(pEASData, fileHandle, &streamHandle, offset)) != EAS_SUCCESS)
58356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
58456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "CheckFileType returned error %ld\n", result); */ }
58556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
58656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
58756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
58856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* parser recognized the file, return the handle */
58956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (streamHandle)
59056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
59156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_InitStream(&pEASData->streams[streamNum], pParserModule, streamHandle);
59256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        *ppStream = &pEASData->streams[streamNum];
59356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_SUCCESS;
59456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
59556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
59656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_ERROR_UNRECOGNIZED_FORMAT;
59756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
59856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
59956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
60056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
60156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_OpenFile()
60256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
60356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
60456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Opens a file for audio playback.
60556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
60656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
60756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
60856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pHandle          - pointer to file handle
60956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
61056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
61156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
61256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
61356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
61456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
61556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
61656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
61756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_OpenFile (EAS_DATA_HANDLE pEASData, EAS_FILE_LOCATOR locator, EAS_HANDLE *ppStream)
61856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
61956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
62056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_FILE_HANDLE fileHandle;
62156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_VOID_PTR streamHandle;
62256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_FILE_PARSER_INTERFACE *pParserModule;
62356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT streamNum;
62456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT moduleNum;
62556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
62656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* open the file */
62756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWOpenFile(pEASData->hwInstData, locator, &fileHandle, EAS_FILE_READ)) != EAS_SUCCESS)
62856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
62956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
63056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* allocate a stream */
63156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((streamNum = EAS_AllocateStream(pEASData)) < 0)
63256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_MAX_STREAMS_OPEN;
63356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
63456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check Configuration Module for file parsers */
63556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pParserModule = NULL;
63656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *ppStream = NULL;
63756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    streamHandle = NULL;
63856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (moduleNum = 0; ; moduleNum++)
63956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
64056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pParserModule = (S_FILE_PARSER_INTERFACE *) EAS_CMEnumModules(moduleNum);
64156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pParserModule == NULL)
64256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
64356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
64456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* see if this parser recognizes it */
64556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = (*pParserModule->pfCheckFileType)(pEASData, fileHandle, &streamHandle, 0L)) != EAS_SUCCESS)
64656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
64756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "CheckFileType returned error %ld\n", result); */ }
64856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
64956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
65056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
65156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* parser recognized the file, return the handle */
65256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (streamHandle)
65356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
65456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
65556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* save the parser pointer and file handle */
65656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            EAS_InitStream(&pEASData->streams[streamNum], pParserModule, streamHandle);
65756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            *ppStream = &pEASData->streams[streamNum];
65856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_SUCCESS;
65956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
66056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
66156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* rewind the file for the next parser */
66256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWFileSeek(pEASData->hwInstData, fileHandle, 0L)) != EAS_SUCCESS)
66356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
66456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
66556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
66656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* no parser was able to recognize the file, close it and return an error */
66756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_HWCloseFile(pEASData->hwInstData, fileHandle);
66856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "No parser recognized the requested file\n"); */ }
66956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_ERROR_UNRECOGNIZED_FORMAT;
67056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
67156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
67256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef MMAPI_SUPPORT
67356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
67456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_MMAPIToneControl()
67556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
67656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
67756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Opens a ToneControl file for audio playback.
67856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
67956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
68056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
68156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pHandle          - pointer to file handle
68256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
68356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
68456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
68556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
68656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
68756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
68856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
68956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
69056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_MMAPIToneControl (EAS_DATA_HANDLE pEASData, EAS_FILE_LOCATOR locator, EAS_HANDLE *ppStream)
69156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
69256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
69356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_FILE_HANDLE fileHandle;
69456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_VOID_PTR streamHandle;
69556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_FILE_PARSER_INTERFACE *pParserModule;
69656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT streamNum;
69756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
69856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check if the tone control parser is available */
69956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *ppStream = NULL;
70056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    streamHandle = NULL;
70156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pParserModule = EAS_CMEnumOptModules(EAS_MODULE_MMAPI_TONE_CONTROL);
70256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pParserModule == NULL)
70356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
70456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "EAS_MMAPIToneControl: ToneControl parser not available\n"); */ }
70556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FEATURE_NOT_AVAILABLE;
70656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
70756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
70856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* open the file */
70956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWOpenFile(pEASData->hwInstData, locator, &fileHandle, EAS_FILE_READ)) != EAS_SUCCESS)
71056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
71156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
71256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* allocate a stream */
71356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((streamNum = EAS_AllocateStream(pEASData)) < 0)
71456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_MAX_STREAMS_OPEN;
71556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
71656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* see if ToneControl parser recognizes it */
71756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = (*pParserModule->pfCheckFileType)(pEASData, fileHandle, &streamHandle, 0L)) != EAS_SUCCESS)
71856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
71956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "CheckFileType returned error %ld\n", result); */ }
72056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
72156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
72256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
72356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* parser accepted the file, return the handle */
72456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (streamHandle)
72556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
72656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
72756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* save the parser pointer and file handle */
72856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_InitStream(&pEASData->streams[streamNum], pParserModule, streamHandle);
72956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        *ppStream = &pEASData->streams[streamNum];
73056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_SUCCESS;
73156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
73256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
73356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* parser did not recognize the file, close it and return an error */
73456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_HWCloseFile(pEASData->hwInstData, fileHandle);
73556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "No parser recognized the requested file\n"); */ }
73656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_ERROR_UNRECOGNIZED_FORMAT;
73756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
73856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
73956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
74056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_GetWaveFmtChunk
74156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
74256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Helper function to retrieve WAVE file fmt chunk for MMAPI
74356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
74456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to EAS persistent data object
74556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pStream          - stream handle
74656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pFmtChunk        - pointer to variable to receive current setting
74756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
74856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
74956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_GetWaveFmtChunk (S_EAS_DATA *pEASData, EAS_HANDLE pStream, EAS_VOID_PTR *ppFmtChunk)
75056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
75156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
75256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 value;
75356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
75456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_GetStreamParameter(pEASData, pStream, PARSER_DATA_FORMAT, &value)) != EAS_SUCCESS)
75556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
75656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *ppFmtChunk = (EAS_VOID_PTR) value;
75756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
75856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
75956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
76056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
76156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
76256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_GetFileType
76356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
76456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns the file type (see eas_types.h for enumerations)
76556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
76656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to EAS persistent data object
76756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pStream          - stream handle
76856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pFileType        - pointer to variable to receive file type
76956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
77056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
77156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_GetFileType (S_EAS_DATA *pEASData, EAS_HANDLE pStream, EAS_I32 *pFileType)
77256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
77356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!EAS_StreamReady (pEASData, pStream))
77456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
77556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_GetStreamParameter(pEASData, pStream, PARSER_DATA_FILE_TYPE, pFileType);
77656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
77756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
77856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
77956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_Prepare()
78056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
78156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
78256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Prepares the synthesizer to play the file or stream. Parses the first
78356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * frame of data from the file and arms the synthesizer.
78456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
78556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
78656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
78756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - file or stream handle
78856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
78956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
79056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
79156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
79256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
79356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
79456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
79556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
79656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_Prepare (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream)
79756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
79856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_FILE_PARSER_INTERFACE *pParserModule;
79956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_STATE state;
80056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
80156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
80256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pParserModule = (S_FILE_PARSER_INTERFACE*) pStream->pParserModule;
80356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pParserModule == NULL)
80456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FEATURE_NOT_AVAILABLE;
80556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
80656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check for valid state */
80756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    result = pParserModule->pfState(pEASData, pStream->handle, &state);
80856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (result == EAS_SUCCESS)
80956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
81056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* prepare the stream */
81156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (state == EAS_STATE_OPEN)
81256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
81356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pParserModule = (S_FILE_PARSER_INTERFACE*) pStream->pParserModule;
81456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            result = (*pParserModule->pfPrepare)(pEASData, pStream->handle);
81556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
81656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* set volume */
81756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (result == EAS_SUCCESS)
81856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                result = EAS_SetVolume(pEASData, pStream, pStream->volume);
81956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
82056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else
82156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            result = EAS_ERROR_NOT_VALID_IN_THIS_STATE;
82256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
82356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
82456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
82556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return result;
82656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
82756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
82856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
82956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_Render()
83056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
83156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
83256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Parse the Midi data and render PCM audio data.
83356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
83456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
83556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  pEASData        - buffer for internal EAS data
83656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  pOut            - output buffer pointer
83756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  nNumRequested   - requested num samples to generate
83856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  pnNumGenerated  - actual number of samples generated
83956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
84056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
84156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  EAS_SUCCESS if PCM data was successfully rendered
84256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
84356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
84456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
84556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_Render (EAS_DATA_HANDLE pEASData, EAS_PCM *pOut, EAS_I32 numRequested, EAS_I32 *pNumGenerated)
84656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
84756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_FILE_PARSER_INTERFACE *pParserModule;
84856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
84956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 voicesRendered;
85056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_STATE parserState;
85156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT streamNum;
85256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
85356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* assume no samples generated and reset workload */
85456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pNumGenerated = 0;
85556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    VMInitWorkload(pEASData->pVoiceMgr);
85656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
85756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* no support for other buffer sizes yet */
85856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (numRequested != BUFFER_SIZE_IN_MONO_SAMPLES)
85956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
86056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "This library supports only %ld samples in buffer, host requested %ld samples\n",
86156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (EAS_I32) BUFFER_SIZE_IN_MONO_SAMPLES, numRequested); */ }
86256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_BUFFER_SIZE_MISMATCH;
86356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
86456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
86556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _METRICS_ENABLED
86656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* start performance counter */
86756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->pMetricsData)
86856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        (*pEASData->pMetricsModule->pfStartTimer)(pEASData->pMetricsData, EAS_PM_TOTAL_TIME);
86956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
87056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
87156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* prep the frame buffer, do mix engine prep only if TRUE */
87256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _SPLIT_ARCHITECTURE
87356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (VMStartFrame(pEASData))
87456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_MixEnginePrep(pEASData, numRequested);
87556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#else
87656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* prep the mix engine */
87756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_MixEnginePrep(pEASData, numRequested);
87856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
87956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
88056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* save the output buffer pointer */
88156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pEASData->pOutputAudioBuffer = pOut;
88256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
88356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
88456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _METRICS_ENABLED
88556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* start performance counter */
88656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pEASData->pMetricsData)
88756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (*pEASData->pMetricsModule->pfStartTimer)(pEASData->pMetricsData, EAS_PM_PARSE_TIME);
88856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
88956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
89056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if we haven't finished parsing from last time, do it now */
89156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* need to parse another frame of events before we render again */
89256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (streamNum = 0; streamNum < MAX_NUMBER_STREAMS; streamNum++)
89356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
89456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* clear the locate flag */
89556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pEASData->streams[streamNum].streamFlags &= ~STREAM_FLAGS_LOCATE;
89656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
89756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pEASData->streams[streamNum].pParserModule)
89856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
89956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
90056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* establish pointer to parser module */
90156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pParserModule = pEASData->streams[streamNum].pParserModule;
90256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
90356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* handle pause */
90456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (pEASData->streams[streamNum].streamFlags & STREAM_FLAGS_PAUSE)
90556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
90656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (pParserModule->pfPause)
90756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    result = pParserModule->pfPause(pEASData, pEASData->streams[streamNum].handle);
90856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pEASData->streams[streamNum].streamFlags &= ~STREAM_FLAGS_PAUSE;
90956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
91056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
91156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* get current state */
91256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = (*pParserModule->pfState)(pEASData, pEASData->streams[streamNum].handle, &parserState)) != EAS_SUCCESS)
91356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
91456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
91556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* handle resume */
91656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (parserState == EAS_STATE_PAUSED)
91756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
91856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (pEASData->streams[streamNum].streamFlags & STREAM_FLAGS_RESUME)
91956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
92056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    if (pParserModule->pfResume)
92156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        result = pParserModule->pfResume(pEASData, pEASData->streams[streamNum].handle);
92256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    pEASData->streams[streamNum].streamFlags &= ~STREAM_FLAGS_RESUME;
92356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
92456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
92556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
92656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* if necessary, parse stream */
92756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((pEASData->streams[streamNum].streamFlags & STREAM_FLAGS_PARSED) == 0)
92856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if ((result = EAS_ParseEvents(pEASData, &pEASData->streams[streamNum], pEASData->streams[streamNum].time + pEASData->streams[streamNum].frameLength, eParserModePlay)) != EAS_SUCCESS)
92956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return result;
93056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
93156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* check for an early abort */
93256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((pEASData->streams[streamNum].streamFlags) == 0)
93356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
93456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
93556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _METRICS_ENABLED
93656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                /* stop performance counter */
93756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (pEASData->pMetricsData)
93856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    (*pEASData->pMetricsModule->pfStartTimer)(pEASData->pMetricsData, EAS_PM_TOTAL_TIME);
93956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
94056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
94156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return EAS_SUCCESS;
94256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
94356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
94456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* check for repeat */
94556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (pEASData->streams[streamNum].repeatCount)
94656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
94756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
94856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                /* check for stopped state */
94956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if ((result = (*pParserModule->pfState)(pEASData, pEASData->streams[streamNum].handle, &parserState)) != EAS_SUCCESS)
95056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return result;
95156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (parserState == EAS_STATE_STOPPED)
95256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
95356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
95456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    /* decrement repeat count, unless it is negative */
95556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    if (pEASData->streams[streamNum].repeatCount > 0)
95656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        pEASData->streams[streamNum].repeatCount--;
95756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
95856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    /* reset the parser */
95956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    if ((result = (*pParserModule->pfReset)(pEASData, pEASData->streams[streamNum].handle)) != EAS_SUCCESS)
96056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        return result;
96156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    pEASData->streams[streamNum].time = 0;
96256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
96356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
96456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
96556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
96656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
96756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _METRICS_ENABLED
96856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* stop performance counter */
96956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->pMetricsData)
97056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        (void)(*pEASData->pMetricsModule->pfStopTimer)(pEASData->pMetricsData, EAS_PM_PARSE_TIME);
97156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
97256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
97356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _METRICS_ENABLED
97456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* start the render timer */
97556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->pMetricsData)
97656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        (*pEASData->pMetricsModule->pfStartTimer)(pEASData->pMetricsData, EAS_PM_RENDER_TIME);
97756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
97856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
97956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* render audio */
98056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = VMRender(pEASData->pVoiceMgr, BUFFER_SIZE_IN_MONO_SAMPLES, pEASData->pMixBuffer, &voicesRendered)) != EAS_SUCCESS)
98156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
98256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "pfRender function returned error %ld\n", result); */ }
98356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
98456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
98556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
98656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _METRICS_ENABLED
98756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* stop the render timer */
98856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->pMetricsData) {
98956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        (*pEASData->pMetricsModule->pfIncrementCounter)(pEASData->pMetricsData, EAS_PM_FRAME_COUNT, 1);
99056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        (void)(*pEASData->pMetricsModule->pfStopTimer)(pEASData->pMetricsData, EAS_PM_RENDER_TIME);
99156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        (*pEASData->pMetricsModule->pfIncrementCounter)(pEASData->pMetricsData, EAS_PM_TOTAL_VOICE_COUNT, (EAS_U32) voicesRendered);
99256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        (void)(*pEASData->pMetricsModule->pfRecordMaxValue)(pEASData->pMetricsData, EAS_PM_MAX_VOICES, (EAS_U32) voicesRendered);
99356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
99456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
99556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
99656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //2 Do we really need frameParsed?
99756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* need to parse another frame of events before we render again */
99856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (streamNum = 0; streamNum < MAX_NUMBER_STREAMS; streamNum++)
99956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pEASData->streams[streamNum].pParserModule != NULL)
100056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pEASData->streams[streamNum].streamFlags &= ~STREAM_FLAGS_PARSED;
100156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
100256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _METRICS_ENABLED
100356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* start performance counter */
100456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->pMetricsData)
100556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        (*pEASData->pMetricsModule->pfStartTimer)(pEASData->pMetricsData, EAS_PM_STREAM_TIME);
100656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
100756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
100856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* render PCM audio */
100956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_PERender(pEASData, numRequested)) != EAS_SUCCESS)
101056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
101156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "EAS_PERender returned error %ld\n", result); */ }
101256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
101356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
101456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
101556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _METRICS_ENABLED
101656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* stop the stream timer */
101756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->pMetricsData)
101856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        (void)(*pEASData->pMetricsModule->pfStopTimer)(pEASData->pMetricsData, EAS_PM_STREAM_TIME);
101956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
102056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
102156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _METRICS_ENABLED
102256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* start the post timer */
102356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->pMetricsData)
102456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        (*pEASData->pMetricsModule->pfStartTimer)(pEASData->pMetricsData, EAS_PM_POST_TIME);
102556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
102656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
102756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* for split architecture, send DSP vectors.  Do post only if return is TRUE */
102856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _SPLIT_ARCHITECTURE
102956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (VMEndFrame(pEASData))
103056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
103156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* now do post-processing */
103256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_MixEnginePost(pEASData, numRequested);
103356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        *pNumGenerated = numRequested;
103456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
103556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#else
103656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* now do post-processing */
103756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_MixEnginePost(pEASData, numRequested);
103856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pNumGenerated = numRequested;
103956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
104056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
104156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _METRICS_ENABLED
104256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* stop the post timer */
104356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->pMetricsData)
104456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        (void)(*pEASData->pMetricsModule->pfStopTimer)(pEASData->pMetricsData, EAS_PM_POST_TIME);
104556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
104656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
104756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* advance render time */
104856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pEASData->renderTime += AUDIO_FRAME_LENGTH;
104956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
105056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#if 0
105156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* dump workload for debug */
105256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->pVoiceMgr->workload)
105356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Workload = %d\n", pEASData->pVoiceMgr->workload); */ }
105456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
105556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
105656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _METRICS_ENABLED
105756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* stop performance counter */
105856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->pMetricsData)
105956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
106056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        PERF_TIMER temp;
106156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        temp = (*pEASData->pMetricsModule->pfStopTimer)(pEASData->pMetricsData, EAS_PM_TOTAL_TIME);
106256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
106356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* if max render time, record the number of voices and time */
106456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((*pEASData->pMetricsModule->pfRecordMaxValue)
106556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (pEASData->pMetricsData, EAS_PM_MAX_CYCLES, (EAS_U32) temp))
106656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
106756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (*pEASData->pMetricsModule->pfRecordValue)(pEASData->pMetricsData, EAS_PM_MAX_CYCLES_VOICES, (EAS_U32) voicesRendered);
106856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (*pEASData->pMetricsModule->pfRecordValue)(pEASData->pMetricsData, EAS_PM_MAX_CYCLES_TIME, (EAS_I32) (pEASData->renderTime >> 8));
106956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
107056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
107156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
107256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
107356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef JET_INTERFACE
107456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* let JET to do its thing */
107556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->jetHandle != NULL)
107656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
107756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        result = JET_Process(pEASData);
107856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (result != EAS_SUCCESS)
107956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
108056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
108156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
108256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
108356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
108456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
108556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
108656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
108756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_SetRepeat()
108856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
108956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
109056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Set the selected stream to repeat.
109156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
109256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
109356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  pEASData        - handle to data for this instance
109456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  handle          - handle to stream
109556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  repeatCount     - repeat count
109656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
109756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
109856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
109956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
110056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
110156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Notes:
110256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  0 = no repeat
110356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  1 = repeat once, i.e. play through twice
110456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  -1 = repeat forever
110556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
110656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
110756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, pEASData) reserved for future use */
110856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_SetRepeat (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream, EAS_I32 repeatCount)
110956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
111056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pStream->repeatCount = repeatCount;
111156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
111256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
111356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
111456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
111556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_GetRepeat()
111656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
111756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
111856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Gets the current repeat count for the selected stream.
111956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
112056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
112156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  pEASData        - handle to data for this instance
112256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  handle          - handle to stream
112356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  pRrepeatCount   - pointer to variable to hold repeat count
112456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
112556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
112656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
112756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
112856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
112956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Notes:
113056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  0 = no repeat
113156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  1 = repeat once, i.e. play through twice
113256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  -1 = repeat forever
113356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
113456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
113556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, pEASData) reserved for future use */
113656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_GetRepeat (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream, EAS_I32 *pRepeatCount)
113756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
113856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pRepeatCount = pStream->repeatCount;
113956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
114056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
114156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
114256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
114356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_SetPlaybackRate()
114456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
114556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
114656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Sets the playback rate.
114756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
114856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
114956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  pEASData        - handle to data for this instance
115056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  handle          - handle to stream
115156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  rate            - rate (28-bit fractional amount)
115256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
115356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
115456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
115556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
115656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
115756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
115856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
115956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, pEASData) reserved for future use */
116056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_SetPlaybackRate (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream, EAS_U32 rate)
116156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
116256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
116356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check range */
116456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((rate < (1 << 27)) || (rate > (1 << 29)))
116556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_INVALID_PARAMETER;
116656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
116756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* calculate new frame length
116856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     *
116956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     * NOTE: The maximum frame length we can accomodate based on a
117056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     * maximum rate of 2.0 (2^28) is 2047 (2^13-1). To accomodate a
117156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     * longer frame length or a higher maximum rate, the fixed point
117256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     * divide below will need to be adjusted
117356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     */
117456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pStream->frameLength = (AUDIO_FRAME_LENGTH * (rate >> 8)) >> 20;
117556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
117656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* notify stream of new playback rate */
117756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_SetStreamParameter(pEASData, pStream, PARSER_DATA_PLAYBACK_RATE, (EAS_I32) rate);
117856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
117956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
118056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
118156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
118256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_SetTransposition)
118356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
118456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
118556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Sets the key tranposition for the synthesizer. Transposes all
118656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * melodic instruments by the specified amount. Range is limited
118756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * to +/-12 semitones.
118856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
118956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
119056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  pEASData        - handle to data for this instance
119156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  handle          - handle to stream
119256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  transposition   - +/-12 semitones
119356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
119456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
119556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
119656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
119756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
119856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
119956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
120056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_SetTransposition (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream, EAS_I32 transposition)
120156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
120256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
120356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check range */
120456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((transposition < -12) || (transposition > 12))
120556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_INVALID_PARAMETER;
120656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
120756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!EAS_StreamReady(pEASData, pStream))
120856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
120956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_IntSetStrmParam(pEASData, pStream, PARSER_DATA_TRANSPOSITION, transposition);
121056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
121156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
121256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
121356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_ParseEvents()
121456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
121556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
121656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Parse events in the current streams until the desired time is reached.
121756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
121856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
121956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  pEASData        - buffer for internal EAS data
122056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  endTime         - stop parsing if this time is reached
122156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  parseMode       - play, locate, or metadata
122256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
122356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
122456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  EAS_SUCCESS if PCM data was successfully rendered
122556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
122656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
122756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
122856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT EAS_ParseEvents (S_EAS_DATA *pEASData, EAS_HANDLE pStream, EAS_U32 endTime, EAS_INT parseMode)
122956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
123056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_FILE_PARSER_INTERFACE *pParserModule;
123156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
123256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 parserState;
123356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_BOOL done;
123456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT yieldCount = YIELD_EVENT_COUNT;
123556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 time = 0;
123656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
123756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* does this parser have a time function? */
123856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pParserModule = pStream->pParserModule;
123956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pParserModule->pfTime == NULL)
124056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
124156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* check state */
124256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = (*pParserModule->pfState)(pEASData, pStream->handle, &parserState)) != EAS_SUCCESS)
124356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
124456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* if play state, advance time */
124556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((parserState >= EAS_STATE_READY) && (parserState <= EAS_STATE_PAUSING))
124656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pStream->time += pStream->frameLength;
124756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        done = EAS_TRUE;
124856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
124956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
125056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* assume we're not done, in case we abort out */
125156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else
125256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
125356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pStream->streamFlags &= ~STREAM_FLAGS_PARSED;
125456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        done = EAS_FALSE;
125556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
125656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
125756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    while (!done)
125856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
125956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
126056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* check for stopped state */
126156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = (*pParserModule->pfState)(pEASData, pStream->handle, &parserState)) != EAS_SUCCESS)
126256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
126356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (parserState > EAS_STATE_PLAY)
126456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
126556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* save current time if we're not in play mode */
126656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (parseMode != eParserModePlay)
126756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pStream->time = time << 8;
126856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            done = EAS_TRUE;
126956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
127056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
127156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
127256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* get the next event time */
127356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pParserModule->pfTime)
127456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
127556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = (*pParserModule->pfTime)(pEASData, pStream->handle, &time)) != EAS_SUCCESS)
127656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
127756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
127856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* if next event is within this frame, parse it */
127956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (time < (endTime >> 8))
128056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
128156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
128256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                /* parse the next event */
128356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (pParserModule->pfEvent)
128456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    if ((result = (*pParserModule->pfEvent)(pEASData, pStream->handle, parseMode)) != EAS_SUCCESS)
128556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        return result;
128656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
128756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
128856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* no more events in this frame, advance time */
128956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            else
129056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
129156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pStream->time = endTime;
129256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                done = EAS_TRUE;
129356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
129456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
129556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
129656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* check for max workload exceeded */
129756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (VMCheckWorkload(pEASData->pVoiceMgr))
129856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
129956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* stop even though we may not have parsed
130056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks             * all the events in this frame. The parser will try to
130156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks             * catch up on the next frame.
130256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks             */
130356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
130456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
130556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
130656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* give host a chance for an early abort */
130756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (--yieldCount == 0)
130856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
130956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (EAS_HWYield(pEASData->hwInstData))
131056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
131156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            yieldCount = YIELD_EVENT_COUNT;
131256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
131356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
131456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
131556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if no early abort, parsing is complete for this frame */
131656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (done)
131756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pStream->streamFlags |= STREAM_FLAGS_PARSED;
131856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
131956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
132056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
132156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
132256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
132356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_ParseMetaData()
132456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
132556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
132656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
132756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
132856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
132956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
133056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - file or stream handle
133156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * playLength       - pointer to variable to store the play length (in msecs)
133256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
133356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
133456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
133556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
133656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
133756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *                  - resets the parser to the start of the file
133856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
133956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
134056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_ParseMetaData (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream, EAS_I32 *playLength)
134156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
134256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_FILE_PARSER_INTERFACE *pParserModule;
134356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
134456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_STATE state;
134556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
134656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pParserModule = (S_FILE_PARSER_INTERFACE*) pStream->pParserModule;
134756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pParserModule == NULL)
134856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FEATURE_NOT_AVAILABLE;
134956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
135056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check parser state */
135156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = (*pParserModule->pfState)(pEASData, pStream->handle, &state)) != EAS_SUCCESS)
135256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
135356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (state >= EAS_STATE_OPEN)
135456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
135556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
135656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if parser has metadata function, use that */
135756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pParserModule->pfGetMetaData != NULL)
135856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return pParserModule->pfGetMetaData(pEASData, pStream->handle, playLength);
135956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
136056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* reset the parser to the beginning */
136156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = (*pParserModule->pfReset)(pEASData, pStream->handle)) != EAS_SUCCESS)
136256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
136356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
136456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* parse the file to end */
136556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pStream->time = 0;
136656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    VMInitWorkload(pEASData->pVoiceMgr);
136756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_ParseEvents(pEASData, pStream, 0x7fffffff, eParserModeMetaData)) != EAS_SUCCESS)
136856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
136956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
137056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the parser time */
137156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_GetLocation(pEASData, pStream, playLength)) != EAS_SUCCESS)
137256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
137356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
137456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* reset the parser to the beginning */
137556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pStream->time = 0;
137656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return (*pParserModule->pfReset)(pEASData, pStream->handle);
137756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
137856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
137956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
138056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_RegisterMetaDataCallback()
138156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
138256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
138356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Registers a metadata callback function for parsed metadata.
138456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
138556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
138656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
138756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - file or stream handle
138856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * cbFunc           - pointer to host callback function
138956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * metaDataBuffer   - pointer to metadata buffer
139056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * metaDataBufSize  - maximum size of the metadata buffer
139156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
139256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
139356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
139456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
139556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
139656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
139756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
139856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
139956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_RegisterMetaDataCallback (
140056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_DATA_HANDLE pEASData,
140156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_HANDLE pStream,
140256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_METADATA_CBFUNC cbFunc,
140356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    char *metaDataBuffer,
140456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 metaDataBufSize,
140556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_VOID_PTR pUserData)
140656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
140756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_METADATA_CB metadata;
140856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
140956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!EAS_StreamReady(pEASData, pStream))
141056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
141156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
141256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* register callback function */
141356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    metadata.callback = cbFunc;
141456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    metadata.buffer = metaDataBuffer;
141556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    metadata.bufferSize = metaDataBufSize;
141656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    metadata.pUserData = pUserData;
141756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SetStreamParameter(pEASData, pStream, PARSER_DATA_METADATA_CB, (EAS_I32) &metadata);
141856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
141956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
142056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
142156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_GetNoteCount ()
142256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
142356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns the total number of notes played in this stream
142456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
142556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
142656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_GetNoteCount (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream, EAS_I32 *pNoteCount)
142756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
142856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!EAS_StreamReady(pEASData, pStream))
142956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
143056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_IntGetStrmParam(pEASData, pStream, PARSER_DATA_NOTE_COUNT, pNoteCount);
143156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
143256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
143356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
143456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_CloseFile()
143556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
143656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
143756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Closes an audio file or stream. Playback should have either paused or
143856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * completed (EAS_State returns EAS_PAUSED or EAS_STOPPED).
143956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
144056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
144156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
144256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - file or stream handle
144356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
144456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
144556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
144656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
144756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
144856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
144956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
145056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
145156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_CloseFile (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream)
145256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
145356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_FILE_PARSER_INTERFACE *pParserModule;
145456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
145556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
145656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* call the close function */
145756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pParserModule = (S_FILE_PARSER_INTERFACE*) pStream->pParserModule;
145856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pParserModule == NULL)
145956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FEATURE_NOT_AVAILABLE;
146056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
146156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    result = (*pParserModule->pfClose)(pEASData, pStream->handle);
146256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
146356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* clear the handle and parser interface pointer */
146456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pStream->handle = NULL;
146556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pStream->pParserModule = NULL;
146656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return result;
146756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
146856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
146956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
147056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_OpenMIDIStream()
147156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
147256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
147356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Opens a raw MIDI stream allowing the host to route MIDI cable data directly to the synthesizer
147456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
147556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
147656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
147756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pHandle          - pointer to variable to hold file or stream handle
147856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
147956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
148056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
148156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
148256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
148356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
148456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
148556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
148656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_OpenMIDIStream (EAS_DATA_HANDLE pEASData, EAS_HANDLE *ppStream, EAS_HANDLE streamHandle)
148756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
148856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
148956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_INTERACTIVE_MIDI *pMIDIStream;
149056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT streamNum;
149156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
149256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* initialize some pointers */
149356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *ppStream = NULL;
149456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
149556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* allocate a stream */
149656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((streamNum = EAS_AllocateStream(pEASData)) < 0)
149756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_MAX_STREAMS_OPEN;
149856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
149956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check Configuration Module for S_EAS_DATA allocation */
150056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->staticMemoryModel)
150156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pMIDIStream = EAS_CMEnumData(EAS_CM_MIDI_STREAM_DATA);
150256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else
150356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pMIDIStream = EAS_HWMalloc(pEASData->hwInstData, sizeof(S_INTERACTIVE_MIDI));
150456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
150556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* allocate dynamic memory */
150656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!pMIDIStream)
150756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
150856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_FATAL, "Failed to allocate MIDI stream data\n"); */ }
150956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_MALLOC_FAILED;
151056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
151156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
151256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* zero the memory to insure complete initialization */
151356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_HWMemSet(pMIDIStream, 0, sizeof(S_INTERACTIVE_MIDI));
151456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_InitStream(&pEASData->streams[streamNum], NULL, pMIDIStream);
151556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
151656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* instantiate a new synthesizer */
151756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (streamHandle == NULL)
151856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
151956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        result = VMInitMIDI(pEASData, &pMIDIStream->pSynth);
152056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
152156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
152256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* use an existing synthesizer */
152356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else
152456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
152556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_I32 value;
152656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        result = EAS_GetStreamParameter(pEASData, streamHandle, PARSER_DATA_SYNTH_HANDLE, &value);
152756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pMIDIStream->pSynth = (S_SYNTH*) value;
152856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        VMIncRefCount(pMIDIStream->pSynth);
152956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
153056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (result != EAS_SUCCESS)
153156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
153256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_CloseMIDIStream(pEASData, &pEASData->streams[streamNum]);
153356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
153456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
153556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
153656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* initialize the MIDI stream data */
153756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_InitMIDIStream(&pMIDIStream->stream);
153856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
153956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *ppStream = (EAS_HANDLE) &pEASData->streams[streamNum];
154056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
154156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
154256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
154356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
154456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_WriteMIDIStream()
154556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
154656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
154756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Send data to the MIDI stream device
154856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
154956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
155056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
155156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - stream handle
155256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pBuffer          - pointer to buffer
155356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * count            - number of bytes to write
155456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
155556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
155656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
155756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
155856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
155956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
156056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
156156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
156256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_WriteMIDIStream (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream, EAS_U8 *pBuffer, EAS_I32 count)
156356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
156456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_INTERACTIVE_MIDI *pMIDIStream;
156556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
156656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
156756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pMIDIStream = (S_INTERACTIVE_MIDI*) pStream->handle;
156856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
156956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* send the entire buffer */
157056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    while (count--)
157156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
157256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_ParseMIDIStream(pEASData, pMIDIStream->pSynth, &pMIDIStream->stream, *pBuffer++, eParserModePlay)) != EAS_SUCCESS)
157356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
157456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
157556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
157656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
157756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
157856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
157956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_CloseMIDIStream()
158056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
158156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
158256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Closes a raw MIDI stream
158356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
158456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
158556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
158656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - stream handle
158756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
158856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
158956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
159056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
159156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
159256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
159356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
159456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
159556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_CloseMIDIStream (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream)
159656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
159756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_INTERACTIVE_MIDI *pMIDIStream;
159856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
159956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pMIDIStream = (S_INTERACTIVE_MIDI*) pStream->handle;
160056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
160156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* close synth */
160256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pMIDIStream->pSynth != NULL)
160356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
160456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        VMMIDIShutdown(pEASData, pMIDIStream->pSynth);
160556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pMIDIStream->pSynth = NULL;
160656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
160756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
160856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* release allocated memory */
160956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!pEASData->staticMemoryModel)
161056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_HWFree(((S_EAS_DATA*) pEASData)->hwInstData, pMIDIStream);
161156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
161256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pStream->handle = NULL;
161356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
161456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
161556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
161656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
161756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_State()
161856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
161956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
162056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns the state of an audio file or stream.
162156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
162256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
162356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
162456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - file or stream handle
162556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
162656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
162756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
162856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
162956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
163056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
163156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
163256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
163356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_State (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream, EAS_STATE *pState)
163456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
163556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_FILE_PARSER_INTERFACE *pParserModule;
163656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
163756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
163856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* call the parser to return state */
163956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pParserModule = (S_FILE_PARSER_INTERFACE*) pStream->pParserModule;
164056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pParserModule == NULL)
164156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FEATURE_NOT_AVAILABLE;
164256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
164356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = (*pParserModule->pfState)(pEASData, pStream->handle, pState)) != EAS_SUCCESS)
164456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
164556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
164656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if repeat count is set for this parser, mask the stopped state from the application */
164756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pStream->repeatCount && (*pState == EAS_STATE_STOPPED))
164856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        *pState = EAS_STATE_PLAY;
164956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
165056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if we're not ready or playing, we don't need to hide state from host */
165156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (*pState > EAS_STATE_PLAY)
165256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_SUCCESS;
165356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
165456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if stream is about to be paused, report it as paused */
165556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pStream->streamFlags & STREAM_FLAGS_PAUSE)
165656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
165756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pStream->streamFlags & STREAM_FLAGS_LOCATE)
165856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            *pState = EAS_STATE_PAUSED;
165956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else
166056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            *pState = EAS_STATE_PAUSING;
166156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
166256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
166356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if stream is about to resume, report it as playing */
166456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pStream->streamFlags & STREAM_FLAGS_RESUME)
166556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        *pState = EAS_STATE_PLAY;
166656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
166756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
166856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
166956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
167056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
167156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_SetPolyphony()
167256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
167356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
167456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Set the polyphony of the stream. A value of 0 allows the stream
167556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * to use all voices (set by EAS_SetSynthPolyphony).
167656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
167756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
167856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
167956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * streamHandle     - handle returned by EAS_OpenFile
168056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * polyphonyCount   - the desired polyphony count
168156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
168256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
168356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
168456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
168556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
168656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
168756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
168856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_SetPolyphony (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream, EAS_I32 polyphonyCount)
168956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
169056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!EAS_StreamReady(pEASData, pStream))
169156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
169256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_IntSetStrmParam(pEASData, pStream, PARSER_DATA_POLYPHONY, polyphonyCount);
169356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
169456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
169556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
169656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_GetPolyphony()
169756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
169856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
169956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns the current polyphony setting of the stream
170056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
170156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
170256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
170356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * streamHandle     - handle returned by EAS_OpenFile
170456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pPolyphonyCount  - pointer to variable to receive polyphony count
170556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
170656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
170756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
170856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
170956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
171056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
171156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
171256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_GetPolyphony (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream, EAS_I32 *pPolyphonyCount)
171356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
171456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!EAS_StreamReady(pEASData, pStream))
171556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
171656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_IntGetStrmParam(pEASData, pStream, PARSER_DATA_POLYPHONY, pPolyphonyCount);
171756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
171856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
171956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
172056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_SetSynthPolyphony()
172156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
172256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
172356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Set the polyphony of the synth . Value must be >= 1 and <= the
172456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * maximum number of voices. This function will pin the polyphony
172556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * at those limits
172656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
172756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
172856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
172956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * synthNum         - synthesizer number (0 = onboard, 1 = DSP)
173056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * polyphonyCount   - the desired polyphony count
173156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
173256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
173356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
173456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
173556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
173656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
173756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
173856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_SetSynthPolyphony (EAS_DATA_HANDLE pEASData, EAS_I32 synthNum, EAS_I32 polyphonyCount)
173956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
174056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return VMSetSynthPolyphony(pEASData->pVoiceMgr, synthNum, polyphonyCount);
174156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
174256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
174356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
174456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_GetSynthPolyphony()
174556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
174656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
174756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns the current polyphony setting of the synth
174856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
174956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
175056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
175156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * synthNum         - synthesizer number (0 = onboard, 1 = DSP)
175256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pPolyphonyCount  - pointer to variable to receive polyphony count
175356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
175456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
175556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
175656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
175756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
175856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
175956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
176056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_GetSynthPolyphony (EAS_DATA_HANDLE pEASData, EAS_I32 synthNum, EAS_I32 *pPolyphonyCount)
176156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
176256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return VMGetSynthPolyphony(pEASData->pVoiceMgr, synthNum, pPolyphonyCount);
176356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
176456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
176556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
176656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_SetPriority()
176756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
176856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
176956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Set the priority of the stream. Determines which stream's voices
177056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * are stolen when there are insufficient voices for all notes.
177156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Value must be in the range of 1-15, lower values are higher
177256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * priority.
177356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
177456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
177556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
177656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * streamHandle     - handle returned by EAS_OpenFile
177756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * polyphonyCount   - the desired polyphony count
177856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
177956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
178056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
178156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
178256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
178356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
178456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
178556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_SetPriority (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream, EAS_I32 priority)
178656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
178756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!EAS_StreamReady(pEASData, pStream))
178856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
178956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_IntSetStrmParam(pEASData, pStream, PARSER_DATA_PRIORITY, priority);
179056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
179156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
179256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
179356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_GetPriority()
179456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
179556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
179656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns the current priority setting of the stream
179756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
179856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
179956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
180056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * streamHandle     - handle returned by EAS_OpenFile
180156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pPriority        - pointer to variable to receive priority
180256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
180356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
180456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
180556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
180656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
180756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
180856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
180956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_GetPriority (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream, EAS_I32 *pPriority)
181056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
181156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!EAS_StreamReady(pEASData, pStream))
181256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
181356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_IntGetStrmParam(pEASData, pStream, PARSER_DATA_PRIORITY, pPriority);
181456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
181556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
181656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
181756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_SetVolume()
181856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
181956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
182056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Set the master gain for the mix engine in 1dB increments
182156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
182256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
182356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
182456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * volume           - the desired master gain (100 is max)
182556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - file or stream handle
182656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
182756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
182856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
182956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
183056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
183156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * overrides any previously set master volume from sysex
183256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
183356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
183456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
183556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_SetVolume (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream, EAS_I32 volume)
183656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
183756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I16 gain;
183856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
183956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check range */
184056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((volume < 0) || (volume > EAS_MAX_VOLUME))
184156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_PARAMETER_RANGE;
184256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
184356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* stream volume */
184456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pStream != NULL)
184556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
184656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_I32 gainOffset;
184756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_RESULT result;
184856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
184956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (!EAS_StreamReady(pEASData, pStream))
185056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
185156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
185256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* get gain offset */
185356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pStream->volume = (EAS_U8) volume;
185456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        result = EAS_GetStreamParameter(pEASData, pStream, PARSER_DATA_GAIN_OFFSET, &gainOffset);
185556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (result == EAS_SUCCESS)
185656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            volume += gainOffset;
185756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
185856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* set stream volume */
185956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        gain = EAS_VolumeToGain(volume - STREAM_VOLUME_HEADROOM);
186056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
186156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* convert to linear scalar */
186256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_IntSetStrmParam(pEASData, pStream, PARSER_DATA_VOLUME, gain);
186356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
186456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
186556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* master volume */
186656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pEASData->masterVolume = (EAS_U8) volume;
186756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#if (NUM_OUTPUT_CHANNELS == 1)
186856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* leave 3dB headroom for mono output */
186956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    volume -= 3;
187056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
187156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
187256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    gain = EAS_VolumeToGain(volume - STREAM_VOLUME_HEADROOM);
187356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pEASData->masterGain = gain;
187456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
187556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
187656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
187756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
187856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_GetVolume()
187956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
188056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
188156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns the master volume for the synthesizer. The default volume setting is
188256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 50. The volume range is 0 to 100;
188356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
188456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
188556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
188656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * volume           - the desired master volume
188756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - file or stream handle
188856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
188956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
189056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
189156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
189256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
189356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * overrides any previously set master volume from sysex
189456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
189556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
189656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
189756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_I32 EAS_GetVolume (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream)
189856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
189956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pStream == NULL)
190056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return pEASData->masterVolume;
190156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
190256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!EAS_StreamReady(pEASData, pStream))
190356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
190456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return pStream->volume;
190556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
190656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
190756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
190856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_SetMaxLoad()
190956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
191056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
191156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Sets the maximum workload the parsers will do in a single call to
191256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_Render. The units are currently arbitrary, but should correlate
191356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * well to the actual CPU cycles consumed. The primary effect is to
191456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * reduce the occasional peaks in CPU cycles consumed when parsing
191556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * dense parts of a MIDI score.
191656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
191756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
191856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  pEASData        - handle to data for this instance
191956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  maxLoad         - the desired maximum workload
192056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
192156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
192256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
192356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
192456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
192556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
192656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
192756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_SetMaxLoad (EAS_DATA_HANDLE pEASData, EAS_I32 maxLoad)
192856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
192956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    VMSetWorkload(pEASData->pVoiceMgr, maxLoad);
193056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
193156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
193256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
193356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
193456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_SetMaxPCMStreams()
193556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
193656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Sets the maximum number of PCM streams allowed in parsers that
193756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * use PCM streaming.
193856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
193956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
194056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
194156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * streamHandle     - handle returned by EAS_OpenFile
194256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * maxNumStreams    - maximum number of PCM streams
194356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
194456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
194556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_SetMaxPCMStreams (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream, EAS_I32 maxNumStreams)
194656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
194756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!EAS_StreamReady(pEASData, pStream))
194856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
194956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_IntSetStrmParam(pEASData, pStream, PARSER_DATA_MAX_PCM_STREAMS, maxNumStreams);
195056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
195156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
195256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
195356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_Locate()
195456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
195556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
195656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Locate into the file associated with the handle.
195756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
195856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
195956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData - pointer to overall EAS data structure
196056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - file handle
196156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * milliseconds     - playback offset from start of file in milliseconds
196256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
196356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
196456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
196556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
196656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
196756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * the actual offset will be quantized to the closest update period, typically
196856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * a resolution of 5.9ms. Notes that are started prior to this time will not
196956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * sound. Any notes currently playing will be shut off.
197056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
197156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
197256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
197356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_Locate (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream, EAS_I32 milliseconds, EAS_BOOL offset)
197456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
197556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_FILE_PARSER_INTERFACE *pParserModule;
197656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
197756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 requestedTime;
197856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_STATE state;
197956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
198056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get pointer to parser function table */
198156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pParserModule = (S_FILE_PARSER_INTERFACE*) pStream->pParserModule;
198256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pParserModule == NULL)
198356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FEATURE_NOT_AVAILABLE;
198456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
198556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = (*pParserModule->pfState)(pEASData, pStream->handle, &state)) != EAS_SUCCESS)
198656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
198756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (state >= EAS_STATE_OPEN)
198856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
198956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
199056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* handle offset and limit to start of file */
199156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e{704} use shift for performance*/
199256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (offset)
199356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        milliseconds += (EAS_I32) pStream->time >> 8;
199456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (milliseconds < 0)
199556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        milliseconds = 0;
199656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
199756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check to see if the request is different from the current time */
199856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    requestedTime = (EAS_U32) milliseconds;
199956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (requestedTime == (pStream->time >> 8))
200056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_SUCCESS;
200156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
200256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* set the locate flag */
200356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pStream->streamFlags |= STREAM_FLAGS_LOCATE;
200456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
200556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* use the parser locate function, if available */
200656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pParserModule->pfLocate != NULL)
200756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
200856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_BOOL parserLocate = EAS_FALSE;
200956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        result = pParserModule->pfLocate(pEASData, pStream->handle, (EAS_I32) requestedTime, &parserLocate);
201056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (!parserLocate)
201156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
201256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (result == EAS_SUCCESS)
201356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pStream->time = requestedTime << 8;
201456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
201556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
201656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
201756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
201856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if we were paused and not going to resume, set pause request flag */
201956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (((state == EAS_STATE_PAUSING) || (state == EAS_STATE_PAUSED)) && ((pStream->streamFlags & STREAM_FLAGS_RESUME) == 0))
202056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pStream->streamFlags |= STREAM_FLAGS_PAUSE;
202156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
202256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* reset the synth and parser */
202356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = (*pParserModule->pfReset)(pEASData, pStream->handle)) != EAS_SUCCESS)
202456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
202556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pStream->time = 0;
202656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
202756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* locating forward, clear parsed flag and parse data until we get to the requested location */
202856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_ParseEvents(pEASData, pStream, requestedTime << 8, eParserModeLocate)) != EAS_SUCCESS)
202956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
203056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
203156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
203256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
203356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
203456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
203556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_GetLocation()
203656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
203756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
203856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns the current playback offset
203956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
204056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
204156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
204256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - file handle
204356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
204456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
204556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * The offset in milliseconds from the start of the current sequence, quantized
204656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * to the nearest update period. Actual resolution is typically 5.9 ms.
204756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
204856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
204956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
205056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
205156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
205256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, pEASData) reserved for future use */
205356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_GetLocation (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream, EAS_I32 *pTime)
205456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
205556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!EAS_StreamReady(pEASData, pStream))
205656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
205756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
205856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pTime = pStream->time >> 8;
205956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
206056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
206156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
206256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
206356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_GetRenderTime()
206456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
206556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
206656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns the current playback offset
206756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
206856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
206956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
207056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
207156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
207256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Gets the render time clock in msecs.
207356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
207456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
207556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
207656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
207756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
207856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_GetRenderTime (EAS_DATA_HANDLE pEASData, EAS_I32 *pTime)
207956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
208056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pTime = pEASData->renderTime >> 8;
208156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
208256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
208356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
208456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
208556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_Pause()
208656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
208756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
208856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Pauses the playback of the data associated with this handle. The audio
208956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * is gracefully ramped down to prevent clicks and pops. It may take several
209056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * buffers of audio before the audio is muted.
209156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
209256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
209356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * psEASData        - pointer to overall EAS data structure
209456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - file or stream handle
209556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
209656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
209756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
209856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
209956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
210056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
210156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
210256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
210356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
210456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_Pause (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream)
210556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
210656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_FILE_PARSER_INTERFACE *pParserModule;
210756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_STATE state;
210856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
210956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
211056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pParserModule = (S_FILE_PARSER_INTERFACE*) pStream->pParserModule;
211156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pParserModule == NULL)
211256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FEATURE_NOT_AVAILABLE;
211356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
211456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check for valid state */
211556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    result = pParserModule->pfState(pEASData, pStream->handle, &state);
211656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (result == EAS_SUCCESS)
211756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
211856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((state != EAS_STATE_PLAY) && (state != EAS_STATE_READY) && ((pStream->streamFlags & STREAM_FLAGS_RESUME) == 0))
211956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
212056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
212156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* make sure parser implements pause */
212256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pParserModule->pfPause == NULL)
212356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            result = EAS_ERROR_NOT_IMPLEMENTED;
212456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
212556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* clear resume flag */
212656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pStream->streamFlags &= ~STREAM_FLAGS_RESUME;
212756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
212856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* set pause flag */
212956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pStream->streamFlags |= STREAM_FLAGS_PAUSE;
213056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
213156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#if 0
213256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* pause the stream */
213356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pParserModule->pfPause)
213456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            result = pParserModule->pfPause(pEASData, pStream->handle);
213556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else
213656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            result = EAS_ERROR_NOT_IMPLEMENTED;
213756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
213856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
213956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
214056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return result;
214156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
214256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
214356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
214456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_Resume()
214556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
214656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
214756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Resumes the playback of the data associated with this handle. The audio
214856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * is gracefully ramped up to prevent clicks and pops.
214956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
215056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
215156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * psEASData        - pointer to overall EAS data structure
215256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - file or stream handle
215356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
215456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
215556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
215656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
215756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
215856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
215956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
216056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
216156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
216256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_Resume (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream)
216356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
216456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_FILE_PARSER_INTERFACE *pParserModule;
216556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_STATE state;
216656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
216756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
216856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pParserModule = (S_FILE_PARSER_INTERFACE*) pStream->pParserModule;
216956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pParserModule == NULL)
217056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FEATURE_NOT_AVAILABLE;
217156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
217256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check for valid state */
217356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    result = pParserModule->pfState(pEASData, pStream->handle, &state);
217456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (result == EAS_SUCCESS)
217556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
217656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((state != EAS_STATE_PAUSED) && (state != EAS_STATE_PAUSING) && ((pStream->streamFlags & STREAM_FLAGS_PAUSE) == 0))
217756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
217856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
217956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* make sure parser implements this function */
218056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pParserModule->pfResume == NULL)
218156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            result = EAS_ERROR_NOT_IMPLEMENTED;
218256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
218356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* clear pause flag */
218456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pStream->streamFlags &= ~STREAM_FLAGS_PAUSE;
218556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
218656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* set resume flag */
218756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pStream->streamFlags |= STREAM_FLAGS_RESUME;
218856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
218956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#if 0
219056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* resume the stream */
219156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pParserModule->pfResume)
219256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            result = pParserModule->pfResume(pEASData, pStream->handle);
219356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else
219456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            result = EAS_ERROR_NOT_IMPLEMENTED;
219556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
219656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
219756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
219856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return result;
219956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
220056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
220156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
220256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_GetParameter()
220356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
220456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
220556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Set the parameter of a module. See E_MODULES for a list of modules
220656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * and the header files of the modules for a list of parameters.
220756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
220856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
220956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * psEASData        - pointer to overall EAS data structure
221056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - file or stream handle
221156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * module           - enumerated module number
221256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * param            - enumerated parameter number
221356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pValue           - pointer to variable to receive parameter value
221456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
221556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
221656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
221756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
221856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
221956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
222056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
222156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
222256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
222356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_GetParameter (EAS_DATA_HANDLE pEASData, EAS_I32 module, EAS_I32 param, EAS_I32 *pValue)
222456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
222556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
222656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (module >= NUM_EFFECTS_MODULES)
222756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_INVALID_MODULE;
222856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
222956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->effectsModules[module].effectData == NULL)
223056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_INVALID_MODULE;
223156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
223256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return (*pEASData->effectsModules[module].effect->pFGetParam)
223356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        (pEASData->effectsModules[module].effectData, param, pValue);
223456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
223556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
223656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
223756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_SetParameter()
223856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
223956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
224056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Set the parameter of a module. See E_MODULES for a list of modules
224156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * and the header files of the modules for a list of parameters.
224256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
224356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
224456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * psEASData        - pointer to overall EAS data structure
224556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - file or stream handle
224656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * module           - enumerated module number
224756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * param            - enumerated parameter number
224856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * value            - new parameter value
224956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
225056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
225156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
225256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
225356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
225456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
225556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
225656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
225756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
225856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_SetParameter (EAS_DATA_HANDLE pEASData, EAS_I32 module, EAS_I32 param, EAS_I32 value)
225956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
226056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
226156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (module >= NUM_EFFECTS_MODULES)
226256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_INVALID_MODULE;
226356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
226456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->effectsModules[module].effectData == NULL)
226556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_INVALID_MODULE;
226656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
226756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return (*pEASData->effectsModules[module].effect->pFSetParam)
226856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        (pEASData->effectsModules[module].effectData, param, value);
226956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
227056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
227156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _METRICS_ENABLED
227256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
227356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_MetricsReport()
227456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
227556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
227656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Displays the current metrics through the metrics interface.
227756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
227856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
227956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * p                - instance data handle
228056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
228156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
228256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
228356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
228456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
228556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
228656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
228756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
228856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_MetricsReport (EAS_DATA_HANDLE pEASData)
228956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
229056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!pEASData->pMetricsModule)
229156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_INVALID_MODULE;
229256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
229356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return (*pEASData->pMetricsModule->pfReport)(pEASData->pMetricsData);
229456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
229556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
229656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
229756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_MetricsReset()
229856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
229956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
230056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Resets the metrics.
230156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
230256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
230356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * p                - instance data handle
230456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
230556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
230656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
230756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
230856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
230956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
231056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
231156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
231256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_MetricsReset (EAS_DATA_HANDLE pEASData)
231356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
231456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
231556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!pEASData->pMetricsModule)
231656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_INVALID_MODULE;
231756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
231856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return (*pEASData->pMetricsModule->pfReset)(pEASData->pMetricsData);
231956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
232056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
232156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
232256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
232356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_SetSoundLibrary()
232456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
232556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
232656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Sets the location of the sound library.
232756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
232856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
232956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData             - instance data handle
233056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pSoundLib            - pointer to sound library
233156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
233256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
233356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
233456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
233556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
233656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
233756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
233856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
233956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_SetSoundLibrary (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream, EAS_SNDLIB_HANDLE pSndLib)
234056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
234156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pStream)
234256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
234356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (!EAS_StreamReady(pEASData, pStream))
234456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
234556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_IntSetStrmParam(pEASData, pStream, PARSER_DATA_EAS_LIBRARY, (EAS_I32) pSndLib);
234656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
234756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
234856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return VMSetGlobalEASLib(pEASData->pVoiceMgr, pSndLib);
234956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
235056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
235156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
235256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_SetHeaderSearchFlag()
235356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
235456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * By default, when EAS_OpenFile is called, the parsers check the
235556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * first few bytes of the file looking for a specific header. Some
235656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * mobile devices may add a header to the start of a file, which
235756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * will prevent the parser from recognizing the file. If the
235856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * searchFlag is set to EAS_TRUE, the parser will search the entire
235956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * file looking for the header. This may enable EAS to recognize
236056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * some files that it would ordinarily reject. The negative is that
236156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * it make take slightly longer to process the EAS_OpenFile request.
236256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
236356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
236456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData             - instance data handle
236556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * searchFlag           - search flag (EAS_TRUE or EAS_FALSE)
236656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
236756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
236856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_SetHeaderSearchFlag (EAS_DATA_HANDLE pEASData, EAS_BOOL searchFlag)
236956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
237056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pEASData->searchHeaderFlag = (EAS_BOOL8) searchFlag;
237156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
237256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
237356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
237456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
237556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_SetPlayMode()
237656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
237756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Some file formats support special play modes, such as iMode partial
237856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * play mode. This call can be used to change the play mode. The
237956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * default play mode (usually straight playback) is always zero.
238056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
238156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
238256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData             - instance data handle
238356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle               - file or stream handle
238456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * playMode             - play mode (see file parser for specifics)
238556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
238656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
238756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_SetPlayMode (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream, EAS_I32 playMode)
238856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
238956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_IntSetStrmParam(pEASData, pStream, PARSER_DATA_PLAY_MODE, playMode);
239056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
239156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
239256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef DLS_SYNTHESIZER
239356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
239456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_LoadDLSCollection()
239556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
239656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
239756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Sets the location of the sound library.
239856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
239956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
240056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData             - instance data handle
240156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pSoundLib            - pointer to sound library
240256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
240356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
240456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
240556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
240656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
240756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
240856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
240956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
241056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_LoadDLSCollection (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream, EAS_FILE_LOCATOR locator)
241156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
241256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_FILE_HANDLE fileHandle;
241356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
241456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_DLSLIB_HANDLE pDLS;
241556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
241656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pStream != NULL)
241756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
241856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (!EAS_StreamReady(pEASData, pStream))
241956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
242056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
242156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
242256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* open the file */
242356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWOpenFile(pEASData->hwInstData, locator, &fileHandle, EAS_FILE_READ)) != EAS_SUCCESS)
242456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
242556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
242656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* parse the file */
242756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    result = DLSParser(pEASData->hwInstData, fileHandle, 0, &pDLS);
242856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_HWCloseFile(pEASData->hwInstData, fileHandle);
242956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
243056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (result == EAS_SUCCESS)
243156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
243256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
243356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* if a stream pStream is specified, point it to the DLS collection */
243456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pStream)
243556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            result = EAS_IntSetStrmParam(pEASData, pStream, PARSER_DATA_DLS_COLLECTION, (EAS_I32) pDLS);
243656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
243756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* global DLS load */
243856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else
243956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            result = VMSetGlobalDLSLib(pEASData, pDLS);
244056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
244156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
244256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return result;
244356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
244456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
244556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
244656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef EXTERNAL_AUDIO
244756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
244856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_RegExtAudioCallback()
244956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
245056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
245156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Registers callback functions for audio events.
245256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
245356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
245456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
245556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - file or stream handle
245656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * cbProgChgFunc    - pointer to host callback function for program change
245756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * cbEventFunc      - pointer to host callback functio for note events
245856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
245956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
246056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
246156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
246256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
246356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
246456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
246556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
246656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_RegExtAudioCallback (EAS_DATA_HANDLE pEASData,
246756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_HANDLE pStream,
246856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_VOID_PTR pInstData,
246956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_EXT_PRG_CHG_FUNC cbProgChgFunc,
247056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_EXT_EVENT_FUNC cbEventFunc)
247156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
247256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_SYNTH *pSynth;
247356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
247456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!EAS_StreamReady(pEASData, pStream))
247556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
247656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
247756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (EAS_GetStreamParameter(pEASData, pStream, PARSER_DATA_SYNTH_HANDLE, (EAS_I32*) &pSynth) != EAS_SUCCESS)
247856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_INVALID_PARAMETER;
247956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
248056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pSynth == NULL)
248156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_INVALID_PARAMETER;
248256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
248356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    VMRegExtAudioCallback(pSynth, pInstData, cbProgChgFunc, cbEventFunc);
248456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
248556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
248656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
248756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
248856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_GetMIDIControllers()
248956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
249056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
249156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns the current state of MIDI controllers on the requested channel.
249256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
249356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
249456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
249556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - file or stream handle
249656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pControl         - pointer to structure to receive data
249756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
249856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
249956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
250056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
250156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
250256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
250356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
250456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
250556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_GetMIDIControllers (EAS_DATA_HANDLE pEASData, EAS_HANDLE pStream, EAS_U8 channel, S_MIDI_CONTROLLERS *pControl)
250656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
250756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_SYNTH *pSynth;
250856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
250956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!EAS_StreamReady(pEASData, pStream))
251056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
251156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
251256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (EAS_GetStreamParameter(pEASData, pStream, PARSER_DATA_SYNTH_HANDLE, (EAS_I32*) &pSynth) != EAS_SUCCESS)
251356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_INVALID_PARAMETER;
251456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
251556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pSynth == NULL)
251656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_INVALID_PARAMETER;
251756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
251856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    VMGetMIDIControllers(pSynth, channel, pControl);
251956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
252056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
252156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
252256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
252356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _SPLIT_ARCHITECTURE
252456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
252556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_SetFrameBuffer()
252656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
252756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
252856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Sets the frame buffer pointer passed to the IPC communications functions
252956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
253056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
253156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData             - instance data handle
253256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * locator              - file locator
253356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
253456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
253556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
253656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
253756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
253856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * May overlay instruments in the GM sound set
253956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
254056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
254156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
254256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_PUBLIC EAS_RESULT EAS_SetFrameBuffer (EAS_DATA_HANDLE pEASData, EAS_FRAME_BUFFER_HANDLE pFrameBuffer)
254356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
254456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->pVoiceMgr)
254556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pEASData->pVoiceMgr->pFrameBuffer = pFrameBuffer;
254656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
254756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
254856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
254956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
255056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
255156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_SearchFile
255256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
255356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Search file for specific sequence starting at current file
255456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * position. Returns offset to start of sequence.
255556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
255656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
255756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to EAS persistent data object
255856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * fileHandle       - file handle
255956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * searchString     - pointer to search sequence
256056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * len              - length of search sequence
256156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pOffset          - pointer to variable to store offset to sequence
256256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
256356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns EAS_EOF if end-of-file is reached
256456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
256556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
256656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_SearchFile (S_EAS_DATA *pEASData, EAS_FILE_HANDLE fileHandle, const EAS_U8 *searchString, EAS_I32 len, EAS_I32 *pOffset)
256756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
256856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
256956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT index;
257056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U8 c;
257156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
257256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pOffset = -1;
257356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    index = 0;
257456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (;;)
257556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
257656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        result = EAS_HWGetByte(pEASData->hwInstData, fileHandle, &c);
257756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (result != EAS_SUCCESS)
257856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
257956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (c == searchString[index])
258056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
258156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            index++;
258256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (index == 4)
258356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
258456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                result = EAS_HWFilePos(pEASData->hwInstData, fileHandle, pOffset);
258556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (result != EAS_SUCCESS)
258656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return result;
258756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                *pOffset -= len;
258856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
258956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
259056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
259156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else
259256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            index = 0;
259356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
259456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
259556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
259656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
259756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
2598