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, &params, 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,
10387937d3eed4c1d2eba95bf3a0071a8e9d88f7b98Glenn Kasten                            8*1024);
1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!record) return -1;
1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return record->start() == NO_ERROR ? 0 : -1;
1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint AudioClose(void)
1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(USE_DEV_EAC_FILE)
1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return close(audiofd);
1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  record->stop();
1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  delete record;
1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    #ifdef SAVE_RAW_AUDIO
1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        fclose ( audio_data );
1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    #endif
1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return 0;
1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint AudioRead(short *buffer, int frame_count)
1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int n;
1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(USE_DEV_EAC_FILE)
1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  n = read(audiofd, buffer, frame_count*sizeof(short)*N_CHANNELS);
1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  n /= sizeof(short)*N_CHANNELS;
1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return n;
1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int nreq = frame_count * sizeof(short);
1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  n = record->read(buffer, nreq);
1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (n > 0) {
1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (n != nreq) {
1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError ( "AudioRead error: not enough data %d vs %d\n", n, nreq );
1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    n /= sizeof(short);
1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    #ifdef SAVE_RAW_AUDIO
1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if ( n > 0 )
1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            fwrite ( buffer, 2, n, audio_data );
1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    #endif
1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return n;
1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint AudioSetVolume(int stream_type, int volume)
1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(USE_DEV_EAC_FILE)
1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return 0;
1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
15485d4a2a8fe7c306f0e0cfd30f51e9015566c021dEric Laurent  return AudioSystem::setStreamVolume(stream_type, volume, 0);
1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint AudioGetVolume(int stream_type)
1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(USE_DEV_EAC_FILE)
1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return 0;
1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  float v = 0;
16485d4a2a8fe7c306f0e0cfd30f51e9015566c021dEric Laurent  AudioSystem::getStreamVolume(stream_type, &v, 0);
1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return int(v * 100.0f);
1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint AudioOpen(void)
1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return -1;
1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint AudioClose(void)
1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return -1;
1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint AudioSetInputFormat(int sample_rate, int channel_count)
1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return -1;
1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint AudioSetOutputFormat(int sample_rate, int channel_count)
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 Projectint AudioRead(short *buffer, int frame_count)
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 Projectint AudioWrite(short *buffer, int frame_count)
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 Projectint AudioSetStreamType(int stream_type)
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 Projectint AudioSetVolume(int stream_type, int volume)
2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return -1;
2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint AudioGetVolume(int stream_type)
2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return -1;
2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} // extern "C"
219