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