156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * File:
456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * eas_smf.c
556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Contents and purpose:
756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * SMF Type 0 and 1 File Parser
856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * For SMF timebase analysis, see "MIDI Sequencer Analysis.xls".
1056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
1156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Copyright Sonic Network Inc. 2005
127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * you may not use this file except in compliance with the License.
157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * You may obtain a copy of the License at
167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * See the License for the specific language governing permissions and
237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * limitations under the License.
2456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
2556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
2656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Revision Control:
2756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *   $Revision: 803 $
2856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *   $Date: 2007-08-01 09:57:00 -0700 (Wed, 01 Aug 2007) $
2956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
3056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
3156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
3256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_data.h"
3356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_miditypes.h"
3456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_parser.h"
3556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_report.h"
3656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_host.h"
3756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_midi.h"
3856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_config.h"
3956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_vm_protos.h"
4056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_smfdata.h"
4156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_smf.h"
4256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
4356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef JET_INTERFACE
4456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "jet_data.h"
4556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
4656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
4756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks//3 dls: The timebase for this module is adequate to keep MIDI and
4856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks//3 digital audio synchronized for only a few minutes. It should be
4956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks//3 sufficient for most mobile applications. If better accuracy is
5056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks//3 required, more fractional bits should be added to the timebase.
5156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
5256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic const EAS_U8 smfHeader[] = { 'M', 'T', 'h', 'd' };
5356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
5456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* local prototypes */
5556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT SMF_GetVarLenData (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE fileHandle, EAS_U32 *pData);
5656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT SMF_ParseMetaEvent (S_EAS_DATA *pEASData, S_SMF_DATA *pSMFData, S_SMF_STREAM *pSMFStream);
5756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT SMF_ParseSysEx (S_EAS_DATA *pEASData, S_SMF_DATA *pSMFData, S_SMF_STREAM *pSMFStream, EAS_U8 f0, EAS_INT parserMode);
5856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT SMF_ParseEvent (S_EAS_DATA *pEASData, S_SMF_DATA *pSMFData, S_SMF_STREAM *pSMFStream, EAS_INT parserMode);
5956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT SMF_GetDeltaTime (EAS_HW_DATA_HANDLE hwInstData, S_SMF_STREAM *pSMFStream);
6056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic void SMF_UpdateTime (S_SMF_DATA *pSMFData, EAS_U32 ticks);
6156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
6256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
6356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
6456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
6556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * SMF_Parser
6656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
6756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * This structure contains the functional interface for the SMF parser
6856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
6956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
7056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksconst S_FILE_PARSER_INTERFACE EAS_SMF_Parser =
7156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
7256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    SMF_CheckFileType,
7356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    SMF_Prepare,
7456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    SMF_Time,
7556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    SMF_Event,
7656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    SMF_State,
7756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    SMF_Close,
7856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    SMF_Reset,
7956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    SMF_Pause,
8056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    SMF_Resume,
8156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    NULL,
8256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    SMF_SetData,
8356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    SMF_GetData,
8456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    NULL
8556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks};
8656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
8756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
8856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * SMF_CheckFileType()
8956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
9056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
9156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Check the file type to see if we can parse it
9256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
9356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
9456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
9556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
9656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
9756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
9856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
9956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
10056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
10156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
10256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
10356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
10456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT SMF_CheckFileType (S_EAS_DATA *pEASData, EAS_FILE_HANDLE fileHandle, EAS_VOID_PTR *ppHandle, EAS_I32 offset)
10556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
10656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_SMF_DATA* pSMFData;
10756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
10856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
10956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* seek to starting offset - usually 0 */
11056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *ppHandle = NULL;
11156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(pEASData->hwInstData, fileHandle, offset)) != EAS_SUCCESS)
11256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
11356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
11456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* search through file for header - slow method */
11556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->searchHeaderFlag)
11656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
11756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        result = EAS_SearchFile(pEASData, fileHandle, smfHeader, sizeof(smfHeader), &offset);
11856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (result != EAS_SUCCESS)
11956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return (result == EAS_EOF) ? EAS_SUCCESS : result;
12056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
12156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
12256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* read the first 4 bytes of the file - quick method */
12356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else {
12456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_U8 header[4];
12556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_I32 count;
12656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWReadFile(pEASData->hwInstData, fileHandle, header, sizeof(header), &count)) != EAS_SUCCESS)
12756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
12856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
12956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* check for 'MTrk' - return if no match */
13056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((header[0] != 'M') || (header[1] != 'T') || (header[2] != 'h') || (header[3] != 'd'))
13156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_SUCCESS;
13256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
13356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
13456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check for static memory allocation */
13556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->staticMemoryModel)
13656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pSMFData = EAS_CMEnumData(EAS_CM_SMF_DATA);
13756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else
13856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
13956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pSMFData = EAS_HWMalloc(pEASData->hwInstData, sizeof(S_SMF_DATA));
14056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_HWMemSet((void *)pSMFData,0, sizeof(S_SMF_DATA));
14156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
14256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!pSMFData)
14356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_MALLOC_FAILED;
14456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
14556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* initialize some critical data */
14656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSMFData->fileHandle = fileHandle;
14756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSMFData->fileOffset = offset;
14856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSMFData->pSynth = NULL;
14956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSMFData->time = 0;
15056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSMFData->state = EAS_STATE_OPEN;
15156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *ppHandle = pSMFData;
15256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
15356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
15456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
15556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
15656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
15756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * SMF_Prepare()
15856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
15956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
16056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Prepare to parse the file. Allocates instance data (or uses static allocation for
16156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * static memory model).
16256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
16356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
16456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
16556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
16656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
16756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
16856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
16956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
17056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
17156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
17256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
17356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
17456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT SMF_Prepare (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
17556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
17656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_SMF_DATA* pSMFData;
17756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
17856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
17956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check for valid state */
18056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSMFData = (S_SMF_DATA *) pInstData;
18156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pSMFData->state != EAS_STATE_OPEN)
18256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
18356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
18456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* instantiate a synthesizer */
18556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = VMInitMIDI(pEASData, &pSMFData->pSynth)) != EAS_SUCCESS)
18656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
18756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "VMInitMIDI returned %d\n", result); */ }
18856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
18956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
19056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
19156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* parse the file header and setup the individual stream parsers */
19256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = SMF_ParseHeader(pEASData->hwInstData, pSMFData)) != EAS_SUCCESS)
19356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
19456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
19556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* ready to play */
19656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSMFData->state = EAS_STATE_READY;
19756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
19856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
19956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
20056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
20156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * SMF_Time()
20256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
20356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
20456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns the time of the next event in msecs
20556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
20656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
20756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
20856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
20956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pTime            - pointer to variable to hold time of next event (in msecs)
21056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
21156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
21256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
21356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
21456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
21556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
21656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
21756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
21856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, pEASData) reserved for future use */
21956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT SMF_Time (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_U32 *pTime)
22056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
22156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_SMF_DATA *pSMFData;
22256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
22356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSMFData = (S_SMF_DATA*) pInstData;
22456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
22556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* sanity check */
22656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _CHECKED_BUILD
22756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pSMFData->state == EAS_STATE_STOPPED)
22856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
22956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Can't ask for time on a stopped stream\n"); */ }
23056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
23156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
23256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pSMFData->nextStream == NULL)
23356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
23456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx( _EAS_SEVERITY_ERROR, "no is NULL\n"); */ }
23556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
23656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
23756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
23856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#if 0
23956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* return time in milliseconds */
24056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if chase mode, lie about time */
24156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pSMFData->flags & SMF_FLAGS_CHASE_MODE)
24256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        *pTime = 0;
24356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
24456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else
24556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
24656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
24756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /*lint -e{704} use shift instead of division */
24856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        *pTime = pSMFData->time >> 8;
24956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
25056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pTime = pSMFData->time >> 8;
25156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
25256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
25356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
25456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
25556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * SMF_Event()
25656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
25756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
25856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Parse the next event in the file
25956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
26056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
26156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
26256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
26356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
26456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
26556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
26656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
26756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
26856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
26956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
27056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
27156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT SMF_Event (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_INT parserMode)
27256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
27356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_SMF_DATA* pSMFData;
27456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
27556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 i;
27656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 ticks;
27756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 temp;
27856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
27956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* establish pointer to instance data */
28056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSMFData = (S_SMF_DATA*) pInstData;
28156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pSMFData->state >= EAS_STATE_OPEN)
28256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_SUCCESS;
28356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
28456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get current ticks */
28556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    ticks = pSMFData->nextStream->ticks;
28656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
28756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* assume that an error occurred */
28856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSMFData->state = EAS_STATE_ERROR;
28956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
29056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef JET_INTERFACE
29156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if JET has track muted, set parser mode to mute */
29256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pSMFData->nextStream->midiStream.jetData & MIDI_FLAGS_JET_MUTE)
29356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        parserMode = eParserModeMute;
29456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
29556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
29656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* parse the next event from all the streams */
29756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = SMF_ParseEvent(pEASData, pSMFData, pSMFData->nextStream, parserMode)) != EAS_SUCCESS)
29856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
29956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* check for unexpected end-of-file */
30056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (result != EAS_EOF)
30156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
30256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
30356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* indicate end of track for this stream */
30456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pSMFData->nextStream->ticks = SMF_END_OF_TRACK;
30556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
30656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
30756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get next delta time, unless already at end of track */
30856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else if (pSMFData->nextStream->ticks != SMF_END_OF_TRACK)
30956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
31056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = SMF_GetDeltaTime(pEASData->hwInstData, pSMFData->nextStream)) != EAS_SUCCESS)
31156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
31256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* check for unexpected end-of-file */
31356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (result != EAS_EOF)
31456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
31556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
31656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* indicate end of track for this stream */
31756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pSMFData->nextStream->ticks = SMF_END_OF_TRACK;
31856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
31956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
32056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* if zero delta to next event, stay with this stream */
32156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else if (pSMFData->nextStream->ticks == ticks)
32256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
32356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pSMFData->state = EAS_STATE_PLAY;
32456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_SUCCESS;
32556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
32656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
32756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
32856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* find next event in all streams */
32956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    temp = 0x7ffffff;
33056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSMFData->nextStream = NULL;
33156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (i = 0; i < pSMFData->numStreams; i++)
33256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
33356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pSMFData->streams[i].ticks < temp)
33456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
33556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            temp = pSMFData->streams[i].ticks;
33656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pSMFData->nextStream = &pSMFData->streams[i];
33756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
33856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
33956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
34056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* are there any more events to parse? */
34156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pSMFData->nextStream)
34256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
34356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pSMFData->state = EAS_STATE_PLAY;
34456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
34556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* update the time of the next event */
34656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        SMF_UpdateTime(pSMFData, pSMFData->nextStream->ticks - ticks);
34756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
34856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else
34956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
35056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pSMFData->state = EAS_STATE_STOPPING;
35156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        VMReleaseAllVoices(pEASData->pVoiceMgr, pSMFData->pSynth);
35256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
35356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
35456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
35556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
35656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
35756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
35856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * SMF_State()
35956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
36056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
36156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns the current state of the stream
36256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
36356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
36456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
36556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
36656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pState           - pointer to variable to store state
36756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
36856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
36956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
37056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
37156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
37256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
37356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
37456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
37556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, pEASData) reserved for future use */
37656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT SMF_State (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 *pState)
37756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
37856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_SMF_DATA* pSMFData;
37956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
38056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* establish pointer to instance data */
38156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSMFData = (S_SMF_DATA*) pInstData;
38256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
38356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if stopping, check to see if synth voices are active */
38456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pSMFData->state == EAS_STATE_STOPPING)
38556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
38656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (VMActiveVoices(pSMFData->pSynth) == 0)
38756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pSMFData->state = EAS_STATE_STOPPED;
38856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
38956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
39056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pSMFData->state == EAS_STATE_PAUSING)
39156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
39256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (VMActiveVoices(pSMFData->pSynth) == 0)
39356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pSMFData->state = EAS_STATE_PAUSED;
39456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
39556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
39656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* return current state */
39756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pState = pSMFData->state;
39856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
39956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
40056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
40156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
40256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * SMF_Close()
40356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
40456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
40556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Close the file and clean up
40656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
40756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
40856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
40956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
41056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
41156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
41256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
41356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
41456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
41556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
41656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
41756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
41856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT SMF_Close (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
41956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
42056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_SMF_DATA* pSMFData;
42156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 i;
42256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
42356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
42456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSMFData = (S_SMF_DATA*) pInstData;
42556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
42656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* close all the streams */
42756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (i = 0; i < pSMFData->numStreams; i++)
42856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
42956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pSMFData->streams[i].fileHandle != NULL)
43056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
43156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = EAS_HWCloseFile(pEASData->hwInstData, pSMFData->streams[i].fileHandle)) != EAS_SUCCESS)
43256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
43356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
43456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
43556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pSMFData->fileHandle != NULL)
43656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWCloseFile(pEASData->hwInstData, pSMFData->fileHandle)) != EAS_SUCCESS)
43756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
43856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
43956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* free the synth */
44056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pSMFData->pSynth != NULL)
44156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        VMMIDIShutdown(pEASData, pSMFData->pSynth);
44256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
44356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if using dynamic memory, free it */
44456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!pEASData->staticMemoryModel)
44556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
44656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pSMFData->streams)
44756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            EAS_HWFree(pEASData->hwInstData, pSMFData->streams);
44856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
44956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* free the instance data */
45056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_HWFree(pEASData->hwInstData, pSMFData);
45156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
45256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
45356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
45456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
45556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
45656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
45756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * SMF_Reset()
45856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
45956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
46056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Reset the sequencer. Used for locating backwards in the file.
46156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
46256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
46356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
46456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
46556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
46656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
46756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
46856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
46956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
47056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
47156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
47256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
47356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT SMF_Reset (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
47456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
47556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_SMF_DATA* pSMFData;
47656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 i;
47756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
47856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 ticks;
47956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
48056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSMFData = (S_SMF_DATA*) pInstData;
48156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
48256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* reset time to zero */
48356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSMFData->time = 0;
48456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
48556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* reset the synth */
48656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    VMReset(pEASData->pVoiceMgr, pSMFData->pSynth, EAS_TRUE);
48756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
48856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* find the start of each track */
48956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    ticks = 0x7fffffffL;
49056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSMFData->nextStream = NULL;
49156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (i = 0; i < pSMFData->numStreams; i++)
49256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
49356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
49456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* reset file position to first byte of data in track */
49556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWFileSeek(pEASData->hwInstData, pSMFData->streams[i].fileHandle, pSMFData->streams[i].startFilePos)) != EAS_SUCCESS)
49656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
49756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
49856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* initalize some data */
49956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pSMFData->streams[i].ticks = 0;
50056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
50156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* initalize the MIDI parser data */
50256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_InitMIDIStream(&pSMFData->streams[i].midiStream);
50356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
50456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* parse the first delta time in each stream */
50556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = SMF_GetDeltaTime(pEASData->hwInstData,&pSMFData->streams[i])) != EAS_SUCCESS)
50656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
50756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pSMFData->streams[i].ticks < ticks)
50856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
50956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            ticks = pSMFData->streams[i].ticks;
51056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pSMFData->nextStream = &pSMFData->streams[i];
51156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
51256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
51356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
51456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
51556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSMFData->state = EAS_STATE_READY;
51656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
51756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
51856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
51956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
52056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * SMF_Pause()
52156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
52256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
52356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Pauses the sequencer. Mutes all voices and sets state to pause.
52456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
52556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
52656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
52756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
52856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
52956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
53056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
53156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
53256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
53356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
53456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
53556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
53656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT SMF_Pause (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
53756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
53856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_SMF_DATA *pSMFData;
53956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
54056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* can't pause a stopped stream */
54156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSMFData = (S_SMF_DATA*) pInstData;
54256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pSMFData->state == EAS_STATE_STOPPED)
54356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_ALREADY_STOPPED;
54456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
54556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* mute the synthesizer */
54656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    VMMuteAllVoices(pEASData->pVoiceMgr, pSMFData->pSynth);
54756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSMFData->state = EAS_STATE_PAUSING;
54856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
54956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
55056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
55156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
55256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * SMF_Resume()
55356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
55456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
55556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Resume playing after a pause, sets state back to playing.
55656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
55756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
55856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
55956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
56056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
56156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
56256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
56356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
56456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
56556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
56656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
56756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
56856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, pEASData) reserved for future use */
56956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT SMF_Resume (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
57056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
57156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_SMF_DATA *pSMFData;
57256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
57356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* can't resume a stopped stream */
57456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSMFData = (S_SMF_DATA*) pInstData;
57556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pSMFData->state == EAS_STATE_STOPPED)
57656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_ALREADY_STOPPED;
57756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
57856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* nothing to do but resume playback */
57956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSMFData->state = EAS_STATE_PLAY;
58056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
58156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
58256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
58356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
58456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * SMF_SetData()
58556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
58656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
58756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Sets parser parameters
58856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
58956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
59056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
59156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
59256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
59356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
59456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
59556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
59656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
59756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
59856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
59956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
60056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, pEASData) reserved for future use */
60156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT SMF_SetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value)
60256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
60356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_SMF_DATA *pSMFData;
60456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
60556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSMFData = (S_SMF_DATA*) pInstData;
60656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    switch (param)
60756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
60856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
60956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* set metadata callback */
61056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_METADATA_CB:
61156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            EAS_HWMemCpy(&pSMFData->metadata, (void*) value, sizeof(S_METADATA_CB));
61256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
61356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
61456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef JET_INTERFACE
61556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* set jet segment and track ID of all tracks for callback function */
61656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_JET_CB:
61756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
61856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                EAS_U32 i;
61956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                EAS_U32 bit = (EAS_U32) value;
62056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                bit = (bit << JET_EVENT_SEG_SHIFT) & JET_EVENT_SEG_MASK;
62156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                for (i = 0; i < pSMFData->numStreams; i++)
62256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    pSMFData->streams[i].midiStream.jetData =
62356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        (pSMFData->streams[i].midiStream.jetData &
62456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        ~(JET_EVENT_TRACK_MASK | JET_EVENT_SEG_MASK)) |
62556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        i << JET_EVENT_TRACK_SHIFT | bit | MIDI_FLAGS_JET_CB;
62656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pSMFData->flags |= SMF_FLAGS_JET_STREAM;
62756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
62856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
62956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
63056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* set state of all mute flags at once */
63156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_MUTE_FLAGS:
63256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
63356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                EAS_INT i;
63456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                EAS_U32 bit = (EAS_U32) value;
63556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                for (i = 0; i < pSMFData->numStreams; i++)
63656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
63756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    if (bit & 1)
63856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        pSMFData->streams[i].midiStream.jetData |= MIDI_FLAGS_JET_MUTE;
63956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    else
64056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        pSMFData->streams[i].midiStream.jetData &= ~MIDI_FLAGS_JET_MUTE;
64156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    bit >>= 1;
64256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
64356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
64456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
64556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
64656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* set track mute */
64756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_SET_MUTE:
64856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (value < pSMFData->numStreams)
64956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pSMFData->streams[value].midiStream.jetData |= MIDI_FLAGS_JET_MUTE;
65056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            else
65156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return EAS_ERROR_PARAMETER_RANGE;
65256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
65356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
65456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* clear track mute */
65556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_CLEAR_MUTE:
65656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (value < pSMFData->numStreams)
65756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pSMFData->streams[value].midiStream.jetData &= ~MIDI_FLAGS_JET_MUTE;
65856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            else
65956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return EAS_ERROR_PARAMETER_RANGE;
66056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
66156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
66256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
66356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        default:
66456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_INVALID_PARAMETER;
66556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
66656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
66756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
66856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
66956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
67056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
67156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * SMF_GetData()
67256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
67356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
67456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Retrieves parser parameters
67556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
67656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
67756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
67856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
67956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
68056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
68156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
68256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
68356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
68456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
68556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
68656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
68756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, pEASData) reserved for future use */
68856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT SMF_GetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue)
68956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
69056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_SMF_DATA *pSMFData;
69156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
69256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSMFData = (S_SMF_DATA*) pInstData;
69356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    switch (param)
69456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
69556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* return file type */
69656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_FILE_TYPE:
69756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (pSMFData->numStreams == 1)
69856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                *pValue = EAS_FILE_SMF0;
69956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            else
70056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                *pValue = EAS_FILE_SMF1;
70156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
70256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
70356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* now handled in eas_public.c */
70456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#if 0
70556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_POLYPHONY:
70656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (pSMFData->pSynth)
70756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                VMGetPolyphony(pEASData->pVoiceMgr, pSMFData->pSynth, pValue);
70856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            else
70956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
71056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
71156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
71256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_PRIORITY:
71356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (pSMFData->pSynth)
71456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                VMGetPriority(pEASData->pVoiceMgr, pSMFData->pSynth, pValue);
71556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
71656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
71756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* set transposition */
71856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_TRANSPOSITION:
71956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            *pValue = pSMFData->transposition;
72056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
72156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
72256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
72356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_SYNTH_HANDLE:
72456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            *pValue = (EAS_I32) pSMFData->pSynth;
72556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
72656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
72756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        default:
72856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_INVALID_PARAMETER;
72956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
73056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
73156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
73256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
73356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
73456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
73556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * SMF_GetVarLenData()
73656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
73756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
73856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Reads a varible length quantity from an SMF file
73956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
74056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
74156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
74256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
74356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
74456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
74556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
74656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
74756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
74856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
74956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
75056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT SMF_GetVarLenData (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE fileHandle, EAS_U32 *pData)
75156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
75256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
75356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 data;
75456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U8 c;
75556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
75656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* read until bit 7 is zero */
75756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    data = 0;
75856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    do
75956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
76056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWGetByte(hwInstData, fileHandle,&c)) != EAS_SUCCESS)
76156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
76256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        data = (data << 7) | (c & 0x7f);
76356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    } while (c & 0x80);
76456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pData = data;
76556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
76656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
76756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
76856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
76956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * SMF_GetDeltaTime()
77056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
77156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
77256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Reads a varible length quantity from an SMF file
77356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
77456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
77556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
77656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
77756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
77856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
77956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
78056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
78156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
78256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
78356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
78456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT SMF_GetDeltaTime (EAS_HW_DATA_HANDLE hwInstData, S_SMF_STREAM *pSMFStream)
78556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
78656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
78756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 ticks;
78856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
78956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = SMF_GetVarLenData(hwInstData, pSMFStream->fileHandle, &ticks)) != EAS_SUCCESS)
79056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
79156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
79256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSMFStream->ticks += ticks;
79356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
79456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
79556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
79656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
79756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * SMF_ParseMetaEvent()
79856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
79956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
80056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Reads a varible length quantity from an SMF file
80156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
80256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
80356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
80456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
80556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
80656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
80756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
80856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
80956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
81056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
81156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
81256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT SMF_ParseMetaEvent (S_EAS_DATA *pEASData, S_SMF_DATA *pSMFData, S_SMF_STREAM *pSMFStream)
81356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
81456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
81556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 len;
81656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 pos;
81756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 temp;
81856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U8 c;
81956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
82056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the meta-event type */
82156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetByte(pEASData->hwInstData, pSMFStream->fileHandle, &c)) != EAS_SUCCESS)
82256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
82356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
82456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the length */
82556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = SMF_GetVarLenData(pEASData->hwInstData, pSMFStream->fileHandle, &len)) != EAS_SUCCESS)
82656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
82756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
82856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the current file position so we can skip the event */
82956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFilePos(pEASData->hwInstData, pSMFStream->fileHandle, &pos)) != EAS_SUCCESS)
83056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
83156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pos += (EAS_I32) len;
83256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
83356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* end of track? */
83456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (c == SMF_META_END_OF_TRACK)
83556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
83656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Meta-event: end of track\n", c, len); */ }
83756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pSMFStream->ticks = SMF_END_OF_TRACK;
83856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
83956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
84056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* tempo event? */
84156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else if (c == SMF_META_TEMPO)
84256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
84356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* read the 3-byte timebase value */
84456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        temp = 0;
84556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        while (len--)
84656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
84756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = EAS_HWGetByte(pEASData->hwInstData, pSMFStream->fileHandle, &c)) != EAS_SUCCESS)
84856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
84956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            temp = (temp << 8) | c;
85056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
85156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
85256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pSMFData->tickConv = (EAS_U16) (((temp * 1024) / pSMFData->ppqn + 500) / 1000);
85356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pSMFData->flags |= SMF_FLAGS_HAS_TEMPO;
85456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
85556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
85656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check for time signature - see iMelody spec V1.4 section 4.1.2.2.3.6 */
85756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else if (c == SMF_META_TIME_SIGNATURE)
85856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
85956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pSMFData->flags |= SMF_FLAGS_HAS_TIME_SIG;
86056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
86156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
86256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if the host has registered a metadata callback return the metadata */
86356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else if (pSMFData->metadata.callback)
86456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
86556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_I32 readLen;
86656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        E_EAS_METADATA_TYPE metaType;
86756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
86856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        metaType = EAS_METADATA_UNKNOWN;
86956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
87056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* only process title on the first track */
87156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (c == SMF_META_SEQTRK_NAME)
87256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            metaType = EAS_METADATA_TITLE;
87356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else if (c == SMF_META_TEXT)
87456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            metaType = EAS_METADATA_TEXT;
87556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else if (c == SMF_META_COPYRIGHT)
87656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            metaType = EAS_METADATA_COPYRIGHT;
87756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else if (c == SMF_META_LYRIC)
87856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            metaType = EAS_METADATA_LYRIC;
87956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
88056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (metaType != EAS_METADATA_UNKNOWN)
88156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
88256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            readLen = pSMFData->metadata.bufferSize - 1;
88356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((EAS_I32) len < readLen)
88456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                readLen = (EAS_I32) len;
88556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = EAS_HWReadFile(pEASData->hwInstData, pSMFStream->fileHandle, pSMFData->metadata.buffer, readLen, &readLen)) != EAS_SUCCESS)
88656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
88756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pSMFData->metadata.buffer[readLen] = 0;
88856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pSMFData->metadata.callback(metaType, pSMFData->metadata.buffer, pSMFData->metadata.pUserData);
88956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
89056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
89156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
89256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* position file to next event - in case we ignored all or part of the meta-event */
89356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(pEASData->hwInstData, pSMFStream->fileHandle, pos)) != EAS_SUCCESS)
89456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
89556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
89656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Meta-event: type=%02x, len=%d\n", c, len); */ }
89756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
89856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
89956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
90056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
90156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * SMF_ParseSysEx()
90256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
90356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
90456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Reads a varible length quantity from an SMF file
90556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
90656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
90756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
90856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
90956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
91056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
91156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
91256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
91356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
91456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
91556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
91656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT SMF_ParseSysEx (S_EAS_DATA *pEASData, S_SMF_DATA *pSMFData, S_SMF_STREAM *pSMFStream, EAS_U8 f0, EAS_INT parserMode)
91756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
91856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
91956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 len;
92056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U8 c;
92156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
92256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the length */
92356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = SMF_GetVarLenData(pEASData->hwInstData, pSMFStream->fileHandle, &len)) != EAS_SUCCESS)
92456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
92556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
92656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* start of SysEx message? */
92756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (f0 == 0xf0)
92856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
92956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_ParseMIDIStream(pEASData, pSMFData->pSynth, &pSMFStream->midiStream, f0, parserMode)) != EAS_SUCCESS)
93056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
93156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
93256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
93356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* feed the SysEx to the stream parser */
93456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    while (len--)
93556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
93656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWGetByte(pEASData->hwInstData, pSMFStream->fileHandle, &c)) != EAS_SUCCESS)
93756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
93856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_ParseMIDIStream(pEASData, pSMFData->pSynth, &pSMFStream->midiStream, c, parserMode)) != EAS_SUCCESS)
93956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
94056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
94156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* check for GM system ON */
94256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pSMFStream->midiStream.flags & MIDI_FLAG_GM_ON)
94356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pSMFData->flags |= SMF_FLAGS_HAS_GM_ON;
94456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
94556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
94656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
94756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
94856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
94956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
95056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * SMF_ParseEvent()
95156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
95256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
95356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Reads a varible length quantity from an SMF file
95456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
95556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
95656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
95756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
95856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
95956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
96056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
96156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
96256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
96356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
96456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
96556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT SMF_ParseEvent (S_EAS_DATA *pEASData, S_SMF_DATA *pSMFData, S_SMF_STREAM *pSMFStream, EAS_INT parserMode)
96656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
96756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
96856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U8 c;
96956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
97056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the event type */
97156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetByte(pEASData->hwInstData, pSMFStream->fileHandle, &c)) != EAS_SUCCESS)
97256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
97356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
97456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* parse meta-event */
97556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (c == 0xff)
97656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
97756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = SMF_ParseMetaEvent(pEASData, pSMFData, pSMFStream)) != EAS_SUCCESS)
97856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
97956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
98056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
98156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* parse SysEx */
98256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else if ((c == 0xf0) || (c == 0xf7))
98356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
98456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = SMF_ParseSysEx(pEASData, pSMFData, pSMFStream, c, parserMode)) != EAS_SUCCESS)
98556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
98656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
98756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
98856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* parse MIDI message */
98956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else
99056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
99156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_ParseMIDIStream(pEASData, pSMFData->pSynth, &pSMFStream->midiStream, c, parserMode)) != EAS_SUCCESS)
99256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
99356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
99456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* keep streaming data to the MIDI parser until the message is complete */
99556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        while (pSMFStream->midiStream.pending)
99656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
99756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = EAS_HWGetByte(pEASData->hwInstData, pSMFStream->fileHandle, &c)) != EAS_SUCCESS)
99856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
99956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = EAS_ParseMIDIStream(pEASData, pSMFData->pSynth, &pSMFStream->midiStream, c, parserMode)) != EAS_SUCCESS)
100056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
100156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
100256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
100356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
100456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
100556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* chase mode logic */
100656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pSMFData->time == 0)
100756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
100856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pSMFData->flags & SMF_FLAGS_CHASE_MODE)
100956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
101056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (pSMFStream->midiStream.flags & MIDI_FLAG_FIRST_NOTE)
101156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pSMFData->flags &= ~SMF_FLAGS_CHASE_MODE;
101256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
101356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else if ((pSMFData->flags & SMF_FLAGS_SETUP_BAR) == SMF_FLAGS_SETUP_BAR)
101456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pSMFData->flags = (pSMFData->flags & ~SMF_FLAGS_SETUP_BAR) | SMF_FLAGS_CHASE_MODE;
101556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
101656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
101756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
101856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
101956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
102056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
102156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * SMF_ParseHeader()
102256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
102356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
102456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Parses the header of an SMF file, allocates memory the stream parsers and initializes the
102556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * stream parsers.
102656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
102756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
102856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
102956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pSMFData         - pointer to parser instance data
103056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * fileHandle       - file handle
103156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * fileOffset       - offset in the file where the header data starts, usually 0
103256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
103356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
103456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
103556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
103656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
103756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
103856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
103956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
104056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
104156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -e{801} we know that 'goto' is deprecated - but it's cleaner in this case */
104256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT SMF_ParseHeader (EAS_HW_DATA_HANDLE hwInstData, S_SMF_DATA *pSMFData)
104356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
104456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
104556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 i;
104656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16 division;
104756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 chunkSize;
104856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 chunkStart;
104956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 temp;
105056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 ticks;
105156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
105256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* rewind the file and find the end of the header chunk */
105356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(hwInstData, pSMFData->fileHandle, pSMFData->fileOffset + SMF_OFS_HEADER_SIZE)) != EAS_SUCCESS)
105456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        goto ReadError;
105556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetDWord(hwInstData, pSMFData->fileHandle, &chunkSize, EAS_TRUE)) != EAS_SUCCESS)
105656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        goto ReadError;
105756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
105856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* determine the number of tracks */
105956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(hwInstData, pSMFData->fileHandle, pSMFData->fileOffset + SMF_OFS_NUM_TRACKS)) != EAS_SUCCESS)
106056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        goto ReadError;
106156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetWord(hwInstData, pSMFData->fileHandle, &pSMFData->numStreams, EAS_TRUE)) != EAS_SUCCESS)
106256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        goto ReadError;
106356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
106456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* limit the number of tracks */
106556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pSMFData->numStreams > MAX_SMF_STREAMS)
106656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
106756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "SMF file contains %u tracks, playing %d tracks\n", pSMFData->numStreams, MAX_SMF_STREAMS); */ }
106856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pSMFData->numStreams = MAX_SMF_STREAMS;
106956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
107056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
107156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the time division */
107256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetWord(hwInstData, pSMFData->fileHandle, &division, EAS_TRUE)) != EAS_SUCCESS)
107356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        goto ReadError;
107456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
107556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* setup default timebase for 120 bpm */
107656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSMFData->ppqn = 192;
107756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (division & 0x8000)
107856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING,"No support for SMPTE code timebase\n"); */ }
107956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else
108056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pSMFData->ppqn = (division & 0x7fff);
108156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSMFData->tickConv = (EAS_U16) (((SMF_DEFAULT_TIMEBASE * 1024) / pSMFData->ppqn + 500) / 1000);
108256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
108356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* dynamic memory allocation, allocate memory for streams */
108456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pSMFData->streams == NULL)
108556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
108656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pSMFData->streams = EAS_HWMalloc(hwInstData,sizeof(S_SMF_STREAM) * pSMFData->numStreams);
108756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pSMFData->streams == NULL)
108856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_MALLOC_FAILED;
108956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
109056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* zero the memory to insure complete initialization */
109156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_HWMemSet((void *)(pSMFData->streams), 0, sizeof(S_SMF_STREAM) * pSMFData->numStreams);
109256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
109356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
109456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* find the start of each track */
109556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    chunkStart = (EAS_U32) pSMFData->fileOffset;
109656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    ticks = 0x7fffffffL;
109756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSMFData->nextStream = NULL;
109856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (i = 0; i < pSMFData->numStreams; i++)
109956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
110056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
110156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        for (;;)
110256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
110356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
110456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* calculate start of next chunk - checking for errors */
110556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            temp = chunkStart + SMF_CHUNK_INFO_SIZE + chunkSize;
110656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (temp <= chunkStart)
110756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
110856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING,"Error in chunk size at offset %d\n", chunkStart); */ }
110956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return EAS_ERROR_FILE_FORMAT;
111056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
111156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            chunkStart = temp;
111256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
111356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* seek to the start of the next chunk */
111456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = EAS_HWFileSeek(hwInstData, pSMFData->fileHandle, (EAS_I32) chunkStart)) != EAS_SUCCESS)
111556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                goto ReadError;
111656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
111756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* read the chunk identifier */
111856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = EAS_HWGetDWord(hwInstData, pSMFData->fileHandle, &temp, EAS_TRUE)) != EAS_SUCCESS)
111956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                goto ReadError;
112056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
112156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* read the chunk size */
112256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = EAS_HWGetDWord(hwInstData, pSMFData->fileHandle, &chunkSize, EAS_TRUE)) != EAS_SUCCESS)
112356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                goto ReadError;
112456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
112556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* make sure this is an 'MTrk' chunk */
112656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (temp == SMF_CHUNK_TYPE_TRACK)
112756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
112856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
112956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING,"Unexpected chunk type: 0x%08x\n", temp); */ }
113056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
113156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
113256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* initalize some data */
113356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pSMFData->streams[i].ticks = 0;
113456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pSMFData->streams[i].fileHandle = pSMFData->fileHandle;
113556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
113656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* NULL the file handle so we don't try to close it twice */
113756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pSMFData->fileHandle = NULL;
113856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
113956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* save this file position as the start of the track */
114056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pSMFData->streams[i].startFilePos = (EAS_I32) chunkStart + SMF_CHUNK_INFO_SIZE;
114156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
114256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* initalize the MIDI parser data */
114356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_InitMIDIStream(&pSMFData->streams[i].midiStream);
114456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
114556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* parse the first delta time in each stream */
114656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = SMF_GetDeltaTime(hwInstData, &pSMFData->streams[i])) != EAS_SUCCESS)
114756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                goto ReadError;
114856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
114956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pSMFData->streams[i].ticks < ticks)
115056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
115156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            ticks = pSMFData->streams[i].ticks;
115256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pSMFData->nextStream = &pSMFData->streams[i];
115356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
115456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
115556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* more tracks to do, create a duplicate file handle */
115656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (i < (pSMFData->numStreams - 1))
115756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
115856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = EAS_HWDupHandle(hwInstData, pSMFData->streams[i].fileHandle, &pSMFData->fileHandle)) != EAS_SUCCESS)
115956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                goto ReadError;
116056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
116156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
116256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
116356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* update the time of the next event */
116456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pSMFData->nextStream)
116556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        SMF_UpdateTime(pSMFData, pSMFData->nextStream->ticks);
116656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
116756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
116856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
116956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* ugly goto: but simpler than structured */
117056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    ReadError:
117156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (result == EAS_EOF)
117256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_FILE_FORMAT;
117356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
117456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
117556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
117656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
117756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * SMF_UpdateTime()
117856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
117956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
118056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Update the millisecond time base by converting the ticks into millieconds
118156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
118256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
118356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
118456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
118556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
118656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
118756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
118856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
118956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
119056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
119156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
119256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic void SMF_UpdateTime (S_SMF_DATA *pSMFData, EAS_U32 ticks)
119356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
119456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 temp1, temp2;
119556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
119656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pSMFData->flags & SMF_FLAGS_CHASE_MODE)
119756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return;
119856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
119956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    temp1 = (ticks >> 10) * pSMFData->tickConv;
120056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    temp2 = (ticks & 0x3ff) * pSMFData->tickConv;
120156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pSMFData->time += (EAS_I32)((temp1 << 8) + (temp2 >> 2));
120256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
120356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
1204