audioinwrapper.cpp revision 0e94fe6807e53920046fa83715af4788b844ca95
14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------* 24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * audioinwrapper.cpp * 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 2115fc15883c8aee2b736e8cc9a31eef071908e4a0Sean McNeil#if defined(ANDROID) && (defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_4__)) 224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//#define USE_DEV_EAC_FILE 1 244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(USE_DEV_EAC_FILE) 264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <fcntl.h> 274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define N_CHANNELS 1 284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 29570be96f35b570ee31c86a602cc6c050e03a1f3dDima Zavin#include <system/audio.h> 304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <media/AudioRecord.h> 3185d4a2a8fe7c306f0e0cfd30f51e9015566c021dEric Laurent#include <media/mediarecorder.h> 324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectusing namespace android; 334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3515fc15883c8aee2b736e8cc9a31eef071908e4a0Sean McNeil#endif // defined(ANDROID) && (defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_4__)) 364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "plog.h" 384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// #define SAVE_RAW_AUDIO 1 404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SAVE_RAW_AUDIO 424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <sys/time.h> 434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stdio.h> 444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic FILE *audio_data; 474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic struct timeval buffer_save_audio; 484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectextern "C" 524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5415fc15883c8aee2b736e8cc9a31eef071908e4a0Sean McNeil#if defined(ANDROID) && (defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_4__)) 554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(USE_DEV_EAC_FILE) 574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int audiofd = -1; 584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic AudioRecord* record; 604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int sampleRate = 8000; 614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int numChannels = 1; 624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// called before AudioOpen 654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint AudioSetInputFormat(int sample_rate, int channel_count) 664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(USE_DEV_EAC_FILE) 684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 0; 694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project sampleRate = sample_rate; 714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project numChannels = channel_count; 724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 0; 734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint AudioOpen(void) 774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(USE_DEV_EAC_FILE) 794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project audiofd = open("/dev/eac", O_RDONLY, 0666); 804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (audiofd >= 0) { 814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project //fcntl(audiofd, F_SETFL, O_NONBLOCK); 824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // possibly lame attempt to get Sooner audio input working 844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project struct { unsigned long param1, param2, param3; } params = { 11025, 0, 0 }; 854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ioctl(audiofd, 317, ¶ms, sizeof(params)); 864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return audiofd; 894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project #ifdef SAVE_RAW_AUDIO 914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project char file_name [256]; 924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project gettimeofday ( &buffer_save_audio, NULL ); 944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project sprintf ( file_name, "data_%ld_%ld.raw", buffer_save_audio.tv_sec, buffer_save_audio.tv_usec ); 954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project audio_data = fopen ( file_name, "w" ); 964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project #endif 974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// TODO: get record buffer size from hardware. 984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project record = new android::AudioRecord( 991b229941e91e25f6fa787b20cd6f53c818b2eb7fDima Zavin AUDIO_SOURCE_DEFAULT, 10085d4a2a8fe7c306f0e0cfd30f51e9015566c021dEric Laurent sampleRate, 1011b229941e91e25f6fa787b20cd6f53c818b2eb7fDima Zavin AUDIO_FORMAT_PCM_16_BIT, 1021b229941e91e25f6fa787b20cd6f53c818b2eb7fDima Zavin (numChannels > 1) ? AUDIO_CHANNEL_IN_STEREO : AUDIO_CHANNEL_IN_MONO, 10385d4a2a8fe7c306f0e0cfd30f51e9015566c021dEric Laurent 8*1024, 1040e94fe6807e53920046fa83715af4788b844ca95Glenn Kasten (android::AudioRecord::record_flags) 0); 1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (!record) return -1; 1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return record->start() == NO_ERROR ? 0 : -1; 1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint AudioClose(void) 1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(USE_DEV_EAC_FILE) 1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return close(audiofd); 1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project record->stop(); 1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project delete record; 1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project #ifdef SAVE_RAW_AUDIO 1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fclose ( audio_data ); 1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project #endif 1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 0; 1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint AudioRead(short *buffer, int frame_count) 1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int n; 1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(USE_DEV_EAC_FILE) 1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project n = read(audiofd, buffer, frame_count*sizeof(short)*N_CHANNELS); 1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project n /= sizeof(short)*N_CHANNELS; 1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return n; 1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int nreq = frame_count * sizeof(short); 1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project n = record->read(buffer, nreq); 1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (n > 0) { 1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (n != nreq) { 1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError ( "AudioRead error: not enough data %d vs %d\n", n, nreq ); 1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project n /= sizeof(short); 1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project #ifdef SAVE_RAW_AUDIO 1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ( n > 0 ) 1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fwrite ( buffer, 2, n, audio_data ); 1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project #endif 1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return n; 1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint AudioSetVolume(int stream_type, int volume) 1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(USE_DEV_EAC_FILE) 1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 0; 1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 15585d4a2a8fe7c306f0e0cfd30f51e9015566c021dEric Laurent return AudioSystem::setStreamVolume(stream_type, volume, 0); 1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint AudioGetVolume(int stream_type) 1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(USE_DEV_EAC_FILE) 1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 0; 1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project float v = 0; 16585d4a2a8fe7c306f0e0cfd30f51e9015566c021dEric Laurent AudioSystem::getStreamVolume(stream_type, &v, 0); 1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return int(v * 100.0f); 1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint AudioOpen(void) 1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return -1; 1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint AudioClose(void) 1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return -1; 1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint AudioSetInputFormat(int sample_rate, int channel_count) 1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return -1; 1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint AudioSetOutputFormat(int sample_rate, int channel_count) 1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return -1; 1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint AudioRead(short *buffer, int frame_count) 1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return -1; 1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint AudioWrite(short *buffer, int frame_count) 1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return -1; 2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint AudioSetStreamType(int stream_type) 2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return -1; 2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint AudioSetVolume(int stream_type, int volume) 2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return -1; 2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint AudioGetVolume(int stream_type) 2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return -1; 2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} // extern "C" 220