156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * File:
456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * eas_tonecontrol.c
556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Contents and purpose:
756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * MMAPI ToneControl parser
856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Copyright Sonic Network Inc. 2006
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: 795 $
2656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *   $Date: 2007-08-01 00:14:45 -0700 (Wed, 01 Aug 2007) $
2756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
2856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
2956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
3056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_data.h"
3156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_miditypes.h"
3256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_parser.h"
3356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_report.h"
3456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_host.h"
3556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_midi.h"
3656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_config.h"
3756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_vm_protos.h"
3856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_tcdata.h"
3956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
4056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
4156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* default channel and program for TC playback */
4256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define TC_CHANNEL              0
4356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define TC_PROGRAM              80
4456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define TC_VELOCITY             127
4556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
4656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define TC_FIELD_SILENCE        -1
4756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define TC_FIELD_VERSION        -2
4856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define TC_FIELD_TEMPO          -3
4956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define TC_FIELD_RESOLUTION     -4
5056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define TC_FIELD_BLOCK_START    -5
5156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define TC_FIELD_BLOCK_END      -6
5256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define TC_FIELD_PLAY_BLOCK     -7
5356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define TC_FIELD_SET_VOLUME     -8
5456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define TC_FIELD_REPEAT         -9
5556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define TC_FIELD_INVALID        -10
5656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
5756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* convert 0-100 volume to 0-127 velocity using fixed point */
5856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define TC_VOLUME_CONV          21307064
5956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define TC_VOLUME_SHIFT         24
6056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
6156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
6256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* local prototypes */
6356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_CheckFileType (S_EAS_DATA *pEASData, EAS_FILE_HANDLE fileHandle, EAS_VOID_PTR *ppHandle, EAS_I32 offset);
6456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_Prepare (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
6556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_Time (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_U32 *pTime);
6656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_Event (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_INT parserMode);
6756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_State (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_STATE *pState);
6856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_Close (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
6956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_Reset (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
7056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_Pause (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
7156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_Resume (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
7256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_SetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value);
7356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_GetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue);
7456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_ParseHeader (S_EAS_DATA *pEASData, S_TC_DATA* pData);
7556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_StartNote (S_EAS_DATA *pEASData, S_TC_DATA* pData, EAS_INT parserMode, EAS_I8 note);
7656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_GetRepeat (S_EAS_DATA *pEASData, S_TC_DATA* pData, EAS_INT parserMode);
7756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_PlayBlock (S_EAS_DATA *pEASData, S_TC_DATA* pData);
7856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_BlockEnd (S_EAS_DATA *pEASData, S_TC_DATA* pData);
7956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_GetVolume (S_EAS_DATA *pEASData, S_TC_DATA* pData);
8056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_GetTempo (S_EAS_DATA *pEASData, S_TC_DATA* pData);
8156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_GetResolution (S_EAS_DATA *pEASData, S_TC_DATA* pData);
8256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_GetNextChar (EAS_HW_DATA_HANDLE hwInstData, S_TC_DATA *pData, EAS_I8 *pValue);
8356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic void TC_PutBackChar (S_TC_DATA *pData, EAS_I8 value);
8456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
8556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* calculate a new tick time based on resolution & tempo */
8656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_INLINE void TC_CalcTimeBase (S_TC_DATA *pData)
8756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
8856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
8956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* ticks in 256ths of a millisecond */
9056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->tick = ((60 * 1000) << 8) / (pData->tempo * pData->resolution);
9156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
9256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
9356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
9456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
9556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_TC_Parser
9656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
9756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * This structure contains the functional interface for the iMelody parser
9856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
9956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
10056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksconst S_FILE_PARSER_INTERFACE EAS_TC_Parser =
10156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
10256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    TC_CheckFileType,
10356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    TC_Prepare,
10456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    TC_Time,
10556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    TC_Event,
10656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    TC_State,
10756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    TC_Close,
10856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    TC_Reset,
10956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    TC_Pause,
11056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    TC_Resume,
11156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    NULL,
11256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    TC_SetData,
11356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    TC_GetData,
11456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    NULL
11556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks};
11656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
11756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
11856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * TC_CheckFileType()
11956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
12056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
12156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Check the file type to see if we can parse it
12256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
12356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
12456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
12556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
12656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
12756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
12856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
12956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
13056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
13156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
13256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
13356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
13456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_CheckFileType (S_EAS_DATA *pEASData, EAS_FILE_HANDLE fileHandle, EAS_VOID_PTR *ppHandle, EAS_I32 offset)
13556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
13656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_TC_DATA data;
13756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_TC_DATA *pData;
13856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
13956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* init data */
14056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_HWMemSet(&data, 0, sizeof(S_TC_DATA));
14156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    data.fileHandle = fileHandle;
14256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    data.fileOffset = offset;
14356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *ppHandle= NULL;
14456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
14556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* see if we can parse the header */
14656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (TC_ParseHeader(pEASData, &data) == EAS_SUCCESS)
14756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
14856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
14956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* check for static memory allocation */
15056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pEASData->staticMemoryModel)
15156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pData = EAS_CMEnumOptData(EAS_MODULE_MMAPI_TONE_CONTROL);
15256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else
15356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pData = EAS_HWMalloc(pEASData->hwInstData, sizeof(S_TC_DATA));
15456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (!pData)
15556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_MALLOC_FAILED;
15656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
15756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* copy data to persistent storage */
15856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_HWMemCpy(pData, &data, sizeof(S_TC_DATA));
15956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
16056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* return a pointer to the instance data */
16156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pData->state = EAS_STATE_OPEN;
16256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        *ppHandle = pData;
16356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
16456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
16556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
16656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
16756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
16856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
16956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * TC_Prepare()
17056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
17156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
17256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Prepare to parse the file. Allocates instance data (or uses static allocation for
17356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * static memory model).
17456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
17556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
17656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
17756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
17856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
17956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
18056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
18156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
18256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
18356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
18456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
18556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
18656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_Prepare (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
18756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
18856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_TC_DATA* pData;
18956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
19056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
19156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check for valid state */
19256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData = (S_TC_DATA*) pInstData;
19356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pData->state != EAS_STATE_OPEN)
19456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
19556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
19656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* instantiate a synthesizer */
19756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = VMInitMIDI(pEASData, &pData->pSynth)) != EAS_SUCCESS)
19856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
19956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "VMInitMIDI returned %d\n", result); */ }
20056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
20156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
20256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
20356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* set to ready state */
20456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->state = EAS_STATE_READY;
20556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
20656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
20756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
20856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
20956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * TC_Time()
21056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
21156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
21256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns the time of the next event in msecs
21356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
21456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
21556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
21656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
21756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pTime            - pointer to variable to hold time of next event (in msecs)
21856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
21956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
22056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
22156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
22256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
22356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
22456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
22556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
22656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, pEASData) reserved for future use */
22756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_Time (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_U32 *pTime)
22856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
22956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_TC_DATA *pData;
23056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
23156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData = (S_TC_DATA*) pInstData;
23256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
23356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* return time in milliseconds */
23456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e{704} use shift instead of division */
23556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pTime = pData->time >> 8;
23656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
23756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
23856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
23956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
24056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * TC_Event()
24156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
24256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
24356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Parse the next event in the file
24456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
24556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
24656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
24756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
24856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
24956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
25056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
25156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
25256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
25356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
25456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
25556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
25656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_Event (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_INT parserMode)
25756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
25856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_TC_DATA* pData;
25956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
26056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I8 temp;
26156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
26256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData = (S_TC_DATA*) pInstData;
26356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pData->state >= EAS_STATE_OPEN)
26456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_SUCCESS;
26556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
26656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* initialize MIDI channel when the track starts playing */
26756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pData->time == 0)
26856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
26956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* set program to square lead */
27056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        VMProgramChange(pEASData->pVoiceMgr, pData->pSynth, TC_CHANNEL, TC_PROGRAM);
27156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
27256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* set channel volume to max */
27356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        VMControlChange(pEASData->pVoiceMgr, pData->pSynth, TC_CHANNEL, 7, 127);
27456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
27556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
27656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check for end of note */
27756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pData->note >= 0)
27856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
27956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* stop the note */
28056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        VMStopNote(pEASData->pVoiceMgr, pData->pSynth, TC_CHANNEL, (EAS_U8) pData->note, 0);
28156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
28256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* check for repeat note */
28356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pData->repeatCount)
28456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
28556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pData->repeatCount--;
28656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pData->time += pData->length;
28756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((pData->note >= 0) && (parserMode == eParserModePlay))
28856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                VMStartNote(pEASData->pVoiceMgr, pData->pSynth, TC_CHANNEL, (EAS_U8) pData->note, pData->volume);
28956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_SUCCESS;
29056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
29156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
29256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pData->note = TC_FIELD_SILENCE;
29356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
29456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
29556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* parse stream until we get a note or rest */
29656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (;;)
29756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
29856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
29956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* get next byte from stream */
30056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = TC_GetNextChar(pEASData->hwInstData, pData, &temp)) != EAS_SUCCESS)
30156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
30256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (result == EAS_EOF)
30356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
30456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pData->state = EAS_STATE_STOPPING;
30556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return EAS_SUCCESS;
30656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
30756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
30856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
30956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
31056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* check for musical events */
31156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (temp >= TC_FIELD_SILENCE)
31256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
31356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            result = TC_StartNote(pEASData, pData, parserMode, temp);
31456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
31556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
31656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
31756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* must be a control field */
31856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        switch (temp)
31956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
32056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case TC_FIELD_TEMPO:
32156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                result = TC_GetTempo(pEASData, pData);
32256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
32356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
32456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case TC_FIELD_RESOLUTION:
32556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                result = TC_GetResolution(pEASData, pData);
32656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
32756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
32856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case TC_FIELD_SET_VOLUME:
32956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                result = TC_GetVolume(pEASData, pData);
33056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
33156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
33256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case TC_FIELD_REPEAT:
33356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                result = TC_GetRepeat(pEASData, pData, parserMode);
33456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
33556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
33656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case TC_FIELD_PLAY_BLOCK:
33756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                result = TC_PlayBlock(pEASData, pData);
33856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
33956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
34056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case TC_FIELD_BLOCK_START:
34156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                result = TC_GetNextChar(pEASData->hwInstData, pData, &temp);
34256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
34356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
34456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case TC_FIELD_BLOCK_END:
34556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                result = TC_BlockEnd(pEASData, pData);
34656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
34756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
34856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            default:
34956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Unexpected byte 0x%02x in ToneControl stream\n", temp); */ }
35056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                result = EAS_ERROR_FILE_FORMAT;
35156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
35256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
35356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* check for error */
35456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (result != EAS_SUCCESS)
35556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
35656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
35756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
35856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check for error */
35956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (result != EAS_SUCCESS)
36056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
36156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (result == EAS_EOF)
36256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            result = EAS_ERROR_FILE_FORMAT;
36356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pData->state = EAS_STATE_ERROR;
36456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
36556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else
36656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pData->state = EAS_STATE_PLAY;
36756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return result;
36856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
36956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
37056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
37156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * TC_State()
37256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
37356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
37456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns the current state of the stream
37556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
37656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
37756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
37856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
37956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pState           - pointer to variable to store state
38056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
38156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
38256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
38356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
38456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
38556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
38656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
38756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
38856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, pEASData) reserved for future use */
38956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_State (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 *pState)
39056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
39156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_TC_DATA* pData;
39256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
39356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* establish pointer to instance data */
39456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData = (S_TC_DATA*) pInstData;
39556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
39656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if stopping, check to see if synth voices are active */
39756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pData->state == EAS_STATE_STOPPING)
39856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
39956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (VMActiveVoices(pData->pSynth) == 0)
40056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pData->state = EAS_STATE_STOPPED;
40156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
40256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
40356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pData->state == EAS_STATE_PAUSING)
40456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
40556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (VMActiveVoices(pData->pSynth) == 0)
40656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pData->state = EAS_STATE_PAUSED;
40756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
40856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
40956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* return current state */
41056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pState = pData->state;
41156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
41256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
41356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
41456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
41556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * TC_Close()
41656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
41756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
41856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Close the file and clean up
41956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
42056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
42156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
42256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
42356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
42456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
42556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
42656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
42756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
42856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
42956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
43056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
43156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_Close (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
43256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
43356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_TC_DATA* pData;
43456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
43556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
43656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData = (S_TC_DATA*) pInstData;
43756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
43856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* close the file */
43956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWCloseFile(pEASData->hwInstData, pData->fileHandle)) != EAS_SUCCESS)
44056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
44156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
44256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* free the synth */
44356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pData->pSynth != NULL)
44456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        VMMIDIShutdown(pEASData, pData->pSynth);
44556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
44656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if using dynamic memory, free it */
44756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!pEASData->staticMemoryModel)
44856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_HWFree(pEASData->hwInstData, pData);
44956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
45056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
45156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
45256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
45356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
45456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * TC_Reset()
45556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
45656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
45756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Reset the sequencer. Used for locating backwards in the file.
45856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
45956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
46056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
46156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
46256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
46356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
46456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
46556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
46656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
46756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
46856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
46956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
47056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_Reset (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
47156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
47256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_TC_DATA* pData;
47356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
47456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
47556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData = (S_TC_DATA*) pInstData;
47656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
47756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* reset the synth */
47856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    VMReset(pEASData->pVoiceMgr, pData->pSynth, EAS_TRUE);
47956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
48056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* reset time to zero */
48156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->time = 0;
48256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
48356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* reset file position and re-parse header */
48456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->state = EAS_STATE_ERROR;
48556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(pEASData->hwInstData, pData->fileHandle, pData->fileOffset)) != EAS_SUCCESS)
48656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
48756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = TC_ParseHeader (pEASData,  pData)) != EAS_SUCCESS)
48856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
48956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
49056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->state = EAS_STATE_READY;
49156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
49256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
49356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
49456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
49556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * TC_Pause()
49656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
49756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
49856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Pauses the sequencer. Mutes all voices and sets state to pause.
49956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
50056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
50156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
50256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
50356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
50456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
50556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
50656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
50756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
50856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
50956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
51056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
51156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_Pause (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
51256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
51356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_TC_DATA *pData;
51456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
51556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* can't pause a stopped stream */
51656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData = (S_TC_DATA*) pInstData;
51756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pData->state == EAS_STATE_STOPPED)
51856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_ALREADY_STOPPED;
51956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
52056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* mute the synthesizer */
52156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    VMMuteAllVoices(pEASData->pVoiceMgr, pData->pSynth);
52256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->state = EAS_STATE_PAUSING;
52356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
52456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
52556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
52656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
52756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * TC_Resume()
52856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
52956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
53056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Resume playing after a pause, sets state back to playing.
53156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
53256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
53356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
53456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
53556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
53656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
53756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
53856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
53956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
54056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
54156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
54256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
54356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, pEASData) reserved for future use */
54456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_Resume (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
54556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
54656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_TC_DATA *pData;
54756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
54856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* can't resume a stopped stream */
54956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData = (S_TC_DATA*) pInstData;
55056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pData->state == EAS_STATE_STOPPED)
55156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_ALREADY_STOPPED;
55256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
55356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* nothing to do but resume playback */
55456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->state = EAS_STATE_PLAY;
55556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
55656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
55756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
55856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
55956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * TC_SetData()
56056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
56156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
56256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Return file type
56356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
56456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
56556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
56656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
56756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
56856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
56956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
57056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
57156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
57256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
57356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
57456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
57556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, pEASData, pInstData, value) reserved for future use */
57656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_SetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value)
57756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
57856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* we don't parse any metadata, but we need to return success here */
57956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (param == PARSER_DATA_METADATA_CB)
58056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_SUCCESS;
58156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
58256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_ERROR_INVALID_PARAMETER;
58356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
58456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
58556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
58656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * TC_GetData()
58756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
58856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
58956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Return file type
59056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
59156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
59256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
59356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
59456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
59556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
59656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
59756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
59856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
59956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
60056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
60156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
60256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -e{715} common with other parsers */
60356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_GetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue)
60456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
60556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_TC_DATA *pData;
60656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
60756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData = (S_TC_DATA *) pInstData;
60856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    switch (param)
60956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
61056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* return file type as TC */
61156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_FILE_TYPE:
61256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            *pValue = EAS_FILE_MMAPI_TONE_CONTROL;
61356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
61456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
61556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_SYNTH_HANDLE:
61656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            *pValue = (EAS_I32) pData->pSynth;
61756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
61856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
61956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    default:
62056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_INVALID_PARAMETER;
62156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
62256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
62356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
62456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
62556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
62656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * TC_ParseHeader()
62756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
62856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
62956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Prepare to parse the file. Allocates instance data (or uses static allocation for
63056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * static memory model).
63156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
63256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
63356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
63456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
63556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
63656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
63756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
63856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
63956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
64056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
64156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
64256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
64356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_ParseHeader (S_EAS_DATA *pEASData, S_TC_DATA* pData)
64456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
64556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
64656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I8 temp;
64756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
64856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* initialize some defaults */
64956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->time = 0;
65056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->tempo = 120;
65156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->resolution = 64;
65256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->volume = 127;
65356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->repeatCount = 0;
65456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->note = TC_FIELD_SILENCE;
65556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->byteAvail = EAS_FALSE;
65656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
65756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* set default timebase */
65856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    TC_CalcTimeBase(pData);
65956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
66056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* seek to start of data */
66156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(pEASData->hwInstData, pData->fileHandle, pData->fileOffset)) != EAS_SUCCESS)
66256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
66356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
66456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get version */
66556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = TC_GetNextChar(pEASData->hwInstData, pData, &temp)) != EAS_SUCCESS)
66656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
66756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
66856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check for version number */
66956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (temp == TC_FIELD_VERSION)
67056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
67156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        TC_GetNextChar(pEASData->hwInstData, pData, &temp);
67256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks//      { /* dpp: EAS_ReportEx(_EAS_SEVERITY_INFO, "ToneControl sequence version %d\n", temp); */ }
67356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
67456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else
67556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FILE_FORMAT;
67656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
67756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* parse the header data until we find the first note or block */
67856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (;;)
67956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
68056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
68156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* get next byte from stream */
68256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = TC_GetNextChar(pEASData->hwInstData, pData, &temp)) != EAS_SUCCESS)
68356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
68456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
68556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* check for tempo */
68656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (temp == TC_FIELD_TEMPO)
68756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
68856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = TC_GetTempo(pEASData, pData)) != EAS_SUCCESS)
68956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
69056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
69156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
69256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* or resolution */
69356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else if (temp == TC_FIELD_TEMPO)
69456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
69556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = TC_GetResolution(pEASData, pData)) != EAS_SUCCESS)
69656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
69756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
69856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
69956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* must be music data */
70056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else if (temp > TC_FIELD_INVALID)
70156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
70256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            TC_PutBackChar(pData, temp);
70356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_SUCCESS;
70456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
70556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
70656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* unknown codes */
70756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else
70856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
70956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Unexpected byte 0x%02x in ToneControl stream\n", temp); */ }
71056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_FILE_FORMAT;
71156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
71256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
71356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
71456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
71556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
71656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * TC_StartNote()
71756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
71856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Process a note or silence event
71956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
72056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
72156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_StartNote (S_EAS_DATA *pEASData, S_TC_DATA* pData, EAS_INT parserMode, EAS_I8 note)
72256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
72356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I8 duration;
72456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
72556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the duration */
72656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (TC_GetNextChar(pEASData->hwInstData, pData, &duration) != EAS_SUCCESS)
72756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FILE_FORMAT;
72856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
72956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* calculate time of next event */
73056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->length = (EAS_I32) duration * pData->tick;
73156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->time += pData->length;
73256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
73356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* start the note */
73456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((note >= 0) && (parserMode == eParserModePlay))
73556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
73656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        VMStartNote(pEASData->pVoiceMgr, pData->pSynth, TC_CHANNEL, (EAS_U8) note, pData->volume);
73756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pData->note = note;
73856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
73956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
74056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
74156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
74256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
74356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
74456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * TC_GetRepeat()
74556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
74656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Process a repeat code
74756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
74856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
74956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_GetRepeat (S_EAS_DATA *pEASData, S_TC_DATA* pData, EAS_INT parserMode)
75056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
75156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I8 count;
75256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
75356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the repeat count */
75456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (TC_GetNextChar(pEASData->hwInstData, pData, &count) != EAS_SUCCESS)
75556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FILE_FORMAT;
75656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
75756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* validiate it */
75856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (count < 2)
75956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FILE_FORMAT;
76056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
76156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* calculate time of next event */
76256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->time += pData->length;
76356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->repeatCount = count - 2;
76456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
76556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* start the note */
76656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((pData->note >= 0) && (parserMode == eParserModePlay))
76756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        VMStartNote(pEASData->pVoiceMgr, pData->pSynth, TC_CHANNEL, (EAS_U8) pData->note, pData->volume);
76856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
76956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
77056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
77156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
77256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
77356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * TC_PlayBlock()
77456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
77556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Play a block of notes
77656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
77756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
77856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_PlayBlock (S_EAS_DATA *pEASData, S_TC_DATA* pData)
77956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
78056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
78156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I8 blockNum;
78256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I8 temp;
78356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I8 temp2;
78456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
78556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the block number */
78656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (TC_GetNextChar(pEASData->hwInstData, pData, &blockNum) != EAS_SUCCESS)
78756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FILE_FORMAT;
78856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
78956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* validiate it */
79056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (blockNum < 0)
79156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FILE_FORMAT;
79256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
79356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* save the current position */
79456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFilePos(pEASData->hwInstData, pData->fileHandle, &pData->restorePos)) != EAS_SUCCESS)
79556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
79656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
79756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* return to start of file */
79856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->byteAvail = EAS_FALSE;
79956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(pEASData->hwInstData, pData->fileHandle, pData->fileOffset)) != EAS_SUCCESS)
80056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
80156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
80256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* find the block */
80356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (;;)
80456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
80556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (TC_GetNextChar(pEASData->hwInstData, pData, &temp) != EAS_SUCCESS)
80656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_FILE_FORMAT;
80756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
80856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (TC_GetNextChar(pEASData->hwInstData, pData, &temp2) != EAS_SUCCESS)
80956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_FILE_FORMAT;
81056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
81156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((temp == TC_FIELD_BLOCK_START) && (temp2 == blockNum))
81256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_SUCCESS;
81356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
81456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
81556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
81656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
81756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * TC_BlockEnd()
81856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
81956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Handle end of block
82056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
82156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
82256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_BlockEnd (S_EAS_DATA *pEASData, S_TC_DATA* pData)
82356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
82456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I8 blockNum;
82556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
82656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the block number */
82756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (TC_GetNextChar(pEASData->hwInstData, pData, &blockNum) != EAS_SUCCESS)
82856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FILE_FORMAT;
82956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
83056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* validiate it */
83156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (blockNum < 0)
83256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FILE_FORMAT;
83356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
83456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if we were playing this block, restore to previous position */
83556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->byteAvail = EAS_FALSE;
83656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_HWFileSeek(pEASData->hwInstData, pData->fileHandle, pData->restorePos);
83756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
83856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
83956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
84056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * TC_GetVolume()
84156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
84256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Get the volume field and process it
84356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
84456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
84556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_GetVolume (S_EAS_DATA *pEASData, S_TC_DATA* pData)
84656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
84756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I8 volume;
84856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
84956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get volume */
85056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (TC_GetNextChar(pEASData->hwInstData, pData, &volume) != EAS_SUCCESS)
85156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FILE_FORMAT;
85256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((volume < 0) || (volume > 100))
85356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FILE_FORMAT;
85456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
85556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* save volume */
85656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->volume = (EAS_U8) ((EAS_I32) (volume * TC_VOLUME_CONV + 1) >> TC_VOLUME_SHIFT);
85756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
85856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
85956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
86056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
86156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * TC_GetTempo()
86256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
86356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Get the tempo field and process it
86456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
86556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
86656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_GetTempo (S_EAS_DATA *pEASData, S_TC_DATA* pData)
86756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
86856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I8 tempo;
86956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
87056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get tempo */
87156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (TC_GetNextChar(pEASData->hwInstData, pData, &tempo) != EAS_SUCCESS)
87256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FILE_FORMAT;
87356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (tempo < 5)
87456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FILE_FORMAT;
87556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
87656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* save tempo */
87756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->tempo = tempo;
87856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
87956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* calculate new timebase */
88056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    TC_CalcTimeBase(pData);
88156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
88256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
88356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
88456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
88556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * TC_GetResolution()
88656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
88756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Get the resolution field and process it
88856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
88956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
89056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_GetResolution (S_EAS_DATA *pEASData, S_TC_DATA* pData)
89156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
89256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I8 resolution;
89356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
89456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get resolution */
89556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (TC_GetNextChar(pEASData->hwInstData, pData, &resolution) != EAS_SUCCESS)
89656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FILE_FORMAT;
89756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (resolution < 0)
89856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FILE_FORMAT;
89956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
90056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* save tempo */
90156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->resolution = resolution;
90256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
90356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* calculate new timebase */
90456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    TC_CalcTimeBase(pData);
90556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
90656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
90756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
90856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
90956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * TC_GetNextChar()
91056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
91156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Fetch the next character from the stream
91256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
91356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
91456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT TC_GetNextChar (EAS_HW_DATA_HANDLE hwInstData, S_TC_DATA *pData, EAS_I8 *pValue)
91556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
91656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
91756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get character from "put back" buffer */
91856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pData->byteAvail)
91956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
92056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pData->byteAvail = EAS_FALSE;
92156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        *pValue = pData->dataByte;
92256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_SUCCESS;
92356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
92456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
92556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get character from file */
92656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_HWGetByte(hwInstData, pData->fileHandle, pValue);
92756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
92856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
92956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
93056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * TC_PutBackChar()
93156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
93256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Put back the character
93356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
93456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
93556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic void TC_PutBackChar (S_TC_DATA *pData, EAS_I8 value)
93656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
93756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
93856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->dataByte = value;
93956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->byteAvail = EAS_TRUE;
94056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
94156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
942