summaryrefslogtreecommitdiffstats
path: root/arm-fm-22k/lib_src/eas_ota.c
diff options
context:
space:
mode:
Diffstat (limited to 'arm-fm-22k/lib_src/eas_ota.c')
-rw-r--r--arm-fm-22k/lib_src/eas_ota.c1077
1 files changed, 0 insertions, 1077 deletions
diff --git a/arm-fm-22k/lib_src/eas_ota.c b/arm-fm-22k/lib_src/eas_ota.c
deleted file mode 100644
index fb81d62..0000000
--- a/arm-fm-22k/lib_src/eas_ota.c
+++ /dev/null
@@ -1,1077 +0,0 @@
-/*----------------------------------------------------------------------------
- *
- * File:
- * eas_ota.c
- *
- * Contents and purpose:
- * OTA parser
- *
- * Copyright Sonic Network Inc. 2005
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- *----------------------------------------------------------------------------
- * Revision Control:
- * $Revision: 795 $
- * $Date: 2007-08-01 00:14:45 -0700 (Wed, 01 Aug 2007) $
- *----------------------------------------------------------------------------
-*/
-
-#include "eas_data.h"
-#include "eas_miditypes.h"
-#include "eas_parser.h"
-#include "eas_report.h"
-#include "eas_host.h"
-#include "eas_midi.h"
-#include "eas_config.h"
-#include "eas_vm_protos.h"
-#include "eas_otadata.h"
-
-/* increase gain for mono ringtones */
-#define OTA_GAIN_OFFSET 8
-
-/* file definitions */
-#define OTA_RINGTONE 0x25
-#define OTA_SOUND 0x1d
-#define OTA_UNICODE 0x22
-
-/* song type definitions */
-#define OTA_BASIC_SONG_TYPE 0x01
-#define OTA_TEMPORARY_SONG_TYPE 0x02
-
-/* instruction ID coding */
-#define OTA_PATTERN_HEADER_ID 0x00
-#define OTA_NOTE_INST_ID 0x01
-#define OTA_SCALE_INST_ID 0x02
-#define OTA_STYLE_INST_ID 0x03
-#define OTA_TEMPO_INST_ID 0x04
-#define OTA_VOLUME_INST_ID 0x05
-
-/* note durations */
-#define OTA_NORMAL_DURATION 0x00
-#define OTA_DOTTED_NOTE 0x01
-#define OTA_DOUBLE_DOTTED_NOTE 0x02
-#define OTA_TRIPLET_NOTE 0x03
-
-/* loop count value for infinite loop */
-#define OTA_INFINITE_LOOP 0x0f
-
-/* length of 32nd note in 1/256ths of a msec for 63 BPM tempo */
-#define DEFAULT_TICK_CONV 30476
-
-/* default channel and program for OTA playback */
-#define OTA_CHANNEL 0
-#define OTA_PROGRAM 80
-#define OTA_VEL_MUL 4
-#define OTA_VEL_OFS 67
-#define OTA_VEL_DEFAULT 95
-
-/* multiplier for fixed point triplet conversion */
-#define TRIPLET_MULTIPLIER 683
-#define TRIPLET_SHIFT 10
-
-/* local prototypes */
-static EAS_RESULT OTA_CheckFileType (S_EAS_DATA *pEASData, EAS_FILE_HANDLE fileHandle, EAS_VOID_PTR *ppHandle, EAS_I32 offset);
-static EAS_RESULT OTA_Prepare (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
-static EAS_RESULT OTA_Time (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_U32 *pTime);
-static EAS_RESULT OTA_Event (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_INT parserMode);
-static EAS_RESULT OTA_State (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_STATE *pState);
-static EAS_RESULT OTA_Close (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
-static EAS_RESULT OTA_Reset (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
-static EAS_RESULT OTA_Pause (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
-static EAS_RESULT OTA_Resume (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
-static EAS_RESULT OTA_SetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value);
-static EAS_RESULT OTA_GetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue);
-static EAS_RESULT OTA_ParseHeader (S_EAS_DATA *pEASData, S_OTA_DATA* pData);
-static EAS_RESULT OTA_FetchBitField (EAS_HW_DATA_HANDLE hwInstData, S_OTA_DATA *pData, EAS_I32 numBits, EAS_U8 *pValue);
-static EAS_RESULT OTA_SavePosition (EAS_HW_DATA_HANDLE hwInstData, S_OTA_DATA *pData, S_OTA_LOC *pLoc);
-static EAS_RESULT OTA_RestorePosition (EAS_HW_DATA_HANDLE hwInstData, S_OTA_DATA *pData, S_OTA_LOC *pLoc);
-
-
-/*----------------------------------------------------------------------------
- *
- * EAS_OTA_Parser
- *
- * This structure contains the functional interface for the OTA parser
- *----------------------------------------------------------------------------
-*/
-const S_FILE_PARSER_INTERFACE EAS_OTA_Parser =
-{
- OTA_CheckFileType,
- OTA_Prepare,
- OTA_Time,
- OTA_Event,
- OTA_State,
- OTA_Close,
- OTA_Reset,
- OTA_Pause,
- OTA_Resume,
- NULL,
- OTA_SetData,
- OTA_GetData,
- NULL
-};
-
-/*----------------------------------------------------------------------------
- *
- * bpmTable
- *
- * BPM conversion table. Converts bpm values to 256ths of a millisecond for a 32nd note
- *----------------------------------------------------------------------------
-*/
-static const EAS_U32 bpmTable[32] =
-{
- 76800, 68571, 61935, 54857,
- 48000, 42667, 38400, 34286,
- 30476, 27429, 24000, 21333,
- 19200, 17143, 15360, 13714,
- 12000, 10667, 9600, 8533,
- 7680, 6737, 6000, 5408,
- 4800, 4267, 3840, 3398,
- 3024, 2685, 2400, 2133
-};
-
-/*----------------------------------------------------------------------------
- * OTA_CheckFileType()
- *----------------------------------------------------------------------------
- * Purpose:
- * Check the file type to see if we can parse it
- *
- * Inputs:
- * pEASData - pointer to overall EAS data structure
- * handle - pointer to file handle
- *
- * Outputs:
- *
- *
- * Side Effects:
- *
- *----------------------------------------------------------------------------
-*/
-static EAS_RESULT OTA_CheckFileType (S_EAS_DATA *pEASData, EAS_FILE_HANDLE fileHandle, EAS_VOID_PTR *ppHandle, EAS_I32 offset)
-{
- S_OTA_DATA* pData;
- EAS_RESULT result;
- EAS_INT cmdLen;
- EAS_INT state;
- EAS_U8 temp;
-
- /* read the first byte, should be command length */
- *ppHandle = NULL;
- if ((result = EAS_HWGetByte(pEASData->hwInstData, fileHandle, &temp)) != EAS_SUCCESS)
- return result;
-
- /* read all the commands */
- cmdLen = temp;
- state = 0;
- while (cmdLen--)
- {
-
- /* read the command, upper 7 bits */
- if ((result = EAS_HWGetByte(pEASData->hwInstData, fileHandle, &temp)) != EAS_SUCCESS)
- return result;
- temp = temp >> 1;
-
- if (state == 0)
- {
- if (temp != OTA_RINGTONE)
- break;
- state++;
- }
- else
- {
-
- if (temp == OTA_SOUND)
- {
-
- /* check for static memory allocation */
- if (pEASData->staticMemoryModel)
- pData = EAS_CMEnumData(EAS_CM_OTA_DATA);
- else
- pData = EAS_HWMalloc(pEASData->hwInstData, sizeof(S_OTA_DATA));
- if (!pData)
- {
- { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Malloc failed in OTA_Prepare\n"); */ }
- return EAS_ERROR_MALLOC_FAILED;
- }
- EAS_HWMemSet(pData, 0, sizeof(S_OTA_DATA));
-
- /* return a pointer to the instance data */
- pData->fileHandle = fileHandle;
- pData->fileOffset = offset;
- pData->state = EAS_STATE_OPEN;
- *ppHandle = pData;
- break;
- }
-
- if (temp != OTA_UNICODE)
- break;
- }
- }
-
- /* not recognized */
- return EAS_SUCCESS;
-}
-
-/*----------------------------------------------------------------------------
- * OTA_Prepare()
- *----------------------------------------------------------------------------
- * Purpose:
- * Prepare to parse the file. Allocates instance data (or uses static allocation for
- * static memory model).
- *
- * Inputs:
- * pEASData - pointer to overall EAS data structure
- * handle - pointer to file handle
- *
- * Outputs:
- *
- *
- * Side Effects:
- *
- *----------------------------------------------------------------------------
-*/
-static EAS_RESULT OTA_Prepare (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
-{
- S_OTA_DATA* pData;
- EAS_RESULT result;
-
- /* check for valid state */
- pData = (S_OTA_DATA*) pInstData;
- if (pData->state != EAS_STATE_OPEN)
- return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
-
- /* instantiate a synthesizer */
- if ((result = VMInitMIDI(pEASData, &pData->pSynth)) != EAS_SUCCESS)
- {
- { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "VMInitMIDI returned %d\n", result); */ }
- return result;
- }
-
- pData->state = EAS_STATE_ERROR;
- if ((result = OTA_ParseHeader(pEASData, pData)) != EAS_SUCCESS)
- return result;
-
- pData->state = EAS_STATE_READY;
- return EAS_SUCCESS;
-}
-
-/*----------------------------------------------------------------------------
- * OTA_Time()
- *----------------------------------------------------------------------------
- * Purpose:
- * Returns the time of the next event in msecs
- *
- * Inputs:
- * pEASData - pointer to overall EAS data structure
- * handle - pointer to file handle
- * pTime - pointer to variable to hold time of next event (in msecs)
- *
- * Outputs:
- *
- *
- * Side Effects:
- *
- *----------------------------------------------------------------------------
-*/
-/*lint -esym(715, pEASData) common decoder interface - pEASData not used */
-static EAS_RESULT OTA_Time (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_U32 *pTime)
-{
- S_OTA_DATA *pData;
-
- pData = (S_OTA_DATA*) pInstData;
-
- /* return time in milliseconds */
- /*lint -e{704} use shift instead of division */
- *pTime = pData->time >> 8;
- return EAS_SUCCESS;
-}
-
-/*----------------------------------------------------------------------------
- * OTA_Event()
- *----------------------------------------------------------------------------
- * Purpose:
- * Parse the next event in the file
- *
- * Inputs:
- * pEASData - pointer to overall EAS data structure
- * handle - pointer to file handle
- *
- * Outputs:
- *
- *
- * Side Effects:
- *
- *----------------------------------------------------------------------------
-*/
-static EAS_RESULT OTA_Event (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_INT parserMode)
-{
- S_OTA_DATA* pData;
- EAS_RESULT result;
- EAS_U32 duration;
- EAS_U8 temp;
-
- pData = (S_OTA_DATA*) pInstData;
- if (pData->state >= EAS_STATE_OPEN)
- return EAS_SUCCESS;
-
- /* initialize MIDI channel when the track starts playing */
- if (pData->time == 0)
- {
- /* set program to square lead */
- if (parserMode != eParserModeMetaData)
- VMProgramChange(pEASData->pVoiceMgr, pData->pSynth, OTA_CHANNEL, OTA_PROGRAM);
-
- /* set channel volume to max */
- if (parserMode != eParserModeMetaData)
- VMControlChange(pEASData->pVoiceMgr, pData->pSynth, OTA_CHANNEL, 7, 127);
- }
-
- /* check for end of note */
- if (pData->note)
- {
- /* stop the note */
- VMStopNote(pEASData->pVoiceMgr, pData->pSynth, OTA_CHANNEL, pData->note, 0);
- pData->note = 0;
-
- /* check for rest between notes */
- if (pData->restTicks)
- {
- pData->time += (EAS_I32) pData->restTicks;
- pData->restTicks = 0;
- return EAS_SUCCESS;
- }
- }
-
- /* if not in a pattern, read the pattern header */
- while (pData->current.patternLen == 0)
- {
-
- /* check for loop - don't do infinite loops when locating */
- if (pData->loopCount && ((parserMode == eParserModePlay) || (pData->loopCount != OTA_INFINITE_LOOP)))
- {
- /* if not infinite loop, decrement loop count */
- if (pData->loopCount != OTA_INFINITE_LOOP)
- pData->loopCount--;
-
- /* back to start of pattern*/
- if ((result = OTA_RestorePosition(pEASData->hwInstData, pData, &pData->patterns[pData->currentPattern])) != EAS_SUCCESS)
- return result;
- }
-
- /* if no previous position to restore, continue forward */
- else if (pData->restore.fileOffset < 0)
- {
-
- /* check for end of song */
- if (pData->numPatterns == 0)
- {
- pData->state = EAS_STATE_STOPPING;
- VMReleaseAllVoices(pEASData->pVoiceMgr, pData->pSynth);
- return EAS_SUCCESS;
- }
-
- /* read the next pattern header */
- if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 3, &temp)) != EAS_SUCCESS)
- return result;
- if (temp != OTA_PATTERN_HEADER_ID)
- {
- { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Expected OTA pattern header\n"); */ }
- return EAS_ERROR_FILE_FORMAT;
- }
-
- /* get the pattern ID */
- if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 2, &pData->currentPattern)) != EAS_SUCCESS)
- return result;
-
- /* get the loop count */
- if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 4, &pData->loopCount)) != EAS_SUCCESS)
- return result;
-
- /* get the pattern length */
- if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 8, &pData->current.patternLen)) != EAS_SUCCESS)
- return result;
-
- /* if pattern definition, save the current position */
- if (pData->current.patternLen)
- {
- if ((result = OTA_SavePosition(pEASData->hwInstData, pData, &pData->patterns[pData->currentPattern])) != EAS_SUCCESS)
- return result;
- }
-
- /* if pattern length is zero, repeat a previous pattern */
- else
- {
- /* make sure it's a valid pattern */
- if (pData->patterns[pData->currentPattern].fileOffset < 0)
- {
- { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "OTA pattern error, invalid pattern specified\n"); */ }
- return EAS_ERROR_FILE_FORMAT;
- }
-
- /* save current position and data */
- if ((result = OTA_SavePosition(pEASData->hwInstData, pData, &pData->restore)) != EAS_SUCCESS)
- return result;
-
- /* seek to the pattern in the file */
- if ((result = OTA_RestorePosition(pEASData->hwInstData, pData, &pData->patterns[pData->currentPattern])) != EAS_SUCCESS)
- return result;
- }
-
- /* decrement pattern count */
- pData->numPatterns--;
- }
-
- /* restore previous position */
- else
- {
- if ((result = OTA_RestorePosition(pEASData->hwInstData, pData, &pData->restore)) != EAS_SUCCESS)
- return result;
- }
- }
-
- /* get the next event */
- if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 3, &temp)) != EAS_SUCCESS)
- return result;
-
- switch (temp)
- {
- case OTA_NOTE_INST_ID:
- /* fetch note value */
- if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 4, &pData->note)) != EAS_SUCCESS)
- return result;
-
- /* fetch note duration */
- if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 3, &temp)) != EAS_SUCCESS)
- return result;
- duration = pData->tick * (0x20 >> temp);
-
- /* fetch note duration modifier */
- if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 2, &temp)) != EAS_SUCCESS)
- return result;
- switch (temp)
- {
- case OTA_NORMAL_DURATION:
- break;
-
- case OTA_DOTTED_NOTE:
- duration += duration >> 1;
- break;
-
- case OTA_DOUBLE_DOTTED_NOTE:
- duration += (duration >> 1) + (duration >> 2);
- break;
-
- case OTA_TRIPLET_NOTE:
- duration = (duration * TRIPLET_MULTIPLIER) >> TRIPLET_SHIFT;
- break;
-
- default:
- { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Unrecognized note duration ignored\n"); */ }
- break;
- }
-
- /* check for note */
- if (pData->note)
- {
-
- /* determine note length based on style */
- switch (pData->style)
- {
- case 0:
- pData->restTicks = duration >> 4;
- break;
- case 1:
- pData->restTicks = 0;
- break;
- case 2:
- pData->restTicks = duration >> 1;
- break;
- default:
- { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Unrecognized note style ignored\n"); */ }
- }
-
- /* add octave */
- pData->note += pData->octave;
- if (parserMode == eParserModePlay)
- VMStartNote(pEASData->pVoiceMgr, pData->pSynth, OTA_CHANNEL, pData->note, pData->velocity);
- pData->time += (EAS_I32) duration - (EAS_I32) pData->restTicks;
- }
-
- /* this is a rest */
- else
- pData->time += (EAS_I32) duration;
- break;
-
- case OTA_SCALE_INST_ID:
- /* fetch octave */
- if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 2, &temp)) != EAS_SUCCESS)
- return result;
- pData->octave = (EAS_U8) (temp * 12 + 59);
- break;
-
- case OTA_STYLE_INST_ID:
- /* fetch note style */
- if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 2, &pData->style)) != EAS_SUCCESS)
- return result;
- break;
-
- case OTA_TEMPO_INST_ID:
- /* fetch tempo */
- if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 5, &temp)) != EAS_SUCCESS)
- return result;
- pData->tick = bpmTable[temp];
- break;
-
- case OTA_VOLUME_INST_ID:
- /* fetch volume */
- if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 4, &temp)) != EAS_SUCCESS)
- return result;
- pData->velocity = temp ? (EAS_U8) (temp * OTA_VEL_MUL + OTA_VEL_OFS) : 0;
- break;
-
- default:
- { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Unexpected instruction ID in OTA stream\n"); */ }
- return EAS_ERROR_FILE_FORMAT;
- }
-
- /* decrement pattern length */
- pData->current.patternLen--;
- return EAS_SUCCESS;
-}
-
-/*----------------------------------------------------------------------------
- * OTA_State()
- *----------------------------------------------------------------------------
- * Purpose:
- * Returns the current state of the stream
- *
- * Inputs:
- * pEASData - pointer to overall EAS data structure
- * handle - pointer to file handle
- * pState - pointer to variable to store state
- *
- * Outputs:
- *
- *
- * Side Effects:
- *
- *----------------------------------------------------------------------------
-*/
-/*lint -esym(715, pEASData) common decoder interface - pEASData not used */
-static EAS_RESULT OTA_State (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 *pState)
-{
- S_OTA_DATA* pData;
-
- /* establish pointer to instance data */
- pData = (S_OTA_DATA*) pInstData;
-
- /* if stopping, check to see if synth voices are active */
- if (pData->state == EAS_STATE_STOPPING)
- {
- if (VMActiveVoices(pData->pSynth) == 0)
- pData->state = EAS_STATE_STOPPED;
- }
-
- if (pData->state == EAS_STATE_PAUSING)
- {
- if (VMActiveVoices(pData->pSynth) == 0)
- pData->state = EAS_STATE_PAUSED;
- }
-
- /* return current state */
- *pState = pData->state;
- return EAS_SUCCESS;
-}
-
-/*----------------------------------------------------------------------------
- * OTA_Close()
- *----------------------------------------------------------------------------
- * Purpose:
- * Close the file and clean up
- *
- * Inputs:
- * pEASData - pointer to overall EAS data structure
- * handle - pointer to file handle
- *
- * Outputs:
- *
- *
- * Side Effects:
- *
- *----------------------------------------------------------------------------
-*/
-static EAS_RESULT OTA_Close (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
-{
- S_OTA_DATA* pData;
- EAS_RESULT result;
-
- pData = (S_OTA_DATA*) pInstData;
-
- /* close the file */
- if ((result = EAS_HWCloseFile(pEASData->hwInstData, pData->fileHandle)) != EAS_SUCCESS)
- return result;
-
- /* free the synth */
- if (pData->pSynth != NULL)
- VMMIDIShutdown(pEASData, pData->pSynth);
-
- /* if using dynamic memory, free it */
- if (!pEASData->staticMemoryModel)
- EAS_HWFree(pEASData->hwInstData, pData);
-
- return EAS_SUCCESS;
-}
-
-/*----------------------------------------------------------------------------
- * OTA_Reset()
- *----------------------------------------------------------------------------
- * Purpose:
- * Reset the sequencer. Used for locating backwards in the file.
- *
- * Inputs:
- * pEASData - pointer to overall EAS data structure
- * handle - pointer to file handle
- *
- * Outputs:
- *
- *
- * Side Effects:
- *
- *----------------------------------------------------------------------------
-*/
-static EAS_RESULT OTA_Reset (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
-{
- S_OTA_DATA* pData;
- EAS_RESULT result;
-
- pData = (S_OTA_DATA*) pInstData;
-
- /* reset the synth */
- VMReset(pEASData->pVoiceMgr, pData->pSynth, EAS_TRUE);
- pData->note = 0;
-
- /* reset file position and re-parse header */
- pData->state = EAS_STATE_ERROR;
- if ((result = OTA_ParseHeader (pEASData, pData)) != EAS_SUCCESS)
- return result;
-
- pData->state = EAS_STATE_READY;
- return EAS_SUCCESS;
-}
-
-/*----------------------------------------------------------------------------
- * OTA_Pause()
- *----------------------------------------------------------------------------
- * Purpose:
- * Pauses the sequencer. Mutes all voices and sets state to pause.
- *
- * Inputs:
- * pEASData - pointer to overall EAS data structure
- * handle - pointer to file handle
- *
- * Outputs:
- *
- *
- * Side Effects:
- *
- *----------------------------------------------------------------------------
-*/
-static EAS_RESULT OTA_Pause (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
-{
- S_OTA_DATA *pData;
-
- /* can't pause a stopped stream */
- pData = (S_OTA_DATA*) pInstData;
- if (pData->state == EAS_STATE_STOPPED)
- return EAS_ERROR_ALREADY_STOPPED;
-
- /* mute the synthesizer */
- VMMuteAllVoices(pEASData->pVoiceMgr, pData->pSynth);
- pData->state = EAS_STATE_PAUSING;
- return EAS_SUCCESS;
-}
-
-/*----------------------------------------------------------------------------
- * OTA_Resume()
- *----------------------------------------------------------------------------
- * Purpose:
- * Resume playing after a pause, sets state back to playing.
- *
- * Inputs:
- * pEASData - pointer to overall EAS data structure
- * handle - pointer to file handle
- *
- * Outputs:
- *
- *
- * Side Effects:
- *
- *----------------------------------------------------------------------------
-*/
-/*lint -esym(715, pEASData) common decoder interface - pEASData not used */
-static EAS_RESULT OTA_Resume (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
-{
- S_OTA_DATA *pData;
-
- /* can't resume a stopped stream */
- pData = (S_OTA_DATA*) pInstData;
- if (pData->state == EAS_STATE_STOPPED)
- return EAS_ERROR_ALREADY_STOPPED;
-
- /* nothing to do but resume playback */
- pData->state = EAS_STATE_PLAY;
- return EAS_SUCCESS;
-}
-
-/*----------------------------------------------------------------------------
- * OTA_SetData()
- *----------------------------------------------------------------------------
- * Purpose:
- * Return file type
- *
- * Inputs:
- * pEASData - pointer to overall EAS data structure
- * handle - pointer to file handle
- *
- * Outputs:
- *
- *
- * Side Effects:
- *
- *----------------------------------------------------------------------------
-*/
-/*lint -esym(715, pEASData) common decoder interface - pEASData not used */
-static EAS_RESULT OTA_SetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value)
-{
- S_OTA_DATA *pData;
-
- pData = (S_OTA_DATA *) pInstData;
- switch (param)
- {
-
- /* set metadata callback */
- case PARSER_DATA_METADATA_CB:
- EAS_HWMemCpy(&pData->metadata, (void*) value, sizeof(S_METADATA_CB));
- break;
-
- default:
- return EAS_ERROR_INVALID_PARAMETER;
- }
-
- return EAS_SUCCESS;
-}
-
-/*----------------------------------------------------------------------------
- * OTA_GetData()
- *----------------------------------------------------------------------------
- * Purpose:
- * Return file type
- *
- * Inputs:
- * pEASData - pointer to overall EAS data structure
- * handle - pointer to file handle
- *
- * Outputs:
- *
- *
- * Side Effects:
- *
- *----------------------------------------------------------------------------
-*/
-/*lint -esym(715, pEASData) common decoder interface - pEASData not used */
-static EAS_RESULT OTA_GetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue)
-{
- S_OTA_DATA *pData;
-
- pData = (S_OTA_DATA*) pInstData;
- switch (param)
- {
- /* return file type as OTA */
- case PARSER_DATA_FILE_TYPE:
- *pValue = EAS_FILE_OTA;
- break;
-
-#if 0
- /* set transposition */
- case PARSER_DATA_TRANSPOSITION:
- *pValue = pData->transposition;
- break;
-#endif
-
- case PARSER_DATA_SYNTH_HANDLE:
- *pValue = (EAS_I32) pData->pSynth;
- break;
-
- case PARSER_DATA_GAIN_OFFSET:
- *pValue = OTA_GAIN_OFFSET;
- break;
-
- default:
- return EAS_ERROR_INVALID_PARAMETER;
- }
- return EAS_SUCCESS;
-}
-
-/*----------------------------------------------------------------------------
- * OTA_ParseHeader()
- *----------------------------------------------------------------------------
- * Purpose:
- * Prepare to parse the file. Allocates instance data (or uses static allocation for
- * static memory model).
- *
- * Inputs:
- * pEASData - pointer to overall EAS data structure
- * handle - pointer to file handle
- *
- * Outputs:
- *
- *
- * Side Effects:
- *
- *----------------------------------------------------------------------------
-*/
-static EAS_RESULT OTA_ParseHeader (S_EAS_DATA *pEASData, S_OTA_DATA* pData)
-{
- EAS_RESULT result;
- EAS_INT i;
- EAS_INT state;
- EAS_U8 temp;
- EAS_U8 titleLen;
-
- /* initialize some data */
- pData->flags = 0;
- pData->time = 0;
- pData->tick = DEFAULT_TICK_CONV;
- pData->patterns[0].fileOffset = pData->patterns[1].fileOffset =
- pData->patterns[2].fileOffset = pData->patterns[3].fileOffset = -1;
- pData->current.bitCount = 0;
- pData->current.patternLen = 0;
- pData->loopCount = 0;
- pData->restore.fileOffset = -1;
- pData->note = 0;
- pData->restTicks = 0;
- pData->velocity = OTA_VEL_DEFAULT;
- pData->style = 0;
- pData->octave = 59;
-
- /* seek to start of data */
- if ((result = EAS_HWFileSeek(pEASData->hwInstData, pData->fileHandle, pData->fileOffset)) != EAS_SUCCESS)
- return result;
-
- /* read the first byte, should be command length */
- if ((result = EAS_HWGetByte(pEASData->hwInstData, pData->fileHandle, &temp)) != EAS_SUCCESS)
- return result;
-
- /* read all the commands */
- i = temp;
- state = 0;
- while (i--)
- {
-
- /* fetch command, always starts on byte boundary */
- pData->current.bitCount = 0;
- if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 7, &temp)) != EAS_SUCCESS)
- return result;
-
- if (state == 0)
- {
- if (temp != OTA_RINGTONE)
- {
- { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Expected OTA Ring Tone Programming type\n"); */ }
- return EAS_ERROR_FILE_FORMAT;
- }
- state++;
- }
- else
- {
-
- if (temp == OTA_SOUND)
- break;
-
- if (temp == OTA_UNICODE)
- pData->flags |= OTA_FLAGS_UNICODE;
- else
- {
- { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Expected OTA Sound or Unicode type\n"); */ }
- return EAS_ERROR_FILE_FORMAT;
- }
- }
- }
-
- /* get song type */
- if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 3, &temp)) != EAS_SUCCESS)
- return result;
-
- /* check for basic song type */
- if (temp == OTA_BASIC_SONG_TYPE)
- {
- /* fetch title length */
- if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 4, &titleLen)) != EAS_SUCCESS)
- return result;
-
- /* if unicode, double the length */
- if (pData->flags & OTA_FLAGS_UNICODE)
- titleLen = (EAS_U8) (titleLen << 1);
-
- /* zero the metadata buffer */
- if (pData->metadata.buffer)
- EAS_HWMemSet(pData->metadata.buffer, 0, pData->metadata.bufferSize);
-
- /* read the song title */
- for (i = 0; i < titleLen; i++)
- {
- /* fetch character */
- if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 8, &temp)) != EAS_SUCCESS)
- return result;
-
- /* check for metadata callback */
- if (pData->metadata.callback)
- {
- if (i < (pData->metadata.bufferSize - 1))
- pData->metadata.buffer[i] = (char) temp;
- }
- }
-
- /* if host has registered callback, call it now */
- if (pData->metadata.callback)
- (*pData->metadata.callback)(EAS_METADATA_TITLE, pData->metadata.buffer, pData->metadata.pUserData);
- }
-
- /* must be temporary song */
- else if (temp != OTA_TEMPORARY_SONG_TYPE)
- {
- { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Expected OTA basic or temporary song type\n"); */ }
- return EAS_ERROR_FILE_FORMAT;
- }
-
- /* get the song length */
- if ((result = OTA_FetchBitField(pEASData->hwInstData, pData, 8, &pData->numPatterns)) != EAS_SUCCESS)
- return result;
-
- /* sanity check */
- if (pData->numPatterns == 0)
- {
- { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "OTA number of patterns is zero\n"); */ }
- return EAS_ERROR_FILE_FORMAT;
- }
-
- /* at start of first pattern */
- return EAS_SUCCESS;
-}
-
-/*----------------------------------------------------------------------------
- * OTA_FetchBitField()
- *----------------------------------------------------------------------------
- * Purpose:
- * Fetch a specified number of bits from the input stream
- *
- * Inputs:
- *
- *
- * Outputs:
- *
- *
- * Side Effects:
- *
- *----------------------------------------------------------------------------
-*/
-static EAS_RESULT OTA_FetchBitField (EAS_HW_DATA_HANDLE hwInstData, S_OTA_DATA *pData, EAS_I32 numBits, EAS_U8 *pValue)
-{
- EAS_RESULT result;
- EAS_I32 bitsLeft;
- EAS_U8 value;
-
- value = 0;
-
- /* do we have enough bits? */
- bitsLeft = pData->current.bitCount - numBits;
-
- /* not enough bits, assemble them from 2 characters */
- if (bitsLeft < 0)
- {
- /* grab the remaining bits from the previous byte */
- if (pData->current.bitCount)
- /*lint -e{504,734} this is a legitimate shift operation */
- value = pData->current.dataByte << -bitsLeft;
-
- /* read the next byte */
- if ((result = EAS_HWGetByte(hwInstData, pData->fileHandle, &pData->current.dataByte)) != EAS_SUCCESS)
- return result;
- bitsLeft += 8;
- }
-
- /* more bits than needed? */
- if (bitsLeft > 0)
- {
- value |= pData->current.dataByte >> bitsLeft;
- pData->current.bitCount = (EAS_U8) bitsLeft;
- pData->current.dataByte = pData->current.dataByte & (0xff >> (8 - bitsLeft));
- }
-
- /* exactly the right number of bits */
- else
- {
- value |= pData->current.dataByte;
- pData->current.bitCount = 0;
- }
-
- *pValue = value;
- return EAS_SUCCESS;
-}
-
-/*----------------------------------------------------------------------------
- * OTA_SavePosition()
- *----------------------------------------------------------------------------
- * Purpose:
- *
- *
- * Inputs:
- *
- *
- * Outputs:
- *
- *
- * Side Effects:
- *
- *----------------------------------------------------------------------------
-*/
-static EAS_RESULT OTA_SavePosition (EAS_HW_DATA_HANDLE hwInstData, S_OTA_DATA *pData, S_OTA_LOC *pLoc)
-{
- EAS_HWMemCpy(pLoc, &pData->current, sizeof(S_OTA_LOC));
- return EAS_HWFilePos(hwInstData, pData->fileHandle, &pLoc->fileOffset);
-}
-
-/*----------------------------------------------------------------------------
- * OTA_RestorePosition()
- *----------------------------------------------------------------------------
- * Purpose:
- *
- *
- * Inputs:
- *
- *
- * Outputs:
- *
- *
- * Side Effects:
- *
- *----------------------------------------------------------------------------
-*/
-static EAS_RESULT OTA_RestorePosition (EAS_HW_DATA_HANDLE hwInstData, S_OTA_DATA *pData, S_OTA_LOC *pLoc)
-{
- EAS_HWMemCpy(&pData->current, pLoc, sizeof(S_OTA_LOC));
- pData->restore.fileOffset = -1;
- return EAS_HWFileSeek(hwInstData, pData->fileHandle, pLoc->fileOffset);
-}
-