diff --git a/configure.in b/configure.in index cde55770..74310499 100644 --- a/configure.in +++ b/configure.in @@ -9,27 +9,10 @@ AC_CONFIG_MACRO_DIR([m4]) CFLAGS=${CFLAGS:--g -O2 -Wall} AC_CANONICAL_HOST - -dnl -dnl Set proper compiler flags and such for some platforms -dnl -case $host in - arm-wince-pe*) - CFLAGS=${CFLAGS:--march=armv4 -mapcs-32 -malignment-traps} - LIBS='-lc -lgcc -lwinsock -lcoredll' - CFLAGS="$CFLAGS -DNEWLIB -DSARM -DWIN32 -DGNUWINCE" - ;; - *uclinux*) - # uClinux needs special "flat" binaries - LDFLAGS="$LDFLAGS -Wl,-elf2flt" - ;; - *) - ;; -esac - AC_ISC_POSIX AC_PROG_CC AC_PROG_CC_STDC +AC_PROG_LIBTOOL # We don't bother ourselves with flex checks until the rest of the world has an up-to-date Flex # We need specific bison extensions, so check for bison @@ -186,11 +169,23 @@ case $host in ]) ;; *-*-*cygwin*|*-*-*mingw*) - ad_files="play_win32.lo rec_win32.lo" + ad_files="ad_win32.lo" ad_libs="-lwinmm" ad_backend="AD_BACKEND_WIN32" AC_DEFINE(AD_BACKEND_WIN32, [], [Use WinMM interface for sound I/O]) ;; + *-apple-*darwin*) + sdkpath=`xcodebuild -version -sdk | grep MacOSX | grep "^Path:" | cut -d" " -f2` + ad_cppflags="-I$sdkpath/System/Library/Frameworks/OpenAL.framework/Versions/A/Headers/" + backup_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $ad_cppflags" + AC_CHECK_HEADER("alc.h", [], AC_MSG_ERROR([OpenAL not found])) + CPPFLAGS="$backup_CPPFLAGS" + ad_files="ad_openal.lo" + ad_libs="-framework OpenAL" + ad_backend="AD_BACKEND_OPENAL" + AC_DEFINE(AD_BACKEND_OPENAL, [], [Use OpenAL for sound I/O]) + ;; *) ad_files="ad_base.lo" ad_backend="AD_BACKEND_NONE" @@ -199,12 +194,11 @@ case $host in ;; esac +AC_SUBST(ad_cppflags) AC_SUBST(ad_files) AC_SUBST(ad_libs) AC_SUBST(ad_backend) -AM_PROG_LIBTOOL - dnl dnl Check for Doxygen, and build dox if present dnl diff --git a/include/sphinxbase/ad.h b/include/sphinxbase/ad.h index 063b1762..55742a1f 100644 --- a/include/sphinxbase/ad.h +++ b/include/sphinxbase/ad.h @@ -1,6 +1,6 @@ /* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== - * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * Copyright (c) 1999-2014 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,68 +34,6 @@ * ==================================================================== * */ -/* - * ad.h -- generic live audio interface for recording and playback - * - * ********************************************** - * CMU ARPA Speech Project - * - * Copyright (c) 1996 Carnegie Mellon University. - * ALL RIGHTS RESERVED. - * ********************************************** - * - * HISTORY - * - * $Log: ad.h,v $ - * Revision 1.8 2005/06/22 08:00:06 arthchan2003 - * Completed all doxygen documentation on file description for libs3decoder/libutil/libs3audio and programs. - * - * Revision 1.7 2004/12/14 00:39:49 arthchan2003 - * add to the code, change some comments to doxygen style - * - * Revision 1.6 2004/12/06 11:17:55 arthchan2003 - * Update the copyright information of ad.h, *sigh* start to feel tired of updating documentation system. Anyone who has time, please take up libs3audio. That is the last place which is undocumented - * - * Revision 1.5 2004/07/23 23:44:46 egouvea - * Changed the cygwin code to use the same audio files as the MS Visual code, removed unused variables from fe_interface.c - * - * Revision 1.4 2004/02/29 23:48:31 egouvea - * Updated configure.in to the recent automake/autoconf, fixed win32 - * references in audio files. - * - * Revision 1.3 2002/11/10 19:27:38 egouvea - * Fixed references to sun's implementation of audio interface, - * referring to the correct .h file, and replacing sun4 with sunos. - * - * Revision 1.2 2001/12/11 04:40:55 lenzo - * License cleanup. - * - * Revision 1.1.1.1 2001/12/03 16:01:45 egouvea - * Initial import of sphinx3 - * - * Revision 1.1.1.1 2001/01/17 05:17:14 ricky - * Initial Import of the s3.3 decoder, has working decodeaudiofile, s3.3_live - * - * - * 19-Jan-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University - * Added AD_ return codes. Added ad_open_sps_bufsize(), and - * ad_rec_t.n_buf. - * - * 17-Apr-98 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University - * Added ad_open_play_sps(). - * - * 07-Mar-98 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University - * Added ad_open_sps(). - * - * 10-Jun-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University - * Added ad_wbuf_t, ad_rec_t, and ad_play_t types, and augmented all - * recording functions with ad_rec_t, and playback functions with - * ad_play_t. - * - * 06-Jun-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University - * Created. - */ - /** \file ad.h * \brief generic live audio interface for recording and playback */ @@ -122,6 +60,9 @@ #include #elif defined(AD_BACKEND_ALSA) #include +#elif defined(AD_BACKEND_OPENAL) +#include +#include #endif /* Win32/WinCE DLL gunk */ @@ -249,6 +190,12 @@ typedef struct ad_rec_s { SPHINXBASE_EXPORT ad_rec_t *ad_open_sps_bufsize (int32 samples_per_sec, int32 bufsize_msec); +#elif defined(AD_BACKEND_OPENAL) + +typedef struct { + ALCdevice * device; +} ad_rec_t; + #else #define DEFAULT_DEVICE NULL @@ -316,7 +263,6 @@ int32 ad_stop_rec (ad_rec_t *); SPHINXBASE_EXPORT int32 ad_close (ad_rec_t *); - /* * Read next block of audio samples while recording; read upto max samples into buf. * Return value: # samples actually read (could be 0 since non-blocking); -1 if not @@ -326,72 +272,8 @@ SPHINXBASE_EXPORT int32 ad_read (ad_rec_t *, int16 *buf, int32 max); -/* ------ PLAYBACK; SIMILAR TO RECORDING ------- */ - -#if defined(_WIN32) && !defined(GNUWINCE) - -typedef struct { - HWAVEOUT h_waveout; /* "HANDLE" to the audio output device */ - ad_wbuf_t *wo_buf; /* Playback buffers given to the system */ - int32 opened; /* Flag; A/D opened for playback */ - int32 playing; - char *busy; /* flags [N_WO_BUF] indicating whether given to system */ - int32 nxtbuf; /* Next buffer [0..N_WO_BUF-1] to be used for playback data */ - int32 sps; /* Samples/sec */ - int32 bps; /* Bytes/sample */ -} ad_play_t; - -#else - -typedef struct { - int32 sps; /* Samples/sec */ - int32 bps; /* Bytes/sample */ -} ad_play_t; /* Dummy definition for systems without A/D stuff */ - -#endif - - -SPHINXBASE_EXPORT -ad_play_t *ad_open_play_sps (int32 samples_per_sec); - -SPHINXBASE_EXPORT -ad_play_t *ad_open_play ( void ); - -SPHINXBASE_EXPORT -int32 ad_start_play (ad_play_t *); - -SPHINXBASE_EXPORT -int32 ad_stop_play (ad_play_t *); - -SPHINXBASE_EXPORT -int32 ad_close_play (ad_play_t *); - - -/** - * Queue a block of audio samples for playback. - * - * Write the next block of [len] samples from rawbuf to the A/D device for playback. - * The device may queue less than len samples, possibly 0, since it is non-blocking. - * The application should resubmit the remaining data to be played. - * Return value: # samples accepted for playback; -1 if error. - */ -SPHINXBASE_EXPORT -int32 ad_write (ad_play_t *, int16 *buf, int32 len); - - -/* ------ MISCELLANEOUS ------- */ - -/** - * Convert mu-law data to int16 linear PCM format. - */ -SPHINXBASE_EXPORT -void ad_mu2li (int16 *outbuf, /* Out: PCM data placed here (allocated by user) */ - unsigned char *inbuf, /* In: Input buffer with mulaw data */ - int32 n_samp); /* In: #Samples in inbuf */ - #ifdef __cplusplus } #endif - #endif diff --git a/src/libsphinxad/Makefile.am b/src/libsphinxad/Makefile.am index c6b2a127..fd3f3f91 100644 --- a/src/libsphinxad/Makefile.am +++ b/src/libsphinxad/Makefile.am @@ -16,9 +16,9 @@ EXTRA_libsphinxad_la_SOURCES = ad_base.c \ ad_pulse.c \ ad_jack.c -EXTRA_DIST = ad_s60.cpp \ - play_win32.c \ - rec_win32.c +EXTRA_DIST = \ + ad_s60.cpp \ + ad_win32.c libsphinxad_la_DEPENDENCIES = @ad_files@ @@ -29,7 +29,7 @@ libsphinxad_la_LIBADD = \ $(top_builddir)/src/libsphinxbase/libsphinxbase.la INCLUDES = \ - @SAMPLERATE_CFLAGS@ \ + @ad_cppflags@ \ -I$(top_srcdir)/include/sphinxbase \ -I$(top_srcdir)/include \ -I$(top_builddir)/include diff --git a/src/libsphinxad/ad_openal.c b/src/libsphinxad/ad_openal.c new file mode 100644 index 00000000..6b5a45ab --- /dev/null +++ b/src/libsphinxad/ad_openal.c @@ -0,0 +1,85 @@ +#include +#include +#include + +#include "ad.h" + +ad_rec_t * +ad_open_dev(const char * dev, int32 samples_per_sec) +{ + ad_rec_t * handle = malloc(sizeof(ad_rec_t)); + + if (handle == NULL) { + fprintf(stderr, "%s\n", "failed to allocate memory"); + abort(); + } + + handle -> device = alcCaptureOpenDevice(dev, samples_per_sec, AL_FORMAT_MONO16, samples_per_sec * 10); + + if (handle -> device == NULL) { + free(handle); + fprintf(stderr, "%s\n", "failed to open capture device"); + abort(); + } + + return handle; +} + + +ad_rec_t * +ad_open_sps(int32 samples_per_sec) +{ + return ad_open_dev(NULL, samples_per_sec); +} + +ad_rec_t * +ad_open(void) +{ + return ad_open_sps(DEFAULT_SAMPLES_PER_SEC); +} + + +int32 +ad_start_rec(ad_rec_t * r) +{ + alcCaptureStart(r -> device); + return 0; +} + + +int32 +ad_stop_rec(ad_rec_t * r) +{ + alcCaptureStop(r -> device); + return 0; +} + + +int32 +ad_read(ad_rec_t * r, int16 * buf, int32 max) +{ + ALCint number; + + alcGetIntegerv(r -> device, ALC_CAPTURE_SAMPLES, sizeof(number), &number); + if (number >= 0) { + number = (number < max ? number : max); + alcCaptureSamples(r -> device, buf, number); + } + + return number; +} + + +int32 +ad_close(ad_rec_t * r) +{ + ALCboolean isClosed; + + isClosed = alcCaptureCloseDevice(r -> device); + + if (isClosed) { + return 0; + } else { + return -1; + } +} diff --git a/src/libsphinxad/rec_win32.c b/src/libsphinxad/ad_win32.c similarity index 100% rename from src/libsphinxad/rec_win32.c rename to src/libsphinxad/ad_win32.c diff --git a/src/libsphinxad/play_win32.c b/src/libsphinxad/play_win32.c deleted file mode 100644 index 6138e45b..00000000 --- a/src/libsphinxad/play_win32.c +++ /dev/null @@ -1,417 +0,0 @@ -/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ -/* ==================================================================== - * Copyright (c) 1999-2001 Carnegie Mellon University. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * This work was supported in part by funding from the Defense Advanced - * Research Projects Agency and the National Science Foundation of the - * United States of America, and the CMU Sphinx Speech Consortium. - * - * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND - * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY - * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * ==================================================================== - * - */ - -/* - * HISTORY - * - * 17-Apr-98 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University - * Added ad_open_play_sps(), and made ad_open_play() call it. - * - * 10-Jun-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University - * Added ad_play_t type to all calls. - * - * 03-Jun-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University - * Created. - */ - - -#include -#include -#include -#include -#include - -#include "sphinxbase/prim_type.h" -#include "sphinxbase/ad.h" - - -#define WO_BUFSIZE 3200 /* Samples/buf */ -#define N_WO_BUF 2 /* #Playback bufs */ - -#ifdef _WIN32_WCE -#include "sphinxbase/ckd_alloc.h" -static void -waveout_error(char *src, int32 ret) -{ - TCHAR errbuf[512]; - wchar_t* werrbuf; - size_t len; - - waveOutGetErrorText(ret, errbuf, sizeof(errbuf)); - len = mbstowcs(NULL, errbuf, 0) + 1; - werrbuf = ckd_calloc(len, sizeof(*werrbuf)); - mbstowcs(werrbuf, errbuf, len); - - OutputDebugStringW(werrbuf); - } - -#else -static void -waveout_error(char *src, int32 ret) -{ - char errbuf[1024]; - - waveOutGetErrorText(ret, errbuf, sizeof(errbuf)); - fprintf(stderr, "%s error %d: %s\n", src, ret, errbuf); -} -#endif - - -static void -waveout_free_buf(ad_wbuf_t * b) -{ - GlobalUnlock(b->h_whdr); - GlobalFree(b->h_whdr); - GlobalUnlock(b->h_buf); - GlobalFree(b->h_buf); -} - - -static int32 -waveout_alloc_buf(ad_wbuf_t * b, int32 samples_per_buf) -{ - HGLOBAL h_buf; - LPSTR p_buf; - HGLOBAL h_whdr; - LPWAVEHDR p_whdr; - - /* Allocate data buffer */ - h_buf = - GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, - samples_per_buf * sizeof(int16)); - if (!h_buf) { - fprintf(stderr, "GlobalAlloc failed\n"); - return -1; - } - if ((p_buf = GlobalLock(h_buf)) == NULL) { - GlobalFree(h_buf); - fprintf(stderr, "GlobalLock failed\n"); - return -1; - } - - /* Allocate WAVEHDR structure */ - h_whdr = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, sizeof(WAVEHDR)); - if (h_whdr == NULL) { - GlobalUnlock(h_buf); - GlobalFree(h_buf); - - fprintf(stderr, "GlobalAlloc failed\n"); - return -1; - } - if ((p_whdr = GlobalLock(h_whdr)) == NULL) { - GlobalUnlock(h_buf); - GlobalFree(h_buf); - GlobalFree(h_whdr); - - fprintf(stderr, "GlobalLock failed\n"); - return -1; - } - - b->h_buf = h_buf; - b->p_buf = p_buf; - b->h_whdr = h_whdr; - b->p_whdr = p_whdr; - - p_whdr->lpData = p_buf; - p_whdr->dwBufferLength = samples_per_buf * sizeof(int16); - p_whdr->dwUser = 0L; - p_whdr->dwFlags = 0L; - p_whdr->dwLoops = 0L; - - return 0; -} - - -static int32 -waveout_enqueue_buf(HWAVEOUT h, LPWAVEHDR whdr) -{ - int32 st; - - if ((st = waveOutPrepareHeader(h, whdr, sizeof(WAVEHDR))) != 0) { - waveout_error("waveOutPrepareHeader", st); - return -1; - } - - if ((st = waveOutWrite(h, whdr, sizeof(WAVEHDR))) != 0) { - waveout_error("waveOutWrite", st); - return -1; - } - - return 0; -} - - -static HWAVEOUT -waveout_open(int32 samples_per_sec, int32 bytes_per_sample) -{ - WAVEFORMATEX wfmt; - int32 st; - HWAVEOUT h; - - if (bytes_per_sample != sizeof(int16)) { - fprintf(stderr, "bytes/sample != %d\n", sizeof(int16)); - return NULL; - } - - wfmt.wFormatTag = WAVE_FORMAT_PCM; - wfmt.nChannels = 1; - wfmt.nSamplesPerSec = samples_per_sec; - wfmt.nAvgBytesPerSec = samples_per_sec * bytes_per_sample; - wfmt.nBlockAlign = bytes_per_sample; - wfmt.wBitsPerSample = 8 * bytes_per_sample; - wfmt.cbSize = 0; - - /* There should be a check here for a device of the desired type; later... */ - - st = waveOutOpen((LPHWAVEOUT) & h, WAVE_MAPPER, - (LPWAVEFORMATEX) & wfmt, (DWORD) 0L, 0L, - (DWORD) CALLBACK_NULL); - if (st != 0) { - waveout_error("waveOutOpen", st); - return NULL; - } - - return h; -} - - -static void -waveout_mem_cleanup(ad_play_t * p, int32 n_buf) -{ - int32 i; - - for (i = 0; i < n_buf; i++) - waveout_free_buf(&(p->wo_buf[i])); - if (p->wo_buf) - free(p->wo_buf); - if (p->busy) - free(p->busy); -} - - -static int32 -waveout_close(ad_play_t * p) -{ - int32 st; - - waveout_mem_cleanup(p, N_WO_BUF); - - if ((st = waveOutClose(p->h_waveout)) != 0) { - waveout_error("waveOutClose", st); - return -1; - } - - free(p); - - return 0; -} - - -ad_play_t * -ad_open_play_sps(int32 sps) -{ - ad_play_t *p; - int32 i; - HWAVEOUT h; - - if ((h = waveout_open(sps, sizeof(int16))) == NULL) - return NULL; - - if ((p = (ad_play_t *) calloc(1, sizeof(ad_play_t))) == NULL) { - fprintf(stderr, "calloc(1,%d) failed\n", sizeof(ad_play_t)); - waveOutClose(h); - return NULL; - } - if ((p->wo_buf = - (ad_wbuf_t *) calloc(N_WO_BUF, sizeof(ad_wbuf_t))) == NULL) { - fprintf(stderr, "calloc(%d,%d) failed\n", N_WO_BUF, - sizeof(ad_wbuf_t)); - free(p); - waveOutClose(h); - - return NULL; - } - if ((p->busy = (char *) calloc(N_WO_BUF, sizeof(char))) == NULL) { - fprintf(stderr, "calloc(%d,%d) failed\n", N_WO_BUF, sizeof(char)); - waveout_mem_cleanup(p, 0); - free(p); - waveOutClose(h); - - return NULL; - } - for (i = 0; i < N_WO_BUF; i++) { - if (waveout_alloc_buf(&(p->wo_buf[i]), WO_BUFSIZE) < 0) { - waveout_mem_cleanup(p, i); - free(p); - waveOutClose(h); - - return NULL; - } - } - - p->h_waveout = h; - p->playing = 0; - p->opened = 1; - p->nxtbuf = 0; - p->sps = sps; - p->bps = sizeof(int16); /* HACK!! Hardwired value for bytes/sec */ - - return p; -} - - -ad_play_t * -ad_open_play(void) -{ - return (ad_open_play_sps(DEFAULT_SAMPLES_PER_SEC)); -} - - -int32 -ad_close_play(ad_play_t * p) -{ - if (!p->opened) - return 0; - - if (p->playing) - if (ad_stop_play(p) < 0) - return -1; - - if (waveout_close(p) < 0) - return -1; - - return 0; -} - - -int32 -ad_start_play(ad_play_t * p) -{ - int32 i; - - if ((!p->opened) || p->playing) - return -1; - - for (i = 0; i < N_WO_BUF; i++) - p->busy[i] = 0; - p->nxtbuf = 0; - p->playing = 1; - - return 0; -} - - -int32 -ad_stop_play(ad_play_t * p) -{ - int32 i, st; - LPWAVEHDR whdr; - - if ((!p->opened) || (!p->playing)) - return -1; - -#if 0 - whdr->dwUser = (plen <= 0) ? 1 : 0; -#endif - - /* Wait for all buffers to be emptied and unprepare them */ - for (i = 0; i < N_WO_BUF; i++) { - whdr = p->wo_buf[i].p_whdr; - - while (p->busy[i] && (!(whdr->dwFlags & WHDR_DONE))) - Sleep(100); - - st = waveOutUnprepareHeader(p->h_waveout, whdr, sizeof(WAVEHDR)); - if (st != 0) { - waveout_error("waveOutUnprepareHeader", st); - return -1; - } - - p->busy[i] = 0; - } - - return 0; -} - - -int32 -ad_write(ad_play_t * p, int16 * buf, int32 size) -{ - int32 i, k, len, st; - LPWAVEHDR whdr; - - if ((!p->opened) || (!p->playing)) - return -1; - - len = 0; - - for (i = 0; (i < N_WO_BUF) && (size > 0); i++) { - whdr = p->wo_buf[p->nxtbuf].p_whdr; - - if (p->busy[p->nxtbuf]) { - if (!(whdr->dwFlags & WHDR_DONE)) - return len; - - st = waveOutUnprepareHeader(p->h_waveout, whdr, - sizeof(WAVEHDR)); - if (st != 0) { - waveout_error("waveOutUnprepareHeader", st); - return -1; - } - - p->busy[p->nxtbuf] = 0; - } - - k = (size > WO_BUFSIZE) ? WO_BUFSIZE : size; - - whdr->dwBufferLength = k * sizeof(int16); - memcpy(whdr->lpData, (LPSTR) buf, k * sizeof(int16)); - - if (waveout_enqueue_buf(p->h_waveout, whdr) < 0) - return -1; - - buf += k; - size -= k; - len += k; - - p->busy[(p->nxtbuf)++] = 1; - if (p->nxtbuf >= N_WO_BUF) - p->nxtbuf = 0; - } - - return len; -} diff --git a/win32/sphinxbase/sphinxbase.vcxproj b/win32/sphinxbase/sphinxbase.vcxproj index f6629bb0..40666467 100755 --- a/win32/sphinxbase/sphinxbase.vcxproj +++ b/win32/sphinxbase/sphinxbase.vcxproj @@ -172,9 +172,8 @@ - - + diff --git a/win32/sphinxbase/sphinxbase.vcxproj.filters b/win32/sphinxbase/sphinxbase.vcxproj.filters index 0c3c0743..f395b52d 100755 --- a/win32/sphinxbase/sphinxbase.vcxproj.filters +++ b/win32/sphinxbase/sphinxbase.vcxproj.filters @@ -134,13 +134,10 @@ Source Files - - Source Files - Source Files - + Source Files