1 /*---------------------------------------------------------------------------- 2 * 3 * File: 4 * eas_host.c 5 * 6 * Contents and purpose: 7 * This file contains the host wrapper functions for stdio, stdlib, etc. 8 * This is a sample version that wraps the standard library functions. 9 * Modify this file to suit the needs of your particular system. 10 * 11 * EAS_MAX_FILE_HANDLES sets the maximum number of MIDI streams within 12 * a MIDI type 1 file that can be played. To maintain efficiency, data 13 * is buffered locally when byte access is used (EAS_HWGetByte). The 14 * size of the buffer is set by EAS_FILE_BUFFER_SIZE. 15 * 16 * EAS_HW_FILE is a structure to support local file buffering. It 17 * comprises the OS File handle, some data related to the local file 18 * buffer, the position of the next byte of data to be read, the dup 19 * flag which when set, indicates that the handle has been duplicated, 20 * and the data buffer. Since the data buffer is only used for byte 21 * access, it does not need to be large. 22 * 23 * If the file system supports duplicate file handles and buffering, 24 * this entire subsystem can be replaced with direct calls to the 25 * native file I/O routines. 26 * 27 * If the system has enough memory to support reading the entire file 28 * into memory, it will be much more efficient to do so on the call to 29 * EAS_HWOpenFile and then close the file. Simply substitute a memory 30 * pointer for the FILE* pointer. Calls to EAS_HW_DupHandle will work 31 * as they do in this version. In the call to EAS_HWCloseFile, instead 32 * of calling fclose, free the memory containing the file data. 33 * 34 * Copyright 2005 Sonic Network Inc. 35 36 * Licensed under the Apache License, Version 2.0 (the "License"); 37 * you may not use this file except in compliance with the License. 38 * You may obtain a copy of the License at 39 * 40 * http://www.apache.org/licenses/LICENSE-2.0 41 * 42 * Unless required by applicable law or agreed to in writing, software 43 * distributed under the License is distributed on an "AS IS" BASIS, 44 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 45 * See the License for the specific language governing permissions and 46 * limitations under the License. 47 * 48 *---------------------------------------------------------------------------- 49 * Revision Control: 50 * $Revision: 853 $ 51 * $Date: 2007-09-05 09:54:17 -0700 (Wed, 05 Sep 2007) $ 52 *---------------------------------------------------------------------------- 53 */ 54 55 #ifdef _lint 56 #include "lint_stdlib.h" 57 #else 58 #include <stdio.h> 59 #include <stdlib.h> 60 #include <string.h> 61 #endif 62 63 #include "eas_host.h" 64 65 // #define DEBUG_FILE_IO 66 67 /* Only for debugging LED, vibrate, and backlight functions */ 68 #include "eas_report.h" 69 70 #ifndef EAS_MAX_FILE_HANDLES 71 #define EAS_MAX_FILE_HANDLES 32 72 #endif 73 74 #ifndef EAS_FILE_BUFFER_SIZE 75 #define EAS_FILE_BUFFER_SIZE 32 76 #endif 77 78 /* 79 * this structure and the related function are here 80 * to support the ability to create duplicate handles 81 * and buffering into a single file. If the OS supports 82 * duplicate file handles natively, this code can be 83 * stripped to eliminate double-buffering. 84 */ 85 typedef struct eas_hw_file_tag 86 { 87 FILE *pFile; 88 EAS_I32 bytesInBuffer; 89 EAS_I32 readIndex; 90 EAS_I32 filePos; 91 EAS_BOOL dup; 92 EAS_U8 buffer[EAS_FILE_BUFFER_SIZE]; 93 } EAS_HW_FILE; 94 95 typedef struct eas_hw_inst_data_tag 96 { 97 EAS_HW_FILE files[EAS_MAX_FILE_HANDLES]; 98 } EAS_HW_INST_DATA; 99 100 /* local memory for files and streams */ 101 #ifdef _STATIC_MEMORY 102 EAS_HW_INST_DATA fileData; 103 #endif 104 105 /*---------------------------------------------------------------------------- 106 * EAS_HWInit 107 * 108 * Initialize host wrapper interface 109 * 110 *---------------------------------------------------------------------------- 111 */ 112 EAS_RESULT EAS_HWInit (EAS_HW_DATA_HANDLE *pHWInstData) 113 { 114 115 /* need to track file opens for duplicate handles */ 116 #ifndef _STATIC_MEMORY 117 *pHWInstData = malloc(sizeof(EAS_HW_INST_DATA)); 118 if (!(*pHWInstData)) 119 return EAS_ERROR_MALLOC_FAILED; 120 #else 121 *pHWInstData = &fileData; 122 #endif 123 EAS_HWMemSet(*pHWInstData, 0, sizeof(EAS_HW_INST_DATA)); 124 return EAS_SUCCESS; 125 } 126 127 /*---------------------------------------------------------------------------- 128 * EAS_HWShutdown 129 * 130 * Shut down host wrapper interface 131 * 132 *---------------------------------------------------------------------------- 133 */ 134 /*lint -esym(715, hwInstData) hwInstData available for customer use */ 135 EAS_RESULT EAS_HWShutdown (EAS_HW_DATA_HANDLE hwInstData) 136 { 137 138 #ifndef _STATIC_MEMORY 139 free(hwInstData); 140 #endif 141 return EAS_SUCCESS; 142 } 143 144 /*---------------------------------------------------------------------------- 145 * 146 * EAS_HWMalloc 147 * 148 * Allocates dynamic memory 149 * 150 *---------------------------------------------------------------------------- 151 */ 152 /*lint -esym(715, hwInstData) hwInstData available for customer use */ 153 #ifdef _STATIC_MEMORY 154 /*lint -esym(715, size) not used in static memory model */ 155 #endif 156 void *EAS_HWMalloc (EAS_HW_DATA_HANDLE hwInstData, EAS_I32 size) 157 { 158 #ifdef _STATIC_MEMORY 159 return NULL; 160 #else 161 return malloc((EAS_U32)size); 162 #endif 163 } 164 165 /*---------------------------------------------------------------------------- 166 * 167 * EAS_HWFree 168 * 169 * Frees dynamic memory 170 * 171 *---------------------------------------------------------------------------- 172 */ 173 /*lint -esym(715, hwInstData) hwInstData available for customer use */ 174 #ifdef _STATIC_MEMORY 175 /*lint -esym(715, p) not used in static memory model */ 176 #endif 177 void EAS_HWFree(EAS_HW_DATA_HANDLE hwInstData, void *p) 178 { 179 #ifndef _STATIC_MEMORY 180 free(p); 181 #endif 182 } 183 184 /*---------------------------------------------------------------------------- 185 * 186 * EAS_HWMemCpy 187 * 188 * Copy memory wrapper 189 * 190 *---------------------------------------------------------------------------- 191 */ 192 void *EAS_HWMemCpy (void *dest, const void *src, EAS_I32 amount) 193 { 194 return memcpy(dest,src,(size_t) amount); 195 } 196 197 /*---------------------------------------------------------------------------- 198 * 199 * EAS_HWMemSet 200 * 201 * Set memory wrapper 202 * 203 *---------------------------------------------------------------------------- 204 */ 205 void *EAS_HWMemSet (void *dest, int val, EAS_I32 amount) 206 { 207 return memset(dest,val,(size_t) amount); 208 } 209 210 /*---------------------------------------------------------------------------- 211 * 212 * EAS_HWMemCmp 213 * 214 * Compare memory wrapper 215 * 216 *---------------------------------------------------------------------------- 217 */ 218 EAS_I32 EAS_HWMemCmp (const void *s1, const void *s2, EAS_I32 amount) 219 { 220 return (EAS_I32) memcmp(s1, s2, (size_t) amount); 221 } 222 223 /*---------------------------------------------------------------------------- 224 * 225 * EAS_HWOpenFile 226 * 227 * Open a file for read or write 228 * 229 *---------------------------------------------------------------------------- 230 */ 231 EAS_RESULT EAS_HWOpenFile (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_LOCATOR locator, EAS_FILE_HANDLE *pFile, EAS_FILE_MODE mode) 232 { 233 EAS_HW_FILE *file; 234 int i; 235 236 /* set return value to NULL */ 237 *pFile = NULL; 238 239 /* only support read mode at this time */ 240 if (mode != EAS_FILE_READ) 241 return EAS_ERROR_INVALID_FILE_MODE; 242 243 /* find an empty entry in the file table */ 244 file = hwInstData->files; 245 for (i = 0; i < EAS_MAX_FILE_HANDLES; i++) 246 { 247 /* is this slot being used? */ 248 if (file->pFile == NULL) 249 { 250 /* open the file */ 251 if (locator->path) 252 file->pFile = fopen((const char*) locator->path, "rb"); 253 if (file->pFile == NULL) 254 return EAS_ERROR_FILE_OPEN_FAILED; 255 256 #ifdef DEBUG_FILE_IO 257 EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWOpenFile: Open file %d\n", i); 258 #endif 259 260 /* initialize some values */ 261 file->bytesInBuffer = 0; 262 file->readIndex = 0; 263 file->filePos = 0; 264 file->dup = EAS_FALSE; 265 266 *pFile = file; 267 return EAS_SUCCESS; 268 } 269 file++; 270 } 271 272 /* too many open files */ 273 return EAS_ERROR_MAX_FILES_OPEN; 274 } 275 276 /*---------------------------------------------------------------------------- 277 * 278 * EAS_HWFillBuffer 279 * 280 * Fill buffer from file 281 *---------------------------------------------------------------------------- 282 */ 283 /*lint -esym(715, hwInstData) hwInstData available for customer use */ 284 EAS_RESULT EAS_HWFillBuffer (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file) 285 { 286 /* reposition the file pointer */ 287 if (fseek(file->pFile, file->filePos, SEEK_SET) != 0) 288 return EAS_ERROR_FILE_SEEK; 289 290 /* read some data from the file */ 291 file->bytesInBuffer = (EAS_I32) fread(file->buffer, 1, EAS_FILE_BUFFER_SIZE, file->pFile); 292 file->readIndex = 0; 293 if (file->bytesInBuffer == 0) 294 return EAS_EOF; 295 return EAS_SUCCESS; 296 } 297 298 /*---------------------------------------------------------------------------- 299 * 300 * EAS_HWReadFile 301 * 302 * Read data from a file 303 *---------------------------------------------------------------------------- 304 */ 305 /*lint -esym(715, hwInstData) hwInstData available for customer use */ 306 EAS_RESULT EAS_HWReadFile (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *pBuffer, EAS_I32 n, EAS_I32 *pBytesRead) 307 { 308 EAS_RESULT result; 309 EAS_I32 temp; 310 EAS_U8 *p = pBuffer; 311 EAS_I32 bytesLeft = n; 312 313 *pBytesRead = 0; 314 315 /* check handle integrity */ 316 if (file->pFile == NULL) 317 return EAS_ERROR_INVALID_HANDLE; 318 319 #ifdef DEBUG_FILE_IO 320 EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWReadFile: Reading %d bytes from position %d\n", n, file->filePos); 321 #endif 322 323 /* try to fulfill request from buffer */ 324 for (;bytesLeft > 0;) 325 { 326 /* how many bytes can we get from buffer? */ 327 temp = file->bytesInBuffer - file->readIndex; 328 if (temp > bytesLeft) 329 temp = bytesLeft; 330 331 /* copy data from buffer */ 332 EAS_HWMemCpy(p, &file->buffer[file->readIndex], temp); 333 *pBytesRead += temp; 334 file->readIndex += temp; 335 file->filePos += temp; 336 bytesLeft -= temp; 337 p += temp; 338 339 /* don't refill buffer if request is bigger than buffer */ 340 if ((bytesLeft == 0) || (bytesLeft >= EAS_FILE_BUFFER_SIZE)) 341 break; 342 343 /* refill buffer */ 344 if ((result = EAS_HWFillBuffer(hwInstData, file)) != EAS_SUCCESS) 345 return result; 346 } 347 348 /* more to read? do unbuffered read directly to target memory */ 349 if (bytesLeft) 350 { 351 352 /* position the file pointer */ 353 if (fseek(file->pFile, file->filePos, SEEK_SET) != 0) 354 return EAS_ERROR_FILE_SEEK; 355 356 /* read data in the buffer */ 357 /*lint -e{826} lint doesn't like this with STATIC_MEMORY defined for some reason */ 358 temp = (EAS_I32) fread(p, 1, (size_t) bytesLeft, file->pFile); 359 *pBytesRead += temp; 360 file->filePos += temp; 361 362 /* reset buffer info */ 363 file->bytesInBuffer = 0; 364 file->readIndex = 0; 365 } 366 367 #ifdef DEBUG_FILE_IO 368 { 369 #define BYTES_PER_LINE 16 370 char str[BYTES_PER_LINE * 3 + 1]; 371 EAS_INT i; 372 for (i = 0; i < (n > BYTES_PER_LINE ? BYTES_PER_LINE : n) ; i ++) 373 sprintf(&str[i*3], "%02x ", ((EAS_U8*)pBuffer)[i]); 374 if (i) 375 EAS_ReportX(_EAS_SEVERITY_NOFILTER, "%s\n", str); 376 } 377 #endif 378 379 /* were n bytes read? */ 380 if (*pBytesRead != n) 381 return EAS_EOF; 382 383 return EAS_SUCCESS; 384 } 385 386 /*---------------------------------------------------------------------------- 387 * 388 * EAS_HWGetByte 389 * 390 * Read a byte from a file 391 *---------------------------------------------------------------------------- 392 */ 393 /*lint -esym(715, hwInstData) hwInstData available for customer use */ 394 EAS_RESULT EAS_HWGetByte (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *p) 395 { 396 EAS_RESULT result; 397 398 /* check handle integrity */ 399 if (file->pFile == NULL) 400 return EAS_ERROR_INVALID_HANDLE; 401 402 /* use local buffer - do we have any data? */ 403 if (file->readIndex >= file->bytesInBuffer) 404 { 405 if ((result = EAS_HWFillBuffer(hwInstData, file)) != EAS_SUCCESS) 406 return result; 407 408 /* if nothing to read, return EOF */ 409 if (file->bytesInBuffer == 0) 410 return EAS_EOF; 411 } 412 413 /* get a character from the buffer */ 414 *((EAS_U8*) p) = file->buffer[file->readIndex++]; 415 416 #ifdef DEBUG_FILE_IO 417 EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWGetByte: Reading from position %d, byte = 0x%02x\n", file->filePos, *(EAS_U8*)p); 418 #endif 419 420 file->filePos++; 421 return EAS_SUCCESS; 422 } 423 424 /*---------------------------------------------------------------------------- 425 * 426 * EAS_HWGetWord 427 * 428 * Read a 16-bit value from the file 429 *---------------------------------------------------------------------------- 430 */ 431 EAS_RESULT EAS_HWGetWord (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *p, EAS_BOOL msbFirst) 432 { 433 EAS_RESULT result; 434 EAS_I32 count; 435 EAS_U8 c[2]; 436 437 #ifdef DEBUG_FILE_IO 438 EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWGetWord: Reading 2 bytes from position %d\n", file->filePos); 439 #endif 440 441 /* read 2 bytes from the file */ 442 if ((result = EAS_HWReadFile(hwInstData, file, c, 2, &count)) != EAS_SUCCESS) 443 return result; 444 445 /* order them as requested */ 446 if (msbFirst) 447 *((EAS_U16*) p) = ((EAS_U16) c[0] << 8) | c[1]; 448 else 449 *((EAS_U16*) p) = ((EAS_U16) c[1] << 8) | c[0]; 450 451 return EAS_SUCCESS; 452 } 453 454 /*---------------------------------------------------------------------------- 455 * 456 * EAS_HWGetDWord 457 * 458 * Read a 16-bit value from the file 459 *---------------------------------------------------------------------------- 460 */ 461 EAS_RESULT EAS_HWGetDWord (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *p, EAS_BOOL msbFirst) 462 { 463 EAS_RESULT result; 464 EAS_I32 count; 465 EAS_U8 c[4]; 466 467 #ifdef DEBUG_FILE_IO 468 EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWGetDWord: Reading 4 bytes from position %d\n", file->filePos); 469 #endif 470 471 /* read 4 bytes from the file */ 472 if ((result = EAS_HWReadFile(hwInstData, file, c, 4, &count)) != EAS_SUCCESS) 473 return result; 474 475 /* order them as requested */ 476 if (msbFirst) 477 *((EAS_U32*) p) = ((EAS_U32) c[0] << 24) | ((EAS_U32) c[1] << 16) | ((EAS_U32) c[2] << 8) | c[3]; 478 else 479 *((EAS_U32*) p) = ((EAS_U32) c[3] << 24) | ((EAS_U32) c[2] << 16) | ((EAS_U32) c[1] << 8) | c[0]; 480 481 return EAS_SUCCESS; 482 } 483 484 /*---------------------------------------------------------------------------- 485 * 486 * EAS_HWFilePos 487 * 488 * Returns the current location in the file 489 * 490 *---------------------------------------------------------------------------- 491 */ 492 /*lint -esym(715, hwInstData) hwInstData available for customer use */ 493 EAS_RESULT EAS_HWFilePos (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_I32 *pPosition) 494 { 495 496 /* check handle integrity */ 497 if (file->pFile == NULL) 498 return EAS_ERROR_INVALID_HANDLE; 499 500 *pPosition = file->filePos; 501 return EAS_SUCCESS; 502 } 503 504 /*---------------------------------------------------------------------------- 505 * 506 * EAS_HWFileSeek 507 * 508 * Seek to a specific location in the file 509 * 510 *---------------------------------------------------------------------------- 511 */ 512 /*lint -esym(715, hwInstData) hwInstData available for customer use */ 513 EAS_RESULT EAS_HWFileSeek (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_I32 position) 514 { 515 EAS_I32 newIndex; 516 517 /* check handle integrity */ 518 if (file->pFile == NULL) 519 return EAS_ERROR_INVALID_HANDLE; 520 521 #ifdef DEBUG_FILE_IO 522 EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWFileSeek: Seeking to new position %d\n", file->filePos); 523 #endif 524 525 /* is new position in current buffer? */ 526 newIndex = position - file->filePos + file->readIndex; 527 if ((newIndex >= 0) && (newIndex < file->bytesInBuffer)) 528 { 529 file->readIndex = newIndex; 530 file->filePos = position; 531 return EAS_SUCCESS; 532 } 533 534 /* save new position and reset buffer info so EAS_HWGetByte doesn't fail */ 535 file->filePos = position; 536 file->bytesInBuffer = 0; 537 file->readIndex = 0; 538 return EAS_SUCCESS; 539 } 540 541 /*---------------------------------------------------------------------------- 542 * 543 * EAS_HWFileSeekOfs 544 * 545 * Seek forward or back relative to the current position 546 * 547 *---------------------------------------------------------------------------- 548 */ 549 /*lint -esym(715, hwInstData) hwInstData available for customer use */ 550 EAS_RESULT EAS_HWFileSeekOfs (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_I32 position) 551 { 552 EAS_I32 temp; 553 554 #ifdef DEBUG_FILE_IO 555 EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWFileSeekOfs: Seeking to new position %d\n", file->filePos + position); 556 #endif 557 558 /* check handle integrity */ 559 if (file->pFile == NULL) 560 return EAS_ERROR_INVALID_HANDLE; 561 562 /* is new position in current buffer? */ 563 temp = position + file->readIndex; 564 if ((temp >= 0) && (temp < file->bytesInBuffer)) 565 { 566 file->readIndex = temp; 567 file->filePos += position; 568 return EAS_SUCCESS; 569 } 570 571 /* save new position and reset buffer info so EAS_HWGetByte doesn't fail */ 572 file->filePos += position; 573 file->bytesInBuffer = 0; 574 file->readIndex = 0; 575 return EAS_SUCCESS; 576 } 577 578 /*---------------------------------------------------------------------------- 579 * 580 * EAS_HWFileLength 581 * 582 * Return the file length 583 * 584 *---------------------------------------------------------------------------- 585 */ 586 /*lint -esym(715, hwInstData) hwInstData available for customer use */ 587 EAS_RESULT EAS_HWFileLength (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_I32 *pLength) 588 { 589 long pos; 590 591 /* check handle integrity */ 592 if (file->pFile == NULL) 593 return EAS_ERROR_INVALID_HANDLE; 594 595 if ((pos = ftell(file->pFile)) == -1L) 596 return EAS_ERROR_FILE_LENGTH; 597 if (fseek(file->pFile, 0L, SEEK_END) != 0) 598 return EAS_ERROR_FILE_LENGTH; 599 if ((*pLength = ftell(file->pFile)) == -1L) 600 return EAS_ERROR_FILE_LENGTH; 601 if (fseek(file->pFile, pos, SEEK_SET) != 0) 602 return EAS_ERROR_FILE_LENGTH; 603 return EAS_SUCCESS; 604 } 605 606 /*---------------------------------------------------------------------------- 607 * 608 * EAS_HWDupHandle 609 * 610 * Duplicate a file handle 611 * 612 *---------------------------------------------------------------------------- 613 */ 614 EAS_RESULT EAS_HWDupHandle (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_FILE_HANDLE* pDupFile) 615 { 616 EAS_HW_FILE *dupfile; 617 int i; 618 619 /* check handle integrity */ 620 *pDupFile = NULL; 621 if (file->pFile == NULL) 622 return EAS_ERROR_INVALID_HANDLE; 623 624 /* find an empty entry in the file table */ 625 dupfile = hwInstData->files; 626 for (i = 0; i < EAS_MAX_FILE_HANDLES; i++) 627 { 628 /* is this slot being used? */ 629 if (dupfile->pFile == NULL) 630 { 631 632 /* copy info from the handle to be duplicated */ 633 dupfile->filePos = file->filePos; 634 dupfile->pFile = file->pFile; 635 636 /* set the duplicate handle flag */ 637 dupfile->dup = file->dup = EAS_TRUE; 638 639 /* initialize some values */ 640 dupfile->bytesInBuffer = 0; 641 dupfile->readIndex = 0; 642 643 *pDupFile = dupfile; 644 return EAS_SUCCESS; 645 } 646 dupfile++; 647 } 648 649 /* too many open files */ 650 return EAS_ERROR_MAX_FILES_OPEN; 651 } 652 653 /*---------------------------------------------------------------------------- 654 * 655 * EAS_HWClose 656 * 657 * Wrapper for fclose function 658 * 659 *---------------------------------------------------------------------------- 660 */ 661 EAS_RESULT EAS_HWCloseFile (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file1) 662 { 663 EAS_HW_FILE *file2,*dupFile; 664 int i; 665 666 /* check handle integrity */ 667 if (file1->pFile == NULL) 668 return EAS_ERROR_INVALID_HANDLE; 669 670 /* check for duplicate handle */ 671 if (file1->dup) 672 { 673 dupFile = NULL; 674 file2 = hwInstData->files; 675 for (i = 0; i < EAS_MAX_FILE_HANDLES; i++) 676 { 677 /* check for duplicate */ 678 if ((file1 != file2) && (file2->pFile == file1->pFile)) 679 { 680 /* is there more than one duplicate? */ 681 if (dupFile != NULL) 682 { 683 /* clear this entry and return */ 684 file1->pFile = NULL; 685 return EAS_SUCCESS; 686 } 687 688 /* this is the first duplicate found */ 689 dupFile = file2; 690 } 691 file2++; 692 } 693 694 /* there is only one duplicate, clear the dup flag */ 695 if (dupFile) 696 dupFile->dup = EAS_FALSE; 697 else 698 /* if we get here, there's a serious problem */ 699 return EAS_ERROR_HANDLE_INTEGRITY; 700 701 /* clear this entry and return */ 702 file1->pFile = NULL; 703 return EAS_SUCCESS; 704 } 705 706 /* no duplicates - close the file */ 707 if (fclose(file1->pFile) != 0) 708 return EAS_ERROR_CLOSE_FAILED; 709 710 /* clear this entry and return */ 711 file1->pFile = NULL; 712 return EAS_SUCCESS; 713 } 714 715 /*---------------------------------------------------------------------------- 716 * 717 * EAS_HWVibrate 718 * 719 * Turn on/off vibrate function 720 * 721 *---------------------------------------------------------------------------- 722 */ 723 /*lint -esym(715, hwInstData) hwInstData available for customer use */ 724 EAS_RESULT EAS_HWVibrate (EAS_HW_DATA_HANDLE hwInstData, EAS_BOOL state) 725 { 726 EAS_ReportX(_EAS_SEVERITY_NOFILTER, "Vibrate state: %d\n", state); 727 return EAS_SUCCESS; 728 } 729 730 /*---------------------------------------------------------------------------- 731 * 732 * EAS_HWLED 733 * 734 * Turn on/off LED 735 * 736 *---------------------------------------------------------------------------- 737 */ 738 /*lint -esym(715, hwInstData) hwInstData available for customer use */ 739 EAS_RESULT EAS_HWLED (EAS_HW_DATA_HANDLE hwInstData, EAS_BOOL state) 740 { 741 EAS_ReportX(_EAS_SEVERITY_NOFILTER, "LED state: %d\n", state); 742 return EAS_SUCCESS; 743 } 744 745 /*---------------------------------------------------------------------------- 746 * 747 * EAS_HWBackLight 748 * 749 * Turn on/off backlight 750 * 751 *---------------------------------------------------------------------------- 752 */ 753 /*lint -esym(715, hwInstData) hwInstData available for customer use */ 754 EAS_RESULT EAS_HWBackLight (EAS_HW_DATA_HANDLE hwInstData, EAS_BOOL state) 755 { 756 EAS_ReportX(_EAS_SEVERITY_NOFILTER, "Backlight state: %d\n", state); 757 return EAS_SUCCESS; 758 } 759 760 /*---------------------------------------------------------------------------- 761 * 762 * EAS_HWYield 763 * 764 * This function is called periodically by the EAS library to give the 765 * host an opportunity to allow other tasks to run. There are two ways to 766 * use this call: 767 * 768 * If you have a multi-tasking OS, you can call the yield function in the 769 * OS to allow other tasks to run. In this case, return EAS_FALSE to tell 770 * the EAS library to continue processing when control returns from this 771 * function. 772 * 773 * If tasks run in a single thread by sequential function calls (sometimes 774 * call a "commutator loop"), return EAS_TRUE to cause the EAS Library to 775 * return to the caller. Be sure to check the number of bytes rendered 776 * before passing the audio buffer to the codec - it may not be filled. 777 * The next call to EAS_Render will continue processing until the buffer 778 * has been filled. 779 * 780 *---------------------------------------------------------------------------- 781 */ 782 /*lint -esym(715, hwInstData) hwInstData available for customer use */ 783 EAS_BOOL EAS_HWYield (EAS_HW_DATA_HANDLE hwInstData) 784 { 785 /* put your code here */ 786 return EAS_FALSE; 787 } 788