156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * File: 456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * eas_imelody.c 556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Contents and purpose: 756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * iMelody parser 856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Copyright Sonic Network Inc. 2005 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: 797 $ 2656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * $Date: 2007-08-01 00:15:56 -0700 (Wed, 01 Aug 2007) $ 2756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 2856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 2956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 3056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* lint doesn't like the way some string.h files look */ 3156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _lint 3256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "lint_stdlib.h" 3356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#else 3456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include <string.h> 3556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 3656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 3756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_data.h" 3856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_miditypes.h" 3956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_parser.h" 4056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_report.h" 4156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_host.h" 4256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_midi.h" 4356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_config.h" 4456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_vm_protos.h" 4556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_imelodydata.h" 4656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_ctype.h" 4756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 4856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// #define _DEBUG_IMELODY 4956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 5056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* increase gain for mono ringtones */ 5156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define IMELODY_GAIN_OFFSET 8 5256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 5356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* length of 32nd note in 1/256ths of a msec for 120 BPM tempo */ 5456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define DEFAULT_TICK_CONV 16000 5556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define TICK_CONVERT 1920000 5656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 5756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* default channel and program for iMelody playback */ 5856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define IMELODY_CHANNEL 0 5956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define IMELODY_PROGRAM 80 6056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define IMELODY_VEL_MUL 4 6156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define IMELODY_VEL_OFS 67 6256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 6356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* multiplier for fixed point triplet conversion */ 6456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define TRIPLET_MULTIPLIER 683 6556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define TRIPLET_SHIFT 10 6656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 6756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic const char* const tokens[] = 6856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 6956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks "BEGIN:IMELODY", 7056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks "VERSION:", 7156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks "FORMAT:CLASS", 7256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks "NAME:", 7356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks "COMPOSER:", 7456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks "BEAT:", 7556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks "STYLE:", 7656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks "VOLUME:", 7756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks "MELODY:", 7856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks "END:IMELODY" 7956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}; 8056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 8156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* ledon or ledoff */ 8256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic const char ledStr[] = "edo"; 8356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 8456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* vibeon or vibeoff */ 8556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic const char vibeStr[] = "ibeo"; 8656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 8756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* backon or backoff */ 8856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic const char backStr[] = "cko"; 8956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 9056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparkstypedef enum 9156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 9256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks TOKEN_BEGIN, 9356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks TOKEN_VERSION, 9456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks TOKEN_FORMAT, 9556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks TOKEN_NAME, 9656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks TOKEN_COMPOSER, 9756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks TOKEN_BEAT, 9856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks TOKEN_STYLE, 9956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks TOKEN_VOLUME, 10056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks TOKEN_MELODY, 10156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks TOKEN_END, 10256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks TOKEN_INVALID 10356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} ENUM_IMELODY_TOKENS; 10456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 10556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* lookup table for note values */ 10656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic const EAS_I8 noteTable[] = { 9, 11, 0, 2, 4, 5, 7 }; 10756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 10856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* inline functions */ 10956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 11056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic void PutBackChar (S_IMELODY_DATA *pData) 11156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 11256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pData->index) 11356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->index--; 11456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "PutBackChar '%c'\n", pData->buffer[pData->index]); */ } 11556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 11656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#else 11756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_INLINE void PutBackChar (S_IMELODY_DATA *pData) { if (pData->index) pData->index--; } 11856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 11956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 12056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 12156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* local prototypes */ 12256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_CheckFileType (S_EAS_DATA *pEASData, EAS_FILE_HANDLE fileHandle, EAS_VOID_PTR *ppHandle, EAS_I32 offset); 12356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_Prepare (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData); 12456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_Time (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_U32 *pTime); 12556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_Event (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_INT parserMode); 12656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_State (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_STATE *pState); 12756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_Close (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData); 12856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_Reset (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData); 12956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_Pause (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData); 13056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_Resume (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData); 13156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_SetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value); 13256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_GetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue); 13356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_BOOL IMY_PlayNote (S_EAS_DATA *pEASData, S_IMELODY_DATA *pData, EAS_I8 note, EAS_INT parserMode); 13456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_BOOL IMY_PlayRest (S_EAS_DATA *pEASData, S_IMELODY_DATA *pData); 13556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_BOOL IMY_GetDuration (EAS_HW_DATA_HANDLE hwInstData, S_IMELODY_DATA *pData, EAS_I32 *pDuration); 13656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_BOOL IMY_GetLEDState (S_EAS_DATA *pEASData, S_IMELODY_DATA *pData); 13756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_BOOL IMY_GetVibeState (S_EAS_DATA *pEASData, S_IMELODY_DATA *pData); 13856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_BOOL IMY_GetBackState (S_EAS_DATA *pEASData, S_IMELODY_DATA *pData); 13956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_BOOL IMY_GetVolume (EAS_HW_DATA_HANDLE hwInstData, S_IMELODY_DATA *pData, EAS_BOOL inHeader); 14056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_BOOL IMY_GetNumber (EAS_HW_DATA_HANDLE hwInstData, S_IMELODY_DATA *pData, EAS_INT *temp, EAS_BOOL inHeader); 14156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_ParseHeader (S_EAS_DATA *pEASData, S_IMELODY_DATA* pData); 14256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_I8 IMY_GetNextChar (EAS_HW_DATA_HANDLE hwInstData, S_IMELODY_DATA *pData, EAS_BOOL inHeader); 14356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_ReadLine (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE fileHandle, EAS_I8 *buffer, EAS_I32 *pStartLine); 14456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_INT IMY_ParseLine (EAS_I8 *buffer, EAS_U8 *pIndex); 14556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 14656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 14756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 14856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 14956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_iMelody_Parser 15056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 15156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * This structure contains the functional interface for the iMelody parser 15256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 15356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 15456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksconst S_FILE_PARSER_INTERFACE EAS_iMelody_Parser = 15556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 15656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks IMY_CheckFileType, 15756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks IMY_Prepare, 15856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks IMY_Time, 15956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks IMY_Event, 16056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks IMY_State, 16156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks IMY_Close, 16256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks IMY_Reset, 16356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks IMY_Pause, 16456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks IMY_Resume, 16556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks NULL, 16656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks IMY_SetData, 16756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks IMY_GetData, 16856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks NULL 16956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}; 17056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 17156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 17256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_CheckFileType() 17356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 17456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 17556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Check the file type to see if we can parse it 17656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 17756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 17856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData - pointer to overall EAS data structure 17956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle - pointer to file handle 18056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 18156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 18256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 18356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 18456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 18556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 18656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 18756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 18856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_CheckFileType (S_EAS_DATA *pEASData, EAS_FILE_HANDLE fileHandle, EAS_VOID_PTR *ppHandle, EAS_I32 offset) 18956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 19056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_IMELODY_DATA* pData; 19156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I8 buffer[MAX_LINE_SIZE+1]; 19256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U8 index; 19356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 19456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 19556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Enter IMY_CheckFileType\n"); */ } 19656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 19756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 19856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* read the first line of the file */ 19956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *ppHandle = NULL; 20056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (IMY_ReadLine(pEASData->hwInstData, fileHandle, buffer, NULL) != EAS_SUCCESS) 20156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 20256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 20356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check for header string */ 20456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (IMY_ParseLine(buffer, &index) == TOKEN_BEGIN) 20556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 20656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 20756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check for static memory allocation */ 20856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pEASData->staticMemoryModel) 20956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData = EAS_CMEnumData(EAS_CM_IMELODY_DATA); 21056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 21156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData = EAS_HWMalloc(pEASData->hwInstData, sizeof(S_IMELODY_DATA)); 21256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (!pData) 21356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_MALLOC_FAILED; 21456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HWMemSet(pData, 0, sizeof(S_IMELODY_DATA)); 21556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 21656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* initialize */ 21756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->fileHandle = fileHandle; 21856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->fileOffset = offset; 21956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->state = EAS_STATE_ERROR; 22056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->state = EAS_STATE_OPEN; 22156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 22256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* return a pointer to the instance data */ 22356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *ppHandle = pData; 22456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 22556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 22656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 22756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 22856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 22956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 23056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_Prepare() 23156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 23256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 23356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Prepare to parse the file. Allocates instance data (or uses static allocation for 23456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * static memory model). 23556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 23656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 23756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData - pointer to overall EAS data structure 23856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle - pointer to file handle 23956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 24056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 24156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 24256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 24356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 24456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 24556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 24656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 24756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_Prepare (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData) 24856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 24956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_IMELODY_DATA* pData; 25056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_RESULT result; 25156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 25256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 25356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Enter IMY_Prepare\n"); */ } 25456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 25556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 25656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check for valid state */ 25756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData = (S_IMELODY_DATA*) pInstData; 25856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pData->state != EAS_STATE_OPEN) 25956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_NOT_VALID_IN_THIS_STATE; 26056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 26156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* instantiate a synthesizer */ 26256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = VMInitMIDI(pEASData, &pData->pSynth)) != EAS_SUCCESS) 26356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 26456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "VMInitMIDI returned %d\n", result); */ } 26556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 26656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 26756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 26856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* parse the header */ 26956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = IMY_ParseHeader(pEASData, pData)) != EAS_SUCCESS) 27056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 27156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 27256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 27356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_Prepare: state set to EAS_STATE_READY\n"); */ } 27456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 27556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 27656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData ->state = EAS_STATE_READY; 27756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 27856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 27956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 28056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 28156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_Time() 28256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 28356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 28456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns the time of the next event in msecs 28556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 28656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 28756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData - pointer to overall EAS data structure 28856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle - pointer to file handle 28956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pTime - pointer to variable to hold time of next event (in msecs) 29056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 29156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 29256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 29356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 29456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 29556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 29656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 29756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 29856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, pEASData) common decoder interface - pEASData not used */ 29956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_Time (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_U32 *pTime) 30056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 30156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_IMELODY_DATA *pData; 30256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 30356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData = (S_IMELODY_DATA*) pInstData; 30456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 30556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* return time in milliseconds */ 30656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{704} use shift instead of division */ 30756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pTime = pData->time >> 8; 30856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 30956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 31056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 31156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 31256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_Event() 31356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 31456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 31556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Parse the next event in the file 31656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 31756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 31856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData - pointer to overall EAS data structure 31956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle - pointer to file handle 32056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 32156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 32256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 32356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 32456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 32556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 32656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 32756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 32856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_Event (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_INT parserMode) 32956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 33056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_IMELODY_DATA* pData; 33156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_RESULT result; 33256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I8 c; 33356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_BOOL eof; 33456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_INT temp; 33556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 33656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData = (S_IMELODY_DATA*) pInstData; 33756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pData->state >= EAS_STATE_OPEN) 33856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 33956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 34056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* initialize MIDI channel when the track starts playing */ 34156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pData->time == 0) 34256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 34356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 34456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 34556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_Event: Reset\n"); */ } 34656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 34756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* set program to square lead */ 34856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks VMProgramChange(pEASData->pVoiceMgr, pData->pSynth, IMELODY_CHANNEL, IMELODY_PROGRAM); 34956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 35056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* set channel volume to max */ 35156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks VMControlChange(pEASData->pVoiceMgr, pData->pSynth, IMELODY_CHANNEL, 7, 127); 35256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 35356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 35456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check for end of note */ 35556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pData->note) 35656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 35756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 35856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 35956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Stopping note %d\n", pData->note); */ } 36056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 36156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* stop the note */ 36256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks VMStopNote(pEASData->pVoiceMgr, pData->pSynth, IMELODY_CHANNEL, pData->note, 0); 36356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->note = 0; 36456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 36556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check for rest between notes */ 36656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pData->restTicks) 36756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 36856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->time += pData->restTicks; 36956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->restTicks = 0; 37056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 37156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 37256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 37356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 37456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* parse the next event */ 37556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks eof = EAS_FALSE; 37656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks while (!eof) 37756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 37856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 37956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* get next character */ 38056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks c = IMY_GetNextChar(pEASData->hwInstData, pData, EAS_FALSE); 38156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 38256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks switch (c) 38356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 38456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* start repeat */ 38556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case '(': 38656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 38756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 38856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Enter repeat section\n", c); */ } 38956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 39056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 39156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pData->repeatOffset < 0) 39256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 39356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->repeatOffset = pData->startLine + (EAS_I32) pData->index; 39456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 39556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 39656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Repeat offset = %d\n", pData->repeatOffset); */ } 39756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 39856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 39956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 40056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Ignoring nested repeat section\n"); */ } 40156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 40256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 40356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* end repeat */ 40456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case ')': 40556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 40656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 40756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "End repeat section, repeat offset = %d\n", pData->repeatOffset); */ } 40856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 40956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* ignore invalid repeats */ 41056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pData->repeatCount >= 0) 41156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 41256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 41356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* decrement repeat count (repeatCount == 0 means infinite loop) */ 41456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pData->repeatCount > 0) 41556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 41656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (--pData->repeatCount == 0) 41756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 41856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->repeatCount = -1; 41956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 42056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Repeat loop complete\n"); */ } 42156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 42256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 42356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 42456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 42556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks//2 TEMPORARY FIX: If locating, don't do infinite loops. 42656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks//3 We need a different mode for metadata parsing where we don't loop at all 42756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((parserMode == eParserModePlay) || (pData->repeatCount != 0)) 42856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 42956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 43056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 43156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Rewinding file for repeat\n"); */ } 43256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 43356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* rewind to start of loop */ 43456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWFileSeek(pEASData->hwInstData, pData->fileHandle, pData->repeatOffset)) != EAS_SUCCESS) 43556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 43656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks IMY_ReadLine(pEASData->hwInstData, pData->fileHandle, pData->buffer, &pData->startLine); 43756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->index = 0; 43856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 43956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* if last loop, prevent future loops */ 44056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pData->repeatCount == -1) 44156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->repeatOffset = -1; 44256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 44356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 44456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 44556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 44656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* repeat count */ 44756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case '@': 44856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (!IMY_GetNumber(pEASData->hwInstData, pData, &temp, EAS_FALSE)) 44956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks eof = EAS_TRUE; 45056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else if (pData->repeatOffset > 0) 45156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 45256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 45356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 45456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Repeat count = %dt", pData->repeatCount); */ } 45556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 45656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pData->repeatCount < 0) 45756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->repeatCount = (EAS_I16) temp; 45856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 45956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 46056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 46156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* volume */ 46256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case 'V': 46356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (!IMY_GetVolume(pEASData->hwInstData, pData, EAS_FALSE)) 46456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks eof = EAS_TRUE; 46556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 46656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 46756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* flat */ 46856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case '&': 46956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->noteModifier = -1; 47056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 47156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 47256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* sharp */ 47356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case '#': 47456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->noteModifier = +1; 47556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 47656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 47756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* octave */ 47856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case '*': 47956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks c = IMY_GetNextChar(pEASData->hwInstData, pData, EAS_FALSE); 48056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (IsDigit(c)) 48156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->octave = (EAS_U8) ((c - '0' + 1) * 12); 48256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else if (!c) 48356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks eof = EAS_TRUE; 48456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 48556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 48656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* ledon or ledoff */ 48756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case 'l': 48856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (!IMY_GetLEDState(pEASData, pData)) 48956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks eof = EAS_TRUE; 49056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 49156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 49256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* vibeon or vibeoff */ 49356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case 'v': 49456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (!IMY_GetVibeState(pEASData, pData)) 49556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks eof = EAS_TRUE; 49656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 49756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 49856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* either a B note or backon or backoff */ 49956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case 'b': 50056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (IMY_GetNextChar(pEASData->hwInstData, pData, EAS_FALSE) == 'a') 50156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 50256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (!IMY_GetBackState(pEASData, pData)) 50356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks eof = EAS_TRUE; 50456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 50556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 50656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 50756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks PutBackChar(pData); 50856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (IMY_PlayNote(pEASData, pData, c, parserMode)) 50956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 51056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks eof = EAS_TRUE; 51156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 51256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 51356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 51456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* rest */ 51556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case 'r': 51656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case 'R': 51756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (IMY_PlayRest(pEASData, pData)) 51856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 51956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks eof = EAS_TRUE; 52056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 52156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 52256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* EOF */ 52356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case 0: 52456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 52556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_Event: end of iMelody file detected\n"); */ } 52656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 52756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks eof = EAS_TRUE; 52856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 52956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 53056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* must be a note */ 53156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks default: 53256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks c = ToLower(c); 53356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((c >= 'a') && (c <= 'g')) 53456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 53556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (IMY_PlayNote(pEASData, pData, c, parserMode)) 53656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 53756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks eof = EAS_TRUE; 53856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 53956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 54056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Ignoring unexpected character '%c' [0x%02x]\n", c, c); */ } 54156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 54256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 54356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 54456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 54556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* handle EOF */ 54656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 54756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_Event: state set to EAS_STATE_STOPPING\n"); */ } 54856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 54956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->state = EAS_STATE_STOPPING; 55056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks VMReleaseAllVoices(pEASData->pVoiceMgr, pData->pSynth); 55156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 55256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 55356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 55456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 55556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_State() 55656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 55756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 55856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns the current state of the stream 55956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 56056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 56156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData - pointer to overall EAS data structure 56256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle - pointer to file handle 56356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pState - pointer to variable to store state 56456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 56556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 56656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 56756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 56856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 56956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 57056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 57156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 57256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, pEASData) common decoder interface - pEASData not used */ 57356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_State (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 *pState) 57456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 57556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_IMELODY_DATA* pData; 57656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 57756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* establish pointer to instance data */ 57856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData = (S_IMELODY_DATA*) pInstData; 57956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 58056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* if stopping, check to see if synth voices are active */ 58156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pData->state == EAS_STATE_STOPPING) 58256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 58356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (VMActiveVoices(pData->pSynth) == 0) 58456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 58556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->state = EAS_STATE_STOPPED; 58656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 58756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_State: state set to EAS_STATE_STOPPED\n"); */ } 58856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 58956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 59056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 59156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 59256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pData->state == EAS_STATE_PAUSING) 59356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 59456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (VMActiveVoices(pData->pSynth) == 0) 59556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 59656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 59756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_State: state set to EAS_STATE_PAUSED\n"); */ } 59856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 59956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->state = EAS_STATE_PAUSED; 60056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 60156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 60256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 60356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* return current state */ 60456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pState = pData->state; 60556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 60656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 60756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 60856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 60956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_Close() 61056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 61156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 61256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Close the file and clean up 61356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 61456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 61556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData - pointer to overall EAS data structure 61656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle - pointer to file handle 61756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 61856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 61956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 62056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 62156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 62256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 62356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 62456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 62556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_Close (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData) 62656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 62756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_IMELODY_DATA* pData; 62856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_RESULT result; 62956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 63056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 63156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_Close: close file\n"); */ } 63256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 63356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 63456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData = (S_IMELODY_DATA*) pInstData; 63556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 63656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* close the file */ 63756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWCloseFile(pEASData->hwInstData, pData->fileHandle)) != EAS_SUCCESS) 63856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 63956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 64056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* free the synth */ 64156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pData->pSynth != NULL) 64256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks VMMIDIShutdown(pEASData, pData->pSynth); 64356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 64456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* if using dynamic memory, free it */ 64556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (!pEASData->staticMemoryModel) 64656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HWFree(pEASData->hwInstData, pData); 64756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 64856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 64956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 65056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 65156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 65256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_Reset() 65356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 65456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 65556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Reset the sequencer. Used for locating backwards in the file. 65656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 65756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 65856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData - pointer to overall EAS data structure 65956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle - pointer to file handle 66056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 66156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 66256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 66356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 66456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 66556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 66656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 66756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 66856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_Reset (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData) 66956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 67056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_IMELODY_DATA* pData; 67156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_RESULT result; 67256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 67356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 67456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_Reset: reset file\n"); */ } 67556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 67656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData = (S_IMELODY_DATA*) pInstData; 67756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 67856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* reset the synth */ 67956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks VMReset(pEASData->pVoiceMgr, pData->pSynth, EAS_TRUE); 68056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 68156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* reset time to zero */ 68256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->time = 0; 68356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->note = 0; 68456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 68556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* reset file position and re-parse header */ 68656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->state = EAS_STATE_ERROR; 68756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWFileSeek(pEASData->hwInstData, pData->fileHandle, pData->fileOffset)) != EAS_SUCCESS) 68856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 68956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = IMY_ParseHeader (pEASData, pData)) != EAS_SUCCESS) 69056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 69156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 69256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 69356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_Reset: state set to EAS_STATE_ERROR\n"); */ } 69456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 69556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 69656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->state = EAS_STATE_READY; 69756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 69856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 69956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 70056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 70156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_Pause() 70256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 70356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 70456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Pauses the sequencer. Mutes all voices and sets state to pause. 70556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 70656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 70756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData - pointer to overall EAS data structure 70856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle - pointer to file handle 70956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 71056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 71156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 71256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 71356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 71456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 71556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 71656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 71756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_Pause (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData) 71856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 71956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_IMELODY_DATA *pData; 72056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 72156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 72256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_Pause: pause file\n"); */ } 72356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 72456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 72556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* can't pause a stopped stream */ 72656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData = (S_IMELODY_DATA*) pInstData; 72756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pData->state == EAS_STATE_STOPPED) 72856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_ALREADY_STOPPED; 72956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 73056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* mute the synthesizer */ 73156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks VMMuteAllVoices(pEASData->pVoiceMgr, pData->pSynth); 73256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->state = EAS_STATE_PAUSING; 73356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 73456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 73556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 73656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 73756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_Resume() 73856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 73956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 74056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Resume playing after a pause, sets state back to playing. 74156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 74256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 74356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData - pointer to overall EAS data structure 74456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle - pointer to file handle 74556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 74656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 74756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 74856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 74956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 75056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 75156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 75256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 75356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, pEASData) common decoder interface - pEASData not used */ 75456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_Resume (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData) 75556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 75656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_IMELODY_DATA *pData; 75756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 75856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 75956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_Resume: resume file\n"); */ } 76056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 76156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 76256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* can't resume a stopped stream */ 76356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData = (S_IMELODY_DATA*) pInstData; 76456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pData->state == EAS_STATE_STOPPED) 76556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_ALREADY_STOPPED; 76656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 76756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* nothing to do but resume playback */ 76856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->state = EAS_STATE_PLAY; 76956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 77056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 77156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 77256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 77356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_SetData() 77456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 77556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 77656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Adjust tempo relative to song tempo 77756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 77856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 77956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData - pointer to overall EAS data structure 78056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pInstData - pointer to iMelody instance data 78156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * rate - rate (28-bit fractional amount) 78256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 78356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 78456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 78556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 78656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 78756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 78856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 78956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 79056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, pEASData) common decoder interface - pEASData not used */ 79156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_SetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value) 79256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 79356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_IMELODY_DATA *pData; 79456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 79556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData = (S_IMELODY_DATA*) pInstData; 79656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks switch (param) 79756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 79856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 79956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* set metadata callback */ 80056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case PARSER_DATA_METADATA_CB: 80156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HWMemCpy(&pData->metadata, (void*) value, sizeof(S_METADATA_CB)); 80256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 80356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 80456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks default: 80556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_INVALID_PARAMETER; 80656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 80756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 80856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 80956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 81056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 81156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 81256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_GetData() 81356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 81456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 81556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Return the file type 81656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 81756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 81856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData - pointer to overall EAS data structure 81956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pInstData - pointer to iMelody instance data 82056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 82156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 82256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 82356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 82456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 82556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 82656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 82756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 82856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, pEASData) common decoder interface - pEASData not used */ 82956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_GetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue) 83056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 83156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_IMELODY_DATA *pData; 83256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 83356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData = (S_IMELODY_DATA*) pInstData; 83456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 83556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks switch (param) 83656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 83756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* return file type as iMelody */ 83856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case PARSER_DATA_FILE_TYPE: 83956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pValue = EAS_FILE_IMELODY; 84056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 84156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 84256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case PARSER_DATA_SYNTH_HANDLE: 84356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pValue = (EAS_I32) pData->pSynth; 84456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 84556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 84656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case PARSER_DATA_GAIN_OFFSET: 84756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pValue = IMELODY_GAIN_OFFSET; 84856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 84956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 85056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks default: 85156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_INVALID_PARAMETER; 85256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 85356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 85456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 85556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 85656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 85756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 85856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_PlayNote() 85956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 86056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 86156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 86256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 86356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 86456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 86556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 86656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 86756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 86856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 86956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 87056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 87156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 87256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 87356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_BOOL IMY_PlayNote (S_EAS_DATA *pEASData, S_IMELODY_DATA *pData, EAS_I8 note, EAS_INT parserMode) 87456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 87556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 duration; 87656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U8 velocity; 87756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 87856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 87956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 88056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_PlayNote: start note %d\n", note); */ } 88156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 88256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 88356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* get the duration */ 88456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (!IMY_GetDuration(pEASData->hwInstData, pData, &duration)) 88556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FALSE; 88656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 88756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* save note value */ 88856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->note = (EAS_U8) (pData->octave + noteTable[note - 'a'] + pData->noteModifier); 88956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks velocity = (EAS_U8) (pData->volume ? pData->volume * IMELODY_VEL_MUL + IMELODY_VEL_OFS : 0); 89056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 89156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* start note only if in play mode */ 89256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (parserMode == eParserModePlay) 89356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks VMStartNote(pEASData->pVoiceMgr, pData->pSynth, IMELODY_CHANNEL, pData->note, velocity); 89456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 89556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 89656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_PlayNote: Start note %d, duration %d\n", pData->note, duration); */ } 89756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 89856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 89956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* determine note length */ 90056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks switch (pData->style) 90156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 90256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case 0: 90356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{704} shift for performance */ 90456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->restTicks = duration >> 4; 90556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 90656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case 1: 90756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->restTicks = 0; 90856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 90956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case 2: 91056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{704} shift for performance */ 91156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->restTicks = duration >> 1; 91256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 91356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks default: 91456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "IMY_PlayNote: Note style out of range: %d\n", pData->style); */ } 91556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{704} shift for performance */ 91656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->restTicks = duration >> 4; 91756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 91856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 91956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 92056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* next event is at end of this note */ 92156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->time += duration - pData->restTicks; 92256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 92356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* reset the flat/sharp modifier */ 92456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->noteModifier = 0; 92556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 92656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_TRUE; 92756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 92856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 92956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 93056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_PlayRest() 93156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 93256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 93356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 93456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 93556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 93656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 93756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 93856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 93956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 94056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 94156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 94256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 94356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 94456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 94556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_BOOL IMY_PlayRest (S_EAS_DATA *pEASData, S_IMELODY_DATA *pData) 94656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 94756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 duration; 94856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 94956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 95056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Enter IMY_PlayRest]n"); */ } 95156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 95256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 95356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* get the duration */ 95456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (!IMY_GetDuration(pEASData->hwInstData, pData, &duration)) 95556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FALSE; 95656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 95756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 95856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_PlayRest: note duration %d\n", duration); */ } 95956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 96056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 96156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* next event is at end of this note */ 96256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->time += duration; 96356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_TRUE; 96456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 96556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 96656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 96756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_GetDuration() 96856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 96956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 97056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 97156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 97256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 97356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 97456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 97556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 97656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 97756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 97856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 97956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 98056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 98156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 98256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 98356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_BOOL IMY_GetDuration (EAS_HW_DATA_HANDLE hwInstData, S_IMELODY_DATA *pData, EAS_I32 *pDuration) 98456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 98556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 duration; 98656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I8 c; 98756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 98856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* get the duration */ 98956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pDuration = 0; 99056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks c = IMY_GetNextChar(hwInstData, pData, EAS_FALSE); 99156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (!c) 99256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FALSE; 99356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((c < '0') || (c > '5')) 99456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 99556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 99656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetDuration: error in duration '%c'\n", c); */ } 99756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 99856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FALSE; 99956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 100056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 100156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* calculate total length of note */ 100256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks duration = pData->tick * (1 << ('5' - c)); 100356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 100456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check for duration modifier */ 100556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks c = IMY_GetNextChar(hwInstData, pData, EAS_FALSE); 100656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (c) 100756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 100856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (c == '.') 100956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{704} shift for performance */ 101056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks duration += duration >> 1; 101156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else if (c == ':') 101256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{704} shift for performance */ 101356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks duration += (duration >> 1) + (duration >> 2); 101456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else if (c == ';') 101556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{704} shift for performance */ 101656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks duration = (duration * TRIPLET_MULTIPLIER) >> TRIPLET_SHIFT; 101756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 101856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks PutBackChar(pData); 101956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 102056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 102156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pDuration = duration; 102256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_TRUE; 102356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 102456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 102556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 102656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_GetLEDState() 102756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 102856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 102956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 103056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 103156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 103256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 103356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 103456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 103556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 103656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 103756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 103856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 103956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 104056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 104156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_BOOL IMY_GetLEDState (S_EAS_DATA *pEASData, S_IMELODY_DATA *pData) 104256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 104356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I8 c; 104456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_INT i; 104556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 104656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 104756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Enter IMY_GetLEDState\n"); */ } 104856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 104956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 105056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (i = 0; i < 5; i++) 105156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 105256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks c = IMY_GetNextChar(pEASData->hwInstData, pData, EAS_FALSE); 105356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (!c) 105456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FALSE; 105556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks switch (i) 105656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 105756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case 3: 105856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (c == 'n') 105956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 106056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 106156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetLEDState: LED on\n"); */ } 106256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 106356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HWLED(pEASData->hwInstData, EAS_TRUE); 106456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_TRUE; 106556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 106656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else if (c != 'f') 106756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FALSE; 106856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 106956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 107056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case 4: 107156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (c == 'f') 107256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 107356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 107456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetLEDState: LED off\n"); */ } 107556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 107656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HWLED(pEASData->hwInstData, EAS_FALSE); 107756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_TRUE; 107856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 107956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FALSE; 108056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 108156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks default: 108256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (c != ledStr[i]) 108356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FALSE; 108456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 108556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 108656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 108756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FALSE; 108856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 108956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 109056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 109156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_GetVibeState() 109256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 109356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 109456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 109556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 109656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 109756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 109856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 109956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 110056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 110156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 110256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 110356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 110456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 110556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 110656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_BOOL IMY_GetVibeState (S_EAS_DATA *pEASData, S_IMELODY_DATA *pData) 110756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 110856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I8 c; 110956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_INT i; 111056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 111156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 111256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Enter IMY_GetVibeState\n"); */ } 111356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 111456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 111556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (i = 0; i < 6; i++) 111656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 111756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks c = IMY_GetNextChar(pEASData->hwInstData, pData, EAS_FALSE); 111856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (!c) 111956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FALSE; 112056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks switch (i) 112156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 112256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case 4: 112356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (c == 'n') 112456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 112556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 112656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetVibeState: vibrate on\n"); */ } 112756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 112856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HWVibrate(pEASData->hwInstData, EAS_TRUE); 112956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_TRUE; 113056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 113156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else if (c != 'f') 113256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FALSE; 113356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 113456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 113556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case 5: 113656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (c == 'f') 113756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 113856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 113956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetVibeState: vibrate off\n"); */ } 114056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 114156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HWVibrate(pEASData->hwInstData, EAS_FALSE); 114256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_TRUE; 114356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 114456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FALSE; 114556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 114656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks default: 114756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (c != vibeStr[i]) 114856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FALSE; 114956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 115056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 115156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 115256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FALSE; 115356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 115456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 115556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 115656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_GetBackState() 115756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 115856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 115956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 116056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 116156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 116256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 116356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 116456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 116556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 116656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 116756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 116856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 116956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 117056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 117156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_BOOL IMY_GetBackState (S_EAS_DATA *pEASData, S_IMELODY_DATA *pData) 117256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 117356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I8 c; 117456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_INT i; 117556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 117656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 117756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Enter IMY_GetBackState\n"); */ } 117856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 117956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 118056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (i = 0; i < 5; i++) 118156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 118256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks c = IMY_GetNextChar(pEASData->hwInstData, pData, EAS_FALSE); 118356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (!c) 118456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FALSE; 118556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks switch (i) 118656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 118756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case 3: 118856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (c == 'n') 118956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 119056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 119156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetBackState: backlight on\n"); */ } 119256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 119356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HWBackLight(pEASData->hwInstData, EAS_TRUE); 119456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_TRUE; 119556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 119656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else if (c != 'f') 119756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FALSE; 119856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 119956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 120056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case 4: 120156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (c == 'f') 120256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 120356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 120456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetBackState: backlight off\n"); */ } 120556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 120656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HWBackLight(pEASData->hwInstData, EAS_FALSE); 120756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_TRUE; 120856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 120956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FALSE; 121056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 121156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks default: 121256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (c != backStr[i]) 121356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FALSE; 121456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 121556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 121656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 121756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FALSE; 121856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 121956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 122056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 122156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_GetVolume() 122256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 122356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 122456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 122556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 122656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 122756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 122856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 122956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 123056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 123156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 123256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 123356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 123456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 123556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 123656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_BOOL IMY_GetVolume (EAS_HW_DATA_HANDLE hwInstData, S_IMELODY_DATA *pData, EAS_BOOL inHeader) 123756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 123856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_INT temp; 123956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I8 c; 124056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 124156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 124256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Enter IMY_GetVolume\n"); */ } 124356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 124456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 124556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks c = IMY_GetNextChar(hwInstData, pData, inHeader); 124656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (c == '+') 124756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 124856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pData->volume < 15) 124956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->volume++; 125056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_TRUE; 125156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 125256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else if (c == '-') 125356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 125456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pData->volume > 0) 125556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->volume--; 125656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_TRUE; 125756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 125856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else if (IsDigit(c)) 125956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks temp = c - '0'; 126056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 126156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FALSE; 126256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 126356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks c = IMY_GetNextChar(hwInstData, pData, inHeader); 126456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (IsDigit(c)) 126556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks temp = temp * 10 + c - '0'; 126656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else if (c) 126756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks PutBackChar(pData); 126856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((temp >= 0) && (temp <= 15)) 126956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 127056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (inHeader && (temp == 0)) 127156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Ignoring V0 encountered in header\n"); */ } 127256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 127356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->volume = (EAS_U8) temp; 127456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 127556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_TRUE; 127656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 127756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 127856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 127956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_GetNumber() 128056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 128156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 128256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 128356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 128456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 128556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 128656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 128756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 128856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 128956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 129056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 129156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 129256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 129356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 129456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_BOOL IMY_GetNumber (EAS_HW_DATA_HANDLE hwInstData, S_IMELODY_DATA *pData, EAS_INT *temp, EAS_BOOL inHeader) 129556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 129656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_BOOL ok; 129756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I8 c; 129856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 129956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 130056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Enter IMY_GetNumber\n"); */ } 130156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 130256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 130356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *temp = 0; 130456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks ok = EAS_FALSE; 130556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (;;) 130656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 130756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks c = IMY_GetNextChar(hwInstData, pData, inHeader); 130856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (IsDigit(c)) 130956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 131056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *temp = *temp * 10 + c - '0'; 131156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks ok = EAS_TRUE; 131256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 131356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 131456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 131556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (c) 131656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks PutBackChar(pData); 131756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 131856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 131956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetNumber: value %d\n", *temp); */ } 132056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 132156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 132256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return ok; 132356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 132456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 132556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 132656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 132756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 132856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_GetVersion() 132956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 133056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 133156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 133256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 133356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 133456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 133556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 133656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 133756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 133856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 133956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 134056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 134156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 134256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 134356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_BOOL IMY_GetVersion (S_IMELODY_DATA *pData, EAS_INT *pVersion) 134456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 134556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I8 c; 134656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_INT temp; 134756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_INT version; 134856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 134956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks version = temp = 0; 135056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (;;) 135156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 135256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks c = pData->buffer[pData->index++]; 135356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((c == 0) || (c == '.')) 135456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 135556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{701} use shift for performance */ 135656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks version = (version << 8) + temp; 135756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (c == 0) 135856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 135956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 136056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 136156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetVersion: version 0x%04x\n", version); */ } 136256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 136356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 136456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pVersion = version; 136556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_TRUE; 136656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 136756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks temp = 0; 136856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 136956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else if (IsDigit(c)) 137056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks temp = (temp * 10) + c - '0'; 137156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 137256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 137356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 137456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 137556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_MetaData() 137656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 137756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 137856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Prepare to parse the file. Allocates instance data (or uses static allocation for 137956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * static memory model). 138056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 138156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 138256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData - pointer to overall EAS data structure 138356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle - pointer to file handle 138456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 138556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 138656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 138756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 138856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 138956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 139056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 139156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 139256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic void IMY_MetaData (S_IMELODY_DATA *pData, E_EAS_METADATA_TYPE metaType, EAS_I8 *buffer) 139356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 139456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 len; 139556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 139656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check for callback */ 139756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (!pData->metadata.callback) 139856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return; 139956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 140056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* copy data to host buffer */ 140156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks len = (EAS_I32) strlen((char*) buffer); 140256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (len >pData->metadata.bufferSize) 140356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks len = pData->metadata.bufferSize; 140456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks strncpy((char*) pData->metadata.buffer, (char*) buffer, (size_t) len); 140556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->metadata.buffer[len] = 0; 140656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 140756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* callback to host */ 140856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->metadata.callback(metaType, pData->metadata.buffer, pData->metadata.pUserData); 140956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 141056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 141156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 141256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_ParseHeader() 141356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 141456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 141556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Prepare to parse the file. Allocates instance data (or uses static allocation for 141656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * static memory model). 141756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 141856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 141956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData - pointer to overall EAS data structure 142056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle - pointer to file handle 142156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 142256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 142356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 142456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 142556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 142656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 142756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 142856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 142956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_ParseHeader (S_EAS_DATA *pEASData, S_IMELODY_DATA* pData) 143056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 143156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_RESULT result; 143256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_INT token; 143356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_INT temp; 143456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I8 c; 143556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 143656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 143756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Enter IMY_ParseHeader\n"); */ } 143856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 143956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 144056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* initialize some defaults */ 144156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->time = 0; 144256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->tick = DEFAULT_TICK_CONV; 144356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->note = 0; 144456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->noteModifier = 0; 144556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData ->restTicks = 0; 144656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->volume = 7; 144756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->octave = 60; 144856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->repeatOffset = -1; 144956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->repeatCount = -1; 145056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->style = 0; 145156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 145256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* force the read of the first line */ 145356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->index = 1; 145456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 145556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* read data until we get to melody */ 145656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (;;) 145756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 145856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* read a line from the file and parse the token */ 145956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pData->index != 0) 146056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 146156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = IMY_ReadLine(pEASData->hwInstData, pData->fileHandle, pData->buffer, &pData->startLine)) != EAS_SUCCESS) 146256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 146356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 146456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_ParseHeader: IMY_ReadLine returned %d\n", result); */ } 146556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 146656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 146756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 146856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 146956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks token = IMY_ParseLine(pData->buffer, &pData->index); 147056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 147156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks switch (token) 147256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 147356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* ignore these valid tokens */ 147456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case TOKEN_BEGIN: 147556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 147656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 147756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case TOKEN_FORMAT: 147856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (!IMY_GetVersion(pData, &temp)) 147956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 148056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Invalid FORMAT field '%s'\n", pData->buffer); */ } 148156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_FILE_FORMAT; 148256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 148356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((temp != 0x0100) && (temp != 0x0200)) 148456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 148556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Unsupported FORMAT %02x\n", temp); */ } 148656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_UNRECOGNIZED_FORMAT; 148756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 148856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 148956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 149056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case TOKEN_VERSION: 149156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (!IMY_GetVersion(pData, &temp)) 149256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 149356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Invalid VERSION field '%s'\n", pData->buffer); */ } 149456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_FILE_FORMAT; 149556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 149656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((temp != 0x0100) && (temp != 0x0102)) 149756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 149856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Unsupported VERSION %02x\n", temp); */ } 149956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_UNRECOGNIZED_FORMAT; 150056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 150156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 150256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 150356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case TOKEN_NAME: 150456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks IMY_MetaData(pData, EAS_METADATA_TITLE, pData->buffer + pData->index); 150556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 150656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 150756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case TOKEN_COMPOSER: 150856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks IMY_MetaData(pData, EAS_METADATA_AUTHOR, pData->buffer + pData->index); 150956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 151056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 151156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* handle beat */ 151256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case TOKEN_BEAT: 151356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks IMY_GetNumber(pEASData->hwInstData, pData, &temp, EAS_TRUE); 151456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((temp >= 25) && (temp <= 900)) 151556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->tick = TICK_CONVERT / temp; 151656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 151756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 151856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* handle style */ 151956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case TOKEN_STYLE: 152056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks c = IMY_GetNextChar(pEASData->hwInstData, pData, EAS_TRUE); 152156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (c == 'S') 152256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks c = IMY_GetNextChar(pEASData->hwInstData, pData, EAS_TRUE); 152356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((c >= '0') && (c <= '2')) 152456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->style = (EAS_U8) (c - '0'); 152556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 152656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 152756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks PutBackChar(pData); 152856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Error in style command: %s\n", pData->buffer); */ } 152956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 153056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 153156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 153256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* handle volume */ 153356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case TOKEN_VOLUME: 153456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks c = IMY_GetNextChar(pEASData->hwInstData, pData, EAS_TRUE); 153556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (c != 'V') 153656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 153756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks PutBackChar(pData); 153856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (!IsDigit(c)) 153956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 154056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Error in volume command: %s\n", pData->buffer); */ } 154156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 154256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 154356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 154456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks IMY_GetVolume(pEASData->hwInstData, pData, EAS_TRUE); 154556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 154656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 154756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case TOKEN_MELODY: 154856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 154956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Header successfully parsed\n"); */ } 155056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 155156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 155256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 155356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case TOKEN_END: 155456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Unexpected END:IMELODY encountered\n"); */ } 155556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_FILE_FORMAT; 155656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 155756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks default: 155856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* force a read of the next line */ 155956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->index = 1; 156056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Ignoring unrecognized token in iMelody file: %s\n", pData->buffer); */ } 156156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 156256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 156356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 156456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 156556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 156656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 156756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_GetNextChar() 156856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 156956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 157056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 157156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 157256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 157356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 157456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 157556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 157656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 157756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 157856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 157956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 158056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 158156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 158256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_I8 IMY_GetNextChar (EAS_HW_DATA_HANDLE hwInstData, S_IMELODY_DATA *pData, EAS_BOOL inHeader) 158356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 158456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I8 c; 158556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U8 index; 158656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 158756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (;;) 158856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 158956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* get next character */ 159056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks c = pData->buffer[pData->index++]; 159156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 159256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* buffer empty, read more */ 159356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (!c) 159456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 159556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* don't read the next line in the header */ 159656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (inHeader) 159756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return 0; 159856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 159956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->index = 0; 160056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->buffer[0] = 0; 160156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (IMY_ReadLine(hwInstData, pData->fileHandle, pData->buffer, &pData->startLine) != EAS_SUCCESS) 160256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 160356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 160456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetNextChar: EOF\n"); */ } 160556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 160656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return 0; 160756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 160856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 160956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check for END:IMELODY token */ 161056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (IMY_ParseLine(pData->buffer, &index) == TOKEN_END) 161156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 161256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 161356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetNextChar: found END:IMELODY\n"); */ } 161456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 161556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pData->buffer[0] = 0; 161656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return 0; 161756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 161856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks continue; 161956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 162056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 162156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* ignore white space */ 162256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (!IsSpace(c)) 162356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 162456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 162556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 162656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetNextChar returned '%c'\n", c); */ } 162756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 162856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return c; 162956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 163056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 163156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 163256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 163356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 163456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_ReadLine() 163556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 163656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 163756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Reads a line of input from the file, discarding the CR/LF 163856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 163956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 164056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 164156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 164256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 164356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 164456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 164556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 164656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 164756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 164856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 164956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_ReadLine (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE fileHandle, EAS_I8 *buffer, EAS_I32 *pStartLine) 165056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 165156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_RESULT result; 165256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_INT i; 165356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I8 c; 165456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 165556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* fetch current file position and save it */ 165656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pStartLine != NULL) 165756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 165856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWFilePos(hwInstData, fileHandle, pStartLine)) != EAS_SUCCESS) 165956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 166056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 166156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_ParseHeader: EAS_HWFilePos returned %d\n", result); */ } 166256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 166356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 166456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 166556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 166656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 166756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks buffer[0] = 0; 166856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (i = 0; i < MAX_LINE_SIZE; ) 166956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 167056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWGetByte(hwInstData, fileHandle, &c)) != EAS_SUCCESS) 167156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 167256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result == EAS_EOF) && (i > 0)) 167356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 167456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 167556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 167656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 167756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* return on LF or end of data */ 167856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (c == '\n') 167956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 168056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 168156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* store characters in buffer */ 168256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (c != '\r') 168356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks buffer[i++] = c; 168456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 168556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks buffer[i] = 0; 168656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 168756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 168856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_ReadLine read %s\n", buffer); */ } 168956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 169056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 169156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 169256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 169356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 169456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 169556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_ParseLine() 169656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 169756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 169856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 169956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 170056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 170156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 170256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 170356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 170456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 170556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 170656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 170756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 170856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 170956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 171056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_INT IMY_ParseLine (EAS_I8 *buffer, EAS_U8 *pIndex) 171156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 171256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_INT i; 171356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_INT j; 171456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 171556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* there's no strnicmp() in stdlib, so we have to roll our own */ 171656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (i = 0; i < TOKEN_INVALID; i++) 171756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 171856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (j = 0; ; j++) 171956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 172056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* end of token, must be a match */ 172156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (tokens[i][j] == 0) 172256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 172356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 172456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_ParseLine found token %d\n", i); */ } 172556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 172656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pIndex = (EAS_U8) j; 172756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return i; 172856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 172956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (tokens[i][j] != ToUpper(buffer[j])) 173056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 173156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 173256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 173356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY 173456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_ParseLine: no token found\n"); */ } 173556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 173656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return TOKEN_INVALID; 173756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 173856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 1739