14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------*
24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  audioin.c                                                                *
34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the 'License');          *
74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  you may not use this file except in compliance with the License.         *
84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  You may obtain a copy of the License at                                  *
104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0                           *
114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software      *
134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  distributed under the License is distributed on an 'AS IS' BASIS,        *
144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  See the License for the specific language governing permissions and      *
164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  limitations under the License.                                           *
174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *---------------------------------------------------------------------------*/
194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* -------------------------------------------------------------------------+
214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   |                               ScanSoft Inc.                              |
224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   + -------------------------------------------------------------------------*/
234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* -------------------------------------------------------------------------+
274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   | Project       : ScanSoft AudioIn
284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   | Module        : audioin
294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   | File name     : audioin.c
304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   | Description   : This module contains the main implementation for the audioIn
314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   |                 component.
324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   | Reference(s)  : wavein, audioout, audioin.chm, audioin.doc, audioin.hlp,
334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   |                 SltGl00001_audioin_gl1.doc
344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   | Status        : Version 1.2
354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   + -------------------------------------------------------------------------*/
364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*     Feb/25/2002: First QNX/SH4 "draft" version. Version 1.1              */
374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*     Nov/25/2004: clean up and minor changes like choice of the codec     */
384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*                  frame size which is now automatically selected          */
394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*--------------------------------------------------------------------------*/
404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4115fc15883c8aee2b736e8cc9a31eef071908e4a0Sean McNeil#if !defined(ANDROID) || defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_4__)
424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stdio.h>
464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stdlib.h>
474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <string.h>
484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <errno.h>
494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <pthread.h>
504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <sched.h>
514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <time.h>
524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <unistd.h>
534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <sys/select.h>
544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "plog.h"
554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "audioin.h"
564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(ANDROID)
584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "audioinwrapper.h"
594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <alsa/asoundlib.h>
614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// #define SAVE_RAW_AUDIO              1
644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SAVE_RAW_AUDIO
664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <sys/time.h>
674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stdio.h>
684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic FILE *audio_data;
704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic struct timeval buffer_save_audio;
714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*#define FILTER_ON*/
744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef FILTER_ON
764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "filter.h"
774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* -------------------------------------------------------------------------+
804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   |   EXTERNAL DATA (+ meaning)                                              |
814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   + -------------------------------------------------------------------------*/
824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* none */
844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* -------------------------------------------------------------------------+
864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   |   MACROS                                                                 |
874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   + -------------------------------------------------------------------------*/
884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define NR_OF_CHANNELS            1
904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(ANDROID)
924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* size in samples */
934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* We really no longer use this for ANDROID but more changes are needed to remove it. SteveR */
944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SAMPLES_BUFFER_SIZE             (8*1024)
954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SAMPLES_BUFFER_HIGH_WATERMARK   (6*1024)
964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SAMPLES_BUFFER_SIZE            (50*4410)
984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SAMPLES_BUFFER_HIGH_WATERMARK  (40*4410)
994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* IMPORTANT NOTE:
1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   Here a "frame" is an ALSA term.  A frame is comprised of 1 sample if mono,
1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   and 2 samples if stereo.  This should be distinguished from what the
1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   ASR engine and lhs_audioin*() API functions refer to as a frame which is
1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   a set of consecutive samples.
1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   (see http://www.alsa-project.org/alsa-doc/alsa-lib/pcm.html) */
1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(ANDROID)
1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define CODEC_FRAGMENT_SIZE_IN_FRAMES                    1024
1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//read the equivalent of 100 ms per buffer. Note: we are recording at 44 kHz
1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define CODEC_FRAGMENT_SIZE_IN_FRAMES                    4410
1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* -------------------------------------------------------------------------+
1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   |   TYPE DEFINITIONS                                                       |
1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   + -------------------------------------------------------------------------*/
1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* -------------------------------------------------------------------------+
1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   |   GLOBAL CONSTANTS                                                       |
1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   + -------------------------------------------------------------------------*/
1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* -------------------------------------------------------------------------+
1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   |   GLOBAL VARIABLES                                                       |
1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   + -------------------------------------------------------------------------*/
1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if !defined(ANDROID)
1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic snd_pcm_t       *ghPCM;                   /* handle to the PCM recording device */
1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int              gCodecFragmentSizeInFrames = CODEC_FRAGMENT_SIZE_IN_FRAMES;    /* fragment size used by the codec driver */
1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic audioinSample    gSamplesBufferCircularFifo[SAMPLES_BUFFER_SIZE]; /* circular buffer that buffers the incoming samples */
1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int              gWriteIndexPointer = 0;  /* write pointer in the circular FIFO samples buffer */
1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int              gReadIndexPointer  = 0;  /* read  pointer in the circular FIFO samples buffer */
1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic AUDIOIN_INFO     gAudioInInfo;            /* to store the info about the acquisition */
1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic pthread_mutex_t  gAudioMutex;             /* to prevent using the read/write pointers at the same time in both threads */
1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic pthread_cond_t   gThreadRunning;          /* synchronize when the AcquisitionThreadID is running*/
1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int              gThreadRunningSignaled = 0;
1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic pthread_cond_t   gOpenExCalled;          /* synchronize when the lhs_audioinOpenEx is called*/
1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int              gOpenExCalledSignaled = 0;
1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic pthread_cond_t   gCloseCalled;          /* synchronize when the lhs_audioinClose is called*/
1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int              gCloseCalledSignaled = 0;
1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic pthread_t        AcquisitionThreadID;     /* acquisition thread id */
1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int              gInitialized = 0; /* did we initialize some of the variables*/
1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int              gTerminateThread = 0;
1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic struct timeval   timer;                   /* timer used by select to relinquish cpu times */
1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int              gRecordingVolume = -1;   /* recording volume ; number between 0 and 15 */
1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int              bRecord = 0;             /* recording state is off */
1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int              bClose  = 1;             /* audio pipe is closed */
1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef FILTER_ON
1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic FIR_struct      *pFIR = NULL;             /* pointer to FIR structure */
1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef AUDIOIN_SUPPORT_CALLBACK
1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic pCallbackFunc    gpCallback         = NULL;
1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void            *gpCallbackInstance = NULL;
1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic unsigned long    gnCallbackSamples  = 0;
1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* -------------------------------------------------------------------------+
1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   |   LOCAL FUNCTION PROTOTYPES                                              |
1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   + -------------------------------------------------------------------------*/
1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void *AcquisitionThread(void *data);                /* Entry function for the acquisition thread */
1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int OpenAndPrepareSound(unsigned long ulFrequency);
1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * returns 0 if success
1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int Initialize(AUDIOIN_H * phAudioIn)
1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int doneWaiting = 0;
1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if( gInitialized == 1 )
1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 0;
1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* creates the mutex that will be used to lock/unlock access to some variables/code */
1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (pthread_mutex_init(&gAudioMutex, NULL) != 0)
1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 1;
1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(pthread_cond_init(&gThreadRunning, 0) != 0 )
1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 1;
1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(pthread_cond_init(&gOpenExCalled, 0) != 0 )
1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 1;
1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(pthread_cond_init(&gCloseCalled, 0) != 0 )
2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 1;
2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pthread_mutex_lock(&gAudioMutex);
2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* create a thread with very high priority that will do the acquisition */
2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (pthread_create(&AcquisitionThreadID, NULL, AcquisitionThread, phAudioIn) != 0)
2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 1;
2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  //wait for the thread to run
2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  while (!doneWaiting)
2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int rc = pthread_cond_wait(&gThreadRunning, &gAudioMutex);
2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    switch (rc)
2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      case 0:
2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (!gThreadRunningSignaled)
2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          // Avoid spurious wakeups
2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          continue;
2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        else
2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          gThreadRunningSignaled = 0;
2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          doneWaiting = 1;
2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          break;
2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        break;
2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      default:
2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        pthread_mutex_unlock(&gAudioMutex);
2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return 1;
2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pthread_mutex_unlock(&gAudioMutex);
2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  //thread is now running.
2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  gInitialized = 1;
2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return 0;
2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if 0
2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* disable this unused function for now until we decide what to do with this */
2514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
2534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * returns 0 if success
2544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
2554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int UnInitialize()
2564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
2574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  //signal the thread that it has to stop running.
2584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pthread_mutex_lock ( &gAudioMutex );
2594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  gTerminateThread = 1;
2604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  //signal to tell that our thread is now running.
2624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ( pthread_cond_signal ( &gOpenExCalled ) != 0 )
2634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pthread_mutex_unlock ( &gAudioMutex );
2654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError ( "Audio In Error pthread_cond_signal\n" );
2664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 1;
2674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  gOpenExCalledSignaled = 1;
2694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pthread_mutex_unlock ( &gAudioMutex );
2704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* wait until thread exits */
2724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (pthread_join(AcquisitionThreadID, NULL) != 0)
2734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 1;
2754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* destroy the mutex */
2784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (pthread_mutex_destroy(&gAudioMutex) !=0 )
2794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 1;
2814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if( pthread_cond_destroy(&gThreadRunning) != 0 )
2834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 1;
2854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if( pthread_cond_destroy(&gOpenExCalled) != 0 )
2874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 1;
2894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if( pthread_cond_destroy(&gCloseCalled) != 0 )
2914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 1;
2934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  gInitialized = 0;
2954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return 0;
2964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
2984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* -------------------------------------------------------------------------+
3004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   |   LOCAL FUNCTION (should be static)                                      |
3014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   + -------------------------------------------------------------------------*/
3024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void setRecordOn(void)
3044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
3054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  bRecord = 1;
3064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
3074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void setRecordOff(void)
3094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
3104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  bRecord = 0;
3114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
3124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int getRecord(void)
3144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
3154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return bRecord;
3164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
3174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void setCloseOn(void)
3194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
3204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  bClose = 1;
3214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
3224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void setCloseOff(void)
3244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
3254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  bClose = 0;
3264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
3274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int getClose(void)
3294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
3304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return bClose;
3314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
3324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**************************************************************
3354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * AcquisitionThread                                           *
3364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                             *
3374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * This function is the entry function of a thread created by  *
3384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * lhs_audioinOpen and which is responsible of getting the     *
3394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * samples from the codec and store them in a big circular     *
3404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * FIFO buffer.                                                *
3414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * The priority of this thread has been set to high in order   *
3424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * to prevent codec buffer overrun. Since the FIFO is limited  *
3434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * in size (5 sec default ; see SAMPLES_BUFFER_SIZE            *
3444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * parameter), the application must still be fast enough to    *
3454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * prevent FIFO overflow/overrun                               *
3464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project **************************************************************/
3474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(ANDROID)
3484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid *AcquisitionThread ( void *data )
3504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
3514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int doneWaiting = 0;
3524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  audioinSample   *CodecBuffer;
3534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  long            x;
3544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  long            y;
3554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef AUDIOIN_SUPPORT_CALLBACK
3564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  AUDIOIN_H       *phAudioIn = (AUDIOIN_H *)data;
3574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  AUDIOIN_WAVEHDR *pwhdr;
3584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
3594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pthread_mutex_lock ( &gAudioMutex );
3624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  //signal to tell that our thread is now running.
3644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ( pthread_cond_signal ( &gThreadRunning ) != 0 )
3654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
3664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pthread_mutex_unlock ( &gAudioMutex );
3674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError ( "Audio In Error pthread_cond_signal\n" );
3684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    exit ( 1 );
3694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
3704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  gThreadRunningSignaled = 1;
3714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  while( 1 )
3734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
3744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    while (!doneWaiting)
3764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
3774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      int rc = pthread_cond_wait(&gOpenExCalled, &gAudioMutex);
3784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      switch (rc)
3794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
3804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        case 0:
3814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          if (!gOpenExCalledSignaled)
3824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          {
3834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            // Avoid spurious wakeups
3844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            continue;
3854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
3864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          else
3874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          {
3884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            gOpenExCalledSignaled = 0;
3894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            doneWaiting = 1;
3904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            break;
3914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
3924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          break;
3934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        default:
3944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          PLogError ( "Audio In Error pthread_cond_signal\n" );
3954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          pthread_mutex_unlock(&gAudioMutex);
3964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          return ( (void *)NULL );
3974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
3984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
3994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    doneWaiting = 0;
4004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pthread_mutex_unlock(&gAudioMutex);
4014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if( gTerminateThread == 1 )
4034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      break;
4044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* buffer of 16 bits samples */
4084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CodecBuffer = (audioinSample *)malloc ( gCodecFragmentSizeInFrames * sizeof ( audioinSample ) );
4094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( CodecBuffer == NULL )
4114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
4124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError ( "Audio In Error malloc\n" );
4134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      exit ( 1 );
4144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
4154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pwhdr = malloc ( sizeof ( AUDIOIN_WAVEHDR ) );
4164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( pwhdr == NULL )
4184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
4194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError ( "Audio In Error malloc\n" );
4204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      exit ( 1 );
4214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
4224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    while ( !getClose ( ) )
4244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
4254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      int iReadFrames  = 0;  /* number of frames acquired by the codec */
4274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* NOTE: here a frame is comprised of 1 sample if mono, 2 samples if stereo, etc */
4284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      int iReadSamples = 0;  /* number of samples acquired by the codec */
4294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      int frames_to_read;     /* Actual number to read */
4304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      int frames_read;        /* Frames read on one read */
4314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      iReadFrames = 0;
4334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      do
4354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
4364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        frames_to_read = gCodecFragmentSizeInFrames - iReadFrames;
4374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* AudioRead() - output: number of frames (mono: 1 sample, stereo: 2 samples)*/
4384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        frames_read = AudioRead ( CodecBuffer + iReadFrames, frames_to_read );
4394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if ( frames_read > 0 )
4414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          iReadFrames += frames_read;
4424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
4434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      while ( ( iReadFrames < gCodecFragmentSizeInFrames ) && ( frames_read > 0 ) );
4444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      iReadSamples = iReadFrames;
4454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if ( getRecord ( ) )  /* else continue to read from driver but discard samples */
4474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
4484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if ( iReadSamples < 0 )
4494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
4504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          iReadSamples = 0;
4514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          gAudioInInfo.eStatusInfo = AUDIOIN_HWOVERRUN;
4524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
4534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        else
4544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
4554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef FILTER_ON
4564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          /* x: index for start of input samples; y: index for output sample */
4574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          for ( x = 0, y = 0; x < iReadSamples; x += pFIR->factor_down )
4584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          {
4594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            FIR_downsample ( pFIR->factor_down, &( CodecBuffer[x] ), &( CodecBuffer[y++] ), pFIR );
4604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
4614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          /* update the number samples */
4624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          iReadSamples = y;
4634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
4644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          pthread_mutex_lock ( &gAudioMutex );
4654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          if ( gAudioInInfo.u32SamplesAvailable + iReadSamples > SAMPLES_BUFFER_SIZE )
4674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          {
4684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            gAudioInInfo.u32SamplesAvailable = SAMPLES_BUFFER_SIZE;
4694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            gAudioInInfo.eStatusInfo = AUDIOIN_FIFOOVERRUN;
4704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
4714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          else
4724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          {
4734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            if ( gAudioInInfo.u32SamplesAvailable + iReadSamples > SAMPLES_BUFFER_HIGH_WATERMARK )
4744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            {
4754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              gAudioInInfo.eStatusInfo = AUDIOIN_HIGHWATERMARK;
4764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            }
4774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            else if ( gAudioInInfo.eStatusInfo != AUDIOIN_FIFOOVERRUN )
4784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            {
4794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              gAudioInInfo.eStatusInfo = AUDIOIN_NORMAL;
4804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            }
4814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            gAudioInInfo.u32SamplesAvailable += iReadSamples;
4824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
4834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          if ( gWriteIndexPointer + iReadSamples <= SAMPLES_BUFFER_SIZE )
4844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          {
4854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            memcpy ( &( gSamplesBufferCircularFifo[gWriteIndexPointer] ), CodecBuffer,
4864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                iReadSamples * sizeof ( audioinSample ) );
4874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            gWriteIndexPointer += iReadSamples;
4884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            if ( gWriteIndexPointer >= SAMPLES_BUFFER_SIZE )
4904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              gWriteIndexPointer = 0;
4914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
4924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          else
4934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          {
4944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            int NbToCopy;
4954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            NbToCopy = SAMPLES_BUFFER_SIZE - gWriteIndexPointer;
4974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            memcpy ( &( gSamplesBufferCircularFifo [gWriteIndexPointer] ), CodecBuffer,
4984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                NbToCopy * sizeof ( audioinSample ) );
4994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            gWriteIndexPointer = 0;
5004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            memcpy ( gSamplesBufferCircularFifo, &( CodecBuffer [NbToCopy] ),
5014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                ( iReadSamples-NbToCopy ) * sizeof ( audioinSample ) );
5024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            gWriteIndexPointer = iReadSamples - NbToCopy;
5034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
5044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef AUDIOIN_SUPPORT_CALLBACK
5064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          /* Callback notification.  Ideally this audio acquisition thread should be very lean.
5074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project             It should simply read from the low level driver, store the filtered samples in
5084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project             the FIFO, then go back to reading from the driver.  The additional data copy
5094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project             for the callback function is ok despite the overhead incurred, but only because
5104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project             there's some buffering done by the low level driver.  This design should be
5114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project             revisited to make it more general purpose.
5124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project             */
5134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          if ( gpCallback != NULL )
5144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          {
5154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            pwhdr->nBufferLength  = iReadSamples * sizeof ( audioinSample );
5164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            pwhdr->nBytesRecorded = pwhdr->nBufferLength;
5174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            pwhdr->status = AUDIOIN_NORMAL;
5184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            pwhdr->pData = CodecBuffer;
5194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            /* pass samples to callback function who should deallocate the buffer and structure */
5204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            gpCallback ( *phAudioIn, AUDIOIN_MSG_DATA, gpCallbackInstance, pwhdr, NULL );
5214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
5224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
5234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          /* samples are available to read */
5244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          pthread_mutex_unlock ( &gAudioMutex );
5254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          timer.tv_sec = 0;
5264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          timer.tv_usec = 200;
5274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          select ( 0, NULL, NULL, NULL, &timer );
5284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
5294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      } /* if (getRecord()) */
5304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    } /* while (!getClose()) */
5324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( AudioClose ( ) !=0 )
5334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
5344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError ( "Audio In Error Closing Hardware\n" );
5354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
5364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    free ( CodecBuffer );
5374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pthread_mutex_lock ( &gAudioMutex );
5394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    //signal to tell that our thread is now running.
5404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( pthread_cond_signal ( &gCloseCalled ) != 0 )
5414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
5424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      pthread_mutex_unlock ( &gAudioMutex );
5434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError ( "Audio In Error pthread_cond_signal\n" );
5444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      exit ( 1 );
5454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
5464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    gCloseCalledSignaled = 1;
5474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pthread_exit ( (void *)NULL );
5504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ( (void *)NULL );
5514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
5524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
5544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* non-ANDROID version */
5554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid *AcquisitionThread ( void *data )
5574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
5584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int doneWaiting = 0;
5594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  audioinSample   *CodecBuffer;
5604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef FILTER_ON
5614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  long            x;
5624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  long            y;
5634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
5644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef AUDIOIN_SUPPORT_CALLBACK
5654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  AUDIOIN_H       *phAudioIn = (AUDIOIN_H *)data;
5664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
5674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pthread_mutex_lock ( &gAudioMutex );
5694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  //signal to tell that our thread is now running.
5714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ( pthread_cond_signal ( &gThreadRunning ) != 0 )
5724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
5734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pthread_mutex_unlock ( &gAudioMutex );
5744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError ( "Audio In Error pthread_cond_signal\n" );
5754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    exit ( 1 );
5764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  gThreadRunningSignaled = 1;
5784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  while( 1 )
5804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
5814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    while (!doneWaiting)
5824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
5834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      int rc = pthread_cond_wait(&gOpenExCalled, &gAudioMutex);
5844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      switch (rc)
5854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
5864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        case 0:
5874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          if (!gOpenExCalledSignaled)
5884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          {
5894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            // Avoid spurious wakeups
5904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            continue;
5914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
5924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          else
5934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          {
5944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            gOpenExCalledSignaled = 0;
5954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            doneWaiting = 1;
5964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            break;
5974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
5984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          break;
5994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        default:
6004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          PLogError ( "Audio In Error pthread_cond_wait\n" );
6014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          pthread_mutex_unlock(&gAudioMutex);
6024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          return ( (void *)NULL );
6034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
6044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
6054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    doneWaiting = 0;
6064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pthread_mutex_unlock(&gAudioMutex);
6074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if( gTerminateThread == 1 )
6094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      break;
6104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* buffer of 16 bits samples */
6124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CodecBuffer = (audioinSample *)malloc ( gCodecFragmentSizeInFrames * sizeof ( audioinSample ) );
6134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( CodecBuffer == NULL )
6154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
6164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError ( "Audio In Error pthread_cond_signal\n" );
6174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      exit ( 1 );
6184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
6194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    while ( !getClose ( ) )
6214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
6224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      int iReadFrames  = 0;  /* number of frames acquired by the codec */
6234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* NOTE: here a frame is comprised of 1 sample if mono, 2 samples if stereo, etc */
6244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      int iReadSamples = 0;  /* number of samples acquired by the codec */
6254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if ( ( iReadFrames = snd_pcm_readi ( ghPCM, (void *)CodecBuffer, gCodecFragmentSizeInFrames ) ) < 0 )
6264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
6274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if ( iReadFrames == -EBADFD )
6284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
6294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          PLogError ( "Audio In Error PCM Not In The Right State\n" );
6304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
6314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        else if ( iReadFrames == -EPIPE )
6324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
6334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          snd_pcm_prepare(ghPCM);
6344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          PLogError ( "Audio In Error Overrun\n" );
6354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
6364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        else if ( iReadFrames == -ESTRPIPE )
6374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
6384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          PLogError ( "Audio In Error Stream Suspended\n" );
6394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
6404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
6414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      iReadSamples = iReadFrames;
6424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if ( getRecord ( ) )  /* else continue to read from driver but discard samples */
6444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
6454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if ( iReadSamples < 0 )
6464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
6474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          iReadSamples = 0;
6484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          gAudioInInfo.eStatusInfo = AUDIOIN_HWOVERRUN;
6494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
6504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        else
6514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
6524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef FILTER_ON
6534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          /* x: index for start of input samples; y: index for output sample */
6544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          for ( x = 0, y = 0; x < iReadSamples; x += pFIR->factor_down )
6554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          {
6564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            FIR_downsample ( pFIR->factor_down, &( CodecBuffer[x] ), &( CodecBuffer[y++] ), pFIR );
6574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
6584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          /* update the number samples */
6594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          iReadSamples = y;
6604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
6614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SAVE_RAW_AUDIO
6624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          if ( iReadSamples > 0 )
6634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            fwrite ( CodecBuffer, 2, iReadSamples, audio_data );
6644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
6654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          pthread_mutex_lock ( &gAudioMutex );
6674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          if ( gAudioInInfo.u32SamplesAvailable + iReadSamples > SAMPLES_BUFFER_SIZE )
6694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          {
6704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            gAudioInInfo.u32SamplesAvailable = SAMPLES_BUFFER_SIZE;
6714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            gAudioInInfo.eStatusInfo = AUDIOIN_FIFOOVERRUN;
6724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
6734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          else
6744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          {
6754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            if ( gAudioInInfo.u32SamplesAvailable + iReadSamples > SAMPLES_BUFFER_HIGH_WATERMARK )
6764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            {
6774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              gAudioInInfo.eStatusInfo = AUDIOIN_HIGHWATERMARK;
6784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            }
6794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            else if ( gAudioInInfo.eStatusInfo != AUDIOIN_FIFOOVERRUN )
6804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            {
6814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              gAudioInInfo.eStatusInfo = AUDIOIN_NORMAL;
6824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            }
6834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            gAudioInInfo.u32SamplesAvailable += iReadSamples;
6844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
6854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          if ( gWriteIndexPointer + iReadSamples <= SAMPLES_BUFFER_SIZE )
6864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          {
6874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            memcpy ( &( gSamplesBufferCircularFifo[gWriteIndexPointer] ), CodecBuffer,
6884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                iReadSamples * sizeof ( audioinSample ) );
6894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            gWriteIndexPointer += iReadSamples;
6904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            if ( gWriteIndexPointer >= SAMPLES_BUFFER_SIZE )
6924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              gWriteIndexPointer = 0;
6934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
6944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          else
6954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          {
6964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            int NbToCopy;
6974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            NbToCopy = SAMPLES_BUFFER_SIZE - gWriteIndexPointer;
6994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            memcpy ( &( gSamplesBufferCircularFifo [gWriteIndexPointer] ), CodecBuffer,
7004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                NbToCopy * sizeof ( audioinSample ) );
7014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            gWriteIndexPointer = 0;
7024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            memcpy ( gSamplesBufferCircularFifo, &( CodecBuffer [NbToCopy] ),
7034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                ( iReadSamples-NbToCopy ) * sizeof ( audioinSample ) );
7044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            gWriteIndexPointer = iReadSamples - NbToCopy;
7054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
7064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef AUDIOIN_SUPPORT_CALLBACK
7074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          /* Callback notification.  Ideally this audio acquisition thread should be very lean.
7084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project             It should simply read from the low level driver, store the filtered samples in
7094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project             the FIFO, then go back to reading from the driver.  The additional data copy
7104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project             for the callback function is ok despite the overhead incurred, but only because
7114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project             there's some buffering done by the low level driver.  This design should be
7124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project             revisited to make it more general purpose.
7134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project             */
7144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          while ( ( gpCallback != NULL ) && ( gAudioInInfo.u32SamplesAvailable >= gnCallbackSamples ) )
7154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          {
7164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            AUDIOIN_WAVEHDR *pwhdr;
7174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            pwhdr = malloc ( sizeof ( AUDIOIN_WAVEHDR ) );
7194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            if ( pwhdr != NULL )
7214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            {
7224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              pwhdr->nBufferLength  = gnCallbackSamples * sizeof ( audioinSample );
7234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              pwhdr->nBytesRecorded = pwhdr->nBufferLength;
7244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              pwhdr->status = gAudioInInfo.eStatusInfo;
7254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              pwhdr->pData = malloc ( pwhdr->nBufferLength );
7264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              if ( pwhdr->pData != NULL )
7284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              {
7294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                if ( gReadIndexPointer + gnCallbackSamples <= SAMPLES_BUFFER_SIZE )
7304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                {
7314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                  memcpy ( pwhdr->pData, &( gSamplesBufferCircularFifo [gReadIndexPointer] ),
7324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                      pwhdr->nBufferLength );
7334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                  gReadIndexPointer += gnCallbackSamples;
7344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                  if ( gReadIndexPointer >= SAMPLES_BUFFER_SIZE )
7364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                    gReadIndexPointer = 0;
7374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                }
7384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                else
7394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                {
7404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                  size_t nSamplesPart1 = SAMPLES_BUFFER_SIZE - gReadIndexPointer;
7414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                  size_t nSamplesPart2 = gnCallbackSamples - nSamplesPart1;
7424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                  memcpy ( pwhdr->pData, &( gSamplesBufferCircularFifo [gReadIndexPointer] ),
7444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                      nSamplesPart1*sizeof ( audioinSample ) );
7454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                  gReadIndexPointer = 0;
7464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                  memcpy ( pwhdr->pData + nSamplesPart1 * sizeof (audioinSample ),
7474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                      gSamplesBufferCircularFifo, nSamplesPart2 * sizeof ( audioinSample ) );
7484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                  gReadIndexPointer = nSamplesPart2;
7494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                }
7504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                gAudioInInfo.u32SamplesAvailable -= gnCallbackSamples;
7514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                /* pass samples to callback function who should deallocate the buffer and structure */
7524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                gpCallback ( *phAudioIn, AUDIOIN_MSG_DATA, gpCallbackInstance, pwhdr, NULL );
7534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              }
7544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              else
7554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              {
7564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                // error
7574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              }
7584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            }
7594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            else
7604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            {
7614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              // error
7624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            }
7634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
7644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
7654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          /* samples are available to read */
7664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          pthread_mutex_unlock ( &gAudioMutex );
7674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          timer.tv_sec = 0;
7684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          timer.tv_usec = 200;
7694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          select ( 0, NULL, NULL, NULL, &timer );
7704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
7714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      } /* if (getRecord()) */
7724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    } /* while (!getClose()) */
7744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( snd_pcm_close ( ghPCM ) !=0 )
7764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
7774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError ( "Audio In Error Closing Hardware\n" );
7784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
7794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    free ( CodecBuffer );
7814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pthread_mutex_lock ( &gAudioMutex );
7834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    //signal to tell that our thread is now running.
7844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( pthread_cond_signal ( &gCloseCalled ) != 0 )
7854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
7864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      pthread_mutex_unlock ( &gAudioMutex );
7874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError ( "Audio In Error pthread_cond_signal\n" );
7884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      exit ( 1 );
7894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
7904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    gCloseCalledSignaled = 1;
7914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
7924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pthread_exit ( (void *)NULL );
7934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ( (void *)NULL );
7944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
7954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
7964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**************************************************************
7984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * OpenAndPrepareSound                                         *
7994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *************************************************************/
8004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int OpenAndPrepareSound(unsigned long ulFrequency)
8034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
8044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(ANDROID)
8054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Only support certain frequencies.  Modify this to check frequency
8074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     against a structure of valid frequencies */
8084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef FILTER_ON
8094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ( ulFrequency == 11025 )
8104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
8114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( AudioSetInputFormat ( 44100, NR_OF_CHANNELS ) != 0 ) /* sample at 44100 then downsample */
8124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
8134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError ( "Audio In Error OpenAndPrepareSound - AudioSetInputFormat failed!\n");
8144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
8154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
8164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
8174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
8184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
8194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError ( "Audio In Error OpenAndPrepareSound - invalid frequency!");
8204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
8214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
8224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
8234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ( ( ulFrequency == 11025 ) || ( ulFrequency == 8000 ) )
8244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
8254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( AudioSetInputFormat ( ulFrequency, NR_OF_CHANNELS ) != 0 )
8264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
8274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError ( "Audio In Error OpenAndPrepareSound - AudioSetInputFormat failed!");
8284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
8294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
8304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
8314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
8324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
8334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError ( "Audio In Error OpenAndPrepareSound - invalid frequency!");
8344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
8354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
8364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
8374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* set some variables */
8394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  gAudioInInfo.u32SamplesAvailable = 0;
8404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Open Audio driver */
8424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (AudioOpen() < 0)
8434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
8444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError ( "Audio In Error OpenAndPrepareSound - AudioOpen failed!");
8454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ~LHS_AUDIOIN_OK;
8464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
8474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
8494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  snd_pcm_hw_params_t *hwparams;
8514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  unsigned int         exact_rate;
8524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                  dir;
8534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                  rc;
8544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* step 1 : open the sound device */
8564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* ------------------------------ */
8574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ((rc = snd_pcm_open(&ghPCM, "default", SND_PCM_STREAM_CAPTURE, 0)) < 0)
8584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
8594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError ( "Audio In Error snd_pcm_open() (rc = %d: %s)\n", rc, snd_strerror(rc));
8604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
8614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
8624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ((rc = snd_pcm_hw_params_malloc(&hwparams)) < 0)
8644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
8654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError ( "Audio In Error snd_pcm_hw_params_malloc() (rc = %d: %s)\n", rc, snd_strerror(rc));
8664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
8674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
8684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* step 2 : configuring the audio channel */
8704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* -------------------------------------- */
8714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ((rc = snd_pcm_hw_params_any(ghPCM, hwparams)) < 0)
8734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
8744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError ( "Audio In Error snd_pcm_hw_params_any() (rc = %d: %s)\n", rc, snd_strerror(rc));
8754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
8764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
8774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ((rc = snd_pcm_hw_params_set_access(ghPCM, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0)
8794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
8804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError ( "Audio In Error snd_pcm_hw_params_set_access() (rc = %d: %s)\n", rc, snd_strerror(rc));
8814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
8824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
8834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ((rc = snd_pcm_hw_params_set_format(ghPCM, hwparams, SND_PCM_FORMAT_S16_LE)) < 0)
8854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
8864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError ( "Audio In Error snd_pcm_hw_params_set_format() (rc = %d: %s)\n", rc, snd_strerror(rc));
8874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
8884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
8894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef FILTER_ON
8914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (ulFrequency == 11025)
8924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
8934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    exact_rate = 44100;
8944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
8954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
8964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
8974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
8984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  exact_rate = ulFrequency;
8994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
9004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  dir = 0;
9024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if 0
9044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* This version seems to have problems when the code is compiled into a shared library.
9054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     The subsequent call to snd_pcm_hw_params() fails. */
9064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ((rc = snd_pcm_hw_params_set_rate_near(ghPCM, hwparams, &exact_rate, &dir)) < 0)
9074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
9084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError ( "Audio In Error snd_pcm_hw_params_set_rate_near() (rc = %d: %s)\n", rc, snd_strerror(rc));
9094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
9104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
9114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
9124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* This version works better and in fact makes more sense. */
9134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ((rc = snd_pcm_hw_params_set_rate(ghPCM, hwparams, exact_rate, dir)) < 0)
9144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
9154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError ( "Audio In Error snd_pcm_hw_params_set_rate() (rc = %d: %s)\n", rc, snd_strerror(rc));
9164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
9174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
9184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
9194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ((rc = snd_pcm_hw_params_set_channels(ghPCM, hwparams, NR_OF_CHANNELS)) < 0)
9224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
9234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError ( "Audio In Error snd_pcm_hw_params_set_channels() (rc = %d: %s)\n", rc, snd_strerror(rc));
9244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
9254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
9264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ((rc = snd_pcm_hw_params(ghPCM, hwparams)) < 0)
9284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
9294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError ( "Audio In Error snd_pcm_hw_params() (rc = %d: %s)\n", rc, snd_strerror(rc));
9304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
9314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
9324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* step 3 : preparing for read */
9344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* --------------------------- */
9354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*prepare the channel */
9374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ((rc = snd_pcm_prepare(ghPCM)) < 0)
9394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
9404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError ( "Audio In Error snd_pcm_prepare() (rc = %d: %s)\n", rc, snd_strerror(rc));
9414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
9424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
9434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* set some variables */
9454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  gAudioInInfo.u32SamplesAvailable = 0;
9464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
9494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* prepare to read samples */
9514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  setCloseOff();
9524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return 0;
9544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
9554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* -------------------------------------------------------------------------+
9584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   |   GLOBAL FUNCTIONS (prototypes in header file)                           |
9594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   + -------------------------------------------------------------------------*/
9604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**************************************************************
9624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * lhs_audioinOpenEx                                             *
9634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                             *
9644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * notes :                                                     *
9654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  -the input parameters are in fact not used but present     *
9664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *    to ensure compatibility with Win32 implementations       *
9674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project **************************************************************/
9684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectLHS_AUDIOIN_ERROR  lhs_audioinOpenEx (
9694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    unsigned long u32AudioInID,         /*@parm [in]  Audio-in device ID (ranges from 0 to a number of available
9704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          devices on the system). You can also use the following flag
9714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          instead of a device identifier.
9724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          <nl><nl><bold WAVE_MAPPER> = The function selects a
9734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          waveform-audio input device capable of recording in the
9744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          specified format. <bold Header:> Declared in Mmsystem.h from
9754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          the Windows Multimedia: Platform SDK.*/
9764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    unsigned long u32Frequency,         /*@parm [in]  Frequency of the recognition engine in Hz. */
9774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    unsigned long u32NbrOfFrames,       /*@parm [in]  Number of frames buffered internally. */
9784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    unsigned long u32SamplesPerFrame,   /*@parm [in]  Size, in samples, of each individual frame. */
9794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    AUDIOIN_H * phAudioIn               /*@parm [out] Handle to the audio-in device */
9804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    )
9814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
9824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  //initialize some of the static variables.
9834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if( Initialize(phAudioIn) )
9844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ~LHS_AUDIOIN_OK;
9854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* prepare sound */
9884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (OpenAndPrepareSound(u32Frequency) != 0)
9894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
9904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return LHS_E_AUDIOIN_COULDNOTOPENDEVICE;
9914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
9924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  //signal the thread that it has to stop running.
9944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pthread_mutex_lock ( &gAudioMutex );
9954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  //signal to tell that our thread is now running.
9964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ( pthread_cond_signal ( &gOpenExCalled ) != 0 )
9974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
9984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pthread_mutex_unlock ( &gAudioMutex );
9994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError ( "Audio In Error pthread_cond_signal\n" );
10004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    exit ( 1 );
10014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
10024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  gOpenExCalledSignaled = 1;
10034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pthread_mutex_unlock ( &gAudioMutex );
10044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef FILTER_ON
10064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* need to make this more generic to support different filters */
10074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pFIR = FIR_construct(filter_length, ps16FilterCoeff_up1_down4, u16ScaleFilterCoeff_up1_down4, FACTOR_UP, FACTOR_DOWN);
10084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (pFIR == NULL)
10094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
10104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // TO DO: HANDLE THIS (or modify for static allocation)
10114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
10124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
10134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* set the status to normal */
10154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  gAudioInInfo.eStatusInfo = AUDIOIN_NORMAL;
10164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* do not care, but some applications are checking a NULL handle */
10184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *phAudioIn = (void *)10;
10194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef AUDIOIN_SUPPORT_CALLBACK
10214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  gpCallback         = NULL;
10224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  gpCallbackInstance = NULL;
10234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  gnCallbackSamples  = 0;
10244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
10254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return LHS_AUDIOIN_OK;
10274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
10284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**************************************************************
10304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * lhs_audioinOpen                                             *
10314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                             *
10324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * notes :                                                     *
10334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  -the input parameters are in fact not used but present     *
10344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *    to ensure compatibility with Win32 implementation        *
10354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project **************************************************************/
10364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectLHS_AUDIOIN_ERROR  lhs_audioinOpen (
10374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    unsigned long u32AudioInID,         /*@parm [in]  Audio-in device ID (ranges from 0 to a number of available
10384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          devices on the system). You can also use the following flag
10394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          instead of a device identifier.
10404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          <nl><nl><bold WAVE_MAPPER> = The function selects a
10414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          waveform-audio input device capable of recording in the
10424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          specified format. <bold Header:> Declared in Mmsystem.h from
10434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          the Windows Multimedia: Platform SDK.*/
10444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    unsigned long u32Frequency,         /*@parm [in]  Frequency of the recognition engine in Hz. */
10454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    AUDIOIN_H * phAudioIn               /*@parm [out] Handle to the audio-in device */
10464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    )
10474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
10484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return lhs_audioinOpenEx(u32AudioInID, u32Frequency, 0, 0, phAudioIn);
10494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} /* lhs_audioinOpen */
10504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef AUDIOIN_SUPPORT_CALLBACK
10524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**************************************************************
10534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * lhs_audioinOpenCallback                                     *
10544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                             *
10554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * notes :                                                     *
10564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  -the input parameters are in fact not used but present     *
10574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *    to ensure compatibility with Win32 implementation        *
10584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project **************************************************************/
10594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectLHS_AUDIOIN_ERROR  lhs_audioinOpenCallback (
10604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    unsigned long u32AudioInID,         /*@parm [in]  Audio-in device ID (ranges from 0 to a number of available
10614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          devices on the system). You can also use the following flag
10624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          instead of a device identifier.
10634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          <nl><nl><bold WAVE_MAPPER> = The function selects a
10644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          waveform-audio input device capable of recording in the
10654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          specified format. <bold Header:> Declared in Mmsystem.h from
10664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          the Windows Multimedia: Platform SDK.*/
10674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    unsigned long u32Frequency,         /*@parm [in]  Frequency of the recognition engine in Hz. */
10684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    unsigned long u32NbrOfSamples,      /*@parm [in] <nl><bold Input:> Number of samples requested per callback */
10694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pCallbackFunc pCallback,            /*@parm [in] callback function */
10704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    void         *pCallbackInstance,    /*@parm [in] callback instance */
10714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    AUDIOIN_H * phAudioIn               /*@parm [out] Handle to the audio-in device */
10724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    )
10734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
10744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LHS_AUDIOIN_ERROR lhsErr;
10754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef FILTER_ON
10774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  gCodecFragmentSizeInFrames = u32NbrOfSamples * 4;
10784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
10794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  gCodecFragmentSizeInFrames = u32NbrOfSamples;
10804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
10814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ((pCallback == NULL) || (u32NbrOfSamples == 0))
10834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
10844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return LHS_E_AUDIOIN_INVALIDARG;
10854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
10864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  lhsErr = lhs_audioinOpenEx(u32AudioInID, u32Frequency, 0, 0, phAudioIn);
10874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (lhsErr != LHS_AUDIOIN_OK)
10884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
10894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return lhsErr;
10904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
10914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* install callback */
10934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  gpCallback         = pCallback;
10944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  gpCallbackInstance = pCallbackInstance;
10954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  gnCallbackSamples  = u32NbrOfSamples;
10964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* callback notification */
10984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  gpCallback(*phAudioIn, AUDIOIN_MSG_OPEN, gpCallbackInstance, NULL, NULL);
10994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return LHS_AUDIOIN_OK;
11014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} /* lhs_audioinOpenCallback */
11034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
11044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**************************************************************
11064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * lhs_audioinClose                                            *
11074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                             *
11084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * notes :                                                     *
11094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  -the input parameters are in fact not used but present     *
11104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *    to ensure compatibility with Win32 implementations       *
11114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project **************************************************************/
11124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectLHS_AUDIOIN_ERROR lhs_audioinClose(AUDIOIN_H *phAudioIn)
11144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
11154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int doneWaiting = 0;
11164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Validate the handle */
11184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ((phAudioIn == NULL) || (*phAudioIn == NULL))
11194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
11204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return LHS_E_AUDIOIN_NULLPOINTER;
11214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
11224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* stop recording audio samples */
11244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  setRecordOff();
11254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* stop reading audio samples */
11274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  setCloseOn();
11284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  //wait for the thread to stop reading samples.
11304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pthread_mutex_lock ( &gAudioMutex );
11314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  while (!doneWaiting)
11334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
11344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int rc = pthread_cond_wait(&gCloseCalled, &gAudioMutex);
11354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    switch (rc)
11364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
11374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      case 0:
11384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (!gCloseCalledSignaled)
11394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
11404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          // Avoid spurious wakeups
11414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          continue;
11424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
11434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        else
11444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
11454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          gCloseCalledSignaled = 0;
11464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          doneWaiting = 1;
11474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          break;
11484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
11494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        break;
11504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      default:
11514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        PLogError ( "Audio In Error pthread_cond_wait\n" );
11524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        pthread_mutex_unlock(&gAudioMutex);
11534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return ~LHS_AUDIOIN_OK;
11544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
11554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
11564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pthread_mutex_unlock(&gAudioMutex);
11574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef FILTER_ON
11594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FIR_deconstruct(pFIR);
11604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
11614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef AUDIOIN_SUPPORT_CALLBACK
11634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* callback notification */
11644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (gpCallback != NULL) gpCallback(*phAudioIn, AUDIOIN_MSG_CLOSE, gpCallbackInstance, NULL, NULL);
11654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
11664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return LHS_AUDIOIN_OK;
11684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
11694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**************************************************************
11714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * lhs_audioinStart                                            *
11724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                             *
11734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * notes :                                                     *
11744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  -the input parameters are in fact not used but present     *
11754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *    to ensure compatibility with Win32 implementations       *
11764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  -in fact the recording is never stopped or started, when   *
11774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *    non in 'start' status, the samples are just ignored      *
11784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project **************************************************************/
11794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectLHS_AUDIOIN_ERROR lhs_audioinStart(AUDIOIN_H hAudioIn)
11814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
11824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SAVE_RAW_AUDIO
11834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char file_name [256];
11844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  gettimeofday ( &buffer_save_audio, NULL );
11864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  sprintf ( file_name, "data_%ld_%ld.raw", buffer_save_audio.tv_sec, buffer_save_audio.tv_usec );
11874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  audio_data = fopen ( file_name, "w" );
11884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
11894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (hAudioIn == NULL)
11904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
11914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return LHS_E_AUDIOIN_NULLPOINTER;
11924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
11934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pthread_mutex_lock ( &gAudioMutex );
11954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef FILTER_ON
11974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FIR_reset(pFIR);
11984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
11994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  gWriteIndexPointer = 0;
12014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  gReadIndexPointer = 0;
12024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  gAudioInInfo.u32SamplesAvailable = 0;
12034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* start recording */
12054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  setRecordOn();
12064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef AUDIOIN_SUPPORT_CALLBACK
12084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* callback notification */
12094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (gpCallback != NULL) gpCallback(hAudioIn, AUDIOIN_MSG_START, gpCallbackInstance, NULL, NULL);
12104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
12114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pthread_mutex_unlock ( &gAudioMutex );
12124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return LHS_AUDIOIN_OK;
12144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
12154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**************************************************************
12174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * lhs_audioinStop                                             *
12184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                             *
12194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * notes :                                                     *
12204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  -the input parameters are in fact not used but present     *
12214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *    to ensure compatibility with Win32 implementations       *
12224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  -in fact the recording is never stopped or started, when   *
12234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *    non in 'start' status, the samples are just ignored      *
12244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project **************************************************************/
12254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectLHS_AUDIOIN_ERROR lhs_audioinStop(AUDIOIN_H hAudioIn)
12274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
12284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SAVE_RAW_AUDIO
12294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  fclose ( audio_data );
12304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
12314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (hAudioIn == NULL)
12324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
12334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return LHS_E_AUDIOIN_NULLPOINTER;
12344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
12354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pthread_mutex_lock ( &gAudioMutex );
12364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* stop recording (discard samples) */
12384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  setRecordOff();
12394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef AUDIOIN_SUPPORT_CALLBACK
12414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* callback notification */
12424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (gpCallback != NULL) gpCallback(hAudioIn, AUDIOIN_MSG_STOP, gpCallbackInstance, NULL, NULL);
12434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
12444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pthread_mutex_unlock ( &gAudioMutex );
12454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return LHS_AUDIOIN_OK;
12474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
12484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**************************************************************
12504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * lhs_audioinGetSamples                                       *
12514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                             *
12524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * notes :                                                     *
12534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project **************************************************************/
12544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectLHS_AUDIOIN_ERROR lhs_audioinGetSamples(AUDIOIN_H hAudioIn, unsigned long * u32NbrOfSamples, void * pAudioBuffer, AUDIOIN_INFO * pgAudioInInfo)
12564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
12574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  unsigned long cSamples;
12584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  //unsigned long nToCopy;
12594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Check if the handle is valid */
12614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (hAudioIn == NULL)
12624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
12634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return LHS_E_AUDIOIN_NULLPOINTER;
12644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
12654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cSamples = 0;
12674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  while (1)
12694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
12704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* wait until we have enough samples */
12714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (*u32NbrOfSamples <= gAudioInInfo.u32SamplesAvailable)
12724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
12734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* lock the code to prevent dual access to some variables */
12744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      pthread_mutex_lock(&gAudioMutex);
12754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* TO DO: consider copying in chunks (like in AquisitionThread)
12774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         rather than 1 sample at a time. */
12784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* copy all samples into the input buffer */
12804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      while ((cSamples < *u32NbrOfSamples))
12814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
12824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        ((audioinSample *)pAudioBuffer)[cSamples++] = gSamplesBufferCircularFifo[gReadIndexPointer++];
12834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* adapt the parameters */
12854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        gAudioInInfo.u32SamplesAvailable -= 1;
12864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* adapt circular buffer */
12884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (gReadIndexPointer >= SAMPLES_BUFFER_SIZE)
12894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
12904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          gReadIndexPointer = 0;
12914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
12924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* enough samples */
12944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (cSamples == *u32NbrOfSamples)
12954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
12964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          /* return the audioin info structure */
12974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          memcpy(pgAudioInInfo, &gAudioInInfo, sizeof(AUDIOIN_INFO));
12984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          pthread_mutex_unlock(&gAudioMutex);
12994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          return LHS_AUDIOIN_OK;
13004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
13014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
13024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
13034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else
13044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
13054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* relinquish CPU.  select() is more reliable than usleep(). */
13064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      timer.tv_sec = 0;
13074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      timer.tv_usec = 10000;
13084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      select(0, NULL, NULL, NULL, &timer);
13094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
13104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  } /* while (1) */
13114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
13124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**************************************************************
13144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * lhs_audioinGetVersion                                       *
13154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                             *
13164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * notes : not implemented                                     *
13174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project **************************************************************/
13184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectLHS_AUDIOIN_ERROR lhs_audioinGetVersion(unsigned long *pu32Version)
13204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
13214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return LHS_E_AUDIOIN_NOTIMPLEMENTED;
13224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
13234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**************************************************************
13264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * lhs_audioinGetVolume/lhs_audioinSetVolume                   *
13274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                             *
13284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * notes : not implemented                                     *
13294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project **************************************************************/
13304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectLHS_AUDIOIN_ERROR lhs_audioinGetVolume(AUDIOIN_H hAudioIn, unsigned long *pu32Volume)
13324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
13334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *pu32Volume = gRecordingVolume;
13344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return LHS_AUDIOIN_OK;
13354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
13364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectLHS_AUDIOIN_ERROR lhs_audioinSetVolume(AUDIOIN_H hAudioIn, unsigned long u32Volume)
13384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
13394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  gRecordingVolume = u32Volume;
13404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return LHS_E_AUDIOIN_NOTIMPLEMENTED;
13414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
13424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**************************************************************
13444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * lhs_audioinErrorGetString                                   *
13454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                             *
13464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * notes : not implemented                                     *
13474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project **************************************************************/
13484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectconst char *lhs_audioinErrorGetString(const LHS_AUDIOIN_ERROR Error)
13504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
13514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ("unknown error");
13524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
13534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
13564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/******************************************************************************/
13574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* STUB FUNCTIONS FOR SIMULATOR BUILD (DOES NOT SUPPORT THREADS)              */
13584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* This code is enabled if both ANDROID and __ARM_ARCH_5__ are defined.       */
13594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/******************************************************************************/
13604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "audioin.h"
13624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectLHS_AUDIOIN_ERROR  lhs_audioinOpenEx (
13644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    unsigned long u32AudioInID,         /*@parm [in]  Audio-in device ID (ranges from 0 to a number of available
13654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          devices on the system). You can also use the following flag
13664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          instead of a device identifier.
13674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          <nl><nl><bold WAVE_MAPPER> = The function selects a
13684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          waveform-audio input device capable of recording in the
13694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          specified format. <bold Header:> Declared in Mmsystem.h from
13704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          the Windows Multimedia: Platform SDK.*/
13714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    unsigned long u32Frequency,         /*@parm [in]  Frequency of the recognition engine in Hz. */
13724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    unsigned long u32NbrOfFrames,       /*@parm [in]  Number of frames buffered internally. */
13734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    unsigned long u32SamplesPerFrame,   /*@parm [in]  Size, in samples, of each individual frame. */
13744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    AUDIOIN_H * phAudioIn               /*@parm [out] Handle to the audio-in device */
13754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    )
13764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
13774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return LHS_E_AUDIOIN_NOTIMPLEMENTED;
13784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
13794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectLHS_AUDIOIN_ERROR  lhs_audioinOpen (
13814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    unsigned long u32AudioInID,         /*@parm [in]  Audio-in device ID (ranges from 0 to a number of available
13824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          devices on the system). You can also use the following flag
13834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          instead of a device identifier.
13844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          <nl><nl><bold WAVE_MAPPER> = The function selects a
13854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          waveform-audio input device capable of recording in the
13864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          specified format. <bold Header:> Declared in Mmsystem.h from
13874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          the Windows Multimedia: Platform SDK.*/
13884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    unsigned long u32Frequency,         /*@parm [in]  Frequency of the recognition engine in Hz. */
13894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    AUDIOIN_H * phAudioIn               /*@parm [out] Handle to the audio-in device */
13904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    )
13914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
13924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return LHS_E_AUDIOIN_NOTIMPLEMENTED;
13934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
13944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef AUDIOIN_SUPPORT_CALLBACK
13964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectLHS_AUDIOIN_ERROR lhs_audioinOpenCallback(unsigned long u32AudioInID, unsigned long u32Frequency, unsigned long u32NbrOfSamples, pCallbackFunc pCallback, void* pCallbackInstance, AUDIOIN_H * phAudioIn)
13974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
13984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return LHS_E_AUDIOIN_NOTIMPLEMENTED;
13994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
14004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
14014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectLHS_AUDIOIN_ERROR lhs_audioinClose(AUDIOIN_H *phAudioIn)
14034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
14044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return LHS_E_AUDIOIN_NOTIMPLEMENTED;
14054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
14064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectLHS_AUDIOIN_ERROR lhs_audioinStart(AUDIOIN_H hAudioIn)
14084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
14094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return LHS_E_AUDIOIN_NOTIMPLEMENTED;
14104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
14114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectLHS_AUDIOIN_ERROR lhs_audioinStop(AUDIOIN_H hAudioIn)
14134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
14144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return LHS_E_AUDIOIN_NOTIMPLEMENTED;
14154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
14164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectLHS_AUDIOIN_ERROR lhs_audioinGetSamples(AUDIOIN_H hAudioIn, unsigned long * u32NbrOfSamples, void * pAudioBuffer, AUDIOIN_INFO * pgAudioInInfo)
14184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
14194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return LHS_E_AUDIOIN_NOTIMPLEMENTED;
14204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
14214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectLHS_AUDIOIN_ERROR lhs_audioinGetVersion(unsigned long *pu32Version)
14234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
14244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return LHS_E_AUDIOIN_NOTIMPLEMENTED;
14254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
14264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectLHS_AUDIOIN_ERROR lhs_audioinGetVolume(AUDIOIN_H hAudioIn, unsigned long *pu32Volume)
14284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
14294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return LHS_E_AUDIOIN_NOTIMPLEMENTED;
14304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
14314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectLHS_AUDIOIN_ERROR lhs_audioinSetVolume(AUDIOIN_H hAudioIn, unsigned long u32Volume)
14334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
14344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return LHS_E_AUDIOIN_NOTIMPLEMENTED;
14354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
14364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectconst char *lhs_audioinErrorGetString(const LHS_AUDIOIN_ERROR Error)
14384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
14394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return "LHS_E_AUDIOIN_NOTIMPLEMENTED";
14404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
14414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
1443