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