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