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