eas_main.c revision 56c99cd2c2c1e6ab038dac5fced5b92ccf11ff6c
1dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 2dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 3dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * File: 4dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * eas_main.c 5dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 6dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Contents and purpose: 7dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * The entry point and high-level functions for the EAS Synthesizer test 8dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * harness. 9dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 10dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Copyright Sonic Network Inc. 2004 11dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 12dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 13dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * you may not use this file except in compliance with the License. 14dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * You may obtain a copy of the License at 15dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 16dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 17dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 18dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Unless required by applicable law or agreed to in writing, software 19dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 20dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 21dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * See the License for the specific language governing permissions and 22dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * limitations under the License. 23dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 24dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *---------------------------------------------------------------------------- 25dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Revision Control: 26dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * $Revision: 775 $ 27dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * $Date: 2007-07-20 10:11:11 -0700 (Fri, 20 Jul 2007) $ 28dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *---------------------------------------------------------------------------- 29dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/ 30dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 31dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef _lint 32dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "lint_stdlib.h" 33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#else 34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include <stdio.h> 35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include <string.h> 36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include <stdlib.h> 37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include <time.h> 38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 39dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 40dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "eas.h" 41dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "eas_wave.h" 42dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "eas_report.h" 43dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 44dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/* determines how many EAS buffers to fill a host buffer */ 45dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define NUM_BUFFERS 8 46dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 47dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/* default file to play if no filename is specified on the command line */ 48dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberstatic const char defaultTestFile[] = "test.mid"; 49dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 50dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberEAS_I32 polyphony; 51dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 52dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/* prototypes for helper functions */ 53dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberstatic void StrCopy(char *dest, const char *src, EAS_I32 size); 54dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberstatic EAS_BOOL ChangeFileExt(char *str, const char *ext, EAS_I32 size); 55dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberstatic EAS_RESULT PlayFile (EAS_DATA_HANDLE easData, const char* filename, const char* outputFile, const S_EAS_LIB_CONFIG *pLibConfig, void *buffer, EAS_I32 bufferSize); 56dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberstatic EAS_BOOL EASLibraryCheck (const S_EAS_LIB_CONFIG *pLibConfig); 57dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 58dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/* main is defined after playfile to avoid the need for two passes through lint */ 59dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 60dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 61dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * PlayFile() 62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *---------------------------------------------------------------------------- 63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Purpose: 64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * This function plays the file requested by filename 65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Inputs: 67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Outputs: 69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *---------------------------------------------------------------------------- 71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/ 72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberstatic EAS_RESULT PlayFile (EAS_DATA_HANDLE easData, const char* filename, const char* outputFile, const S_EAS_LIB_CONFIG *pLibConfig, void *buffer, EAS_I32 bufferSize) 74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber EAS_HANDLE handle; 76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber EAS_RESULT result, reportResult; 77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber EAS_I32 count; 78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber EAS_STATE state; 79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber EAS_I32 playTime; 80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber char waveFilename[256]; 81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber WAVE_FILE *wFile; 82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber EAS_INT i; 83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber EAS_PCM *p; 84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber EAS_FILE file; 85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* determine the name of the output file */ 87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber wFile = NULL; 88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (outputFile == NULL) 89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber StrCopy(waveFilename, filename, sizeof(waveFilename)); 91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (!ChangeFileExt(waveFilename, "wav", sizeof(waveFilename))) 92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Error in output filename %s\n", waveFilename); */ } 94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return EAS_FAILURE; 95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber outputFile = waveFilename; 97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* call EAS library to open file */ 100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber file.path = filename; 101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber file.fd = 0; 102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((reportResult = EAS_OpenFile(easData, &file, &handle)) != EAS_SUCCESS) 103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "EAS_OpenFile returned %ld\n", reportResult); */ } 105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return reportResult; 106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* prepare to play the file */ 109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((result = EAS_Prepare(easData, handle)) != EAS_SUCCESS) 110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "EAS_Prepare returned %ld\n", result); */ } 112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber reportResult = result; 113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* get play length */ 116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((result = EAS_ParseMetaData(easData, handle, &playTime)) != EAS_SUCCESS) 117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "EAS_ParseMetaData returned %ld\n", result); */ } 119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return result; 120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber EAS_ReportEx(_EAS_SEVERITY_NOFILTER, 0xe624f4d9, 0x00000005 , playTime / 1000, playTime % 1000); 122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (reportResult == EAS_SUCCESS) 124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* create the output file */ 126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber wFile = WaveFileCreate(outputFile, pLibConfig->numChannels, pLibConfig->sampleRate, sizeof(EAS_PCM) * 8); 127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (!wFile) 128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Unable to create output file %s\n", waveFilename); */ } 130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber reportResult = EAS_FAILURE; 131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* rendering loop */ 135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber while (reportResult == EAS_SUCCESS) 136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* we may render several buffers here to fill one host buffer */ 139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = 0, p = buffer; i < NUM_BUFFERS; i++, p+= pLibConfig->mixBufferSize * pLibConfig->numChannels) 140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* get the current time */ 143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((result = EAS_GetLocation(easData, handle, &playTime)) != EAS_SUCCESS) 144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "EAS_GetLocation returned %d\n",result); */ } 146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (reportResult == EAS_SUCCESS) 147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber reportResult = result; 148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Parser time: %d.%03d\n", playTime / 1000, playTime % 1000); */ } 151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* render a buffer of audio */ 153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((result = EAS_Render(easData, p, pLibConfig->mixBufferSize, &count)) != EAS_SUCCESS) 154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "EAS_Render returned %d\n",result); */ } 156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (reportResult == EAS_SUCCESS) 157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber reportResult = result; 158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (result == EAS_SUCCESS) 162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* write it to the wave file */ 164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (WaveFileWrite(wFile, buffer, bufferSize) != bufferSize) 165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "WaveFileWrite failed\n"); */ } 167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber reportResult = EAS_FAILURE; 168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (reportResult == EAS_SUCCESS) 172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* check stream state */ 174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((result = EAS_State(easData, handle, &state)) != EAS_SUCCESS) 175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "EAS_State returned %d\n", result); */ } 177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber reportResult = result; 178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* is playback complete */ 181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((state == EAS_STATE_STOPPED) || (state == EAS_STATE_ERROR)) 182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* close the output file */ 187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (wFile) 188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (!WaveFileClose(wFile)) 190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Error closing wave file %s\n", waveFilename); */ } 192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (reportResult == EAS_SUCCESS) 193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber result = EAS_FAILURE; 194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* close the input file */ 198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((result = EAS_CloseFile(easData,handle)) != EAS_SUCCESS) 199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "EAS_Close returned %ld\n", result); */ } 201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (reportResult == EAS_SUCCESS) 202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber result = EAS_FAILURE; 203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return reportResult; 206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} /* end PlayFile */ 207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * main() 210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *---------------------------------------------------------------------------- 211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Purpose: The entry point for the EAS sample application 212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Inputs: 214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Outputs: 216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *---------------------------------------------------------------------------- 218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/ 219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberint main( int argc, char **argv ) 220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber EAS_DATA_HANDLE easData; 222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const S_EAS_LIB_CONFIG *pLibConfig; 223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber void *buffer; 224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber EAS_RESULT result, playResult; 225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber EAS_I32 bufferSize; 226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber int i; 227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber int temp; 228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FILE *debugFile; 229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber char *outputFile = NULL; 230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* set the error reporting level */ 232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber EAS_SetDebugLevel(_EAS_SEVERITY_INFO); 233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber debugFile = NULL; 234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* process command-line arguments */ 236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = 1; i < argc; i++) 237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* check for switch */ 239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (argv[i][0] == '-') 240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber switch (argv[i][1]) 242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case 'd': 244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = argv[i][2]; 245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((temp >= '0') || (temp <= '9')) 246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber EAS_SetDebugLevel(temp); 247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Invalid debug level %d\n", temp); */ } 249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case 'f': 251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((debugFile = fopen(&argv[i][2],"w")) == NULL) 252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "Unable to create debug file %s\n", &argv[i][2]); */ } 253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber EAS_SetDebugFile(debugFile, EAS_TRUE); 255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case 'o': 257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber outputFile = &argv[i][2]; 258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case 'p': 260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber polyphony = atoi(&argv[i][2]); 261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (polyphony < 1) 262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber polyphony = 1; 263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { /* dpp: EAS_ReportEx(_EAS_SEVERITY_INFO, "Polyphony set to %d\n", polyphony); */ } 264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber default: 266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber continue; 269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* assume success */ 273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber playResult = EAS_SUCCESS; 274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* get the library configuration */ 276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pLibConfig = EAS_Config(); 277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (!EASLibraryCheck(pLibConfig)) 278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return -1; 279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (polyphony > pLibConfig->maxVoices) 280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber polyphony = pLibConfig->maxVoices; 281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* calculate buffer size */ 283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber bufferSize = pLibConfig->mixBufferSize * pLibConfig->numChannels * (EAS_I32)sizeof(EAS_PCM) * NUM_BUFFERS; 284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* allocate output buffer memory */ 286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber buffer = malloc((EAS_U32)bufferSize); 287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (!buffer) 288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { /* dpp: EAS_ReportEx(_EAS_SEVERITY_FATAL, "Error allocating memory for audio buffer\n"); */ } 290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return EAS_FAILURE; 291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* initialize the EAS library */ 294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber polyphony = pLibConfig->maxVoices; 295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((result = EAS_Init(&easData)) != EAS_SUCCESS) 296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { /* dpp: EAS_ReportEx(_EAS_SEVERITY_FATAL, "EAS_Init returned %ld - aborting!\n", result); */ } 298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber free(buffer); 299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return result; 300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Some debugging environments don't allow for passed parameters. 304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * In this case, just play the default MIDI file "test.mid" 305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (argc < 2) 307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { /* dpp: EAS_ReportEx(_EAS_SEVERITY_INFO, "Playing '%s'\n", defaultTestFile); */ } 309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((playResult = PlayFile(easData, defaultTestFile, NULL, pLibConfig, buffer, bufferSize)) != EAS_SUCCESS) 310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Error %d playing file %s\n", playResult, defaultTestFile); */ } 312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* iterate through the list of files to be played */ 315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = 1; i < argc; i++) 318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* check for switch */ 320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (argv[i][0] != '-') 321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { /* dpp: EAS_ReportEx(_EAS_SEVERITY_INFO, "Playing '%s'\n", argv[i]); */ } 324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((playResult = PlayFile(easData, argv[i], outputFile, pLibConfig, buffer, bufferSize)) != EAS_SUCCESS) 325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { /* dpp: EAS_ReportEx(_EAS_SEVERITY_ERROR, "Error %d playing file %s\n", playResult, argv[i]); */ } 327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* shutdown the EAS library */ 334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((result = EAS_Shutdown(easData)) != EAS_SUCCESS) 335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { /* dpp: EAS_ReportEx(_EAS_SEVERITY_FATAL, "EAS_Shutdown returned %ld\n", result); */ } 337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* free the output buffer */ 340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber free(buffer); 341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* close the debug file */ 343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (debugFile) 344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber fclose(debugFile); 345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* play errors take precedence over shutdown errors */ 347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (playResult != EAS_SUCCESS) 348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return playResult; 349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return result; 350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} /* end main */ 351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * StrCopy() 354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *---------------------------------------------------------------------------- 355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Purpose: 356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Safe string copy 357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Inputs: 359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Outputs: 361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *---------------------------------------------------------------------------- 363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/ 364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberstatic void StrCopy(char *dest, const char *src, EAS_I32 size) 365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber int len; 367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber strncpy(dest, src, (size_t) size-1); 369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber len = (int) strlen(src); 370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (len < size) 371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dest[len] = 0; 372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} /* end StrCopy */ 373 374/*---------------------------------------------------------------------------- 375 * ChangeFileExt() 376 *---------------------------------------------------------------------------- 377 * Purpose: 378 * Changes the file extension of a filename 379 * 380 * Inputs: 381 * 382 * Outputs: 383 * 384 *---------------------------------------------------------------------------- 385*/ 386static EAS_BOOL ChangeFileExt(char *str, const char *ext, EAS_I32 size) 387{ 388 char *p; 389 390 /* find the extension, if any */ 391 p = strrchr(str,'.'); 392 if (!p) 393 { 394 if ((EAS_I32)(strlen(str) + 5) > size) 395 return EAS_FALSE; 396 strcat(str,"."); 397 strcat(str,ext); 398 return EAS_TRUE; 399 } 400 401 /* make sure there's room for the extension */ 402 p++; 403 *p = 0; 404 if ((EAS_I32)(strlen(str) + 4) > size) 405 return EAS_FALSE; 406 strcat(str,ext); 407 return EAS_TRUE; 408} /* end ChangeFileExt */ 409 410/*---------------------------------------------------------------------------- 411 * EASLibraryCheck() 412 *---------------------------------------------------------------------------- 413 * Purpose: 414 * Displays the library version and checks it against the header 415 * file used to build this code. 416 * 417 * Inputs: 418 * pLibConfig - library configuration retrieved from the library 419 * 420 * Outputs: 421 * returns EAS_TRUE if matched 422 * 423 * Side Effects: 424 * 425 *---------------------------------------------------------------------------- 426*/ 427static EAS_BOOL EASLibraryCheck (const S_EAS_LIB_CONFIG *pLibConfig) 428{ 429 430 /* display the library version */ 431 { /* dpp: EAS_ReportEx(_EAS_SEVERITY_INFO, "EAS Library Version %d.%d.%d.%d\n", 432 pLibConfig->libVersion >> 24, 433 (pLibConfig->libVersion >> 16) & 0x0f, 434 (pLibConfig->libVersion >> 8) & 0x0f, 435 pLibConfig->libVersion & 0x0f); */ } 436 437 /* display some info about the library build */ 438 if (pLibConfig->checkedVersion) 439 { /* dpp: EAS_ReportEx(_EAS_SEVERITY_INFO, "\tChecked library\n"); */ } 440 { /* dpp: EAS_ReportEx(_EAS_SEVERITY_INFO, "\tMaximum polyphony: %d\n", pLibConfig->maxVoices); */ } 441 { /* dpp: EAS_ReportEx(_EAS_SEVERITY_INFO, "\tNumber of channels: %d\n", pLibConfig->numChannels); */ } 442 { /* dpp: EAS_ReportEx(_EAS_SEVERITY_INFO, "\tSample rate: %d\n", pLibConfig->sampleRate); */ } 443 { /* dpp: EAS_ReportEx(_EAS_SEVERITY_INFO, "\tMix buffer size: %d\n", pLibConfig->mixBufferSize); */ } 444 if (pLibConfig->filterEnabled) 445 { /* dpp: EAS_ReportEx(_EAS_SEVERITY_INFO, "\tFilter enabled\n"); */ } 446#ifndef _WIN32_WCE 447 { /* dpp: EAS_ReportEx(_EAS_SEVERITY_INFO, "\tLibrary Build Timestamp: %s", ctime((time_t*)&pLibConfig->buildTimeStamp)); */ } 448#endif 449 { /* dpp: EAS_ReportEx(_EAS_SEVERITY_INFO, "\tLibrary Build ID: %s\n", pLibConfig->buildGUID); */ } 450 451 /* check it against the header file used to build this code */ 452 /*lint -e{778} constant expression used for display purposes may evaluate to zero */ 453 if (LIB_VERSION != pLibConfig->libVersion) 454 { 455 { /* dpp: EAS_ReportEx(_EAS_SEVERITY_FATAL, "Library version does not match header files. EAS Header Version %d.%d.%d.%d\n", 456 LIB_VERSION >> 24, 457 (LIB_VERSION >> 16) & 0x0f, 458 (LIB_VERSION >> 8) & 0x0f, 459 LIB_VERSION & 0x0f); */ } 460 return EAS_FALSE; 461 } 462 return EAS_TRUE; 463} /* end EASLibraryCheck */ 464 465