17df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 27df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * File: 47df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * eas_smf.c 57df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 67df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Contents and purpose: 77df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * SMF Type 0 and 1 File Parser 87df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * For SMF timebase analysis, see "MIDI Sequencer Analysis.xls". 107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Copyright Sonic Network Inc. 2005 127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * you may not use this file except in compliance with the License. 157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * You may obtain a copy of the License at 167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * See the License for the specific language governing permissions and 237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * limitations under the License. 247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 257df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Revision Control: 2756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * $Revision: 803 $ 2856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * $Date: 2007-08-01 09:57:00 -0700 (Wed, 01 Aug 2007) $ 297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 327df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "eas_data.h" 337df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "eas_miditypes.h" 347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "eas_parser.h" 357df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "eas_report.h" 367df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "eas_host.h" 377df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "eas_midi.h" 387df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "eas_config.h" 397df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "eas_vm_protos.h" 407df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "eas_smfdata.h" 417df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "eas_smf.h" 427df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 437df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#ifdef JET_INTERFACE 447df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "jet_data.h" 457df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif 467df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 477df30109963092559d3760c0661a020f9daf1030The Android Open Source Project//3 dls: The timebase for this module is adequate to keep MIDI and 487df30109963092559d3760c0661a020f9daf1030The Android Open Source Project//3 digital audio synchronized for only a few minutes. It should be 497df30109963092559d3760c0661a020f9daf1030The Android Open Source Project//3 sufficient for most mobile applications. If better accuracy is 507df30109963092559d3760c0661a020f9daf1030The Android Open Source Project//3 required, more fractional bits should be added to the timebase. 517df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 527df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic const EAS_U8 smfHeader[] = { 'M', 'T', 'h', 'd' }; 537df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 547df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/* local prototypes */ 557df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT SMF_GetVarLenData (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE fileHandle, EAS_U32 *pData); 567df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT SMF_ParseMetaEvent (S_EAS_DATA *pEASData, S_SMF_DATA *pSMFData, S_SMF_STREAM *pSMFStream); 577df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT SMF_ParseSysEx (S_EAS_DATA *pEASData, S_SMF_DATA *pSMFData, S_SMF_STREAM *pSMFStream, EAS_U8 f0, EAS_INT parserMode); 587df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT SMF_ParseEvent (S_EAS_DATA *pEASData, S_SMF_DATA *pSMFData, S_SMF_STREAM *pSMFStream, EAS_INT parserMode); 597df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT SMF_GetDeltaTime (EAS_HW_DATA_HANDLE hwInstData, S_SMF_STREAM *pSMFStream); 607df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic void SMF_UpdateTime (S_SMF_DATA *pSMFData, EAS_U32 ticks); 617df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 627df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 637df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 647df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 657df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * SMF_Parser 667df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 6756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * This structure contains the functional interface for the SMF parser 687df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 697df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 707df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectconst S_FILE_PARSER_INTERFACE EAS_SMF_Parser = 717df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{ 7256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks SMF_CheckFileType, 7356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks SMF_Prepare, 7456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks SMF_Time, 7556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks SMF_Event, 7656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks SMF_State, 7756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks SMF_Close, 7856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks SMF_Reset, 7956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks SMF_Pause, 8056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks SMF_Resume, 8156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks NULL, 8256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks SMF_SetData, 8356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks SMF_GetData, 8456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks NULL 857df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}; 867df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 877df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 887df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * SMF_CheckFileType() 897df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 9056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 917df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Check the file type to see if we can parse it 927df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 937df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs: 9456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData - pointer to overall EAS data structure 9556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle - pointer to file handle 9656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 977df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs: 9856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 997df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 1007df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects: 1017df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 1027df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 1037df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 1047df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectEAS_RESULT SMF_CheckFileType (S_EAS_DATA *pEASData, EAS_FILE_HANDLE fileHandle, EAS_VOID_PTR *ppHandle, EAS_I32 offset) 1057df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{ 10656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_SMF_DATA* pSMFData; 10756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_RESULT result; 10856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 10956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* seek to starting offset - usually 0 */ 11056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *ppHandle = NULL; 11156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWFileSeek(pEASData->hwInstData, fileHandle, offset)) != EAS_SUCCESS) 11256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 11356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 11456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* search through file for header - slow method */ 11556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pEASData->searchHeaderFlag) 11656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 11756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks result = EAS_SearchFile(pEASData, fileHandle, smfHeader, sizeof(smfHeader), &offset); 11856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (result != EAS_SUCCESS) 11956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return (result == EAS_EOF) ? EAS_SUCCESS : result; 12056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 12156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 12256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* read the first 4 bytes of the file - quick method */ 12356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else { 12456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U8 header[4]; 12556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 count; 12656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWReadFile(pEASData->hwInstData, fileHandle, header, sizeof(header), &count)) != EAS_SUCCESS) 12756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 12856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 12956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check for 'MTrk' - return if no match */ 13056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((header[0] != 'M') || (header[1] != 'T') || (header[2] != 'h') || (header[3] != 'd')) 13156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 13256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 13356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 13456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check for static memory allocation */ 13556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pEASData->staticMemoryModel) 13656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData = EAS_CMEnumData(EAS_CM_SMF_DATA); 13756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 13856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 13956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData = EAS_HWMalloc(pEASData->hwInstData, sizeof(S_SMF_DATA)); 14056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HWMemSet((void *)pSMFData,0, sizeof(S_SMF_DATA)); 14156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 14256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (!pSMFData) 14356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_MALLOC_FAILED; 14456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 14556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* initialize some critical data */ 14656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->fileHandle = fileHandle; 14756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->fileOffset = offset; 14856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->pSynth = NULL; 14956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->time = 0; 15056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->state = EAS_STATE_OPEN; 15156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *ppHandle = pSMFData; 15256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 15356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 1547df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} 1557df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 1567df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 1577df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * SMF_Prepare() 1587df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 15956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 1607df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Prepare to parse the file. Allocates instance data (or uses static allocation for 16156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * static memory model). 1627df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 1637df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs: 16456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData - pointer to overall EAS data structure 16556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle - pointer to file handle 16656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 1677df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs: 16856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 1697df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 1707df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects: 1717df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 1727df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 1737df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 1747df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectEAS_RESULT SMF_Prepare (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData) 1757df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{ 17656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_SMF_DATA* pSMFData; 17756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_RESULT result; 17856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 17956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check for valid state */ 18056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData = (S_SMF_DATA *) pInstData; 18156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFData->state != EAS_STATE_OPEN) 18256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_NOT_VALID_IN_THIS_STATE; 18356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 18456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* instantiate a synthesizer */ 18556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = VMInitMIDI(pEASData, &pSMFData->pSynth)) != EAS_SUCCESS) 18656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 18756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "VMInitMIDI returned %d\n", result); */ } 18856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 18956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 19056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 19156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* parse the file header and setup the individual stream parsers */ 19256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = SMF_ParseHeader(pEASData->hwInstData, pSMFData)) != EAS_SUCCESS) 19356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 19456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 19556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* ready to play */ 19656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->state = EAS_STATE_READY; 19756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 1987df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} 1997df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 2007df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 2017df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * SMF_Time() 2027df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 20356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 2047df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Returns the time of the next event in msecs 2057df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 2067df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs: 20756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData - pointer to overall EAS data structure 20856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle - pointer to file handle 20956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pTime - pointer to variable to hold time of next event (in msecs) 21056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 2117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs: 21256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 2137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 2147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects: 2157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 2167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 2177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 2187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*lint -esym(715, pEASData) reserved for future use */ 2197df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectEAS_RESULT SMF_Time (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_U32 *pTime) 2207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{ 22156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_SMF_DATA *pSMFData; 22256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 22356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData = (S_SMF_DATA*) pInstData; 2247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 22556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* sanity check */ 2267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#ifdef _CHECKED_BUILD 22756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFData->state == EAS_STATE_STOPPED) 22856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 22956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Can't ask for time on a stopped stream\n"); */ } 23056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 23156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 23256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFData->nextStream == NULL) 23356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 23456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx( _EAS_SEVERITY_ERROR, "no is NULL\n"); */ } 23556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 2367df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif 2377df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 2387df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#if 0 23956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* return time in milliseconds */ 24056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* if chase mode, lie about time */ 24156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFData->flags & SMF_FLAGS_CHASE_MODE) 24256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pTime = 0; 2437df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 24456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 24556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 2467df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 24756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{704} use shift instead of division */ 24856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pTime = pSMFData->time >> 8; 2497df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 25056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pTime = pSMFData->time >> 8; 25156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 2527df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} 2537df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 2547df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 2557df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * SMF_Event() 2567df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 25756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 2587df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Parse the next event in the file 2597df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 2607df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs: 26156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData - pointer to overall EAS data structure 26256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle - pointer to file handle 26356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 2647df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs: 26556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 2667df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 2677df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects: 2687df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 2697df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 2707df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 2717df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectEAS_RESULT SMF_Event (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_INT parserMode) 2727df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{ 27356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_SMF_DATA* pSMFData; 27456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_RESULT result; 27556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 i; 27656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U32 ticks; 27756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U32 temp; 2787df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 27956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* establish pointer to instance data */ 28056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData = (S_SMF_DATA*) pInstData; 28156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFData->state >= EAS_STATE_OPEN) 28256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 2837df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 284e6d06460f6936adaf2c5df783700a683fd082878Marco Nelissen if (!pSMFData->nextStream) { 285e6d06460f6936adaf2c5df783700a683fd082878Marco Nelissen return EAS_ERROR_FILE_FORMAT; 286e6d06460f6936adaf2c5df783700a683fd082878Marco Nelissen } 287e6d06460f6936adaf2c5df783700a683fd082878Marco Nelissen 288e6d06460f6936adaf2c5df783700a683fd082878Marco Nelissen 28956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* get current ticks */ 29056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks ticks = pSMFData->nextStream->ticks; 2917df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 29256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* assume that an error occurred */ 29356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->state = EAS_STATE_ERROR; 2947df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 2957df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#ifdef JET_INTERFACE 29656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* if JET has track muted, set parser mode to mute */ 29756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFData->nextStream->midiStream.jetData & MIDI_FLAGS_JET_MUTE) 29856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks parserMode = eParserModeMute; 29956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 30056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 30156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* parse the next event from all the streams */ 30256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = SMF_ParseEvent(pEASData, pSMFData, pSMFData->nextStream, parserMode)) != EAS_SUCCESS) 30356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 30456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check for unexpected end-of-file */ 30556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (result != EAS_EOF) 30656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 30756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 30856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* indicate end of track for this stream */ 30956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->nextStream->ticks = SMF_END_OF_TRACK; 31056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 31156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 31256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* get next delta time, unless already at end of track */ 31356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else if (pSMFData->nextStream->ticks != SMF_END_OF_TRACK) 31456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 31556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = SMF_GetDeltaTime(pEASData->hwInstData, pSMFData->nextStream)) != EAS_SUCCESS) 31656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 31756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check for unexpected end-of-file */ 31856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (result != EAS_EOF) 31956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 32056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 32156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* indicate end of track for this stream */ 32256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->nextStream->ticks = SMF_END_OF_TRACK; 32356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 32456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 32556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* if zero delta to next event, stay with this stream */ 32656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else if (pSMFData->nextStream->ticks == ticks) 32756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 32856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->state = EAS_STATE_PLAY; 32956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 33056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 33156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 33256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 33356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* find next event in all streams */ 33456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks temp = 0x7ffffff; 33556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->nextStream = NULL; 33656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (i = 0; i < pSMFData->numStreams; i++) 33756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 33856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFData->streams[i].ticks < temp) 33956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 34056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks temp = pSMFData->streams[i].ticks; 34156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->nextStream = &pSMFData->streams[i]; 34256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 34356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 34456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 34556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* are there any more events to parse? */ 34656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFData->nextStream) 34756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 34856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->state = EAS_STATE_PLAY; 34956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 35056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* update the time of the next event */ 35156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks SMF_UpdateTime(pSMFData, pSMFData->nextStream->ticks - ticks); 35256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 35356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 35456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 35556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->state = EAS_STATE_STOPPING; 35656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks VMReleaseAllVoices(pEASData->pVoiceMgr, pSMFData->pSynth); 35756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 35856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 35956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 3607df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} 3617df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 3627df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 3637df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * SMF_State() 3647df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 36556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 3667df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Returns the current state of the stream 3677df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 3687df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs: 36956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData - pointer to overall EAS data structure 37056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle - pointer to file handle 37156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pState - pointer to variable to store state 37256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 3737df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs: 37456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 3757df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 3767df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects: 3777df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 3787df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 3797df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 3807df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*lint -esym(715, pEASData) reserved for future use */ 3817df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectEAS_RESULT SMF_State (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 *pState) 3827df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{ 38356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_SMF_DATA* pSMFData; 38456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 38556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* establish pointer to instance data */ 38656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData = (S_SMF_DATA*) pInstData; 38756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 38856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* if stopping, check to see if synth voices are active */ 38956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFData->state == EAS_STATE_STOPPING) 39056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 39156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (VMActiveVoices(pSMFData->pSynth) == 0) 39256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->state = EAS_STATE_STOPPED; 39356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 39456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 39556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFData->state == EAS_STATE_PAUSING) 39656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 39756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (VMActiveVoices(pSMFData->pSynth) == 0) 39856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->state = EAS_STATE_PAUSED; 39956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 40056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 40156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* return current state */ 40256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pState = pSMFData->state; 40356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 4047df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} 4057df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 4067df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 4077df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * SMF_Close() 4087df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 40956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 4107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Close the file and clean up 4117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 4127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs: 41356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData - pointer to overall EAS data structure 41456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle - pointer to file handle 41556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 4167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs: 41756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 4187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 4197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects: 4207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 4217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 4227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 4237df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectEAS_RESULT SMF_Close (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData) 4247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{ 42556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_SMF_DATA* pSMFData; 42656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 i; 42756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_RESULT result; 42856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 42956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData = (S_SMF_DATA*) pInstData; 43056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 43156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* close all the streams */ 43256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (i = 0; i < pSMFData->numStreams; i++) 43356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 43456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFData->streams[i].fileHandle != NULL) 43556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 43656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWCloseFile(pEASData->hwInstData, pSMFData->streams[i].fileHandle)) != EAS_SUCCESS) 43756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 43856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 43956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 44056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFData->fileHandle != NULL) 44156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWCloseFile(pEASData->hwInstData, pSMFData->fileHandle)) != EAS_SUCCESS) 44256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 44356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 44456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* free the synth */ 44556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFData->pSynth != NULL) 44656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks VMMIDIShutdown(pEASData, pSMFData->pSynth); 44756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 44856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* if using dynamic memory, free it */ 44956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (!pEASData->staticMemoryModel) 45056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 45156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFData->streams) 45256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HWFree(pEASData->hwInstData, pSMFData->streams); 45356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 45456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* free the instance data */ 45556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HWFree(pEASData->hwInstData, pSMFData); 45656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 45756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 45856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 4597df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} 4607df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 4617df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 4627df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * SMF_Reset() 4637df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 46456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 4657df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Reset the sequencer. Used for locating backwards in the file. 4667df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 4677df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs: 46856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData - pointer to overall EAS data structure 46956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle - pointer to file handle 47056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 4717df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs: 47256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 4737df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 4747df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects: 4757df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 4767df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 4777df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 4787df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectEAS_RESULT SMF_Reset (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData) 4797df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{ 48056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_SMF_DATA* pSMFData; 48156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 i; 48256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_RESULT result; 48356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U32 ticks; 48456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 48556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData = (S_SMF_DATA*) pInstData; 48656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 48756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* reset time to zero */ 48856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->time = 0; 48956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 49056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* reset the synth */ 49156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks VMReset(pEASData->pVoiceMgr, pSMFData->pSynth, EAS_TRUE); 49256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 49356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* find the start of each track */ 49456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks ticks = 0x7fffffffL; 49556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->nextStream = NULL; 49656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (i = 0; i < pSMFData->numStreams; i++) 49756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 49856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 49956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* reset file position to first byte of data in track */ 50056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWFileSeek(pEASData->hwInstData, pSMFData->streams[i].fileHandle, pSMFData->streams[i].startFilePos)) != EAS_SUCCESS) 50156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 50256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 50356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* initalize some data */ 50456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->streams[i].ticks = 0; 50556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 50656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* initalize the MIDI parser data */ 50756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_InitMIDIStream(&pSMFData->streams[i].midiStream); 50856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 50956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* parse the first delta time in each stream */ 51056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = SMF_GetDeltaTime(pEASData->hwInstData,&pSMFData->streams[i])) != EAS_SUCCESS) 51156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 51256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFData->streams[i].ticks < ticks) 51356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 51456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks ticks = pSMFData->streams[i].ticks; 51556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->nextStream = &pSMFData->streams[i]; 51656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 51756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 51856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 51956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 52056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->state = EAS_STATE_READY; 52156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 5227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} 5237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 5247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 5257df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * SMF_Pause() 5267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 52756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 5287df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Pauses the sequencer. Mutes all voices and sets state to pause. 5297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 5307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs: 53156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData - pointer to overall EAS data structure 53256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle - pointer to file handle 53356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 5347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs: 53556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 5367df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 5377df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects: 5387df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 5397df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 5407df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 5417df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectEAS_RESULT SMF_Pause (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData) 5427df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{ 54356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_SMF_DATA *pSMFData; 5447df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 54556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* can't pause a stopped stream */ 54656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData = (S_SMF_DATA*) pInstData; 54756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFData->state == EAS_STATE_STOPPED) 54856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_ALREADY_STOPPED; 5497df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 55056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* mute the synthesizer */ 55156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks VMMuteAllVoices(pEASData->pVoiceMgr, pSMFData->pSynth); 55256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->state = EAS_STATE_PAUSING; 55356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 5547df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} 5557df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 5567df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 5577df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * SMF_Resume() 5587df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 55956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 5607df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Resume playing after a pause, sets state back to playing. 5617df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 5627df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs: 56356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData - pointer to overall EAS data structure 56456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle - pointer to file handle 56556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 5667df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs: 56756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 5687df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 5697df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects: 5707df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 5717df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 5727df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 5737df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*lint -esym(715, pEASData) reserved for future use */ 5747df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectEAS_RESULT SMF_Resume (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData) 5757df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{ 57656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_SMF_DATA *pSMFData; 5777df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 57856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* can't resume a stopped stream */ 57956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData = (S_SMF_DATA*) pInstData; 58056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFData->state == EAS_STATE_STOPPED) 58156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_ALREADY_STOPPED; 5827df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 58356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* nothing to do but resume playback */ 58456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->state = EAS_STATE_PLAY; 58556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 5867df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} 5877df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 5887df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 5897df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * SMF_SetData() 5907df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 59156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 5927df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Sets parser parameters 5937df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 5947df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs: 59556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData - pointer to overall EAS data structure 59656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle - pointer to file handle 59756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 5987df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs: 59956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 6007df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 6017df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects: 6027df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 6037df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 6047df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 6057df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*lint -esym(715, pEASData) reserved for future use */ 6067df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectEAS_RESULT SMF_SetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value) 6077df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{ 60856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_SMF_DATA *pSMFData; 60956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 61056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData = (S_SMF_DATA*) pInstData; 61156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks switch (param) 61256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 6137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 61456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* set metadata callback */ 61556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case PARSER_DATA_METADATA_CB: 61656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HWMemCpy(&pSMFData->metadata, (void*) value, sizeof(S_METADATA_CB)); 61756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 6187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 6197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#ifdef JET_INTERFACE 62056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* set jet segment and track ID of all tracks for callback function */ 62156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case PARSER_DATA_JET_CB: 62256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 62356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U32 i; 62456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U32 bit = (EAS_U32) value; 62556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks bit = (bit << JET_EVENT_SEG_SHIFT) & JET_EVENT_SEG_MASK; 62656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (i = 0; i < pSMFData->numStreams; i++) 62756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->streams[i].midiStream.jetData = 62856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks (pSMFData->streams[i].midiStream.jetData & 62956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks ~(JET_EVENT_TRACK_MASK | JET_EVENT_SEG_MASK)) | 63056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks i << JET_EVENT_TRACK_SHIFT | bit | MIDI_FLAGS_JET_CB; 63156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->flags |= SMF_FLAGS_JET_STREAM; 63256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 63356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 63456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 63556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* set state of all mute flags at once */ 63656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case PARSER_DATA_MUTE_FLAGS: 63756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 63856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_INT i; 63956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U32 bit = (EAS_U32) value; 64056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (i = 0; i < pSMFData->numStreams; i++) 64156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 64256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (bit & 1) 64356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->streams[i].midiStream.jetData |= MIDI_FLAGS_JET_MUTE; 64456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 64556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->streams[i].midiStream.jetData &= ~MIDI_FLAGS_JET_MUTE; 64656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks bit >>= 1; 64756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 64856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 64956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 65056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 65156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* set track mute */ 65256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case PARSER_DATA_SET_MUTE: 65356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (value < pSMFData->numStreams) 65456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->streams[value].midiStream.jetData |= MIDI_FLAGS_JET_MUTE; 65556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 65656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_PARAMETER_RANGE; 65756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 65856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 65956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* clear track mute */ 66056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case PARSER_DATA_CLEAR_MUTE: 66156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (value < pSMFData->numStreams) 66256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->streams[value].midiStream.jetData &= ~MIDI_FLAGS_JET_MUTE; 66356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 66456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_PARAMETER_RANGE; 66556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 66656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 66756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 66856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks default: 66956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_INVALID_PARAMETER; 67056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 67156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 67256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 6737df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} 6747df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 6757df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 6767df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * SMF_GetData() 6777df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 67856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 6797df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Retrieves parser parameters 6807df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 6817df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs: 68256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData - pointer to overall EAS data structure 68356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * handle - pointer to file handle 68456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 6857df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs: 68656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 6877df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 6887df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects: 6897df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 6907df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 6917df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 6927df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*lint -esym(715, pEASData) reserved for future use */ 6937df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectEAS_RESULT SMF_GetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue) 6947df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{ 69556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_SMF_DATA *pSMFData; 69656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 69756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData = (S_SMF_DATA*) pInstData; 69856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks switch (param) 69956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 70056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* return file type */ 70156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case PARSER_DATA_FILE_TYPE: 70256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFData->numStreams == 1) 70356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pValue = EAS_FILE_SMF0; 70456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 70556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pValue = EAS_FILE_SMF1; 70656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 7077df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 7087df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/* now handled in eas_public.c */ 70956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#if 0 71056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case PARSER_DATA_POLYPHONY: 71156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFData->pSynth) 71256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks VMGetPolyphony(pEASData->pVoiceMgr, pSMFData->pSynth, pValue); 71356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 71456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_NOT_VALID_IN_THIS_STATE; 71556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 71656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 71756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case PARSER_DATA_PRIORITY: 71856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFData->pSynth) 71956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks VMGetPriority(pEASData->pVoiceMgr, pSMFData->pSynth, pValue); 72056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 72156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 72256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* set transposition */ 72356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case PARSER_DATA_TRANSPOSITION: 72456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pValue = pSMFData->transposition; 72556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 7267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif 7277df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 72856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case PARSER_DATA_SYNTH_HANDLE: 72956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pValue = (EAS_I32) pSMFData->pSynth; 73056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 73156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 73256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks default: 73356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_INVALID_PARAMETER; 73456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 73556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 73656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 7377df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} 7387df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 7397df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 7407df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * SMF_GetVarLenData() 7417df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 74256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 7437df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Reads a varible length quantity from an SMF file 7447df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 7457df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs: 74656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 74756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 7487df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs: 74956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 7507df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 7517df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects: 7527df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 7537df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 7547df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 7557df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT SMF_GetVarLenData (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE fileHandle, EAS_U32 *pData) 7567df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{ 75756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_RESULT result; 75856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U32 data; 75956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U8 c; 76056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 76156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* read until bit 7 is zero */ 76256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks data = 0; 76356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks do 76456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 76556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWGetByte(hwInstData, fileHandle,&c)) != EAS_SUCCESS) 76656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 76756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks data = (data << 7) | (c & 0x7f); 76856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } while (c & 0x80); 76956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pData = data; 77056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 7717df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} 7727df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 7737df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 7747df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * SMF_GetDeltaTime() 7757df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 77656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 7777df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Reads a varible length quantity from an SMF file 7787df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 7797df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs: 78056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 78156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 7827df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs: 78356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 7847df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 7857df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects: 7867df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 7877df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 7887df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 7897df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT SMF_GetDeltaTime (EAS_HW_DATA_HANDLE hwInstData, S_SMF_STREAM *pSMFStream) 7907df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{ 79156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_RESULT result; 79256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U32 ticks; 7937df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 79456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = SMF_GetVarLenData(hwInstData, pSMFStream->fileHandle, &ticks)) != EAS_SUCCESS) 79556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 7967df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 79756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFStream->ticks += ticks; 79856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 7997df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} 8007df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 8017df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 8027df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * SMF_ParseMetaEvent() 8037df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 80456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 8057df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Reads a varible length quantity from an SMF file 8067df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 8077df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs: 80856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 80956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 8107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs: 81156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 8127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 8137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects: 8147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 8157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 8167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 8177df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT SMF_ParseMetaEvent (S_EAS_DATA *pEASData, S_SMF_DATA *pSMFData, S_SMF_STREAM *pSMFStream) 8187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{ 81956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_RESULT result; 82056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U32 len; 82156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 pos; 82256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U32 temp; 82356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U8 c; 82456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 82556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* get the meta-event type */ 82656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWGetByte(pEASData->hwInstData, pSMFStream->fileHandle, &c)) != EAS_SUCCESS) 82756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 82856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 82956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* get the length */ 83056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = SMF_GetVarLenData(pEASData->hwInstData, pSMFStream->fileHandle, &len)) != EAS_SUCCESS) 83156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 83256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 83356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* get the current file position so we can skip the event */ 83456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWFilePos(pEASData->hwInstData, pSMFStream->fileHandle, &pos)) != EAS_SUCCESS) 83556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 83656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pos += (EAS_I32) len; 83756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 83856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* end of track? */ 83956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (c == SMF_META_END_OF_TRACK) 84056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 84156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Meta-event: end of track\n", c, len); */ } 84256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFStream->ticks = SMF_END_OF_TRACK; 84356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 84456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 84556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* tempo event? */ 84656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else if (c == SMF_META_TEMPO) 84756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 84856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* read the 3-byte timebase value */ 84956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks temp = 0; 85056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks while (len--) 85156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 85256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWGetByte(pEASData->hwInstData, pSMFStream->fileHandle, &c)) != EAS_SUCCESS) 85356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 85456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks temp = (temp << 8) | c; 85556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 85656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 85756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->tickConv = (EAS_U16) (((temp * 1024) / pSMFData->ppqn + 500) / 1000); 85856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->flags |= SMF_FLAGS_HAS_TEMPO; 85956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 86056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 86156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check for time signature - see iMelody spec V1.4 section 4.1.2.2.3.6 */ 86256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else if (c == SMF_META_TIME_SIGNATURE) 86356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 86456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->flags |= SMF_FLAGS_HAS_TIME_SIG; 86556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 86656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 86756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* if the host has registered a metadata callback return the metadata */ 86856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else if (pSMFData->metadata.callback) 86956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 87056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 readLen; 87156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks E_EAS_METADATA_TYPE metaType; 87256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 87356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks metaType = EAS_METADATA_UNKNOWN; 87456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 87556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* only process title on the first track */ 87656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (c == SMF_META_SEQTRK_NAME) 87756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks metaType = EAS_METADATA_TITLE; 87856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else if (c == SMF_META_TEXT) 87956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks metaType = EAS_METADATA_TEXT; 88056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else if (c == SMF_META_COPYRIGHT) 88156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks metaType = EAS_METADATA_COPYRIGHT; 88256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else if (c == SMF_META_LYRIC) 88356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks metaType = EAS_METADATA_LYRIC; 88456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 88556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (metaType != EAS_METADATA_UNKNOWN) 88656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 88756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks readLen = pSMFData->metadata.bufferSize - 1; 88856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((EAS_I32) len < readLen) 88956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks readLen = (EAS_I32) len; 89056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWReadFile(pEASData->hwInstData, pSMFStream->fileHandle, pSMFData->metadata.buffer, readLen, &readLen)) != EAS_SUCCESS) 89156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 89256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->metadata.buffer[readLen] = 0; 89356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->metadata.callback(metaType, pSMFData->metadata.buffer, pSMFData->metadata.pUserData); 89456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 89556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 89656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 89756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* position file to next event - in case we ignored all or part of the meta-event */ 89856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWFileSeek(pEASData->hwInstData, pSMFStream->fileHandle, pos)) != EAS_SUCCESS) 89956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 90056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 90156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Meta-event: type=%02x, len=%d\n", c, len); */ } 90256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 9037df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} 9047df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 9057df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 9067df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * SMF_ParseSysEx() 9077df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 90856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 9097df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Reads a varible length quantity from an SMF file 9107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 9117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs: 91256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 91356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 9147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs: 91556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 9167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 9177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects: 9187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 9197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 9207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 9217df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT SMF_ParseSysEx (S_EAS_DATA *pEASData, S_SMF_DATA *pSMFData, S_SMF_STREAM *pSMFStream, EAS_U8 f0, EAS_INT parserMode) 9227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{ 92356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_RESULT result; 92456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U32 len; 92556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U8 c; 92656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 92756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* get the length */ 92856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = SMF_GetVarLenData(pEASData->hwInstData, pSMFStream->fileHandle, &len)) != EAS_SUCCESS) 92956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 93056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 93156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* start of SysEx message? */ 93256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (f0 == 0xf0) 93356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 93456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_ParseMIDIStream(pEASData, pSMFData->pSynth, &pSMFStream->midiStream, f0, parserMode)) != EAS_SUCCESS) 93556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 93656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 93756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 93856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* feed the SysEx to the stream parser */ 93956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks while (len--) 94056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 94156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWGetByte(pEASData->hwInstData, pSMFStream->fileHandle, &c)) != EAS_SUCCESS) 94256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 94356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_ParseMIDIStream(pEASData, pSMFData->pSynth, &pSMFStream->midiStream, c, parserMode)) != EAS_SUCCESS) 94456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 94556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 94656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check for GM system ON */ 94756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFStream->midiStream.flags & MIDI_FLAG_GM_ON) 94856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->flags |= SMF_FLAGS_HAS_GM_ON; 94956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 95056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 95156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 9527df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} 9537df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 9547df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 9557df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * SMF_ParseEvent() 9567df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 95756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 9587df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Reads a varible length quantity from an SMF file 9597df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 9607df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs: 96156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 96256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 9637df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs: 96456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 9657df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 9667df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects: 9677df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 9687df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 9697df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 9707df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT SMF_ParseEvent (S_EAS_DATA *pEASData, S_SMF_DATA *pSMFData, S_SMF_STREAM *pSMFStream, EAS_INT parserMode) 9717df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{ 97256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_RESULT result; 97356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U8 c; 97456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 97556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* get the event type */ 97656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWGetByte(pEASData->hwInstData, pSMFStream->fileHandle, &c)) != EAS_SUCCESS) 97756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 97856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 97956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* parse meta-event */ 98056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (c == 0xff) 98156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 98256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = SMF_ParseMetaEvent(pEASData, pSMFData, pSMFStream)) != EAS_SUCCESS) 98356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 98456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 98556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 98656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* parse SysEx */ 98756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else if ((c == 0xf0) || (c == 0xf7)) 98856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 98956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = SMF_ParseSysEx(pEASData, pSMFData, pSMFStream, c, parserMode)) != EAS_SUCCESS) 99056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 99156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 99256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 99356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* parse MIDI message */ 99456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 99556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 99656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_ParseMIDIStream(pEASData, pSMFData->pSynth, &pSMFStream->midiStream, c, parserMode)) != EAS_SUCCESS) 99756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 99856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 99956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* keep streaming data to the MIDI parser until the message is complete */ 100056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks while (pSMFStream->midiStream.pending) 100156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 100256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWGetByte(pEASData->hwInstData, pSMFStream->fileHandle, &c)) != EAS_SUCCESS) 100356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 100456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_ParseMIDIStream(pEASData, pSMFData->pSynth, &pSMFStream->midiStream, c, parserMode)) != EAS_SUCCESS) 100556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 100656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 100756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 100856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 100956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 101056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* chase mode logic */ 101156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFData->time == 0) 101256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 101356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFData->flags & SMF_FLAGS_CHASE_MODE) 101456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 101556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFStream->midiStream.flags & MIDI_FLAG_FIRST_NOTE) 101656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->flags &= ~SMF_FLAGS_CHASE_MODE; 101756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 101856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else if ((pSMFData->flags & SMF_FLAGS_SETUP_BAR) == SMF_FLAGS_SETUP_BAR) 101956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->flags = (pSMFData->flags & ~SMF_FLAGS_SETUP_BAR) | SMF_FLAGS_CHASE_MODE; 102056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 102156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 102256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 10237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} 10247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 10257df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 10267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * SMF_ParseHeader() 10277df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 102856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 10297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Parses the header of an SMF file, allocates memory the stream parsers and initializes the 10307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * stream parsers. 10317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 10327df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs: 103356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData - pointer to overall EAS data structure 103456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pSMFData - pointer to parser instance data 103556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * fileHandle - file handle 103656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * fileOffset - offset in the file where the header data starts, usually 0 103756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 103856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 10397df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs: 104056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 10417df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 10427df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects: 10437df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 10447df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 10457df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 10467df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*lint -e{801} we know that 'goto' is deprecated - but it's cleaner in this case */ 10477df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectEAS_RESULT SMF_ParseHeader (EAS_HW_DATA_HANDLE hwInstData, S_SMF_DATA *pSMFData) 10487df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{ 104956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_RESULT result; 105056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 i; 105156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U16 division; 105256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U32 chunkSize; 105356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U32 chunkStart; 105456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U32 temp; 105556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U32 ticks; 105656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 105756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* rewind the file and find the end of the header chunk */ 105856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWFileSeek(hwInstData, pSMFData->fileHandle, pSMFData->fileOffset + SMF_OFS_HEADER_SIZE)) != EAS_SUCCESS) 105956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks goto ReadError; 106056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWGetDWord(hwInstData, pSMFData->fileHandle, &chunkSize, EAS_TRUE)) != EAS_SUCCESS) 106156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks goto ReadError; 106256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 106356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* determine the number of tracks */ 106456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWFileSeek(hwInstData, pSMFData->fileHandle, pSMFData->fileOffset + SMF_OFS_NUM_TRACKS)) != EAS_SUCCESS) 106556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks goto ReadError; 106656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWGetWord(hwInstData, pSMFData->fileHandle, &pSMFData->numStreams, EAS_TRUE)) != EAS_SUCCESS) 106756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks goto ReadError; 106856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 106956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* limit the number of tracks */ 107056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFData->numStreams > MAX_SMF_STREAMS) 107156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 107256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "SMF file contains %u tracks, playing %d tracks\n", pSMFData->numStreams, MAX_SMF_STREAMS); */ } 107356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->numStreams = MAX_SMF_STREAMS; 107456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } else if (pSMFData->numStreams == 0) 107556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 107656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* avoid 0 sized allocation */ 107756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_PARAMETER_RANGE; 107856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 107956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 108056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* get the time division */ 108156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWGetWord(hwInstData, pSMFData->fileHandle, &division, EAS_TRUE)) != EAS_SUCCESS) 108256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks goto ReadError; 108356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 108456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* setup default timebase for 120 bpm */ 108556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->ppqn = 192; 108656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (!division || division & 0x8000) 108756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING,"No support for SMPTE code timebase\n"); */ } 108856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 108956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->ppqn = (division & 0x7fff); 109056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->tickConv = (EAS_U16) (((SMF_DEFAULT_TIMEBASE * 1024) / pSMFData->ppqn + 500) / 1000); 109156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 109256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* dynamic memory allocation, allocate memory for streams */ 109356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFData->streams == NULL) 109456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 109556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->streams = EAS_HWMalloc(hwInstData,sizeof(S_SMF_STREAM) * pSMFData->numStreams); 109656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFData->streams == NULL) 109756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_MALLOC_FAILED; 109856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 109956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* zero the memory to insure complete initialization */ 110056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HWMemSet((void *)(pSMFData->streams), 0, sizeof(S_SMF_STREAM) * pSMFData->numStreams); 110156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 110256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 110356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* find the start of each track */ 110456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks chunkStart = (EAS_U32) pSMFData->fileOffset; 110556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks ticks = 0x7fffffffL; 110656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->nextStream = NULL; 110756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (i = 0; i < pSMFData->numStreams; i++) 110856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 110956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 111056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (;;) 111156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 111256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 111356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* calculate start of next chunk - checking for errors */ 111456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks temp = chunkStart + SMF_CHUNK_INFO_SIZE + chunkSize; 111556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (temp <= chunkStart) 111656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 111756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING,"Error in chunk size at offset %d\n", chunkStart); */ } 111856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_FILE_FORMAT; 111956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 112056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks chunkStart = temp; 112156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 112256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* seek to the start of the next chunk */ 112356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWFileSeek(hwInstData, pSMFData->fileHandle, (EAS_I32) chunkStart)) != EAS_SUCCESS) 112456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks goto ReadError; 112556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 112656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* read the chunk identifier */ 112756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWGetDWord(hwInstData, pSMFData->fileHandle, &temp, EAS_TRUE)) != EAS_SUCCESS) 112856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks goto ReadError; 112956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 113056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* read the chunk size */ 113156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWGetDWord(hwInstData, pSMFData->fileHandle, &chunkSize, EAS_TRUE)) != EAS_SUCCESS) 113256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks goto ReadError; 113356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 113456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* make sure this is an 'MTrk' chunk */ 113556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (temp == SMF_CHUNK_TYPE_TRACK) 113656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 113756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 113856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING,"Unexpected chunk type: 0x%08x\n", temp); */ } 113956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 114056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 114156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* initalize some data */ 114256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->streams[i].ticks = 0; 114356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->streams[i].fileHandle = pSMFData->fileHandle; 114456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 114556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* NULL the file handle so we don't try to close it twice */ 114656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->fileHandle = NULL; 114756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 114856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* save this file position as the start of the track */ 114956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->streams[i].startFilePos = (EAS_I32) chunkStart + SMF_CHUNK_INFO_SIZE; 115056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 115156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* initalize the MIDI parser data */ 115256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_InitMIDIStream(&pSMFData->streams[i].midiStream); 115356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 115456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* parse the first delta time in each stream */ 115556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = SMF_GetDeltaTime(hwInstData, &pSMFData->streams[i])) != EAS_SUCCESS) 115656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks goto ReadError; 115756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 115856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFData->streams[i].ticks < ticks) 115956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 116056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks ticks = pSMFData->streams[i].ticks; 116156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->nextStream = &pSMFData->streams[i]; 116256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 116356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 116456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* more tracks to do, create a duplicate file handle */ 116556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (i < (pSMFData->numStreams - 1)) 116656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 116756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWDupHandle(hwInstData, pSMFData->streams[i].fileHandle, &pSMFData->fileHandle)) != EAS_SUCCESS) 116856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks goto ReadError; 116956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 117056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 117156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 117256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* update the time of the next event */ 117356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFData->nextStream) 117456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks SMF_UpdateTime(pSMFData, pSMFData->nextStream->ticks); 117556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 117656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 117756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 117856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* ugly goto: but simpler than structured */ 117956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks ReadError: 118056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (result == EAS_EOF) 118156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_FILE_FORMAT; 118256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 11837df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} 11847df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 11857df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 11867df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * SMF_UpdateTime() 11877df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 118856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 11897df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Update the millisecond time base by converting the ticks into millieconds 11907df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 11917df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs: 119256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 119356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 11947df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs: 119556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 11967df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 11977df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects: 11987df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 11997df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 12007df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 12017df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic void SMF_UpdateTime (S_SMF_DATA *pSMFData, EAS_U32 ticks) 12027df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{ 120356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U32 temp1, temp2; 120456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 120556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSMFData->flags & SMF_FLAGS_CHASE_MODE) 120656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return; 120756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 120856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks temp1 = (ticks >> 10) * pSMFData->tickConv; 120956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks temp2 = (ticks & 0x3ff) * pSMFData->tickConv; 121056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSMFData->time += (EAS_I32)((temp1 << 8) + (temp2 >> 2)); 12117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} 12127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 1213