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