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