156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * File:
456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * eas_xmf.c
556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *  5
656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Contents and purpose:
756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * XMF File 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: 501 $
2656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *   $Date: 2006-12-11 17:53:36 -0800 (Mon, 11 Dec 2006) $
2756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
2856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
2956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
3056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_data.h"
3156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_miditypes.h"
3256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_parser.h"
3356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_report.h"
3456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_host.h"
3556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_midi.h"
3656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_xmf.h"
3756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_xmfdata.h"
3856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_config.h"
3956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_vm_protos.h"
4056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_mdls.h"
4156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_smf.h"
4256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
4356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
4456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* XMF header file type */
4556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define XMF_IDENTIFIER          0x584d465f
4656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define XMF_VERSION_2_00        0x322e3030
4756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define XMF_FILE_TYPE           0x00000002
4856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define XMF_SPEC_LEVEL          0x00000001
4956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define XMF_RIFF_CHUNK          0x52494646
5056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define XMF_RIFF_DLS            0x444c5320
5156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define XMF_SMF_CHUNK           0x4d546864
5256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
5356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* local prototypes */
5456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_CheckFileType (S_EAS_DATA *pEASData, EAS_FILE_HANDLE fileHandle, EAS_VOID_PTR *ppHandle, EAS_I32 offset);
5556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_Prepare (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
5656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_Time (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_U32 *pTime);
5756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_Event (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_INT parserMode);
5856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_State (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_STATE *pState);
5956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_Close (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
6056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_Reset (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
6156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_Pause (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
6256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_Resume (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
6356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_SetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value);
6456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_GetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue);
6556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_FindFileContents (EAS_HW_DATA_HANDLE hwInstData, S_XMF_DATA *pXMFData);
6656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_ReadNode (EAS_HW_DATA_HANDLE hwInstData, S_XMF_DATA *pXMFData, EAS_I32 nodeOffset, EAS_I32 *pLength);
6756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_ReadVLQ (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE fileHandle, EAS_I32 *value);
6856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
6956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
7056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
7156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
7256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * XMF_Parser
7356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
7456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * This structure contains the functional interface for the XMF parser
7556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
7656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
7756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksconst S_FILE_PARSER_INTERFACE EAS_XMF_Parser =
7856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
7956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    XMF_CheckFileType,
8056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    XMF_Prepare,
8156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    XMF_Time,
8256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    XMF_Event,
8356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    XMF_State,
8456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    XMF_Close,
8556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    XMF_Reset,
8656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    XMF_Pause,
8756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    XMF_Resume,
8856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    NULL,
8956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    XMF_SetData,
9056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    XMF_GetData,
9156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    NULL
9256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks};
9356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
9456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
9556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * XMF_CheckFileType()
9656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
9756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
9856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Check the file type to see if we can parse it
9956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
10056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
10156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
10256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
10356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
10456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
10556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
10656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
10756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
10856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
10956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
11056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
11156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_CheckFileType (S_EAS_DATA *pEASData, EAS_FILE_HANDLE fileHandle, EAS_VOID_PTR *ppHandle, EAS_I32 offset)
11256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
11356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_XMF_DATA *pXMFData;
11456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
11556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 temp;
11656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
11756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* assume we don't recognize it initially */
11856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *ppHandle = NULL;
11956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
12056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* read the file identifier */
12156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetDWord(pEASData->hwInstData, fileHandle, &temp, EAS_TRUE))  != EAS_SUCCESS)
12256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
12356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (temp != XMF_IDENTIFIER)
12456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_SUCCESS;
12556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
12656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* read the version */
12756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetDWord(pEASData->hwInstData, fileHandle, &temp, EAS_TRUE))  != EAS_SUCCESS)
12856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
12956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (temp != XMF_VERSION_2_00)
13056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
13156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "XMF file version was 0x%08x, expected 0x%08x\n", temp, XMF_VERSION_2_00); */ }
13256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_SUCCESS;
13356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
13456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
13556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* read the file type */
13656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetDWord(pEASData->hwInstData, fileHandle, &temp, EAS_TRUE))  != EAS_SUCCESS)
13756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
13856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (temp != XMF_FILE_TYPE)
13956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
14056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "XMF file type was 0x%08x, expected 0x%08x\n", temp, XMF_FILE_TYPE); */ }
14156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_SUCCESS;
14256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
14356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
14456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* read the spec level */
14556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetDWord(pEASData->hwInstData, fileHandle, &temp, EAS_TRUE))  != EAS_SUCCESS)
14656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
14756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (temp != XMF_SPEC_LEVEL)
14856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
14956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "XMF file spec was 0x%08x, expected 0x%08x\n", temp, XMF_SPEC_LEVEL); */ }
15056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_SUCCESS;
15156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
15256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
15356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check for static memory allocation */
15456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->staticMemoryModel)
15556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pXMFData = EAS_CMEnumData(EAS_CM_XMF_DATA);
15656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else
15756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pXMFData = EAS_HWMalloc(pEASData->hwInstData, sizeof(S_XMF_DATA));
15856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!pXMFData)
15956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_MALLOC_FAILED;
16056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
16156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* zero the memory to insure complete initialization */
16256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_HWMemSet((void *)pXMFData,0, sizeof(S_XMF_DATA));
16356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
16456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pXMFData->fileHandle = fileHandle;
16556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pXMFData->fileOffset = offset;
16656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *ppHandle = pXMFData;
16756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
16856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* locate the SMF and DLS contents */
16956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = XMF_FindFileContents(pEASData->hwInstData, pXMFData)) != EAS_SUCCESS)
17056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
17156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "No SMF data found in XMF file\n"); */ }
17256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
17356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
17456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
17556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* let the SMF parser take over */
17656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(pEASData->hwInstData, fileHandle, pXMFData->midiOffset)) != EAS_SUCCESS)
17756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
17856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return SMF_CheckFileType(pEASData, fileHandle, &pXMFData->pSMFData, pXMFData->midiOffset);
17956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
18056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
18156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
18256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * XMF_Prepare()
18356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
18456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
18556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Prepare to parse the file. Allocates instance data (or uses static allocation for
18656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * static memory model).
18756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
18856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
18956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
19056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
19156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
19256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
19356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
19456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
19556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
19656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
19756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
19856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
19956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_Prepare (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
20056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
20156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_XMF_DATA* pXMFData;
20256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
20356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
20456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* parse DLS collection */
20556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pXMFData = (S_XMF_DATA*) pInstData;
20656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pXMFData->dlsOffset != 0)
20756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
20856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = DLSParser(pEASData->hwInstData, pXMFData->fileHandle, pXMFData->dlsOffset, &pXMFData->pDLS)) != EAS_SUCCESS)
20956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
21056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Error converting XMF DLS data\n"); */ }
21156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
21256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
21356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
21456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
21556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* Prepare the SMF parser */
21656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = SMF_Prepare(pEASData, pXMFData->pSMFData)) != EAS_SUCCESS)
21756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
21856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
21956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if no DLS file, skip this step */
22056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pXMFData->pDLS == NULL)
22156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_SUCCESS;
22256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
22356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* tell the synth to use the DLS collection */
22456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    result = VMSetDLSLib(((S_SMF_DATA*) pXMFData->pSMFData)->pSynth, pXMFData->pDLS);
22556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (result == EAS_SUCCESS)
22656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
22756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        DLSAddRef(pXMFData->pDLS);
22856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        VMInitializeAllChannels(pEASData->pVoiceMgr, ((S_SMF_DATA*) pXMFData->pSMFData)->pSynth);
22956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
23056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return result;
23156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
23256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
23356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
23456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * XMF_Time()
23556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
23656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
23756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns the time of the next event in msecs
23856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
23956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
24056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
24156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
24256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pTime            - pointer to variable to hold time of next event (in msecs)
24356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
24456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
24556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
24656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
24756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
24856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
24956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
25056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
25156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_Time (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_U32 *pTime)
25256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
25356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return SMF_Time(pEASData, ((S_XMF_DATA*) pInstData)->pSMFData, pTime);
25456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
25556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
25656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
25756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * XMF_Event()
25856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
25956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
26056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Parse the next event in the file
26156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
26256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
26356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
26456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
26556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
26656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
26756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
26856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
26956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
27056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
27156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
27256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
27356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_Event (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_INT parserMode)
27456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
27556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return SMF_Event(pEASData, ((S_XMF_DATA*) pInstData)->pSMFData, parserMode);
27656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
27756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
27856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
27956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * XMF_State()
28056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
28156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
28256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns the current state of the stream
28356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
28456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
28556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
28656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
28756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pState           - pointer to variable to store state
28856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
28956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
29056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
29156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
29256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
29356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
29456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
29556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
29656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_State (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 *pState)
29756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
29856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return SMF_State(pEASData, ((S_XMF_DATA*) pInstData)->pSMFData, pState);
29956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
30056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
30156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
30256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * XMF_Close()
30356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
30456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
30556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Close the file and clean up
30656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
30756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
30856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
30956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
31056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
31156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
31256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
31356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
31456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
31556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
31656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
31756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
31856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_Close (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
31956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
32056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_XMF_DATA* pXMFData;
32156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
32256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
32356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pXMFData = (S_XMF_DATA *)pInstData;
32456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
32556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* close the SMF stream, it will close the file handle */
32656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = SMF_Close(pEASData, pXMFData->pSMFData)) != EAS_SUCCESS)
32756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
32856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
32956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pXMFData->pDLS)
33056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        DLSCleanup(pEASData->hwInstData, pXMFData->pDLS);
33156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
33256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if using dynamic memory, free it */
33356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!pEASData->staticMemoryModel)
33456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
33556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* free the instance data */
33656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_HWFree(pEASData->hwInstData, pXMFData);
33756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
33856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
33956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
34056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
34156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
34256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
34356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * XMF_Reset()
34456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
34556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
34656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Reset the sequencer. Used for locating backwards in the file.
34756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
34856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
34956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
35056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
35156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
35256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
35356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
35456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
35556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
35656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
35756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
35856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
35956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_Reset (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
36056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
36156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return SMF_Reset(pEASData, ((S_XMF_DATA*) pInstData)->pSMFData);
36256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
36356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
36456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
36556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * XMF_Pause()
36656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
36756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
36856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Pauses the sequencer. Mutes all voices and sets state to pause.
36956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
37056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
37156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
37256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
37356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
37456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
37556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
37656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
37756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
37856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
37956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
38056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
38156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_Pause (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
38256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
38356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return SMF_Pause(pEASData, ((S_XMF_DATA*) pInstData)->pSMFData);
38456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
38556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
38656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
38756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * XMF_Resume()
38856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
38956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
39056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Resume playing after a pause, sets state back to playing.
39156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
39256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
39356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
39456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
39556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
39656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
39756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
39856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
39956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
40056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
40156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
40256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
40356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_Resume (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
40456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
40556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return SMF_Resume(pEASData, ((S_XMF_DATA*) pInstData)->pSMFData);
40656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
40756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
40856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
40956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * XMF_SetData()
41056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
41156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
41256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Sets the playback rate of the underlying SMF file
41356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
41456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
41556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
41656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
41756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * rate             - rate (28-bit fraction)
41856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
41956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
42056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
42156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
42256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
42356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
42456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
42556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
42656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_SetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value)
42756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
42856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return SMF_SetData(pEASData, ((S_XMF_DATA*) pInstData)->pSMFData, param, value);
42956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
43056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
43156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
43256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * XMF_GetData()
43356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
43456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
43556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Gets the file type
43656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
43756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
43856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
43956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
44056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * rate             - rate (28-bit fraction)
44156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
44256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
44356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
44456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
44556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
44656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
44756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
44856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
44956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_GetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue)
45056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
45156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
45256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
45356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* call SMF parser to get value */
45456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = SMF_GetData(pEASData, ((S_XMF_DATA*) pInstData)->pSMFData, param, pValue)) != EAS_SUCCESS)
45556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
45656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
45756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* special case for file type */
45856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (param == PARSER_DATA_FILE_TYPE)
45956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
46056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (*pValue == EAS_FILE_SMF0)
46156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            *pValue = EAS_FILE_XMF0;
46256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else if (*pValue == EAS_FILE_SMF1)
46356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            *pValue = EAS_FILE_XMF1;
46456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
46556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
46656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
46756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
46856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
46956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
47056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * XMF_FindFileContents()
47156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
47256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
47356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Finds SMF data and DLS data in XMF file, and remembers offset for each.
47456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * If more than one is found, uses the first one found of each.
47556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Makes assumptions about the format of a mobile XMF file
47656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
47756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
47856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
47956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pXMFData         - pointer to XMF parser instance data
48056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
48156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
48256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
48356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
48456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
48556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
48656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
48756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
48856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
48956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_FindFileContents (EAS_HW_DATA_HANDLE hwInstData, S_XMF_DATA *pXMFData)
49056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
49156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
49256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 value;
49356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 length;
49456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
49556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* initialize offsets */
49656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pXMFData->dlsOffset = pXMFData->midiOffset = 0;
49756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
49856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* read file length, ignore it for now */
49956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = XMF_ReadVLQ(hwInstData, pXMFData->fileHandle, &value)) != EAS_SUCCESS)
50056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
50156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
50256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* read MetaDataTypesTable length and skip over it */
50356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = XMF_ReadVLQ(hwInstData, pXMFData->fileHandle, &value)) != EAS_SUCCESS)
50456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
50556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeekOfs(hwInstData, pXMFData->fileHandle, value)) != EAS_SUCCESS)
50656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
50756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
50856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get TreeStart offset and jump to it */
50956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = XMF_ReadVLQ(hwInstData, pXMFData->fileHandle, &value)) != EAS_SUCCESS)
51056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
51156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = XMF_ReadNode(hwInstData, pXMFData, value, &length)) != EAS_SUCCESS)
51256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
51356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
51456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check for SMF data */
51556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pXMFData->midiOffset == 0)
51656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
51756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "No SMF data found in XMF file\n"); */ }
51856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FILE_FORMAT;
51956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
52056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
52156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check for SFM in wrong order */
52256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((pXMFData->dlsOffset > 0) && (pXMFData->midiOffset < pXMFData->dlsOffset))
52356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "DLS data must precede SMF data in Mobile XMF file\n"); */ }
52456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
52556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
52656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
52756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
52856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
52956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * XMF_ReadNode()
53056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
53156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
53256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
53356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
53456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
53556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
53656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
53756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
53856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
53956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
54056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
54156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
54256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_ReadNode (EAS_HW_DATA_HANDLE hwInstData, S_XMF_DATA *pXMFData, EAS_I32 nodeOffset, EAS_I32 *pLength)
54356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
54456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
54556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 refType;
54656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 numItems;
54756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 offset;
54856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 length;
54956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 headerLength;
55056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 chunkType;
55156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
55256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* seek to start of node */
55356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(hwInstData, pXMFData->fileHandle, nodeOffset)) != EAS_SUCCESS)
55456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
55556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
55656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get node length */
55756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = XMF_ReadVLQ(hwInstData, pXMFData->fileHandle, pLength)) != EAS_SUCCESS)
55856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
55956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
56056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get number of contained items */
56156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = XMF_ReadVLQ(hwInstData, pXMFData->fileHandle, &numItems)) != EAS_SUCCESS)
56256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
56356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
56456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get node header length */
56556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = XMF_ReadVLQ(hwInstData, pXMFData->fileHandle, &headerLength)) != EAS_SUCCESS)
56656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
56756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
56856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get metadata length */
56956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = XMF_ReadVLQ(hwInstData, pXMFData->fileHandle, &length)) != EAS_SUCCESS)
57056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
57156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
57256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the current location */
57356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFilePos(hwInstData, pXMFData->fileHandle, &offset)) != EAS_SUCCESS)
57456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
57556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
57656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* skip to node contents */
57756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(hwInstData, pXMFData->fileHandle, nodeOffset + headerLength)) != EAS_SUCCESS)
57856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
57956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
58056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get reference type */
58156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = XMF_ReadVLQ(hwInstData, pXMFData->fileHandle, &refType)) != EAS_SUCCESS)
58256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
58356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
58456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the current location */
58556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFilePos(hwInstData, pXMFData->fileHandle, &offset)) != EAS_SUCCESS)
58656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
58756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
58856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* process file node */
58956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (numItems == 0)
59056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
59156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
59256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* if in-file resource, find out where it is and jump to it */
59356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (refType == 2)
59456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
59556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = XMF_ReadVLQ(hwInstData, pXMFData->fileHandle, &offset)) != EAS_SUCCESS)
59656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
59756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            offset += pXMFData->fileOffset;
59856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = EAS_HWFileSeek(hwInstData, pXMFData->fileHandle, offset)) != EAS_SUCCESS)
59956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
60056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
60156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
60256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* or else it must be an inline resource */
60356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else if (refType != 1)
60456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
60556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Unexpected reference type %d\n", refType); */ }
60656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_FILE_FORMAT;
60756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
60856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
60956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* get the chunk type */
61056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWGetDWord(hwInstData, pXMFData->fileHandle, &chunkType, EAS_TRUE)) != EAS_SUCCESS)
61156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
61256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
61356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* found a RIFF chunk, check for DLS type */
61456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (chunkType == XMF_RIFF_CHUNK)
61556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
61656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* skip length */
61756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = EAS_HWFileSeekOfs(hwInstData, pXMFData->fileHandle, sizeof(EAS_I32))) != EAS_SUCCESS)
61856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
61956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
62056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* get RIFF file type */
62156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = EAS_HWGetDWord(hwInstData, pXMFData->fileHandle, &chunkType, EAS_TRUE)) != EAS_SUCCESS)
62256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
62356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (chunkType == XMF_RIFF_DLS)
62456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pXMFData->dlsOffset = offset;
62556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
62656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
62756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* found an SMF chunk */
62856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else if (chunkType == XMF_SMF_CHUNK)
62956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pXMFData->midiOffset = offset;
63056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
63156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
63256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* folder node, process the items in the list */
63356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else
63456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
63556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        for ( ; numItems > 0; numItems--)
63656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
63756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* process this item */
63856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = XMF_ReadNode(hwInstData, pXMFData, offset, &length)) != EAS_SUCCESS)
63956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
64056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
64156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* seek to start of next item */
64256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            offset += length;
64356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = EAS_HWFileSeek(hwInstData, pXMFData->fileHandle, offset)) != EAS_SUCCESS)
64456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
64556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
64656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
64756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
64856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
64956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
65056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
65156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#if 0
65256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
65356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * XMF_FindFileContents()
65456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
65556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
65656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Finds SMF data and DLS data in XMF file, and remembers offset for each.
65756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * If more than one is found, uses the first one found of each.
65856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Makes assumptions about the format of a mobile XMF file
65956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
66056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
66156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
66256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pXMFData         - pointer to XMF parser instance data
66356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
66456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
66556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
66656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
66756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
66856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
66956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
67056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
67156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
67256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_FindFileContents(S_EAS_DATA *pEASData, S_XMF_DATA *pXMFData, EAS_FILE_HANDLE fileHandle)
67356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
67456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
67556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 offset;
67656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 value;
67756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 numItems;
67856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 length;
67956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_CHAR id[4];
68056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 location;
68156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
68256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* init dls offset, so that we know we haven't found a dls chunk yet */
68356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pXMFData->dlsOffset = 0;
68456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
68556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* read file length, ignore it for now */
68656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = XMF_ReadVLQ(pEASData, fileHandle, &value)) != EAS_SUCCESS)
68756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
68856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
68956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* read MetaDataTypesTable length and skip over it */
69056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = XMF_ReadVLQ(pEASData, fileHandle, &value)) != EAS_SUCCESS)
69156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
69256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeekOfs(pEASData, fileHandle, value)) != EAS_SUCCESS)
69356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
69456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
69556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get TreeStart offset and jump to it */
69656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = XMF_ReadVLQ(pEASData, fileHandle, &offset)) != EAS_SUCCESS)
69756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
69856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(pEASData->hwInstData, fileHandle, offset)) != EAS_SUCCESS)
69956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
70056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
70156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* read node length, ignore it for now */
70256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = XMF_ReadVLQ(pEASData, fileHandle, &value)) != EAS_SUCCESS)
70356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
70456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
70556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* read number of contained items */
70656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = XMF_ReadVLQ(pEASData, fileHandle, &numItems)) != EAS_SUCCESS)
70756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
70856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
70956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*read node header length */
71056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = XMF_ReadVLQ(pEASData, fileHandle, &value)) != EAS_SUCCESS)
71156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
71256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
71356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*go to the node offset */
71456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(pEASData->hwInstData, fileHandle, offset + value)) != EAS_SUCCESS)
71556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
71656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
71756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* read Reference Type */
71856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = XMF_ReadVLQ(pEASData, fileHandle, &value)) != EAS_SUCCESS)
71956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
72056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
72156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* make sure it is an in-line resource, for now */
72256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (value != 1)
72356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
72456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Problem parsing XMF file tree\n"); */ }
72556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_FAILURE;
72656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
72756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
72856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* parse through the list of items */
72956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    while (numItems > 0)
73056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
73156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /*get current offset */
73256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWFilePos(pEASData->hwInstData, fileHandle, &offset)) != EAS_SUCCESS)
73356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
73456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
73556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /*read node length */
73656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = XMF_ReadVLQ(pEASData, fileHandle, &length)) != EAS_SUCCESS)
73756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
73856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
73956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* read number of items */
74056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = XMF_ReadVLQ(pEASData, fileHandle, &value)) != EAS_SUCCESS)
74156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
74256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
74356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* make sure not a folder */
74456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (value != 0)
74556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
74656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Problem parsing XMF file node\n"); */ }
74756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_FAILURE;
74856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
74956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
75056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* read offset to resource and jump to it */
75156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = XMF_ReadVLQ(pEASData, fileHandle, &value)) != EAS_SUCCESS)
75256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
75356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWFileSeek(pEASData->hwInstData, fileHandle, offset + value)) != EAS_SUCCESS)
75456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
75556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
75656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* read Reference Type */
75756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = XMF_ReadVLQ(pEASData, fileHandle, &value)) != EAS_SUCCESS)
75856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
75956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
76056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* make sure it is an in-line resource */
76156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (value != 1)
76256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
76356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Problem parsing XMF file node\n"); */ }
76456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_FAILURE;
76556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
76656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
76756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* get current offset as a possible location for SMF file or DLS file */
76856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWFilePos(pEASData->hwInstData, fileHandle, &location)) != EAS_SUCCESS)
76956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
77056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
77156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* read four bytes */
77256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWReadFile(pEASData->hwInstData, fileHandle, id, sizeof(id), &value)) != EAS_SUCCESS)
77356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
77456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
77556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* check if DLS */
77656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pXMFData->dlsOffset == 0 && id[0] == 'R' && id[1] == 'I' && id[2] == 'F' && id[3] == 'F')
77756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
77856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            //remember offset
77956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pXMFData->dlsOffset = location;
78056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
78156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
78256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* else check if SMF */
78356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else if (id[0] == 'M' && id[1] == 'T' && id[2] == 'h' && id[3] == 'd')
78456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
78556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            //remember offset
78656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pXMFData->midiOffset = location;
78756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
78856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            //we are done
78956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_SUCCESS;
79056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
79156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
79256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        //one less item
79356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        numItems--;
79456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
79556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        //if more data, go to the next item
79656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (numItems >0)
79756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
79856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = EAS_HWFileSeek(pEASData->hwInstData, fileHandle, offset + length)) != EAS_SUCCESS)
79956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
80056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
80156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
80256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
80356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_FAILURE;
80456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
80556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
80656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
80756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
80856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
80956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * XMF_ReadVLQ()
81056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
81156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
81256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Reads a VLQ encoded value from the file referenced by fileHandle
81356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
81456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
81556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
81656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * fileHandle       - pointer to file handle
81756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
81856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
81956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * value            - pointer to the value decoded from the VLQ data
82056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
82156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
82256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
82356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
82456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
82556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
82656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT XMF_ReadVLQ (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE fileHandle, EAS_I32 *value)
82756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
82856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
82956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U8 c;
83056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
83156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *value = 0;
83256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
83356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetByte(hwInstData, fileHandle, &c)) != EAS_SUCCESS)
83456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
83556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
83656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    while (c > 0x7F)
83756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
83856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /*lint -e{703} shift for performance */
83956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        *value = (*value << 7) | (c & 0x7F);
84056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
84156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWGetByte(hwInstData, fileHandle, &c)) != EAS_SUCCESS)
84256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
84356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
84456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
84556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e{703} shift for performance */
84656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *value = (*value << 7) | c;
84756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
84856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
84956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
85056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
851