156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * File:
456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * eas_ota.c
556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Contents and purpose:
756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * OTA 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: 795 $
2656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *   $Date: 2007-08-01 00:14:45 -0700 (Wed, 01 Aug 2007) $
2756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
2856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
2956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
3056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_data.h"
3156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_miditypes.h"
3256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_parser.h"
3356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_report.h"
3456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_host.h"
3556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_midi.h"
3656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_config.h"
3756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_vm_protos.h"
3856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_otadata.h"
3956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
4056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* increase gain for mono ringtones */
4156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define OTA_GAIN_OFFSET             8
4256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
4356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* file definitions */
4456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define OTA_RINGTONE                0x25
4556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define OTA_SOUND                   0x1d
4656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define OTA_UNICODE                 0x22
4756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
4856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* song type definitions */
4956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define OTA_BASIC_SONG_TYPE         0x01
5056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define OTA_TEMPORARY_SONG_TYPE     0x02
5156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
5256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* instruction ID coding */
5356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define OTA_PATTERN_HEADER_ID       0x00
5456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define OTA_NOTE_INST_ID            0x01
5556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define OTA_SCALE_INST_ID           0x02
5656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define OTA_STYLE_INST_ID           0x03
5756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define OTA_TEMPO_INST_ID           0x04
5856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define OTA_VOLUME_INST_ID          0x05
5956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
6056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* note durations */
6156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define OTA_NORMAL_DURATION         0x00
6256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define OTA_DOTTED_NOTE             0x01
6356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define OTA_DOUBLE_DOTTED_NOTE      0x02
6456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define OTA_TRIPLET_NOTE            0x03
6556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
6656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* loop count value for infinite loop */
6756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define OTA_INFINITE_LOOP           0x0f
6856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
6956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* length of 32nd note in 1/256ths of a msec for 63 BPM tempo */
7056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define DEFAULT_TICK_CONV           30476
7156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
7256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* default channel and program for OTA playback */
7356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define OTA_CHANNEL                 0
7456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define OTA_PROGRAM                 80
7556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define OTA_VEL_MUL                 4
7656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define OTA_VEL_OFS                 67
7756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define OTA_VEL_DEFAULT             95
7856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
7956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* multiplier for fixed point triplet conversion */
8056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define TRIPLET_MULTIPLIER          683
8156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define TRIPLET_SHIFT               10
8256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
8356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* local prototypes */
8456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_CheckFileType (S_EAS_DATA *pEASData, EAS_FILE_HANDLE fileHandle, EAS_VOID_PTR *ppHandle, EAS_I32 offset);
8556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_Prepare (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
8656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_Time (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_U32 *pTime);
8756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_Event (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_INT parserMode);
8856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_State (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_STATE *pState);
8956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_Close (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
9056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_Reset (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
9156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_Pause (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
9256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_Resume (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
9356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_SetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value);
9456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_GetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue);
9556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_ParseHeader (S_EAS_DATA *pEASData, S_OTA_DATA* pData);
9656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_FetchBitField (EAS_HW_DATA_HANDLE hwInstData, S_OTA_DATA *pData, EAS_I32 numBits, EAS_U8 *pValue);
9756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_SavePosition (EAS_HW_DATA_HANDLE hwInstData, S_OTA_DATA *pData, S_OTA_LOC *pLoc);
9856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_RestorePosition (EAS_HW_DATA_HANDLE hwInstData, S_OTA_DATA *pData, S_OTA_LOC *pLoc);
9956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
10056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
10156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
10256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
10356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_OTA_Parser
10456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
10556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * This structure contains the functional interface for the OTA parser
10656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
10756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
10856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksconst S_FILE_PARSER_INTERFACE EAS_OTA_Parser =
10956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
11056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    OTA_CheckFileType,
11156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    OTA_Prepare,
11256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    OTA_Time,
11356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    OTA_Event,
11456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    OTA_State,
11556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    OTA_Close,
11656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    OTA_Reset,
11756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    OTA_Pause,
11856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    OTA_Resume,
11956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    NULL,
12056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    OTA_SetData,
12156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    OTA_GetData,
12256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    NULL
12356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks};
12456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
12556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
12656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
12756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * bpmTable
12856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
12956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * BPM conversion table. Converts bpm values to 256ths of a millisecond for a 32nd note
13056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
13156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
13256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic const EAS_U32 bpmTable[32] =
13356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
13456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    76800, 68571, 61935, 54857,
13556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    48000, 42667, 38400, 34286,
13656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    30476, 27429, 24000, 21333,
13756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    19200, 17143, 15360, 13714,
13856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    12000, 10667, 9600, 8533,
13956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    7680, 6737, 6000, 5408,
14056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    4800, 4267, 3840, 3398,
14156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    3024, 2685, 2400, 2133
14256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks};
14356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
14456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
14556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * OTA_CheckFileType()
14656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
14756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
14856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Check the file type to see if we can parse it
14956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
15056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
15156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
15256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
15356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
15456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
15556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
15656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
15756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
15856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
15956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
16056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
16156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_CheckFileType (S_EAS_DATA *pEASData, EAS_FILE_HANDLE fileHandle, EAS_VOID_PTR *ppHandle, EAS_I32 offset)
16256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
16356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_OTA_DATA* pData;
16456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
16556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT cmdLen;
16656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT state;
16756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U8 temp;
16856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
16956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* read the first byte, should be command length */
17056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *ppHandle = NULL;
17156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetByte(pEASData->hwInstData, fileHandle, &temp)) != EAS_SUCCESS)
17256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
17356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
17456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* read all the commands */
17556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    cmdLen = temp;
17656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    state = 0;
17756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    while (cmdLen--)
17856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
17956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
18056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* read the command, upper 7 bits */
18156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWGetByte(pEASData->hwInstData, fileHandle, &temp)) != EAS_SUCCESS)
18256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
18356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        temp = temp >> 1;
18456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
18556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (state == 0)
18656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
18756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (temp != OTA_RINGTONE)
18856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
18956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            state++;
19056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
19156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else
19256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
19356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
19456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (temp == OTA_SOUND)
19556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
19656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
19756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                /* check for static memory allocation */
19856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (pEASData->staticMemoryModel)
19956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    pData = EAS_CMEnumData(EAS_CM_OTA_DATA);
20056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                else
20156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    pData = EAS_HWMalloc(pEASData->hwInstData, sizeof(S_OTA_DATA));
20256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (!pData)
20356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
20456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Malloc failed in OTA_Prepare\n"); */ }
20556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return EAS_ERROR_MALLOC_FAILED;
20656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
20756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                EAS_HWMemSet(pData, 0, sizeof(S_OTA_DATA));
20856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
20956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                /* return a pointer to the instance data */
21056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pData->fileHandle = fileHandle;
21156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pData->fileOffset = offset;
21256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pData->state = EAS_STATE_OPEN;
21356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                *ppHandle = pData;
21456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
21556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
21656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
21756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (temp != OTA_UNICODE)
21856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
21956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
22056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
22156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
22256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* not recognized */
22356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
22456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
22556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
22656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
22756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * OTA_Prepare()
22856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
22956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
23056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Prepare to parse the file. Allocates instance data (or uses static allocation for
23156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * static memory model).
23256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
23356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
23456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
23556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
23656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
23756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
23856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
23956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
24056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
24156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
24256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
24356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
24456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_Prepare (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
24556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
24656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_OTA_DATA* pData;
24756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
24856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
24956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check for valid state */
25056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData = (S_OTA_DATA*) pInstData;
25156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pData->state != EAS_STATE_OPEN)
25256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
25356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
25456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* instantiate a synthesizer */
25556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = VMInitMIDI(pEASData, &pData->pSynth)) != EAS_SUCCESS)
25656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
25756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "VMInitMIDI returned %d\n", result); */ }
25856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
25956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
26056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
26156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->state = EAS_STATE_ERROR;
26256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = OTA_ParseHeader(pEASData, pData)) != EAS_SUCCESS)
26356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
26456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
26556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->state = EAS_STATE_READY;
26656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
26756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
26856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
26956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
27056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * OTA_Time()
27156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
27256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
27356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns the time of the next event in msecs
27456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
27556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
27656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
27756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
27856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pTime            - pointer to variable to hold time of next event (in msecs)
27956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
28056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
28156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
28256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
28356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
28456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
28556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
28656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
28756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, pEASData) common decoder interface - pEASData not used */
28856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_Time (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_U32 *pTime)
28956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
29056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_OTA_DATA *pData;
29156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
29256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData = (S_OTA_DATA*) pInstData;
29356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
29456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* return time in milliseconds */
29556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e{704} use shift instead of division */
29656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pTime = pData->time >> 8;
29756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
29856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
29956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
30056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
30156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * OTA_Event()
30256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
30356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
30456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Parse the next event in the file
30556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
30656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
30756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
30856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
30956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
31056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
31156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
31256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
31356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
31456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
31556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
31656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
31756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_Event (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_INT parserMode)
31856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
31956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_OTA_DATA* pData;
32056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
32156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 duration;
32256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U8 temp;
32356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
32456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData = (S_OTA_DATA*) pInstData;
32556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pData->state >= EAS_STATE_OPEN)
32656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_SUCCESS;
32756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
32856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* initialize MIDI channel when the track starts playing */
32956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pData->time == 0)
33056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
33156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* set program to square lead */
33256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (parserMode != eParserModeMetaData)
33356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            VMProgramChange(pEASData->pVoiceMgr, pData->pSynth, OTA_CHANNEL, OTA_PROGRAM);
33456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
33556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* set channel volume to max */
33656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (parserMode != eParserModeMetaData)
33756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            VMControlChange(pEASData->pVoiceMgr, pData->pSynth, OTA_CHANNEL, 7, 127);
33856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
33956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
34056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check for end of note */
34156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pData->note)
34256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
34356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* stop the note */
34456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        VMStopNote(pEASData->pVoiceMgr, pData->pSynth, OTA_CHANNEL, pData->note, 0);
34556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pData->note = 0;
34656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
34756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* check for rest between notes */
34856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pData->restTicks)
34956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
35056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pData->time += (EAS_I32) pData->restTicks;
35156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pData->restTicks = 0;
35256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_SUCCESS;
35356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
35456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
35556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
35656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if not in a pattern, read the pattern header */
35756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    while (pData->current.patternLen == 0)
35856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
35956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
36056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* check for loop - don't do infinite loops when locating */
36156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pData->loopCount && ((parserMode == eParserModePlay) || (pData->loopCount != OTA_INFINITE_LOOP)))
36256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
36356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* if not infinite loop, decrement loop count */
36456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (pData->loopCount != OTA_INFINITE_LOOP)
36556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pData->loopCount--;
36656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
36756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* back to start of pattern*/
36856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = OTA_RestorePosition(pEASData->hwInstData, pData, &pData->patterns[pData->currentPattern])) != EAS_SUCCESS)
36956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
37056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
37156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
37256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* if no previous position to restore, continue forward */
37356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else if (pData->restore.fileOffset < 0)
37456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
37556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
37656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* check for end of song */
37756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (pData->numPatterns == 0)
37856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
37956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pData->state = EAS_STATE_STOPPING;
38056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                VMReleaseAllVoices(pEASData->pVoiceMgr, pData->pSynth);
38156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return EAS_SUCCESS;
38256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
38356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
38456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* read the next pattern header */
38556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 3, &temp)) != EAS_SUCCESS)
38656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
38756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (temp != OTA_PATTERN_HEADER_ID)
38856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
38956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Expected OTA pattern header\n"); */ }
39056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return EAS_ERROR_FILE_FORMAT;
39156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
39256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
39356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* get the pattern ID */
39456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 2, &pData->currentPattern)) != EAS_SUCCESS)
39556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
39656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
39756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* get the loop count */
39856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 4, &pData->loopCount)) != EAS_SUCCESS)
39956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
40056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
40156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* get the pattern length */
40256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 8, &pData->current.patternLen)) != EAS_SUCCESS)
40356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
40456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
40556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* if pattern definition, save the current position */
40656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (pData->current.patternLen)
40756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
40856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if ((result = OTA_SavePosition(pEASData->hwInstData, pData, &pData->patterns[pData->currentPattern])) != EAS_SUCCESS)
40956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return result;
41056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
41156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
41256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* if pattern length is zero, repeat a previous pattern */
41356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            else
41456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
41556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                /* make sure it's a valid pattern */
41656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (pData->patterns[pData->currentPattern].fileOffset < 0)
41756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
41856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "OTA pattern error, invalid pattern specified\n"); */ }
41956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return EAS_ERROR_FILE_FORMAT;
42056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
42156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
42256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                /* save current position and data */
42356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if ((result = OTA_SavePosition(pEASData->hwInstData, pData, &pData->restore)) != EAS_SUCCESS)
42456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return result;
42556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
42656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                /* seek to the pattern in the file */
42756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if ((result = OTA_RestorePosition(pEASData->hwInstData, pData, &pData->patterns[pData->currentPattern])) != EAS_SUCCESS)
42856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    return result;
42956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
43056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
43156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* decrement pattern count */
43256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pData->numPatterns--;
43356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
43456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
43556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* restore previous position */
43656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else
43756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
43856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = OTA_RestorePosition(pEASData->hwInstData, pData, &pData->restore)) != EAS_SUCCESS)
43956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
44056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
44156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
44256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
44356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the next event */
44456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 3, &temp)) != EAS_SUCCESS)
44556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
44656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
44756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    switch (temp)
44856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
44956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case OTA_NOTE_INST_ID:
45056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* fetch note value */
45156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 4, &pData->note)) != EAS_SUCCESS)
45256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
45356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
45456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* fetch note duration */
45556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 3, &temp)) != EAS_SUCCESS)
45656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
45756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            duration = pData->tick * (0x20 >> temp);
45856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
45956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* fetch note duration modifier */
46056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 2, &temp)) != EAS_SUCCESS)
46156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
46256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            switch (temp)
46356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
46456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                case OTA_NORMAL_DURATION:
46556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    break;
46656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
46756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                case OTA_DOTTED_NOTE:
46856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    duration += duration >> 1;
46956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    break;
47056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
47156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                case OTA_DOUBLE_DOTTED_NOTE:
47256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    duration += (duration >> 1) + (duration >> 2);
47356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    break;
47456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
47556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                case OTA_TRIPLET_NOTE:
47656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    duration = (duration * TRIPLET_MULTIPLIER) >> TRIPLET_SHIFT;
47756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    break;
47856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
47956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                default:
48056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Unrecognized note duration ignored\n"); */ }
48156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    break;
48256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
48356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
48456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* check for note */
48556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (pData->note)
48656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
48756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
48856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                /* determine note length based on style */
48956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                switch (pData->style)
49056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
49156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    case 0:
49256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        pData->restTicks = duration >> 4;
49356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        break;
49456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    case 1:
49556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        pData->restTicks = 0;
49656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        break;
49756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    case 2:
49856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        pData->restTicks = duration >> 1;
49956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        break;
50056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    default:
50156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Unrecognized note style ignored\n"); */ }
50256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
50356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
50456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                /* add octave */
50556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pData->note += pData->octave;
50656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (parserMode == eParserModePlay)
50756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    VMStartNote(pEASData->pVoiceMgr, pData->pSynth, OTA_CHANNEL, pData->note, pData->velocity);
50856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pData->time += (EAS_I32) duration - (EAS_I32) pData->restTicks;
50956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
51056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
51156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* this is a rest */
51256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            else
51356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pData->time += (EAS_I32) duration;
51456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
51556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
51656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case OTA_SCALE_INST_ID:
51756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* fetch octave */
51856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 2, &temp)) != EAS_SUCCESS)
51956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
52056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pData->octave = (EAS_U8) (temp * 12 + 59);
52156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
52256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
52356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case OTA_STYLE_INST_ID:
52456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* fetch note style */
52556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 2, &pData->style)) != EAS_SUCCESS)
52656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
52756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
52856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
52956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case OTA_TEMPO_INST_ID:
53056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* fetch tempo */
53156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 5, &temp)) != EAS_SUCCESS)
53256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
53356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pData->tick = bpmTable[temp];
53456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
53556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
53656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case OTA_VOLUME_INST_ID:
53756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* fetch volume */
53856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 4, &temp)) != EAS_SUCCESS)
53956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
54056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pData->velocity = temp ? (EAS_U8) (temp * OTA_VEL_MUL + OTA_VEL_OFS) : 0;
54156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
54256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
54356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        default:
54456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Unexpected instruction ID in OTA stream\n"); */ }
54556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_FILE_FORMAT;
54656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
54756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
54856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* decrement pattern length */
54956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->current.patternLen--;
55056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
55156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
55256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
55356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
55456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * OTA_State()
55556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
55656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
55756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns the current state of the stream
55856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
55956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
56056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
56156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
56256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pState           - pointer to variable to store state
56356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
56456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
56556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
56656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
56756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
56856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
56956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
57056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
57156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, pEASData) common decoder interface - pEASData not used */
57256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_State (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 *pState)
57356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
57456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_OTA_DATA* pData;
57556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
57656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* establish pointer to instance data */
57756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData = (S_OTA_DATA*) pInstData;
57856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
57956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if stopping, check to see if synth voices are active */
58056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pData->state == EAS_STATE_STOPPING)
58156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
58256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (VMActiveVoices(pData->pSynth) == 0)
58356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pData->state = EAS_STATE_STOPPED;
58456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
58556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
58656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pData->state == EAS_STATE_PAUSING)
58756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
58856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (VMActiveVoices(pData->pSynth) == 0)
58956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pData->state = EAS_STATE_PAUSED;
59056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
59156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
59256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* return current state */
59356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pState = pData->state;
59456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
59556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
59656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
59756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
59856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * OTA_Close()
59956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
60056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
60156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Close the file and clean up
60256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
60356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
60456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
60556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
60656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
60756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
60856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
60956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
61056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
61156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
61256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
61356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
61456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_Close (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
61556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
61656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_OTA_DATA* pData;
61756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
61856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
61956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData = (S_OTA_DATA*) pInstData;
62056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
62156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* close the file */
62256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWCloseFile(pEASData->hwInstData, pData->fileHandle)) != EAS_SUCCESS)
62356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
62456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
62556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* free the synth */
62656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pData->pSynth != NULL)
62756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        VMMIDIShutdown(pEASData, pData->pSynth);
62856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
62956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* if using dynamic memory, free it */
63056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!pEASData->staticMemoryModel)
63156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_HWFree(pEASData->hwInstData, pData);
63256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
63356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
63456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
63556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
63656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
63756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * OTA_Reset()
63856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
63956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
64056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Reset the sequencer. Used for locating backwards in the file.
64156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
64256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
64356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
64456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
64556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
64656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
64756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
64856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
64956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
65056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
65156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
65256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
65356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_Reset (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
65456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
65556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_OTA_DATA* pData;
65656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
65756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
65856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData = (S_OTA_DATA*) pInstData;
65956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
66056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* reset the synth */
66156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    VMReset(pEASData->pVoiceMgr, pData->pSynth, EAS_TRUE);
66256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->note = 0;
66356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
66456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* reset file position and re-parse header */
66556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->state = EAS_STATE_ERROR;
66656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = OTA_ParseHeader (pEASData,  pData)) != EAS_SUCCESS)
66756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
66856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
66956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->state = EAS_STATE_READY;
67056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
67156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
67256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
67356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
67456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * OTA_Pause()
67556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
67656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
67756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Pauses the sequencer. Mutes all voices and sets state to pause.
67856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
67956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
68056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
68156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
68256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
68356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
68456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
68556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
68656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
68756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
68856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
68956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
69056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_Pause (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
69156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
69256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_OTA_DATA *pData;
69356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
69456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* can't pause a stopped stream */
69556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData = (S_OTA_DATA*) pInstData;
69656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pData->state == EAS_STATE_STOPPED)
69756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_ALREADY_STOPPED;
69856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
69956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* mute the synthesizer */
70056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    VMMuteAllVoices(pEASData->pVoiceMgr, pData->pSynth);
70156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->state = EAS_STATE_PAUSING;
70256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
70356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
70456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
70556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
70656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * OTA_Resume()
70756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
70856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
70956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Resume playing after a pause, sets state back to playing.
71056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
71156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
71256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
71356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
71456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
71556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
71656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
71756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
71856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
71956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
72056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
72156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
72256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, pEASData) common decoder interface - pEASData not used */
72356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_Resume (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
72456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
72556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_OTA_DATA *pData;
72656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
72756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* can't resume a stopped stream */
72856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData = (S_OTA_DATA*) pInstData;
72956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pData->state == EAS_STATE_STOPPED)
73056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_ALREADY_STOPPED;
73156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
73256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* nothing to do but resume playback */
73356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->state = EAS_STATE_PLAY;
73456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
73556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
73656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
73756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
73856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * OTA_SetData()
73956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
74056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
74156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Return file type
74256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
74356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
74456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
74556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
74656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
74756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
74856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
74956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
75056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
75156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
75256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
75356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
75456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, pEASData) common decoder interface - pEASData not used */
75556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_SetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value)
75656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
75756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_OTA_DATA *pData;
75856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
75956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData = (S_OTA_DATA *) pInstData;
76056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    switch (param)
76156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
76256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
76356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* set metadata callback */
76456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_METADATA_CB:
76556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            EAS_HWMemCpy(&pData->metadata, (void*) value, sizeof(S_METADATA_CB));
76656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
76756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
76856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        default:
76956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_INVALID_PARAMETER;
77056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
77156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
77256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
77356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
77456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
77556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
77656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * OTA_GetData()
77756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
77856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
77956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Return file type
78056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
78156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
78256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
78356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
78456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
78556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
78656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
78756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
78856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
78956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
79056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
79156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
79256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, pEASData) common decoder interface - pEASData not used */
79356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_GetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue)
79456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
79556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_OTA_DATA *pData;
79656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
79756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData = (S_OTA_DATA*) pInstData;
79856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    switch (param)
79956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
80056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* return file type as OTA */
80156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_FILE_TYPE:
80256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            *pValue = EAS_FILE_OTA;
80356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
80456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
80556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#if 0
80656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* set transposition */
80756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_TRANSPOSITION:
80856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            *pValue = pData->transposition;
80956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
81056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
81156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
81256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_SYNTH_HANDLE:
81356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            *pValue = (EAS_I32) pData->pSynth;
81456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
81556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
81656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case PARSER_DATA_GAIN_OFFSET:
81756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            *pValue = OTA_GAIN_OFFSET;
81856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
81956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
82056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        default:
82156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_INVALID_PARAMETER;
82256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
82356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
82456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
82556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
82656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
82756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * OTA_ParseHeader()
82856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
82956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
83056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Prepare to parse the file. Allocates instance data (or uses static allocation for
83156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * static memory model).
83256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
83356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
83456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - pointer to overall EAS data structure
83556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle           - pointer to file handle
83656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
83756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
83856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
83956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
84056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
84156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
84256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
84356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
84456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_ParseHeader (S_EAS_DATA *pEASData, S_OTA_DATA* pData)
84556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
84656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
84756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT i;
84856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT state;
84956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U8 temp;
85056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U8 titleLen;
85156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
85256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* initialize some data */
85356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->flags = 0;
85456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->time = 0;
85556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->tick = DEFAULT_TICK_CONV;
85656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->patterns[0].fileOffset = pData->patterns[1].fileOffset =
85756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pData->patterns[2].fileOffset = pData->patterns[3].fileOffset = -1;
85856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->current.bitCount = 0;
85956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->current.patternLen = 0;
86056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->loopCount = 0;
86156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->restore.fileOffset = -1;
86256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->note = 0;
86356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->restTicks = 0;
86456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->velocity = OTA_VEL_DEFAULT;
86556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->style = 0;
86656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->octave = 59;
86756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
86856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* seek to start of data */
86956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWFileSeek(pEASData->hwInstData, pData->fileHandle, pData->fileOffset)) != EAS_SUCCESS)
87056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
87156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
87256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* read the first byte, should be command length */
87356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = EAS_HWGetByte(pEASData->hwInstData, pData->fileHandle, &temp)) != EAS_SUCCESS)
87456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
87556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
87656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* read all the commands */
87756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    i = temp;
87856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    state = 0;
87956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    while (i--)
88056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
88156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
88256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* fetch command, always starts on byte boundary */
88356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pData->current.bitCount = 0;
88456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 7, &temp)) != EAS_SUCCESS)
88556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
88656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
88756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (state == 0)
88856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
88956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (temp != OTA_RINGTONE)
89056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
89156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Expected OTA Ring Tone Programming type\n"); */ }
89256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return EAS_ERROR_FILE_FORMAT;
89356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
89456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            state++;
89556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
89656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else
89756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
89856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
89956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (temp == OTA_SOUND)
90056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
90156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
90256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (temp == OTA_UNICODE)
90356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pData->flags |= OTA_FLAGS_UNICODE;
90456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            else
90556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
90656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Expected OTA Sound or Unicode type\n"); */ }
90756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return EAS_ERROR_FILE_FORMAT;
90856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
90956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
91056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
91156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
91256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get song type */
91356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 3, &temp)) != EAS_SUCCESS)
91456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
91556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
91656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check for basic song type */
91756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (temp == OTA_BASIC_SONG_TYPE)
91856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
91956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* fetch title length */
92056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 4, &titleLen)) != EAS_SUCCESS)
92156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
92256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
92356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* if unicode, double the length */
92456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pData->flags & OTA_FLAGS_UNICODE)
92556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            titleLen = (EAS_U8) (titleLen << 1);
92656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
92756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* zero the metadata buffer */
92856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pData->metadata.buffer)
92956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            EAS_HWMemSet(pData->metadata.buffer, 0, pData->metadata.bufferSize);
93056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
93156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* read the song title */
93256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        for (i = 0; i < titleLen; i++)
93356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
93456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* fetch character */
93556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 8, &temp)) != EAS_SUCCESS)
93656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return result;
93756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
93856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* check for metadata callback */
93956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if (pData->metadata.callback)
94056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
94156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if (i < (pData->metadata.bufferSize - 1))
94256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    pData->metadata.buffer[i] = (char) temp;
94356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
94456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
94556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
94656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* if host has registered callback, call it now */
94756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pData->metadata.callback)
94856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (*pData->metadata.callback)(EAS_METADATA_TITLE, pData->metadata.buffer, pData->metadata.pUserData);
94956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
95056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
95156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* must be temporary song */
95256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else if (temp != OTA_TEMPORARY_SONG_TYPE)
95356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
95456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Expected OTA basic or temporary song type\n"); */ }
95556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FILE_FORMAT;
95656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
95756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
95856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* get the song length */
95956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 8, &pData->numPatterns)) != EAS_SUCCESS)
96056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return result;
96156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
96256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* sanity check */
96356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pData->numPatterns == 0)
96456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
96556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "OTA number of patterns is zero\n"); */ }
96656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_FILE_FORMAT;
96756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
96856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
96956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* at start of first pattern */
97056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
97156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
97256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
97356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
97456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * OTA_FetchBitField()
97556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
97656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
97756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Fetch a specified number of bits from the input stream
97856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
97956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
98056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
98156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
98256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
98356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
98456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
98556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
98656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
98756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
98856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
98956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_FetchBitField (EAS_HW_DATA_HANDLE hwInstData, S_OTA_DATA *pData, EAS_I32 numBits, EAS_U8 *pValue)
99056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
99156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT result;
99256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 bitsLeft;
99356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U8 value;
99456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
99556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    value = 0;
99656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
99756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* do we have enough bits? */
99856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    bitsLeft = pData->current.bitCount - numBits;
99956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
100056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* not enough bits, assemble them from 2 characters */
100156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (bitsLeft < 0)
100256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
100356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* grab the remaining bits from the previous byte */
100456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pData->current.bitCount)
100556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /*lint -e{504,734} this is a legitimate shift operation */
100656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            value = pData->current.dataByte << -bitsLeft;
100756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
100856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* read the next byte */
100956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if ((result = EAS_HWGetByte(hwInstData, pData->fileHandle, &pData->current.dataByte)) != EAS_SUCCESS)
101056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return result;
101156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        bitsLeft += 8;
101256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
101356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
101456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* more bits than needed? */
101556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (bitsLeft > 0)
101656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
101756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        value |= pData->current.dataByte >> bitsLeft;
101856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pData->current.bitCount = (EAS_U8) bitsLeft;
101956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pData->current.dataByte = pData->current.dataByte & (0xff >> (8 - bitsLeft));
102056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
102156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
102256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* exactly the right number of bits */
102356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else
102456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
102556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        value |= pData->current.dataByte;
102656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pData->current.bitCount = 0;
102756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
102856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
102956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pValue = value;
103056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
103156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
103256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
103356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
103456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * OTA_SavePosition()
103556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
103656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
103756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
103856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
103956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
104056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
104156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
104256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
104356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
104456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
104556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
104656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
104756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
104856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
104956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_SavePosition (EAS_HW_DATA_HANDLE hwInstData, S_OTA_DATA *pData, S_OTA_LOC *pLoc)
105056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
105156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_HWMemCpy(pLoc, &pData->current, sizeof(S_OTA_LOC));
105256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_HWFilePos(hwInstData, pData->fileHandle, &pLoc->fileOffset);
105356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
105456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
105556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
105656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * OTA_RestorePosition()
105756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
105856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
105956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
106056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
106156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
106256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
106356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
106456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
106556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
106656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
106756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
106856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
106956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
107056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
107156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT OTA_RestorePosition (EAS_HW_DATA_HANDLE hwInstData, S_OTA_DATA *pData, S_OTA_LOC *pLoc)
107256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
107356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_HWMemCpy(&pData->current, pLoc, sizeof(S_OTA_LOC));
107456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pData->restore.fileOffset = -1;
107556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_HWFileSeek(hwInstData, pData->fileHandle, pLoc->fileOffset);
107656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
107756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
1078