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    if (pData->state == EAS_STATE_READY) {
34156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pData->state = EAS_STATE_PLAY;
34256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
34356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
34456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* initialize MIDI channel when the track starts playing */
34556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pData->time == 0)
34656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
34756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
34856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
34956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_Event: Reset\n"); */ }
35056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
35156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* set program to square lead */
35256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        VMProgramChange(pEASData->pVoiceMgr, pData->pSynth, IMELODY_CHANNEL, IMELODY_PROGRAM);
35356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
35456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* set channel volume to max */
35556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        VMControlChange(pEASData->pVoiceMgr, pData->pSynth, IMELODY_CHANNEL, 7, 127);
35656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
35756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
35856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check for end of note */
35956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pData->note)
36056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
36156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
36256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
36356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Stopping note %d\n", pData->note); */ }
36456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
36556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* stop the note */
36656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        VMStopNote(pEASData->pVoiceMgr, pData->pSynth, IMELODY_CHANNEL, pData->note, 0);
36756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pData->note = 0;
36856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
36956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* check for rest between notes */
37056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pData->restTicks)
37156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
37256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pData->time += pData->restTicks;
37356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pData->restTicks = 0;
37456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_SUCCESS;
37556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
37656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
37756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
37856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* parse the next event */
37956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    eof = EAS_FALSE;
38056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    while (!eof)
38156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
38256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
38356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* get next character */
38456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        c = IMY_GetNextChar(pEASData->hwInstData, pData, EAS_FALSE);
38556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
38656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        switch (c)
38756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
38856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* start repeat */
38956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case '(':
39056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
39156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
39256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Enter repeat section\n", c); */ }
39356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
39456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
39556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (pData->repeatOffset < 0)
39656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
39756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    pData->repeatOffset = pData->startLine + (EAS_I32) pData->index;
39856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
399f198281e8a0b62addc8f5304ba20983feda9f905Dave Sparks                    /* save current time and check it later to make sure the loop isn't zero length */
400f198281e8a0b62addc8f5304ba20983feda9f905Dave Sparks                    pData->repeatTime = pData->time;
401f198281e8a0b62addc8f5304ba20983feda9f905Dave Sparks
40256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
40356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Repeat offset = %d\n", pData->repeatOffset); */ }
40456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
40556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
40656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                else
40756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Ignoring nested repeat section\n"); */ }
40856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
40956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
41056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* end repeat */
41156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case ')':
41256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
41356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
41456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "End repeat section, repeat offset = %d\n", pData->repeatOffset); */ }
41556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
416f198281e8a0b62addc8f5304ba20983feda9f905Dave Sparks                /* ignore zero-length loops */
417f198281e8a0b62addc8f5304ba20983feda9f905Dave Sparks                if (pData->repeatTime == pData->time) {
418f198281e8a0b62addc8f5304ba20983feda9f905Dave Sparks                    pData->repeatCount = -1;
419f198281e8a0b62addc8f5304ba20983feda9f905Dave Sparks                    pData->repeatOffset = -1;
420f198281e8a0b62addc8f5304ba20983feda9f905Dave Sparks                } else if (pData->repeatCount >= 0) {
42156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
42256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    /* decrement repeat count (repeatCount == 0 means infinite loop) */
42356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    if (pData->repeatCount > 0)
42456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    {
42556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        if (--pData->repeatCount == 0)
42656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        {
42756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                            pData->repeatCount = -1;
42856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
42956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Repeat loop complete\n"); */ }
43056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
43156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        }
43256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    }
43356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
43456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks//2 TEMPORARY FIX: If locating, don't do infinite loops.
43556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks//3 We need a different mode for metadata parsing where we don't loop at all
43656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    if ((parserMode == eParserModePlay) || (pData->repeatCount != 0))
43756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    {
43856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
43956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
44056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Rewinding file for repeat\n"); */ }
44156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
44256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        /* rewind to start of loop */
44356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        if ((result = EAS_HWFileSeek(pEASData->hwInstData, pData->fileHandle, pData->repeatOffset)) != EAS_SUCCESS)
44456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                            return result;
44556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        IMY_ReadLine(pEASData->hwInstData, pData->fileHandle, pData->buffer, &pData->startLine);
44656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        pData->index = 0;
44756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
44856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        /* if last loop, prevent future loops */
44956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        if (pData->repeatCount == -1)
45056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                            pData->repeatOffset = -1;
45156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    }
45256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
45356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
45456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
45556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* repeat count */
45656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case '@':
45756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (!IMY_GetNumber(pEASData->hwInstData, pData, &temp, EAS_FALSE))
45856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    eof = EAS_TRUE;
45956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                else if (pData->repeatOffset > 0)
46056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
46156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
46256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
46356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Repeat count = %dt", pData->repeatCount); */ }
46456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
46556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    if (pData->repeatCount < 0)
46656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        pData->repeatCount = (EAS_I16) temp;
46756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
46856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
46956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
47056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* volume */
47156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case 'V':
47256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (!IMY_GetVolume(pEASData->hwInstData, pData, EAS_FALSE))
47356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    eof = EAS_TRUE;
47456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
47556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
47656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* flat */
47756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case '&':
47856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pData->noteModifier = -1;
47956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
48056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
48156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* sharp */
48256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case '#':
48356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pData->noteModifier = +1;
48456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
48556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
48656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* octave */
48756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case '*':
48856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                c = IMY_GetNextChar(pEASData->hwInstData, pData, EAS_FALSE);
48956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (IsDigit(c))
49056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    pData->octave = (EAS_U8) ((c - '0' + 1) * 12);
49156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                else if (!c)
49256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    eof = EAS_TRUE;
49356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
49456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
49556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* ledon or ledoff */
49656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case 'l':
49756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (!IMY_GetLEDState(pEASData, pData))
49856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    eof = EAS_TRUE;
49956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
50056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
50156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* vibeon or vibeoff */
50256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case 'v':
50356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (!IMY_GetVibeState(pEASData, pData))
50456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    eof = EAS_TRUE;
50556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
50656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
50756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* either a B note or backon or backoff */
50856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case 'b':
50956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (IMY_GetNextChar(pEASData->hwInstData, pData, EAS_FALSE) == 'a')
51056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
51156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    if (!IMY_GetBackState(pEASData, pData))
51256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        eof = EAS_TRUE;
51356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
51456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                else
51556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
51656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    PutBackChar(pData);
51756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    if (IMY_PlayNote(pEASData, pData, c, parserMode))
51856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        return EAS_SUCCESS;
51956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    eof = EAS_TRUE;
52056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
52156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
52256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
52356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* rest */
52456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case 'r':
52556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case 'R':
52656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (IMY_PlayRest(pEASData, pData))
52756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return EAS_SUCCESS;
52856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                eof = EAS_TRUE;
52956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
53056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
53156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* EOF */
53256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case 0:
53356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
53456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_Event: end of iMelody file detected\n"); */ }
53556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
53656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                eof = EAS_TRUE;
53756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
53856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
53956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* must be a note */
54056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            default:
54156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                c = ToLower(c);
54256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if ((c >= 'a') && (c <= 'g'))
54356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
54456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    if (IMY_PlayNote(pEASData, pData, c, parserMode))
54556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        return EAS_SUCCESS;
54656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    eof = EAS_TRUE;
54756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
54856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                else
54956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Ignoring unexpected character '%c' [0x%02x]\n", c, c); */ }
55056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
55156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
55256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
55356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
55456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* handle EOF */
55556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
55656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_Event: state set to EAS_STATE_STOPPING\n"); */ }
55756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
55856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->state = EAS_STATE_STOPPING;
55956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    VMReleaseAllVoices(pEASData->pVoiceMgr, pData->pSynth);
56056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
56156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
56256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
56356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
56456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_State()
56556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
56656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
56756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns the current state of the stream
56856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
56956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
57056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
57156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
57256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pState           - pointer to variable to store state
57356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
57456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
57556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
57656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
57756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
57856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
57956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
58056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
58156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, pEASData) common decoder interface - pEASData not used */
58256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_State (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 *pState)
58356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
58456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_IMELODY_DATA* pData;
58556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
58656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* establish pointer to instance data */
58756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData = (S_IMELODY_DATA*) pInstData;
58856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
58956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if stopping, check to see if synth voices are active */
59056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pData->state == EAS_STATE_STOPPING)
59156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
59256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (VMActiveVoices(pData->pSynth) == 0)
59356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
59456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pData->state = EAS_STATE_STOPPED;
59556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
59656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_State: state set to EAS_STATE_STOPPED\n"); */ }
59756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
59856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
59956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
60056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
60156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pData->state == EAS_STATE_PAUSING)
60256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
60356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (VMActiveVoices(pData->pSynth) == 0)
60456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
60556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
60656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_State: state set to EAS_STATE_PAUSED\n"); */ }
60756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
60856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pData->state = EAS_STATE_PAUSED;
60956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
61056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
61156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
61256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* return current state */
61356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pState = pData->state;
61456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
61556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
61656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
61756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
61856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_Close()
61956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
62056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
62156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Close the file and clean up
62256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
62356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
62456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
62556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
62656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
62756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
62856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
62956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
63056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
63156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
63256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
63356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
63456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_Close (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
63556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
63656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_IMELODY_DATA* pData;
63756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
63856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
63956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
64056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_Close: close file\n"); */ }
64156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
64256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
64356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData = (S_IMELODY_DATA*) pInstData;
64456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
64556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* close the file */
64656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWCloseFile(pEASData->hwInstData, pData->fileHandle)) != EAS_SUCCESS)
64756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
64856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
64956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* free the synth */
65056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pData->pSynth != NULL)
65156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        VMMIDIShutdown(pEASData, pData->pSynth);
65256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
65356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if using dynamic memory, free it */
65456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!pEASData->staticMemoryModel)
65556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_HWFree(pEASData->hwInstData, pData);
65656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
65756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
65856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
65956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
66056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
66156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_Reset()
66256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
66356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
66456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Reset the sequencer. Used for locating backwards in the file.
66556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
66656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
66756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
66856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
66956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
67056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
67156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
67256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
67356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
67456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
67556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
67656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
67756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_Reset (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
67856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
67956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_IMELODY_DATA* pData;
68056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
68156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
68256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
68356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_Reset: reset file\n"); */ }
68456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
68556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData = (S_IMELODY_DATA*) pInstData;
68656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
68756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* reset the synth */
68856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    VMReset(pEASData->pVoiceMgr, pData->pSynth, EAS_TRUE);
68956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
69056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* reset time to zero */
69156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->time = 0;
69256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->note = 0;
69356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
69456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* reset file position and re-parse header */
69556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->state = EAS_STATE_ERROR;
69656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(pEASData->hwInstData, pData->fileHandle, pData->fileOffset)) != EAS_SUCCESS)
69756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
69856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = IMY_ParseHeader (pEASData,  pData)) != EAS_SUCCESS)
69956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
70056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
70156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
70256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_Reset: state set to EAS_STATE_ERROR\n"); */ }
70356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
70456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
70556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->state = EAS_STATE_READY;
70656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
70756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
70856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
70956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
71056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_Pause()
71156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
71256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
71356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Pauses the sequencer. Mutes all voices and sets state to pause.
71456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
71556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
71656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
71756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
71856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
71956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
72056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
72156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
72256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
72356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
72456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
72556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
72656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_Pause (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
72756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
72856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_IMELODY_DATA *pData;
72956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
73056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
73156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_Pause: pause file\n"); */ }
73256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
73356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
73456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* can't pause a stopped stream */
73556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData = (S_IMELODY_DATA*) pInstData;
73656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pData->state == EAS_STATE_STOPPED)
73756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_ALREADY_STOPPED;
73856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
73956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* mute the synthesizer */
74056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    VMMuteAllVoices(pEASData->pVoiceMgr, pData->pSynth);
74156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->state = EAS_STATE_PAUSING;
74256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
74356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
74456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
74556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
74656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_Resume()
74756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
74856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
74956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Resume playing after a pause, sets state back to playing.
75056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
75156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
75256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
75356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
75456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
75556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
75656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
75756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
75856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
75956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
76056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
76156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
76256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, pEASData) common decoder interface - pEASData not used */
76356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_Resume (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
76456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
76556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_IMELODY_DATA *pData;
76656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
76756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
76856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_Resume: resume file\n"); */ }
76956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
77056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
77156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* can't resume a stopped stream */
77256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData = (S_IMELODY_DATA*) pInstData;
77356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pData->state == EAS_STATE_STOPPED)
77456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_ALREADY_STOPPED;
77556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
77656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* nothing to do but resume playback */
77756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->state = EAS_STATE_PLAY;
77856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
77956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
78056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
78156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
78256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_SetData()
78356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
78456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
78556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Adjust tempo relative to song tempo
78656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
78756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
78856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
78956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pInstData        - pointer to iMelody instance data
79056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * rate             - rate (28-bit fractional amount)
79156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
79256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
79356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
79456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
79556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
79656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
79756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
79856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
79956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, pEASData) common decoder interface - pEASData not used */
80056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_SetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value)
80156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
80256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_IMELODY_DATA *pData;
80356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
80456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData = (S_IMELODY_DATA*) pInstData;
80556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    switch (param)
80656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
80756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
80856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* set metadata callback */
80956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_METADATA_CB:
81056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            EAS_HWMemCpy(&pData->metadata, (void*) value, sizeof(S_METADATA_CB));
81156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
81256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
81356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        default:
81456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_INVALID_PARAMETER;
81556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
81656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
81756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
81856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
81956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
82056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
82156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_GetData()
82256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
82356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
82456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Return the file type
82556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
82656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
82756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
82856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pInstData        - pointer to iMelody instance data
82956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
83056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
83156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
83256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
83356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
83456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
83556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
83656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
83756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, pEASData) common decoder interface - pEASData not used */
83856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_GetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue)
83956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
84056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_IMELODY_DATA *pData;
84156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
84256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData = (S_IMELODY_DATA*) pInstData;
84356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
84456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    switch (param)
84556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
84656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* return file type as iMelody */
84756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_FILE_TYPE:
84856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            *pValue = EAS_FILE_IMELODY;
84956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
85056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
85156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_SYNTH_HANDLE:
85256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            *pValue = (EAS_I32) pData->pSynth;
85356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
85456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
85556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_GAIN_OFFSET:
85656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            *pValue = IMELODY_GAIN_OFFSET;
85756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
85856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
85956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        default:
86056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_INVALID_PARAMETER;
86156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
86256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
86356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
86456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
86556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
86656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
86756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_PlayNote()
86856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
86956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
87056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
87156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
87256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
87356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
87456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
87556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
87656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
87756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
87856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
87956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
88056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
88156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
88256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_BOOL IMY_PlayNote (S_EAS_DATA *pEASData, S_IMELODY_DATA *pData, EAS_I8 note, EAS_INT parserMode)
88356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
88456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 duration;
88556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U8 velocity;
88656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
88756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
88856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
88956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_PlayNote: start note %d\n", note); */ }
89056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
89156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
89256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the duration */
89356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!IMY_GetDuration(pEASData->hwInstData, pData, &duration))
89456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_FALSE;
89556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
89656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* save note value */
89756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->note = (EAS_U8) (pData->octave + noteTable[note - 'a'] + pData->noteModifier);
89856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    velocity = (EAS_U8) (pData->volume ? pData->volume * IMELODY_VEL_MUL + IMELODY_VEL_OFS : 0);
89956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
90056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* start note only if in play mode */
90156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (parserMode == eParserModePlay)
90256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        VMStartNote(pEASData->pVoiceMgr, pData->pSynth, IMELODY_CHANNEL, pData->note, velocity);
90356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
90456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
90556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_PlayNote: Start note %d, duration %d\n", pData->note, duration); */ }
90656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
90756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
90856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* determine note length */
90956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    switch (pData->style)
91056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
91156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case 0:
91256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /*lint -e{704} shift for performance */
91356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pData->restTicks = duration >> 4;
91456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
91556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case 1:
91656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pData->restTicks = 0;
91756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
91856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case 2:
91956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /*lint -e{704} shift for performance */
92056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pData->restTicks = duration >> 1;
92156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
92256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        default:
92356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "IMY_PlayNote: Note style out of range: %d\n", pData->style); */ }
92456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /*lint -e{704} shift for performance */
92556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pData->restTicks = duration >> 4;
92656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
92756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
92856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
92956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* next event is at end of this note */
93056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->time += duration - pData->restTicks;
93156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
93256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* reset the flat/sharp modifier */
93356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->noteModifier = 0;
93456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
93556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_TRUE;
93656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
93756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
93856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
93956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_PlayRest()
94056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
94156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
94256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
94356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
94456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
94556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
94656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
94756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
94856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
94956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
95056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
95156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
95256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
95356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
95456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_BOOL IMY_PlayRest (S_EAS_DATA *pEASData, S_IMELODY_DATA *pData)
95556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
95656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 duration;
95756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
95856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
95956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Enter IMY_PlayRest]n"); */ }
96056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
96156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
96256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the duration */
96356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!IMY_GetDuration(pEASData->hwInstData, pData, &duration))
96456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_FALSE;
96556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
96656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
96756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_PlayRest: note duration %d\n", duration); */ }
96856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
96956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
97056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* next event is at end of this note */
97156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->time += duration;
97256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_TRUE;
97356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
97456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
97556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
97656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_GetDuration()
97756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
97856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
97956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
98056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
98156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
98256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
98356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
98456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
98556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
98656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
98756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
98856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
98956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
99056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
99156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
99256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_BOOL IMY_GetDuration (EAS_HW_DATA_HANDLE hwInstData, S_IMELODY_DATA *pData, EAS_I32 *pDuration)
99356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
99456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 duration;
99556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I8 c;
99656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
99756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the duration */
99856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pDuration = 0;
99956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    c = IMY_GetNextChar(hwInstData, pData, EAS_FALSE);
100056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!c)
100156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_FALSE;
100256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((c < '0') || (c > '5'))
100356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
100456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
100556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetDuration: error in duration '%c'\n", c); */ }
100656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
100756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_FALSE;
100856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
100956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
101056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* calculate total length of note */
101156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    duration = pData->tick * (1 << ('5' - c));
101256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
101356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check for duration modifier */
101456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    c = IMY_GetNextChar(hwInstData, pData, EAS_FALSE);
101556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (c)
101656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
101756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (c == '.')
101856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /*lint -e{704} shift for performance */
101956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            duration += duration >> 1;
102056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else if (c == ':')
102156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /*lint -e{704} shift for performance */
102256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            duration += (duration >> 1) + (duration >> 2);
102356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else if (c == ';')
102456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /*lint -e{704} shift for performance */
102556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            duration = (duration * TRIPLET_MULTIPLIER) >> TRIPLET_SHIFT;
102656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else
102756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            PutBackChar(pData);
102856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
102956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
103056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pDuration = duration;
103156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_TRUE;
103256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
103356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
103456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
103556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_GetLEDState()
103656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
103756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
103856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
103956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
104056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
104156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
104256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
104356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
104456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
104556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
104656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
104756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
104856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
104956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
105056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_BOOL IMY_GetLEDState (S_EAS_DATA *pEASData, S_IMELODY_DATA *pData)
105156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
105256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I8 c;
105356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT i;
105456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
105556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
105656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Enter IMY_GetLEDState\n"); */ }
105756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
105856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
105956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (i = 0; i < 5; i++)
106056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
106156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        c = IMY_GetNextChar(pEASData->hwInstData, pData, EAS_FALSE);
106256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (!c)
106356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_FALSE;
106456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        switch (i)
106556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
106656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case 3:
106756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (c == 'n')
106856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
106956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
107056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetLEDState: LED on\n"); */ }
107156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
107256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    EAS_HWLED(pEASData->hwInstData, EAS_TRUE);
107356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return EAS_TRUE;
107456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
107556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                else if (c != 'f')
107656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return EAS_FALSE;
107756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
107856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
107956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case 4:
108056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (c == 'f')
108156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
108256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
108356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetLEDState: LED off\n"); */ }
108456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
108556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    EAS_HWLED(pEASData->hwInstData, EAS_FALSE);
108656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return EAS_TRUE;
108756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
108856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return EAS_FALSE;
108956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
109056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            default:
109156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (c != ledStr[i])
109256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return EAS_FALSE;
109356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
109456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
109556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
109656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_FALSE;
109756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
109856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
109956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
110056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_GetVibeState()
110156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
110256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
110356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
110456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
110556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
110656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
110756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
110856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
110956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
111056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
111156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
111256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
111356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
111456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
111556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_BOOL IMY_GetVibeState (S_EAS_DATA *pEASData, S_IMELODY_DATA *pData)
111656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
111756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I8 c;
111856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT i;
111956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
112056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
112156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Enter IMY_GetVibeState\n"); */ }
112256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
112356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
112456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (i = 0; i < 6; i++)
112556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
112656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        c = IMY_GetNextChar(pEASData->hwInstData, pData, EAS_FALSE);
112756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (!c)
112856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_FALSE;
112956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        switch (i)
113056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
113156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case 4:
113256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (c == 'n')
113356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
113456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
113556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetVibeState: vibrate on\n"); */ }
113656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
113756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    EAS_HWVibrate(pEASData->hwInstData, EAS_TRUE);
113856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return EAS_TRUE;
113956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
114056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                else if (c != 'f')
114156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return EAS_FALSE;
114256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
114356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
114456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case 5:
114556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (c == 'f')
114656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
114756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
114856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetVibeState: vibrate off\n"); */ }
114956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
115056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    EAS_HWVibrate(pEASData->hwInstData, EAS_FALSE);
115156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return EAS_TRUE;
115256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
115356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return EAS_FALSE;
115456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
115556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            default:
115656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (c != vibeStr[i])
115756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return EAS_FALSE;
115856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
115956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
116056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
116156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_FALSE;
116256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
116356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
116456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
116556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_GetBackState()
116656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
116756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
116856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
116956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
117056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
117156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
117256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
117356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
117456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
117556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
117656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
117756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
117856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
117956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
118056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_BOOL IMY_GetBackState (S_EAS_DATA *pEASData, S_IMELODY_DATA *pData)
118156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
118256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I8 c;
118356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT i;
118456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
118556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
118656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Enter IMY_GetBackState\n"); */ }
118756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
118856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
118956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (i = 0; i < 5; i++)
119056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
119156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        c = IMY_GetNextChar(pEASData->hwInstData, pData, EAS_FALSE);
119256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (!c)
119356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_FALSE;
119456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        switch (i)
119556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
119656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case 3:
119756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (c == 'n')
119856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
119956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
120056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetBackState: backlight on\n"); */ }
120156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
120256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    EAS_HWBackLight(pEASData->hwInstData, EAS_TRUE);
120356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return EAS_TRUE;
120456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
120556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                else if (c != 'f')
120656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return EAS_FALSE;
120756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
120856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
120956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case 4:
121056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (c == 'f')
121156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
121256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
121356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetBackState: backlight off\n"); */ }
121456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
121556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    EAS_HWBackLight(pEASData->hwInstData, EAS_FALSE);
121656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return EAS_TRUE;
121756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
121856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return EAS_FALSE;
121956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
122056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            default:
122156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (c != backStr[i])
122256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return EAS_FALSE;
122356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
122456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
122556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
122656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_FALSE;
122756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
122856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
122956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
123056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_GetVolume()
123156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
123256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
123356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
123456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
123556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
123656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
123756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
123856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
123956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
124056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
124156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
124256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
124356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
124456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
124556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_BOOL IMY_GetVolume (EAS_HW_DATA_HANDLE hwInstData, S_IMELODY_DATA *pData, EAS_BOOL inHeader)
124656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
124756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT temp;
124856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I8 c;
124956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
125056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
125156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Enter IMY_GetVolume\n"); */ }
125256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
125356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
125456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    c = IMY_GetNextChar(hwInstData, pData, inHeader);
125556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (c == '+')
125656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
125756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pData->volume < 15)
125856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pData->volume++;
125956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_TRUE;
126056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
126156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else if (c == '-')
126256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
126356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pData->volume > 0)
126456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pData->volume--;
126556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_TRUE;
126656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
126756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else if (IsDigit(c))
126856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        temp = c - '0';
126956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else
127056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_FALSE;
127156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
127256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    c = IMY_GetNextChar(hwInstData, pData, inHeader);
127356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (IsDigit(c))
127456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        temp = temp * 10 + c - '0';
127556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else if (c)
127656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        PutBackChar(pData);
127756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((temp >= 0) && (temp <= 15))
127856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
127956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (inHeader && (temp == 0))
128056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Ignoring V0 encountered in header\n"); */ }
128156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else
128256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pData->volume = (EAS_U8) temp;
128356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
128456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_TRUE;
128556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
128656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
128756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
128856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_GetNumber()
128956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
129056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
129156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
129256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
129356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
129456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
129556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
129656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
129756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
129856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
129956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
130056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
130156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
130256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
130356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_BOOL IMY_GetNumber (EAS_HW_DATA_HANDLE hwInstData, S_IMELODY_DATA *pData, EAS_INT *temp, EAS_BOOL inHeader)
130456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
130556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_BOOL ok;
130656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I8 c;
130756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
130856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
130956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Enter IMY_GetNumber\n"); */ }
131056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
131156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
131256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *temp = 0;
131356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    ok = EAS_FALSE;
131456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (;;)
131556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
131656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        c = IMY_GetNextChar(hwInstData, pData, inHeader);
131756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (IsDigit(c))
131856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
131956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            *temp = *temp * 10 + c - '0';
132056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            ok = EAS_TRUE;
132156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
132256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else
132356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
132456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (c)
132556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                PutBackChar(pData);
132656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
132756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
132856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetNumber: value %d\n", *temp); */ }
132956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
133056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
133156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return ok;
133256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
133356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
133456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
133556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
133656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
133756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_GetVersion()
133856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
133956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
134056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
134156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
134256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
134356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
134456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
134556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
134656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
134756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
134856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
134956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
135056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
135156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
135256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_BOOL IMY_GetVersion (S_IMELODY_DATA *pData, EAS_INT *pVersion)
135356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
135456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I8 c;
135556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT temp;
135656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT version;
135756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
135856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    version = temp = 0;
135956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (;;)
136056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
136156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        c = pData->buffer[pData->index++];
136256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((c == 0) || (c == '.'))
136356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
136456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /*lint -e{701} use shift for performance */
136556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            version = (version << 8) + temp;
136656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (c == 0)
136756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
136856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
136956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
137056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetVersion: version 0x%04x\n", version); */ }
137156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
137256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
137356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                *pVersion = version;
137456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return EAS_TRUE;
137556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
137656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            temp = 0;
137756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
137856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else if (IsDigit(c))
137956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            temp = (temp * 10) + c - '0';
138056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
138156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
138256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
138356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
138456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_MetaData()
138556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
138656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
138756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Prepare to parse the file. Allocates instance data (or uses static allocation for
138856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * static memory model).
138956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
139056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
139156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
139256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
139356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
139456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
139556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
139656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
139756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
139856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
139956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
140056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
140156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic void IMY_MetaData (S_IMELODY_DATA *pData, E_EAS_METADATA_TYPE metaType, EAS_I8 *buffer)
140256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
140356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 len;
140456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
140556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check for callback */
140656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!pData->metadata.callback)
140756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return;
140856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
140956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* copy data to host buffer */
141056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    len = (EAS_I32) strlen((char*) buffer);
141156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (len >pData->metadata.bufferSize)
141256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        len = pData->metadata.bufferSize;
141356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    strncpy((char*) pData->metadata.buffer, (char*) buffer, (size_t) len);
141456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->metadata.buffer[len] = 0;
141556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
141656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* callback to host */
141756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->metadata.callback(metaType, pData->metadata.buffer, pData->metadata.pUserData);
141856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
141956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
142056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
142156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_ParseHeader()
142256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
142356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
142456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Prepare to parse the file. Allocates instance data (or uses static allocation for
142556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * static memory model).
142656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
142756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
142856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
142956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
143056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
143156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
143256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
143356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
143456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
143556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
143656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
143756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
143856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_ParseHeader (S_EAS_DATA *pEASData, S_IMELODY_DATA* pData)
143956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
144056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
144156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT token;
144256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT temp;
144356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I8 c;
144456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
144556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
144656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Enter IMY_ParseHeader\n"); */ }
144756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
144856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
144956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* initialize some defaults */
145056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->time = 0;
145156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->tick = DEFAULT_TICK_CONV;
145256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->note = 0;
145356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->noteModifier = 0;
145456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData ->restTicks = 0;
145556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->volume = 7;
145656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->octave = 60;
145756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->repeatOffset = -1;
145856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->repeatCount = -1;
145956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->style = 0;
146056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
146156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* force the read of the first line */
146256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->index = 1;
146356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
146456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* read data until we get to melody */
146556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (;;)
146656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
146756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* read a line from the file and parse the token */
146856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pData->index != 0)
146956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
147056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = IMY_ReadLine(pEASData->hwInstData, pData->fileHandle, pData->buffer, &pData->startLine)) != EAS_SUCCESS)
147156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
147256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
147356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_ParseHeader: IMY_ReadLine returned %d\n", result); */ }
147456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
147556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
147656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
147756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
147856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        token = IMY_ParseLine(pData->buffer, &pData->index);
147956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
148056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        switch (token)
148156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
148256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* ignore these valid tokens */
148356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case TOKEN_BEGIN:
148456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
148556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
148656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case TOKEN_FORMAT:
148756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (!IMY_GetVersion(pData, &temp))
148856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
148956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Invalid FORMAT field '%s'\n", pData->buffer); */ }
149056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return EAS_ERROR_FILE_FORMAT;
149156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
149256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if ((temp != 0x0100) && (temp != 0x0200))
149356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
149456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Unsupported FORMAT %02x\n", temp); */ }
149556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return EAS_ERROR_UNRECOGNIZED_FORMAT;
149656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
149756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
149856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
149956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case TOKEN_VERSION:
150056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (!IMY_GetVersion(pData, &temp))
150156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
150256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Invalid VERSION field '%s'\n", pData->buffer); */ }
150356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return EAS_ERROR_FILE_FORMAT;
150456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
150556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if ((temp != 0x0100) && (temp != 0x0102))
150656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
150756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Unsupported VERSION %02x\n", temp); */ }
150856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return EAS_ERROR_UNRECOGNIZED_FORMAT;
150956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
151056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
151156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
151256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case TOKEN_NAME:
151356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                IMY_MetaData(pData, EAS_METADATA_TITLE, pData->buffer + pData->index);
151456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
151556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
151656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case TOKEN_COMPOSER:
151756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                IMY_MetaData(pData, EAS_METADATA_AUTHOR, pData->buffer + pData->index);
151856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
151956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
152056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* handle beat */
152156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case TOKEN_BEAT:
152256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                IMY_GetNumber(pEASData->hwInstData, pData, &temp, EAS_TRUE);
152356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if ((temp >= 25) && (temp <= 900))
152456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    pData->tick = TICK_CONVERT / temp;
152556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
152656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
152756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* handle style */
152856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case TOKEN_STYLE:
152956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                c = IMY_GetNextChar(pEASData->hwInstData, pData, EAS_TRUE);
153056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (c == 'S')
153156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    c = IMY_GetNextChar(pEASData->hwInstData, pData, EAS_TRUE);
153256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if ((c >= '0') && (c <= '2'))
153356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    pData->style = (EAS_U8) (c - '0');
153456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                else
153556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
153656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    PutBackChar(pData);
153756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Error in style command: %s\n", pData->buffer); */ }
153856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
153956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
154056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
154156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* handle volume */
154256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case TOKEN_VOLUME:
154356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                c = IMY_GetNextChar(pEASData->hwInstData, pData, EAS_TRUE);
154456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (c != 'V')
154556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
154656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    PutBackChar(pData);
154756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    if (!IsDigit(c))
154856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    {
154956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Error in volume command: %s\n", pData->buffer); */ }
155056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        break;
155156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    }
155256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
155356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                IMY_GetVolume(pEASData->hwInstData, pData, EAS_TRUE);
155456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
155556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
155656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case TOKEN_MELODY:
155756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
155856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Header successfully parsed\n"); */ }
155956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
156056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return EAS_SUCCESS;
156156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
156256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case TOKEN_END:
156356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Unexpected END:IMELODY encountered\n"); */ }
156456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return EAS_ERROR_FILE_FORMAT;
156556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
156656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            default:
156756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                /* force a read of the next line */
156856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pData->index = 1;
156956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Ignoring unrecognized token in iMelody file: %s\n", pData->buffer); */ }
157056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
157156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
157256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
157356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
157456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
157556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
157656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_GetNextChar()
157756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
157856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
157956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
158056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
158156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
158256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
158356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
158456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
158556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
158656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
158756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
158856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
158956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
159056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
159156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_I8 IMY_GetNextChar (EAS_HW_DATA_HANDLE hwInstData, S_IMELODY_DATA *pData, EAS_BOOL inHeader)
159256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
159356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I8 c;
159456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U8 index;
159556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
159656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (;;)
159756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
159856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* get next character */
159956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        c = pData->buffer[pData->index++];
160056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
160156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* buffer empty, read more */
160256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (!c)
160356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
160456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* don't read the next line in the header */
160556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (inHeader)
160656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return 0;
160756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
160856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pData->index = 0;
160956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pData->buffer[0] = 0;
161056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (IMY_ReadLine(hwInstData, pData->fileHandle, pData->buffer, &pData->startLine) != EAS_SUCCESS)
161156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
161256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
161356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetNextChar: EOF\n"); */ }
161456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
161556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return 0;
161656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
161756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
161856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* check for END:IMELODY token */
161956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (IMY_ParseLine(pData->buffer, &index) == TOKEN_END)
162056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
162156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
162256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetNextChar: found END:IMELODY\n"); */ }
162356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
162456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pData->buffer[0] = 0;
162556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return 0;
162656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
162756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            continue;
162856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
162956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
163056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* ignore white space */
163156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (!IsSpace(c))
163256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
163356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
163456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
163556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_GetNextChar returned '%c'\n", c); */ }
163656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
163756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return c;
163856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
163956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
164056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
164156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
164256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
164356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_ReadLine()
164456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
164556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
164656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Reads a line of input from the file, discarding the CR/LF
164756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
164856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
164956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
165056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
165156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
165256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
165356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
165456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
165556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
165656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
165756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
165856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT IMY_ReadLine (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE fileHandle, EAS_I8 *buffer, EAS_I32 *pStartLine)
165956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
166056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
166156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT i;
166256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I8 c;
166356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
166456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* fetch current file position and save it */
166556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pStartLine != NULL)
166656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
166756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWFilePos(hwInstData, fileHandle, pStartLine)) != EAS_SUCCESS)
166856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
166956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
167056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_ParseHeader: EAS_HWFilePos returned %d\n", result); */ }
167156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
167256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
167356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
167456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
167556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
167656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    buffer[0] = 0;
167756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (i = 0; i < MAX_LINE_SIZE; )
167856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
167956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWGetByte(hwInstData, fileHandle, &c)) != EAS_SUCCESS)
168056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
168156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result == EAS_EOF) && (i > 0))
168256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
168356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
168456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
168556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
168656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* return on LF or end of data */
168756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (c == '\n')
168856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
168956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
169056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* store characters in buffer */
169156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (c != '\r')
169256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            buffer[i++] = c;
169356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
169456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    buffer[i] = 0;
169556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
169656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
169756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_ReadLine read %s\n", buffer); */ }
169856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
169956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
170056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
170156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
170256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
170356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
170456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * IMY_ParseLine()
170556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
170656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
170756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
170856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
170956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
171056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
171156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
171256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
171356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
171456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
171556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
171656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
171756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
171856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
171956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_INT IMY_ParseLine (EAS_I8 *buffer, EAS_U8 *pIndex)
172056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
172156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT i;
172256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT j;
172356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
172456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* there's no strnicmp() in stdlib, so we have to roll our own */
172556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (i = 0; i < TOKEN_INVALID; i++)
172656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
172756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        for (j = 0; ; j++)
172856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
172956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* end of token, must be a match */
173056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (tokens[i][j] == 0)
173156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
173256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
173356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_ParseLine found token %d\n", i); */ }
173456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
173556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                *pIndex = (EAS_U8) j;
173656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return i;
173756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
173856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (tokens[i][j] != ToUpper(buffer[j]))
173956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
174056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
174156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
174256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _DEBUG_IMELODY
174356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "IMY_ParseLine: no token found\n"); */ }
174456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
174556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return TOKEN_INVALID;
174656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
174756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
1748