156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* 256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EASLib.c 356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EASLIb 456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Copyright (C) 2008 The Android Open Source Project 756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Licensed under the Apache License, Version 2.0 (the "License"); 956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * you may not use this file except in compliance with the License. 1056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * You may obtain a copy of the License at 1156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 1256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * http://www.apache.org/licenses/LICENSE-2.0 1356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 1456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Unless required by applicable law or agreed to in writing, software 1556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * distributed under the License is distributed on an "AS IS" BASIS, 1656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * See the License for the specific language governing permissions and 1856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * limitations under the License. 1956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 2056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks */ 2156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 2256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include <stdlib.h> 2356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include <stdio.h> 2456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include <stdarg.h> 2556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include <string.h> 2656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 2756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas.h" 2856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_report.h" 2956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_host.h" 3056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include <AudioUnit/AudioUnit.h> 3156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include <CoreServices/CoreServices.h> 3256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 3356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef JET_INTERFACE 3456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "jet.h" 3556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 3656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 3756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 3856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define EAS_EXPORT __attribute__((visibility("default"))) 3956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 4056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// #define DEBUG_FILE_IO 4156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 4256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* include debug interface */ 4356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_host_debug.h" 4456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 4556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef AUX_MIXER 4656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_auxmix.h" 4756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 4856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 4956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* this module requires dynamic memory support */ 5056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _STATIC_MEMORY 5156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#error "eas_hostmm.c requires the dynamic memory model!\n" 5256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 5356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 5456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifndef EAS_MAX_FILE_HANDLES 5556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define EAS_MAX_FILE_HANDLES 32 5656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 5756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 5856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifndef EAS_FILE_BUFFER_SIZE 5956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define EAS_FILE_BUFFER_SIZE 32 6056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 6156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 6256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* 6356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * this structure and the related function are here 6456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * to support the ability to create duplicate handles 6556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * and buffering it in memory. If your system uses 6656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * in-memory resources, you can eliminate the calls 6756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * to malloc and free, the dup flag, and simply track 6856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * the file size and read position. 6956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks */ 7056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks #ifdef BUFFERED_FILE_ACCESS 7156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparkstypedef struct eas_hw_file_tag 7256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 7356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks FILE *pFile; 7456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 bytesInBuffer; 7556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 readIndex; 7656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 filePos; 7756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 fileSize; 7856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_BOOL dup; 7956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U8 buffer[EAS_FILE_BUFFER_SIZE]; 8056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} EAS_HW_FILE; 8156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#else 8256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparkstypedef struct eas_hw_file_tag 8356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 8456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 fileSize; 8556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 filePos; 8656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_BOOL dup; 8756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U8 *buffer; 8856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} EAS_HW_FILE; 8956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 9056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 9156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparkstypedef struct eas_hw_inst_data_tag 9256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 9356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HW_FILE files[EAS_MAX_FILE_HANDLES]; 9456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} EAS_HW_INST_DATA; 9556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 9656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_BOOL errorConditions[eNumErrorConditions]; 9756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_BOOL ledState; 9856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_BOOL vibState; 9956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_BOOL backlightState; 10056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 10156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define MAX_DEBUG_MSG_LEN 1024 10256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 10356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparkstypedef void (*EAS_LOG_FUNC)(EAS_INT severity, char *msg); 10456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 10556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_LOG_FUNC logCallback = NULL; 10656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic char messageBuffer[MAX_DEBUG_MSG_LEN]; 10756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 10856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* error counts */ 10956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_INT eas_fatalErrors; 11056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_INT eas_errors; 11156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_INT eas_warnings; 11256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic int severityLevel = 9999; 11356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 11456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 11556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define MAX_BUFFERS 8 11656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 11756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// The output unit 11856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksAudioUnit OutputUnit; 11956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksAudioStreamBasicDescription streamFormat; 12056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 12156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// sync stuf 12256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparkspthread_mutex_t mtx; 12356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparkspthread_cond_t cond; 12456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksbool bStopped = true; 12556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 12656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// buffer to hold the data 12756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparkstypedef struct 12856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 12956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks UInt32 uOutBufferLength; 13056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks UInt32 uOutFrames; 13156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks int ix; 13256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks short* pData[8]; 13356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks unsigned int uLength; 13456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} S_BUFFER_INFO; 13556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 13656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic S_BUFFER_INFO *pBuf = NULL; 13756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksconst S_EAS_LIB_CONFIG *pConfig = NULL; 13856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 13956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 14056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * ResetErrorCounters() 14156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 14256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 14356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_EXPORT void ResetErrorCounters() 14456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 14556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks eas_fatalErrors = 0; 14656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks eas_errors = 0; 14756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks eas_warnings = 0; 14856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 14956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 15056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 15156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * SetLogCallback() 15256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 15356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 15456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_EXPORT void SetLogCallback (EAS_LOG_FUNC callback) 15556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 15656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks logCallback = callback; 15756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 15856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 15956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifndef _NO_DEBUG_PREPROCESSOR 16056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic S_DEBUG_MESSAGES debugMessages[] = 16156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 16256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef UNIFIED_DEBUG_MESSAGES 16356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_debugmsgs.h" 16456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 16556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 0,0,0 } 16656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}; 16756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 16856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 16956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_ReportEx() 17056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 17156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 17256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksvoid EAS_ReportEx (int severity, unsigned long hashCode, int serialNum, ...) 17356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 17456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks va_list vargs; 17556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks int i; 17656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 17756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks switch (severity) 17856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 17956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case _EAS_SEVERITY_FATAL: 18056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks eas_fatalErrors++; 18156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 18256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 18356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case _EAS_SEVERITY_ERROR: 18456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks eas_errors++; 18556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 18656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 18756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case _EAS_SEVERITY_WARNING: 18856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks eas_warnings++; 18956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 19056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 19156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks default: 19256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 19356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 19456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 19556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check severity level */ 19656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (severity > severityLevel) 19756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return; 19856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 19956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check for callback */ 20056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (logCallback == NULL) 20156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return; 20256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 20356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* find the error message and output to stdout */ 20456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (i = 0; debugMessages[i].m_pDebugMsg; i++) 20556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 20656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((debugMessages[i].m_nHashCode == hashCode) && 20756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks (debugMessages[i].m_nSerialNum == serialNum)) 20856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 20956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks va_start(vargs, serialNum); 21056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef WIN32 21156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks vsprintf_s(messageBuffer, sizeof(messageBuffer), fmt, vargs); 21256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#else 21356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks vsprintf(messageBuffer, debugMessages[i].m_pDebugMsg, vargs); 21456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 21556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks logCallback(severity, messageBuffer); 21656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks va_end(vargs); 21756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return; 21856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 21956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 22056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks printf("Unrecognized error: Severity=%d; HashCode=%lu; SerialNum=%d\n", severity, hashCode, serialNum); 22156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} /* end EAS_ReportEx */ 22256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 22356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#else 22456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 22556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_Report() 22656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 22756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 22856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksvoid EAS_Report (int severity, const char *fmt, ...) 22956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 23056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks va_list vargs; 23156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 23256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks switch (severity) 23356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 23456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case _EAS_SEVERITY_FATAL: 23556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks eas_fatalErrors++; 23656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 23756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 23856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case _EAS_SEVERITY_ERROR: 23956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks eas_errors++; 24056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 24156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 24256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case _EAS_SEVERITY_WARNING: 24356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks eas_warnings++; 24456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 24556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 24656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks default: 24756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 24856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 24956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 25056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check severity level */ 25156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (severity > severityLevel) 25256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return; 25356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 25456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check for callback */ 25556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (logCallback == NULL) 25656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return; 25756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 25856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks va_start(vargs, fmt); 25956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _WIN32 26056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks vsprintf_s(messageBuffer, sizeof(messageBuffer), fmt, vargs); 26156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#else 26256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks vsprintf(messageBuffer, fmt, vargs); 26356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 26456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks logCallback(severity, messageBuffer); 26556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks va_end(vargs); 26656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} /* end EAS_Report */ 26756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 26856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 26956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_ReportX() 27056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 27156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 27256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksvoid EAS_ReportX (int severity, const char *fmt, ...) 27356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 27456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks va_list vargs; 27556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 27656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks switch (severity) 27756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 27856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case _EAS_SEVERITY_FATAL: 27956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks eas_fatalErrors++; 28056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 28156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 28256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case _EAS_SEVERITY_ERROR: 28356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks eas_errors++; 28456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 28556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 28656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case _EAS_SEVERITY_WARNING: 28756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks eas_warnings++; 28856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 28956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 29056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks default: 29156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 29256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 29356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 29456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check severity level */ 29556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (severity > severityLevel) 29656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return; 29756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 29856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check for callback */ 29956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (logCallback == NULL) 30056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return; 30156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 30256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks va_start(vargs, fmt); 30356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _WIN32 30456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks vsprintf_s(messageBuffer, sizeof(messageBuffer), fmt, vargs); 30556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#else 30656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks vsprintf(messageBuffer, fmt, vargs); 30756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 30856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks logCallback(severity, messageBuffer); 30956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks va_end(vargs); 31056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 31156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 31256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 31356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 31456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_DLLSetDebugLevel() 31556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 31656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 31756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_EXPORT void EAS_DLLSetDebugLevel (int severity) 31856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 31956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks severityLevel = severity; 32056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 32156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 32256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 32356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_ExSetDebugLevel() 32456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 32556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 32656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksvoid EAS_SetDebugLevel (int severity) 32756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 32856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks severityLevel = severity; 32956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 33056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 33156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 33256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_SelectLibrary() 33356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 33456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 33556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_EXPORT EAS_RESULT EAS_SelectLib (EAS_DATA_HANDLE pEASData, EAS_HANDLE streamHandle, EAS_BOOL testLib) 33656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 33756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks extern EAS_SNDLIB_HANDLE VMGetLibHandle(EAS_INT libNum); 33856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SetSoundLibrary(pEASData, streamHandle, VMGetLibHandle(testLib ? 1 : 0)); 33956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 34056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 34156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// Callback proc 34256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic OSStatus RenderProc( void *inRefCon, 34356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks AudioUnitRenderActionFlags *ioActionFlags, 34456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks const AudioTimeStamp *inTimeStamp, 34556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks UInt32 inBusNumber, 34656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks UInt32 inNumberFrames, 34756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks AudioBufferList *ioData) 34856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 34956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // Get the mutex 35056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pthread_mutex_lock(&mtx); 35156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 35256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks short* ptrOutL = (short *)ioData->mBuffers[0].mData; 35356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks short* ptrOutR = (short *)ioData->mBuffers[1].mData; 35456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 35556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks memset(ptrOutL, 0, pBuf->uOutFrames); 35656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks memset(ptrOutR, 0, pBuf->uOutFrames); 35756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 35856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // check if there is any data in the buffer 35956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pBuf->ix == 0 ) 36056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 36156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // Release the mutex and signal the python thread 36256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pthread_mutex_unlock(&mtx); 36356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pthread_cond_signal(&cond); 36456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return 0; 36556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 36656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 36756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // Get a ptr to the data 36856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks short* pData = pBuf->pData[--(pBuf->ix)]; 36956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 37056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // Now copy the data 37156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks int i; 37256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (i = 0; i < pBuf->uOutFrames; i+=2 ) 37356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 37456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *ptrOutL++ = pData[i]; 37556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *ptrOutR++ = pData[i+1]; 37656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 37756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 37856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // Release the mutex 37956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pthread_mutex_unlock(&mtx); 38056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pthread_cond_signal(&cond); 38156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 38256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return 0; 38356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 38456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 38556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT addData(EAS_PCM *pAudioBuffer) 38656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 38756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // Copy the data we got from the synth 38856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks memcpy(pBuf->pData[(pBuf->ix)++], pAudioBuffer, 2048); 38956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 39056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // Start the output Audio Unit only the first time 39156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ( bStopped == true ) 39256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 39356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks bStopped = false; 39456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks OSStatus err = AudioOutputUnitStart (OutputUnit); 39556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (err) 39656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 39756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks printf ("AudioDeviceStart=%ld\n", err); 39856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FAILURE; 39956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 40056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 40156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 40256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 40356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 40456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 40556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 40656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_EXPORT EAS_RESULT EAS_RenderWaveOut(EAS_DATA_HANDLE easHandle, EAS_PCM *pAudioBuffer, EAS_I32 numRequested, EAS_I32 *pNumGenerated) 40756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 40856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // Get the mutex 40956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pthread_mutex_lock(&mtx); 41056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 41156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // Check if our buffer is full 41256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks while(pBuf->ix == MAX_BUFFERS - 1) 41356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pthread_cond_wait(&cond, &mtx); 41456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 41556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // Call the synth the render a buffer 41656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_RESULT result = EAS_Render(easHandle, pAudioBuffer, numRequested, pNumGenerated); 41756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks addData( pAudioBuffer ); 41856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 41956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // Release the mutex 42056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pthread_mutex_unlock(&mtx); 42156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 42256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //Done 42356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 42456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 42556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 42656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef AUX_MIXER 42756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_EXPORT EAS_RESULT EAS_RenderAuxMixerWaveOut (EAS_DATA_HANDLE easHandle, EAS_PCM *pAudioBuffer, EAS_I32 *pNumGenerated) 42856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 42956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // Get the mutex 43056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pthread_mutex_lock(&mtx); 43156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 43256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // Check if our buffer is full 43356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks while(pBuf->ix == MAX_BUFFERS - 1) 43456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pthread_cond_wait(&cond, &mtx); 43556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 43656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_RESULT result = EAS_RenderAuxMixer(easHandle, pAudioBuffer, pNumGenerated); 43756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks addData( pAudioBuffer ); 43856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 43956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // Release the mutex 44056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pthread_mutex_unlock(&mtx); 44156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 44256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 44356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 44456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 44556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 44656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_EXPORT EAS_RESULT OpenWaveOutDevice(EAS_INT devNum, EAS_INT sampleRate, EAS_INT maxBufSize) 44756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 44856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // Open the default output unit 44956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks ComponentDescription desc; 45056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks desc.componentType = kAudioUnitType_Output; 45156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks desc.componentSubType = kAudioUnitSubType_DefaultOutput; 45256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks desc.componentManufacturer = kAudioUnitManufacturer_Apple; 45356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks desc.componentFlags = 0; 45456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks desc.componentFlagsMask = 0; 45556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 45656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks Component comp = FindNextComponent(NULL, &desc); 45756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (comp == NULL) 45856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 45956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks printf ("Could find the default output unit!!!\n"); 46056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FAILURE; 46156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 46256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 46356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks OSStatus err = OpenAComponent(comp, &OutputUnit); 46456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (comp == NULL) 46556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 46656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks printf ("OpenAComponent=%ld\n", err); 46756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FAILURE; 46856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 46956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 47056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // Set up a callback function to generate output to the output unit 47156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks AURenderCallbackStruct auRenderCallback; 47256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks auRenderCallback.inputProc = RenderProc; 47356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks auRenderCallback.inputProcRefCon = NULL; 47456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 47556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks err = AudioUnitSetProperty (OutputUnit, 47656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks kAudioUnitProperty_SetRenderCallback, 47756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks kAudioUnitScope_Input, 47856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 0, 47956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks &auRenderCallback, 48056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks sizeof(auRenderCallback)); 48156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (err) 48256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 48356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks printf ("AudioUnitSetProperty-CB=%ld\n", err); 48456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FAILURE;; 48556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 48656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 48756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pConfig = EAS_Config(); 48856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 48956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // The synth engine already uses short* for the buffers so let CoreAudio do any conversions if needed 49056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (sampleRate != 0) 49156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks streamFormat.mSampleRate = sampleRate; 49256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 49356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks streamFormat.mSampleRate = pConfig->sampleRate; 49456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 49556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks streamFormat.mFormatID = kAudioFormatLinearPCM; 49656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks streamFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger 49756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks | kAudioFormatFlagsNativeEndian 49856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks | kLinearPCMFormatFlagIsPacked 49956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks | kAudioFormatFlagIsNonInterleaved; 50056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 50156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks streamFormat.mBytesPerPacket = 2; 50256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks streamFormat.mFramesPerPacket = 1; 50356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks streamFormat.mBytesPerFrame = 2; 50456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks streamFormat.mChannelsPerFrame = 2; 50556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks streamFormat.mBitsPerChannel = 16; 50656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 50756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks err = AudioUnitSetProperty (OutputUnit, 50856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks kAudioUnitProperty_StreamFormat, 50956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks kAudioUnitScope_Input, 51056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 0, 51156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks &streamFormat, 51256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks sizeof(AudioStreamBasicDescription)); 51356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (err) 51456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 51556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks printf ("AudioUnitSetProperty-SF= %4.4s, %ld\n", (char*)&err, err); 51656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FAILURE; 51756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 51856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 51956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // Initialize 52056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks err = AudioUnitInitialize(OutputUnit); 52156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (err) 52256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 52356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks printf ("AudioUnitInitialize = %ld\n", err); 52456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FAILURE; 52556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 52656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 52756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pBuf = (S_BUFFER_INFO *) malloc(sizeof(S_BUFFER_INFO)); 52856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if( !pBuf ) 52956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FAILURE; 53056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 53156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pBuf->uOutBufferLength = pConfig->mixBufferSize * streamFormat.mBitsPerChannel / 2; 53256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks UInt32 uDataSize = sizeof(pBuf->uOutBufferLength); 53356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 53456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks err = AudioUnitSetProperty(OutputUnit, kAudioDevicePropertyBufferSize, kAudioUnitScope_Output, 0, &pBuf->uOutBufferLength, uDataSize); 53556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (err) 53656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 53756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks printf ("AudioUnitSetProperty = %ld\n", err); 53856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FAILURE; 53956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 54056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 54156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks err = AudioUnitGetProperty(OutputUnit, kAudioDevicePropertyBufferSize, kAudioUnitScope_Output, 0, &pBuf->uOutBufferLength, &uDataSize); 54256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (err) 54356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 54456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks printf ("AudioUnitGetProperty = %ld\n", err); 54556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FAILURE; 54656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 54756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 54856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pBuf->uLength = pBuf->uOutBufferLength; 54956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks int i; 55056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for ( i = 0; i < MAX_BUFFERS; i++) 55156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pBuf->pData[i] = malloc(pBuf->uLength); 55256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 55356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pBuf->uOutBufferLength /= pConfig->numChannels; 55456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pBuf->uOutFrames = pBuf->uOutBufferLength / sizeof(short); 55556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 55656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pBuf->ix = 0; 55756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 55856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // Init the stop flag 55956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks bStopped = true; 56056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 56156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks int result = pthread_mutex_init(&mtx, NULL); 56256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (result) 56356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 56456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks printf("pthread_mutex_init failed\n"); 56556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FAILURE; 56656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 56756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 56856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks result = pthread_cond_init(&cond, NULL); 56956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (result) 57056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 57156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks printf("pthread_cond_init failed\n"); 57256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FAILURE; 57356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 57456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 57556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // Done 57656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 57756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 57856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 57956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 58056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_EXPORT EAS_RESULT StartStream() 58156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 58256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks OSStatus err = noErr; 58356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pthread_mutex_lock(&mtx); 58456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ( bStopped == true ) 58556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 58656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks err = AudioOutputUnitStart (OutputUnit); 58756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (err) 58856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 58956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks printf ("AudioOutputUnitStart=%ld\n", err); 59056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FAILURE; 59156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 59256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks bStopped = false; 59356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 59456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 59556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 59656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 59756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 59856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 59956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_EXPORT EAS_RESULT CloseWaveOutDevice() 60056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 60156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks OSStatus err; 60256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 60356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pthread_mutex_lock(&mtx); 60456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if( false == bStopped ) 60556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 60656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks AudioOutputUnitStop (OutputUnit); 60756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks bStopped = true; 60856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 60956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks err = AudioUnitUninitialize (OutputUnit); 61056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (err) 61156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 61256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks printf ("AudioUnitUninitialize=%ld\n", err); 61356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FAILURE; 61456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 61556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 61656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks CloseComponent (OutputUnit); 61756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks int i = 0; 61856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for(i; i < MAX_BUFFERS; i++) 61956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks free(pBuf->pData[i]); 62056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 62156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks free(pBuf); 62256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 62356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 62456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pthread_mutex_unlock(&mtx); 62556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 62656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 62756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 62856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 62956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#if defined(_DEBUG) && !defined(MSC) 63056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include <crtdbg.h> 63156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 63256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EnableHeapDebug() 63356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 63456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 63556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic void EnableHeapDebug (void) 63656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 63756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks int temp; 63856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks temp = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); 63956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks temp |= _CRTDBG_ALLOC_MEM_DF; 64056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks temp |= _CRTDBG_CHECK_ALWAYS_DF; 64156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks temp |= _CRTDBG_LEAK_CHECK_DF; 64256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// temp |= _CRTDBG_DELAY_FREE_MEM_DF; 64356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks _CrtSetDbgFlag(temp); 64456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 64556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 64656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 64756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * HeapCheck() 64856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 64956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Check heap status 65056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 65156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 65256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksvoid HeapCheck (void) 65356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 65456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks int heapStatus; 65556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 65656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* Check heap status */ 65756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks heapStatus = _heapchk(); 65856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((heapStatus == _HEAPOK) || (heapStatus == _HEAPEMPTY)) 65956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return; 66056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 66156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_ReportX(_EAS_SEVERITY_FATAL, "Heap corrupt\n" ); 66256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 66356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 66456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 66556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 66656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 66756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWInit 66856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 66956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Initialize host wrapper interface 67056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 67156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 67256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 67356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_HWInit (EAS_HW_DATA_HANDLE *pHWInstData) 67456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 67556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 67656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#if defined(_DEBUG) && !defined(MSC) 67756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EnableHeapDebug(); 67856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 67956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 68056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks #ifdef BUFFERED_FILE_ACCESS 68156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_ReportX(_EAS_SEVERITY_INFO, "EAS_HWInit: Buffered file access\n"); 68256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks #else 68356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_ReportX(_EAS_SEVERITY_INFO, "EAS_HWInit: Memory mapped file access\n"); 68456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks #endif 68556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 68656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* simulate failure */ 68756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (errorConditions[eInitError]) 68856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FAILURE; 68956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 69056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* need to track file opens for duplicate handles */ 69156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pHWInstData = malloc(sizeof(EAS_HW_INST_DATA)); 69256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (!(*pHWInstData)) 69356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_MALLOC_FAILED; 69456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 69556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HWMemSet(*pHWInstData, 0, sizeof(EAS_HW_INST_DATA)); 69656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 69756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 69856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 69956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 70056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWShutdown 70156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 70256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Shut down host wrapper interface 70356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 70456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 70556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 70656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_HWShutdown (EAS_HW_DATA_HANDLE hwInstData) 70756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 70856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 70956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* simulate failure */ 71056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (errorConditions[eShutdownError]) 71156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FAILURE; 71256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 71356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks free(hwInstData); 71456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 71556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#if defined(_DEBUG) && !defined(MSC) 71656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks HeapCheck(); 71756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 71856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 71956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 72056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 72156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 72256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 72356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 72456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWMalloc 72556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 72656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Allocates dynamic memory 72756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 72856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 72956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 73056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, hwInstData) available for customer use */ 73156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksvoid *EAS_HWMalloc (EAS_HW_DATA_HANDLE hwInstData, EAS_I32 size) 73256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 73356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* simulate failure */ 73456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (errorConditions[eMallocError]) 73556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return NULL; 73656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 73756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return malloc((size_t) size); 73856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 73956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 74056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 74156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 74256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWFree 74356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 74456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Frees dynamic memory 74556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 74656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 74756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 74856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, hwInstData) available for customer use */ 74956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksvoid EAS_HWFree (EAS_HW_DATA_HANDLE hwInstData, void *p) 75056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 75156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks free(p); 75256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 75356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 75456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 75556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 75656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWMemCpy 75756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 75856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Copy memory wrapper 75956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 76056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 76156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 76256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksvoid *EAS_HWMemCpy (void *dest, const void *src, EAS_I32 amount) 76356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 76456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return memcpy(dest, src, (size_t) amount); 76556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 76656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 76756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 76856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 76956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWMemSet 77056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 77156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Set memory wrapper 77256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 77356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 77456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 77556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksvoid *EAS_HWMemSet (void *dest, int val, EAS_I32 amount) 77656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 77756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return memset(dest, val, (size_t) amount); 77856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 77956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 78056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 78156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 78256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWMemCmp 78356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 78456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Compare memory wrapper 78556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 78656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 78756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 78856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_I32 EAS_HWMemCmp (const void *s1, const void *s2, EAS_I32 amount) 78956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 79056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return (EAS_I32) memcmp(s1, s2, (size_t) amount); 79156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 79256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 79356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef BUFFERED_FILE_ACCESS 79456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 79556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 79656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWOpenFile 79756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 79856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Open a file for read or write 79956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 80056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 80156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 80256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_HWOpenFile (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_LOCATOR locator, EAS_FILE_HANDLE *pFile, EAS_FILE_MODE mode) 80356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 80456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HW_FILE *file; 80556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks int i; 80656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 80756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* set return value to NULL */ 80856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pFile = NULL; 80956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 81056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* only support read mode at this time */ 81156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (mode != EAS_FILE_READ) 81256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_INVALID_FILE_MODE; 81356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 81456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* find an empty entry in the file table */ 81556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file = hwInstData->files; 81656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (i = 0; i < EAS_MAX_FILE_HANDLES; i++) 81756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 81856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* is this slot being used? */ 81956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (file->pFile == NULL) 82056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 82156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_RESULT result; 82256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 82356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* open the file */ 82456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->pFile = fopen((const char*) locator, "rb"); 82556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (file->pFile == NULL) 82656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_FILE_OPEN_FAILED; 82756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 82856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* get file length */ 82956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWFileLength(hwInstData, file, &file->fileSize)) != EAS_SUCCESS) 83056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 83156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HWCloseFile(hwInstData, file); 83256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 83356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 83456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 83556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef DEBUG_FILE_IO 83656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWOpenFile: Open file %d\n", i); 83756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 83856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 83956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* initialize some values */ 84056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->bytesInBuffer = 0; 84156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->readIndex = 0; 84256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->filePos = 0; 84356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->dup = EAS_FALSE; 84456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 84556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pFile = file; 84656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 84756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 84856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file++; 84956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 85056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 85156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* too many open files */ 85256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_MAX_FILES_OPEN; 85356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 85456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 85556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 85656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 85756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWFillBuffer 85856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 85956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Fill buffer from file 86056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 86156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 86256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, hwInstData) hwInstData available for customer use */ 86356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_HWFillBuffer (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file) 86456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 86556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* reposition the file pointer */ 86656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (fseek(file->pFile, file->filePos, SEEK_SET) != 0) 86756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_FILE_SEEK; 86856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 86956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* read some data from the file */ 87056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->bytesInBuffer = (EAS_I32) fread(file->buffer, 1, EAS_FILE_BUFFER_SIZE, file->pFile); 87156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->readIndex = 0; 87256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (file->bytesInBuffer == 0) 87356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_EOF; 87456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 87556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 87656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 87756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 87856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 87956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWReadFile 88056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 88156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Read data from a file 88256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 88356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 88456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, hwInstData) hwInstData available for customer use */ 88556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_HWReadFile (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *pBuffer, EAS_I32 n, EAS_I32 *pBytesRead) 88656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 88756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_RESULT result; 88856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 temp; 88956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U8 *p = pBuffer; 89056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 bytesLeft = n; 89156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 89256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pBytesRead = 0; 89356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 89456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check handle integrity */ 89556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (file->pFile == NULL) 89656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_INVALID_HANDLE; 89756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 89856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef DEBUG_FILE_IO 89956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWReadFile: Reading %d bytes from position %d\n", n, file->filePos); 90056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 90156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 90256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* try to fulfill request from buffer */ 90356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (;bytesLeft > 0;) 90456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 90556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* how many bytes can we get from buffer? */ 90656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks temp = file->bytesInBuffer - file->readIndex; 90756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (temp > bytesLeft) 90856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks temp = bytesLeft; 90956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 91056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* copy data from buffer */ 91156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HWMemCpy(p, &file->buffer[file->readIndex], temp); 91256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pBytesRead += temp; 91356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->readIndex += temp; 91456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->filePos += temp; 91556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks p += temp; 91656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks bytesLeft -= temp; 91756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 91856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* don't refill buffer if request is bigger than buffer */ 91956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((bytesLeft == 0) || (bytesLeft >= EAS_FILE_BUFFER_SIZE)) 92056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 92156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 92256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* refill buffer */ 92356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWFillBuffer(hwInstData, file)) != EAS_SUCCESS) 92456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 92556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 92656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 92756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* more to read? do unbuffered read directly to target memory */ 92856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (bytesLeft) 92956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 93056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 93156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* position the file pointer */ 93256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (fseek(file->pFile, file->filePos, SEEK_SET) != 0) 93356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_FILE_SEEK; 93456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 93556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* read data in the buffer */ 93656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks temp = (EAS_I32) fread(p, 1, (size_t) bytesLeft, file->pFile); 93756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pBytesRead += temp; 93856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->filePos += temp; 93956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 94056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* reset buffer info */ 94156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->bytesInBuffer = 0; 94256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->readIndex = 0; 94356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 94456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 94556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef DEBUG_FILE_IO 94656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 94756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define BYTES_PER_LINE 16 94856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks char str[BYTES_PER_LINE * 3 + 1]; 94956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_INT i; 95056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (i = 0; i < (n > BYTES_PER_LINE ? BYTES_PER_LINE : n) ; i ++) 95156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks sprintf(&str[i*3], "%02x ", ((EAS_U8*)pBuffer)[i]); 95256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (i) 95356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_ReportX(_EAS_SEVERITY_NOFILTER, "%s\n", str); 95456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 95556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 95656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 95756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* were n bytes read? */ 95856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (*pBytesRead != n) 95956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_EOF; 96056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 96156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 96256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 96356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 96456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 96556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 96656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWGetByte 96756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 96856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Read a byte from a file 96956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 97056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 97156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, hwInstData) hwInstData available for customer use */ 97256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_HWGetByte (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *p) 97356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 97456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_RESULT result; 97556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 97656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check handle integrity */ 97756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (file->pFile == NULL) 97856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_INVALID_HANDLE; 97956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 98056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* use local buffer - do we have any data? */ 98156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (file->readIndex >= file->bytesInBuffer) 98256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 98356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWFillBuffer(hwInstData, file)) != EAS_SUCCESS) 98456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 98556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 98656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* if nothing to read, return EOF */ 98756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (file->bytesInBuffer == 0) 98856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_EOF; 98956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 99056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 99156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* get a character from the buffer */ 99256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *((EAS_U8*) p) = file->buffer[file->readIndex++]; 99356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 99456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef DEBUG_FILE_IO 99556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWGetByte: Reading from position %d, byte = 0x%02x\n", file->filePos, *(EAS_U8*)p); 99656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 99756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 99856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->filePos++; 99956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 100056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 100156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 100256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 100356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 100456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWGetWord 100556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 100656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Read a 16-bit value from the file 100756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 100856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 100956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_HWGetWord (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *p, EAS_BOOL msbFirst) 101056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 101156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_RESULT result; 101256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 count; 101356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U8 c[2]; 101456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 101556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef DEBUG_FILE_IO 101656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWGetWord: Reading 2 bytes from position %d\n", file->filePos); 101756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 101856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 101956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* read 2 bytes from the file */ 102056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWReadFile(hwInstData, file, c, 2, &count)) != EAS_SUCCESS) 102156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 102256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 102356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* order them as requested */ 102456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (msbFirst) 102556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *((EAS_U16*) p) = ((EAS_U16) c[0] << 8) | c[1]; 102656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 102756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *((EAS_U16*) p) = ((EAS_U16) c[1] << 8) | c[0]; 102856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 102956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 103056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 103156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 103256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 103356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 103456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWGetDWord 103556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 103656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Read a 16-bit value from the file 103756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 103856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 103956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_HWGetDWord (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *p, EAS_BOOL msbFirst) 104056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 104156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_RESULT result; 104256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 count; 104356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U8 c[4]; 104456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 104556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef DEBUG_FILE_IO 104656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWGetDWord: Reading 4 bytes from position %d\n", file->filePos); 104756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 104856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 104956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* read 4 bytes from the file */ 105056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWReadFile(hwInstData, file, c, 4, &count)) != EAS_SUCCESS) 105156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 105256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 105356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* order them as requested */ 105456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (msbFirst) 105556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *((EAS_U32*) p) = ((EAS_U32) c[0] << 24) | ((EAS_U32) c[1] << 16) | ((EAS_U32) c[2] << 8) | c[3]; 105656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 105756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *((EAS_U32*) p) = ((EAS_U32) c[3] << 24) | ((EAS_U32) c[2] << 16) | ((EAS_U32) c[1] << 8) | c[0]; 105856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 105956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 106056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 106156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 106256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 106356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 106456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWFilePos 106556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 106656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns the current location in the file 106756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 106856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 106956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 107056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, hwInstData) hwInstData available for customer use */ 107156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_HWFilePos (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_I32 *pPosition) 107256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 107356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 107456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check handle integrity */ 107556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (file->pFile == NULL) 107656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_INVALID_HANDLE; 107756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 107856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pPosition = file->filePos; 107956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 108056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 108156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 108256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 108356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 108456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWFileSeek 108556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 108656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Seek to a specific location in the file 108756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 108856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 108956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 109056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, hwInstData) hwInstData available for customer use */ 109156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_HWFileSeek (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_I32 position) 109256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 109356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 newIndex; 109456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 109556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check handle integrity */ 109656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (file->pFile == NULL) 109756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_INVALID_HANDLE; 109856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 109956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check for seek past end */ 110056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((position < 0) || (position > file->fileSize)) 110156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_FILE_SEEK; 110256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 110356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef DEBUG_FILE_IO 110456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWFileSeek: Seeking to new position %d\n", file->filePos); 110556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 110656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 110756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* is new position in current buffer? */ 110856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks newIndex = position - file->filePos + file->readIndex; 110956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((newIndex >= 0) && (newIndex < file->bytesInBuffer)) 111056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 111156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->readIndex = newIndex; 111256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->filePos = position; 111356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 111456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 111556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 111656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* save new position and reset buffer info so EAS_HWGetByte doesn't fail */ 111756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->filePos = position; 111856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->bytesInBuffer = 0; 111956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->readIndex = 0; 112056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 112156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 112256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 112356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 112456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 112556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWFileSeekOfs 112656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 112756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Seek forward or back relative to the current position 112856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 112956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 113056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 113156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, hwInstData) hwInstData available for customer use */ 113256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_HWFileSeekOfs (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_I32 position) 113356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 113456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 temp; 113556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 113656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef DEBUG_FILE_IO 113756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWFileSeekOfs: Seeking to new position %d\n", file->filePos + position); 113856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 113956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 114056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check handle integrity */ 114156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (file->pFile == NULL) 114256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_INVALID_HANDLE; 114356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 114456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check for seek past end */ 114556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks temp = file->filePos + position; 114656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((temp < 0) || (temp > file->fileSize)) 114756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_FILE_SEEK; 114856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 114956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* is new position in current buffer? */ 115056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks temp = position + file->readIndex; 115156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((temp >= 0) && (temp < file->bytesInBuffer)) 115256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 115356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->readIndex = temp; 115456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->filePos += position; 115556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 115656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 115756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 115856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* save new position and reset buffer info so EAS_HWGetByte doesn't fail */ 115956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->filePos += position; 116056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->bytesInBuffer = 0; 116156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->readIndex = 0; 116256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 116356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 116456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 116556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 116656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 116756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWFileLength 116856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 116956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Return the file length 117056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 117156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 117256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 117356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, hwInstData) hwInstData available for customer use */ 117456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_HWFileLength (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_I32 *pLength) 117556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 117656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks long pos; 117756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 117856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check handle integrity */ 117956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (file->pFile == NULL) 118056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_INVALID_HANDLE; 118156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 118256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((pos = ftell(file->pFile)) == -1L) 118356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_FILE_LENGTH; 118456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (fseek(file->pFile, 0L, SEEK_END) != 0) 118556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_FILE_LENGTH; 118656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((*pLength = ftell(file->pFile)) == -1L) 118756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_FILE_LENGTH; 118856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (fseek(file->pFile, pos, SEEK_SET) != 0) 118956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_FILE_LENGTH; 119056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 119156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 119256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 119356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 119456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 119556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWDupHandle 119656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 119756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Duplicate a file handle 119856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 119956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 120056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 120156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_HWDupHandle (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_FILE_HANDLE* pDupFile) 120256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 120356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HW_FILE *dupfile; 120456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks int i; 120556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 120656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check handle integrity */ 120756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pDupFile = NULL; 120856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (file->pFile == NULL) 120956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_INVALID_HANDLE; 121056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 121156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* find an empty entry in the file table */ 121256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks dupfile = hwInstData->files; 121356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (i = 0; i < EAS_MAX_FILE_HANDLES; i++) 121456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 121556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* is this slot being used? */ 121656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (dupfile->pFile == NULL) 121756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 121856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 121956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* copy info from the handle to be duplicated */ 122056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks dupfile->filePos = file->filePos; 122156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks dupfile->pFile = file->pFile; 122256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks dupfile->fileSize = file->fileSize; 122356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 122456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* set the duplicate handle flag */ 122556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks dupfile->dup = file->dup = EAS_TRUE; 122656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 122756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* initialize some values */ 122856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks dupfile->bytesInBuffer = 0; 122956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks dupfile->readIndex = 0; 123056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 123156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pDupFile = dupfile; 123256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 123356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 123456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks dupfile++; 123556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 123656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 123756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* too many open files */ 123856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_MAX_FILES_OPEN; 123956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 124056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 124156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 124256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 124356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWClose 124456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 124556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Wrapper for fclose function 124656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 124756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 124856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 124956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_HWCloseFile (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file1) 125056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 125156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HW_FILE *file2,*dupFile; 125256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks int i; 125356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 125456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check handle integrity */ 125556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (file1->pFile == NULL) 125656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_INVALID_HANDLE; 125756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 125856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check for duplicate handle */ 125956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (file1->dup) 126056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 126156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks dupFile = NULL; 126256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file2 = hwInstData->files; 126356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (i = 0; i < EAS_MAX_FILE_HANDLES; i++) 126456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 126556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check for duplicate */ 126656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((file1 != file2) && (file2->pFile == file1->pFile)) 126756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 126856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* is there more than one duplicate? */ 126956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (dupFile != NULL) 127056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 127156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* clear this entry and return */ 127256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file1->pFile = NULL; 127356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 127456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 127556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 127656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* this is the first duplicate found */ 127756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks dupFile = file2; 127856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 127956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file2++; 128056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 128156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 128256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* there is only one duplicate, clear the dup flag */ 128356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (dupFile) 128456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks dupFile->dup = EAS_FALSE; 128556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 128656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* if we get here, there's a serious problem */ 128756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_HANDLE_INTEGRITY; 128856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 128956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* clear this entry and return */ 129056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file1->pFile = NULL; 129156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 129256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 129356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 129456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* no duplicates - close the file */ 129556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (fclose(file1->pFile) != 0) 129656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_CLOSE_FAILED; 129756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 129856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* clear this entry and return */ 129956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file1->pFile = NULL; 130056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 130156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 130256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#else 130356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 130456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 130556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWOpenFile 130656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 130756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Open a file for read or write 130856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 130956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 131056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 131156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_HWOpenFile (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_LOCATOR locator, EAS_FILE_HANDLE *pFile, EAS_FILE_MODE mode) 131256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 131356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HW_FILE *file; 131456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks FILE *ioFile; 131556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks int i, temp; 131656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 131756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* set return value to NULL */ 131856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pFile = NULL; 131956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 132056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* simulate failure */ 132156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (errorConditions[eOpenError]) 132256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FAILURE; 132356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 132456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* only support read mode at this time */ 132556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (mode != EAS_FILE_READ) 132656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_INVALID_FILE_MODE; 132756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 132856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* find an empty entry in the file table */ 132956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file = hwInstData->files; 133056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (i = 0; i < EAS_MAX_FILE_HANDLES; i++) 133156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 133256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* is this slot being used? */ 133356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (file->buffer == NULL) 133456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 133556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* open the file */ 133656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((ioFile = fopen(locator,"rb")) == NULL) 133756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_FILE_OPEN_FAILED; 133856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 133956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* determine the file size */ 134056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (fseek(ioFile, 0L, SEEK_END) != 0) 134156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_FILE_LENGTH; 134256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((file->fileSize = ftell(ioFile)) == -1L) 134356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_FILE_LENGTH; 134456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (fseek(ioFile, 0L, SEEK_SET) != 0) 134556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_FILE_LENGTH; 134656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 134756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* allocate a buffer */ 134856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->buffer = EAS_HWMalloc(hwInstData, file->fileSize); 134956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (file->buffer == NULL) 135056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 135156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks fclose(ioFile); 135256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_MALLOC_FAILED; 135356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 135456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 135556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* read the file into memory */ 135656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks temp = (int) fread(file->buffer, (size_t) file->fileSize, 1, ioFile); 135756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 135856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* close the file - don't need it any more */ 135956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks fclose(ioFile); 136056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 136156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check for error reading file */ 136256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (temp != 1) 136356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_FILE_READ_FAILED; 136456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 136556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* initialize some values */ 136656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->filePos = 0; 136756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->dup = EAS_FALSE; 136856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 136956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pFile = file; 137056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 137156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 137256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file++; 137356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 137456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 137556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* too many open files */ 137656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_MAX_FILES_OPEN; 137756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 137856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 137956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 138056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 138156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWReadFile 138256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 138356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Read data from a file 138456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 138556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 138656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 138756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, hwInstData) available for customer use */ 138856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_HWReadFile (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *pBuffer, EAS_I32 n, EAS_I32 *pBytesRead) 138956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 139056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 count; 139156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 139256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* simulate failure */ 139356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (errorConditions[eReadError]) 139456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FAILURE; 139556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 139656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* make sure we have a valid handle */ 139756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (file->buffer == NULL) 139856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_INVALID_HANDLE; 139956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 140056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* calculate the bytes to read */ 140156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks count = file->fileSize - file->filePos; 140256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (n < count) 140356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks count = n; 140456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 140556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* copy the data to the requested location, and advance the pointer */ 140656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (count) 140756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HWMemCpy(pBuffer, &file->buffer[file->filePos], count); 140856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->filePos += count; 140956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pBytesRead = count; 141056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 141156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* were n bytes read? */ 141256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (count!= n) 141356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_EOF; 141456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 141556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 141656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 141756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 141856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 141956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWGetByte 142056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 142156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Read a byte from a file 142256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 142356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 142456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 142556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -e{715} hwInstData available for customer use */ 142656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_HWGetByte (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *p) 142756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 142856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 142956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* simulate failure */ 143056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (errorConditions[eReadError]) 143156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FAILURE; 143256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 143356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* make sure we have a valid handle */ 143456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (file->buffer == NULL) 143556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_INVALID_HANDLE; 143656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 143756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check for end of file */ 143856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (file->filePos >= file->fileSize) 143956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 144056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *((EAS_U8*) p) = 0; 144156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_EOF; 144256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 144356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 144456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* get a character from the buffer */ 144556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *((EAS_U8*) p) = file->buffer[file->filePos++]; 144656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 144756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 144856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 144956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 145056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 145156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWGetWord 145256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 145356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns the current location in the file 145456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 145556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 145656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 145756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, hwInstData) available for customer use */ 145856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_HWGetWord (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *p, EAS_BOOL msbFirst) 145956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 146056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_RESULT result; 146156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U8 c1, c2; 146256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 146356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* read 2 bytes from the file */ 146456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWGetByte(hwInstData, file, &c1)) != EAS_SUCCESS) 146556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 146656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWGetByte(hwInstData, file, &c2)) != EAS_SUCCESS) 146756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 146856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 146956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* order them as requested */ 147056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (msbFirst) 147156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *((EAS_U16*) p) = ((EAS_U16) c1 << 8) | c2; 147256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 147356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *((EAS_U16*) p) = ((EAS_U16) c2 << 8) | c1; 147456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 147556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 147656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 147756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 147856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 147956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 148056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWGetDWord 148156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 148256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns the current location in the file 148356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 148456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 148556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 148656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, hwInstData) available for customer use */ 148756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_HWGetDWord (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *p, EAS_BOOL msbFirst) 148856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 148956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_RESULT result; 149056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_U8 c1, c2,c3,c4; 149156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 149256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* read 4 bytes from the file */ 149356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWGetByte(hwInstData, file, &c1)) != EAS_SUCCESS) 149456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 149556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWGetByte(hwInstData, file, &c2)) != EAS_SUCCESS) 149656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 149756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWGetByte(hwInstData, file, &c3)) != EAS_SUCCESS) 149856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 149956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((result = EAS_HWGetByte(hwInstData, file, &c4)) != EAS_SUCCESS) 150056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return result; 150156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 150256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* order them as requested */ 150356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (msbFirst) 150456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *((EAS_U32*) p) = ((EAS_U32) c1 << 24) | ((EAS_U32) c2 << 16) | ((EAS_U32) c3 << 8) | c4; 150556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 150656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *((EAS_U32*) p)= ((EAS_U32) c4 << 24) | ((EAS_U32) c3 << 16) | ((EAS_U32) c2 << 8) | c1; 150756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 150856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 150956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 151056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 151156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 151256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 151356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWFilePos 151456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 151556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns the current location in the file 151656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 151756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 151856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 151956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, hwInstData) available for customer use */ 152056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_HWFilePos (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_I32 *pPosition) 152156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 152256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 152356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* simulate failure */ 152456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (errorConditions[ePosError]) 152556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FAILURE; 152656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 152756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* make sure we have a valid handle */ 152856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (file->buffer == NULL) 152956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_INVALID_HANDLE; 153056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 153156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pPosition = file->filePos; 153256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 153356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} /* end EAS_HWFilePos */ 153456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 153556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 153656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 153756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWFileSeek 153856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 153956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Seek to a specific location in the file 154056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 154156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 154256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 154356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, hwInstData) available for customer use */ 154456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_HWFileSeek (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_I32 position) 154556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 154656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 154756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* simulate failure */ 154856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (errorConditions[eSeekError]) 154956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FAILURE; 155056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 155156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* make sure we have a valid handle */ 155256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (file->buffer == NULL) 155356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_INVALID_HANDLE; 155456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 155556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* validate new position */ 155656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((position < 0) || (position > file->fileSize)) 155756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_FILE_SEEK; 155856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 155956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* save new position */ 156056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->filePos = position; 156156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 156256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 156356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 156456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 156556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 156656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWFileSeekOfs 156756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 156856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Seek forward or back relative to the current position 156956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 157056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 157156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 157256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, hwInstData) available for customer use */ 157356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_HWFileSeekOfs (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_I32 position) 157456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 157556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 157656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* simulate failure */ 157756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (errorConditions[eSeekError]) 157856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FAILURE; 157956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 158056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* make sure we have a valid handle */ 158156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (file->buffer == NULL) 158256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_INVALID_HANDLE; 158356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 158456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* determine the file position */ 158556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks position += file->filePos; 158656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((position < 0) || (position > file->fileSize)) 158756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_FILE_SEEK; 158856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 158956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* save new position */ 159056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file->filePos = position; 159156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 159256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 159356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 159456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 159556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 159656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWFileLength 159756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 159856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Return the file length 159956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 160056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 160156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 160256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, hwInstData) available for customer use */ 160356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_HWFileLength (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_I32 *pLength) 160456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 160556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 160656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* simulate failure */ 160756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (errorConditions[eLengthError]) 160856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FAILURE; 160956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 161056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* make sure we have a valid handle */ 161156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (file->buffer == NULL) 161256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_INVALID_HANDLE; 161356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 161456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pLength = file->fileSize; 161556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 161656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 161756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 161856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 161956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 162056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWDupHandle 162156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 162256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Duplicate a file handle 162356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 162456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 162556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 162656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_HWDupHandle (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_FILE_HANDLE *pDupFile) 162756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 162856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HW_FILE *dupFile; 162956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks int i; 163056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 163156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* simulate failure */ 163256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (errorConditions[eDupError]) 163356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FAILURE; 163456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 163556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* make sure we have a valid handle */ 163656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (file->buffer == NULL) 163756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_INVALID_HANDLE; 163856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 163956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* find an empty entry in the file table */ 164056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks dupFile = hwInstData->files; 164156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (i = 0; i < EAS_MAX_FILE_HANDLES; i++) 164256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 164356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* is this slot being used? */ 164456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (dupFile->buffer == NULL) 164556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 164656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 164756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* copy info from the handle to be duplicated */ 164856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks dupFile->filePos = file->filePos; 164956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks dupFile->fileSize = file->fileSize; 165056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks dupFile->buffer = file->buffer; 165156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 165256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* set the duplicate handle flag */ 165356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks dupFile->dup = file->dup = EAS_TRUE; 165456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 165556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pDupFile = dupFile; 165656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 165756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 165856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks dupFile++; 165956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 166056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 166156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* too many open files */ 166256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_MAX_FILES_OPEN; 166356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 166456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 166556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 166656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 166756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWClose 166856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 166956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Wrapper for fclose function 167056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 167156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 167256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 167356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_HWCloseFile (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file1) 167456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 167556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HW_FILE *file2,*dupFile; 167656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks int i; 167756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 167856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* simulate failure */ 167956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (errorConditions[eCloseError]) 168056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FAILURE; 168156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 168256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* make sure we have a valid handle */ 168356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (file1->buffer == NULL) 168456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_INVALID_HANDLE; 168556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 168656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check for duplicate handle */ 168756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (file1->dup) 168856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 168956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks dupFile = NULL; 169056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file2 = hwInstData->files; 169156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (i = 0; i < EAS_MAX_FILE_HANDLES; i++) 169256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 169356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check for duplicate */ 169456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((file1 != file2) && (file2->buffer == file1->buffer)) 169556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 169656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* is there more than one duplicate? */ 169756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (dupFile != NULL) 169856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 169956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* clear this entry and return */ 170056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file1->buffer = NULL; 170156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 170256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 170356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 170456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* this is the first duplicate found */ 170556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 170656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks dupFile = file2; 170756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 170856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file2++; 170956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 171056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 171156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* there is only one duplicate, clear the dup flag */ 171256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (dupFile) 171356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks dupFile->dup = EAS_FALSE; 171456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 171556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* if we get here, there's a serious problem */ 171656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_HANDLE_INTEGRITY; 171756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 171856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* clear this entry and return */ 171956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file1->buffer = NULL; 172056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 172156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 172256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 172356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* no duplicates -free the buffer */ 172456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HWFree(hwInstData, file1->buffer); 172556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 172656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* clear this entry and return */ 172756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks file1->buffer = NULL; 172856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 172956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 173056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 173156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 173256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 173356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 173456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWVibrate 173556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 173656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Turn on/off vibrate function 173756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 173856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 173956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 174056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, hwInstData) available for customer use */ 174156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_HWVibrate (EAS_HW_DATA_HANDLE hwInstData, EAS_BOOL state) 174256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 174356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks vibState = state; 174456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// EAS_ReportX(_EAS_SEVERITY_NOFILTER, "Vibrate state: %d\n", state); 174556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 174656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} /* end EAS_HWVibrate */ 174756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 174856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 174956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 175056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWLED 175156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 175256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Turn on/off LED 175356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 175456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 175556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 175656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, hwInstData) available for customer use */ 175756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_HWLED (EAS_HW_DATA_HANDLE hwInstData, EAS_BOOL state) 175856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 175956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks ledState = state; 176056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// EAS_ReportX(_EAS_SEVERITY_NOFILTER, "LED state: %d\n", state); 176156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 176256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 176356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 176456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 176556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 176656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWBackLight 176756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 176856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Turn on/off backlight 176956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 177056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 177156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 177256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, hwInstData) available for customer use */ 177356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_HWBackLight (EAS_HW_DATA_HANDLE hwInstData, EAS_BOOL state) 177456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 177556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks backlightState = state; 177656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// EAS_ReportX(_EAS_SEVERITY_NOFILTER, "Backlight state: %d\n", state); 177756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 177856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 177956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 178056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 178156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 178256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_HWYield 178356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 178456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * This function is called periodically by the EAS library to give the 178556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * host an opportunity to allow other tasks to run. There are two ways to 178656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * use this call: 178756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 178856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * If you have a multi-tasking OS, you can call the yield function in the 178956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * OS to allow other tasks to run. In this case, return EAS_FALSE to tell 179056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * the EAS library to continue processing when control returns from this 179156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * function. 179256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 179356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * If tasks run in a single thread by sequential function calls (sometimes 179456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * call a "commutator loop"), return EAS_TRUE to cause the EAS Library to 179556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * return to the caller. Be sure to check the number of bytes rendered 179656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * before passing the audio buffer to the codec - it may not be filled. 179756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * The next call to EAS_Render will continue processing until the buffer 179856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * has been filled. 179956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 180056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 180156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 180256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*lint -esym(715, hwInstData) available for customer use */ 180356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_BOOL EAS_HWYield (EAS_HW_DATA_HANDLE hwInstData) 180456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 180556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* put your code here */ 180656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_FALSE; 180756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 180856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 180956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 1810