From 1b52a76815aa068a3477bfdfaf58718d41d7f9b4 Mon Sep 17 00:00:00 2001 From: The Android Open Source Project Date: Tue, 3 Mar 2009 18:28:36 -0800 Subject: auto import from //depot/cupcake/@135843 --- arm-hybrid-22k/lib_src/eas_ota.c | 1077 -------------------------------------- 1 file changed, 1077 deletions(-) delete mode 100644 arm-hybrid-22k/lib_src/eas_ota.c (limited to 'arm-hybrid-22k/lib_src/eas_ota.c') diff --git a/arm-hybrid-22k/lib_src/eas_ota.c b/arm-hybrid-22k/lib_src/eas_ota.c deleted file mode 100644 index fb81d62..0000000 --- a/arm-hybrid-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); -} - -- cgit v1.2.3