android_media_AudioTrack.cpp revision 71f2cf116aab893e224056c38ab146bd1538dd3e
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//#define LOG_NDEBUG 0 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "AudioTrack-JNI" 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <unistd.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <fcntl.h> 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <math.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h" 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "JNIHelp.h" 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "android_runtime/AndroidRuntime.h" 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "utils/Log.h" 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "media/AudioSystem.h" 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "media/AudioTrack.h" 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 330795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/MemoryHeapBase.h> 340795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/MemoryBase.h> 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3624fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin#include <cutils/bitops.h> 3724fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin 3834bb419e5946ab28112e9e27a4d1b3928d31e0e2Dima Zavin#include <system/audio.h> 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char* const kClassPathName = "android/media/AudioTrack"; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct fields_t { 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // these fields provide access from C++ to the... 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID postNativeEventInJava; //... event post callback method 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int PCM16; //... format constants 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int PCM8; //... format constants 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int STREAM_VOICE_CALL; //... stream type constants 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int STREAM_SYSTEM; //... stream type constants 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int STREAM_RING; //... stream type constants 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int STREAM_MUSIC; //... stream type constants 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int STREAM_ALARM; //... stream type constants 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int STREAM_NOTIFICATION; //... stream type constants 5883b368505052f59616d29558e65e2250d01fd848Eric Laurent int STREAM_BLUETOOTH_SCO; //... stream type constants 5983b368505052f59616d29558e65e2250d01fd848Eric Laurent int STREAM_DTMF; //... stream type constants 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int MODE_STREAM; //... memory mode 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int MODE_STATIC; //... memory mode 6283b368505052f59616d29558e65e2250d01fd848Eric Laurent jfieldID nativeTrackInJavaObj; // stores in Java the native AudioTrack object 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID jniData; // stores in Java additional resources used by the native AudioTrack 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic fields_t javaAudioTrackFields; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct audiotrack_callback_cookie { 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass audioTrack_class; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject audioTrack_ref; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AudioTrackJniStorage { 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MemoryHeapBase> mMemHeap; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MemoryBase> mMemBase; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audiotrack_callback_cookie mCallbackData; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mStreamType; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioTrackJniStorage() { 818a1496855cb81a6f2e9e8d51dd6b6ed595047a2aJean-Michel Trivi mCallbackData.audioTrack_class = 0; 828a1496855cb81a6f2e9e8d51dd6b6ed595047a2aJean-Michel Trivi mCallbackData.audioTrack_ref = 0; 8324fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin mStreamType = AUDIO_STREAM_DEFAULT; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~AudioTrackJniStorage() { 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMemBase.clear(); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMemHeap.clear(); 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool allocSharedMem(int sizeInBytes) { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMemHeap = new MemoryHeapBase(sizeInBytes, 0, "AudioTrack Heap Base"); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMemHeap->getHeapID() < 0) { 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMemBase = new MemoryBase(mMemHeap, 0, sizeInBytes); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define DEFAULT_OUTPUT_SAMPLE_RATE 44100 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define AUDIOTRACK_SUCCESS 0 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define AUDIOTRACK_ERROR -1 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define AUDIOTRACK_ERROR_BAD_VALUE -2 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define AUDIOTRACK_ERROR_INVALID_OPERATION -3 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define AUDIOTRACK_ERROR_SETUP_AUDIOSYSTEM -16 109a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent#define AUDIOTRACK_ERROR_SETUP_INVALIDCHANNELMASK -17 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define AUDIOTRACK_ERROR_SETUP_INVALIDFORMAT -18 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define AUDIOTRACK_ERROR_SETUP_INVALIDSTREAMTYPE -19 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define AUDIOTRACK_ERROR_SETUP_NATIVEINITFAILED -20 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjint android_media_translateErrorCode(int code) { 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch(code) { 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case NO_ERROR: 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AUDIOTRACK_SUCCESS; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BAD_VALUE: 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AUDIOTRACK_ERROR_BAD_VALUE; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case INVALID_OPERATION: 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AUDIOTRACK_ERROR_INVALID_OPERATION; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AUDIOTRACK_ERROR; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 130e46a86fcb6a0849fc05c4cade6cb94aad0325295Glenn Kastenstatic void audioCallback(int event, void* user, void *info) { 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (event == AudioTrack::EVENT_MORE_DATA) { 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // set size to 0 to signal we're not using the callback to write more data 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioTrack::Buffer* pBuff = (AudioTrack::Buffer*)info; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pBuff->size = 0; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (event == AudioTrack::EVENT_MARKER) { 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audiotrack_callback_cookie *callbackInfo = (audiotrack_callback_cookie *)user; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv *env = AndroidRuntime::getJNIEnv(); 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (user && env) { 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->CallStaticVoidMethod( 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project callbackInfo->audioTrack_class, 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project javaAudioTrackFields.postNativeEventInJava, 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project callbackInfo->audioTrack_ref, event, 0,0, NULL); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (env->ExceptionCheck()) { 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ExceptionDescribe(); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ExceptionClear(); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (event == AudioTrack::EVENT_NEW_POS) { 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audiotrack_callback_cookie *callbackInfo = (audiotrack_callback_cookie *)user; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv *env = AndroidRuntime::getJNIEnv(); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (user && env) { 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->CallStaticVoidMethod( 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project callbackInfo->audioTrack_class, 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project javaAudioTrackFields.postNativeEventInJava, 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project callbackInfo->audioTrack_ref, event, 0,0, NULL); 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (env->ExceptionCheck()) { 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ExceptionDescribe(); 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ExceptionClear(); 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_AudioTrack_native_setup(JNIEnv *env, jobject thiz, jobject weak_this, 170d9ae1c573e37e245c7f4f0480a8fa925e57bd49dJean-Michel Trivi jint streamType, jint sampleRateInHertz, jint javaChannelMask, 171619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent jint audioFormat, jint buffSizeInBytes, jint memoryMode, jintArray jSession) 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 17371f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("sampleRate=%d, audioFormat(from Java)=%d, channel mask=%x, buffSize=%d", 174d9ae1c573e37e245c7f4f0480a8fa925e57bd49dJean-Michel Trivi sampleRateInHertz, audioFormat, javaChannelMask, buffSizeInBytes); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int afSampleRate; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int afFrameCount; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (AudioSystem::getOutputFrameCount(&afFrameCount, streamType) != NO_ERROR) { 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Error creating AudioTrack: Could not get AudioSystem frame count."); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AUDIOTRACK_ERROR_SETUP_AUDIOSYSTEM; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (AudioSystem::getOutputSamplingRate(&afSampleRate, streamType) != NO_ERROR) { 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Error creating AudioTrack: Could not get AudioSystem sampling rate."); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AUDIOTRACK_ERROR_SETUP_AUDIOSYSTEM; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 187d9ae1c573e37e245c7f4f0480a8fa925e57bd49dJean-Michel Trivi // Java channel masks don't map directly to the native definition, but it's a simple shift 188d9ae1c573e37e245c7f4f0480a8fa925e57bd49dJean-Michel Trivi // to skip the two deprecated channel configurations "default" and "mono". 189d9ae1c573e37e245c7f4f0480a8fa925e57bd49dJean-Michel Trivi uint32_t nativeChannelMask = ((uint32_t)javaChannelMask) >> 2; 190d9ae1c573e37e245c7f4f0480a8fa925e57bd49dJean-Michel Trivi 191d9ae1c573e37e245c7f4f0480a8fa925e57bd49dJean-Michel Trivi if (!audio_is_output_channel(nativeChannelMask)) { 192a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent LOGE("Error creating AudioTrack: invalid channel mask."); 193a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return AUDIOTRACK_ERROR_SETUP_INVALIDCHANNELMASK; 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 195d9ae1c573e37e245c7f4f0480a8fa925e57bd49dJean-Michel Trivi 196d9ae1c573e37e245c7f4f0480a8fa925e57bd49dJean-Michel Trivi int nbChannels = popcount(nativeChannelMask); 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // check the stream type 19924fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin audio_stream_type_t atStreamType; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (streamType == javaAudioTrackFields.STREAM_VOICE_CALL) { 20124fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin atStreamType = AUDIO_STREAM_VOICE_CALL; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (streamType == javaAudioTrackFields.STREAM_SYSTEM) { 20324fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin atStreamType = AUDIO_STREAM_SYSTEM; 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (streamType == javaAudioTrackFields.STREAM_RING) { 20524fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin atStreamType = AUDIO_STREAM_RING; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (streamType == javaAudioTrackFields.STREAM_MUSIC) { 20724fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin atStreamType = AUDIO_STREAM_MUSIC; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (streamType == javaAudioTrackFields.STREAM_ALARM) { 20924fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin atStreamType = AUDIO_STREAM_ALARM; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (streamType == javaAudioTrackFields.STREAM_NOTIFICATION) { 21124fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin atStreamType = AUDIO_STREAM_NOTIFICATION; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (streamType == javaAudioTrackFields.STREAM_BLUETOOTH_SCO) { 21324fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin atStreamType = AUDIO_STREAM_BLUETOOTH_SCO; 21483b368505052f59616d29558e65e2250d01fd848Eric Laurent } else if (streamType == javaAudioTrackFields.STREAM_DTMF) { 21524fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin atStreamType = AUDIO_STREAM_DTMF; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Error creating AudioTrack: unknown stream type."); 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AUDIOTRACK_ERROR_SETUP_INVALIDSTREAMTYPE; 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // check the format. 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This function was called from Java, so we compare the format against the Java constants 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((audioFormat != javaAudioTrackFields.PCM16) && (audioFormat != javaAudioTrackFields.PCM8)) { 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Error creating AudioTrack: unsupported audio format."); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AUDIOTRACK_ERROR_SETUP_INVALIDFORMAT; 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // for the moment 8bitPCM in MODE_STATIC is not supported natively in the AudioTrack C++ class 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // so we declare everything as 16bitPCM, the 8->16bit conversion for MODE_STATIC will be handled 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // in android_media_AudioTrack_native_write() 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((audioFormat == javaAudioTrackFields.PCM8) 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (memoryMode == javaAudioTrackFields.MODE_STATIC)) { 23371f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("android_media_AudioTrack_native_setup(): requesting MODE_STATIC for 8bit \ 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buff size of %dbytes, switching to 16bit, buff size of %dbytes", 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffSizeInBytes, 2*buffSizeInBytes); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audioFormat = javaAudioTrackFields.PCM16; 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we will need twice the memory to store the data 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffSizeInBytes *= 2; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // compute the frame count 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int bytesPerSample = audioFormat == javaAudioTrackFields.PCM16 ? 2 : 1; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format = audioFormat == javaAudioTrackFields.PCM16 ? 24424fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin AUDIO_FORMAT_PCM_16_BIT : AUDIO_FORMAT_PCM_8_BIT; 245a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int frameCount = buffSizeInBytes / (nbChannels * bytesPerSample); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioTrackJniStorage* lpJniStorage = new AudioTrackJniStorage(); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // initialize the callback information: 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this data will be passed with every AudioTrack callback 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz = env->GetObjectClass(thiz); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clazz == NULL) { 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Can't find %s when setting up callback.", kClassPathName); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete lpJniStorage; 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AUDIOTRACK_ERROR_SETUP_NATIVEINITFAILED; 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpJniStorage->mCallbackData.audioTrack_class = (jclass)env->NewGlobalRef(clazz); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we use a weak reference so the AudioTrack object can be garbage collected. 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpJniStorage->mCallbackData.audioTrack_ref = env->NewGlobalRef(weak_this); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpJniStorage->mStreamType = atStreamType; 2622fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent 2632fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent if (jSession == NULL) { 264619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent LOGE("Error creating AudioTrack: invalid session ID pointer"); 265619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent delete lpJniStorage; 266619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent return AUDIOTRACK_ERROR; 267619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent } 268619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent 2692fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent jint* nSession = (jint *) env->GetPrimitiveArrayCritical(jSession, NULL); 2702fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent if (nSession == NULL) { 2712fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent LOGE("Error creating AudioTrack: Error retrieving session id pointer"); 2722fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent delete lpJniStorage; 2732fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent return AUDIOTRACK_ERROR; 2742fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent } 2752fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent int sessionId = nSession[0]; 2762fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent env->ReleasePrimitiveArrayCritical(jSession, nSession, 0); 2772fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent nSession = NULL; 2782fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // create the native AudioTrack object 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioTrack* lpTrack = new AudioTrack(); 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpTrack == NULL) { 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Error creating uninitialized AudioTrack"); 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto native_track_failure; 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // initialize the native AudioTrack object 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (memoryMode == javaAudioTrackFields.MODE_STREAM) { 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpTrack->set( 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atStreamType,// stream type 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sampleRateInHertz, 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project format,// word length, PCM 293d9ae1c573e37e245c7f4f0480a8fa925e57bd49dJean-Michel Trivi nativeChannelMask, 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project frameCount, 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0,// flags 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audioCallback, &(lpJniStorage->mCallbackData),//callback, callback data (user) 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0,// notificationFrames == 0 since not using EVENT_MORE_DATA to feed the AudioTrack 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0,// shared mem 299619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent true,// thread can call Java 3002fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent sessionId);// audio session ID 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (memoryMode == javaAudioTrackFields.MODE_STATIC) { 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // AudioTrack is using shared memory 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!lpJniStorage->allocSharedMem(buffSizeInBytes)) { 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Error creating AudioTrack in static mode: error creating mem heap base"); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto native_init_failure; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpTrack->set( 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atStreamType,// stream type 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sampleRateInHertz, 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project format,// word length, PCM 314d9ae1c573e37e245c7f4f0480a8fa925e57bd49dJean-Michel Trivi nativeChannelMask, 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project frameCount, 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0,// flags 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audioCallback, &(lpJniStorage->mCallbackData),//callback, callback data (user)); 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0,// notificationFrames == 0 since not using EVENT_MORE_DATA to feed the AudioTrack 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpJniStorage->mMemBase,// shared mem 320619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent true,// thread can call Java 3212fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent sessionId);// audio session ID 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpTrack->initCheck() != NO_ERROR) { 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Error initializing AudioTrack"); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto native_init_failure; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3292fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent nSession = (jint *) env->GetPrimitiveArrayCritical(jSession, NULL); 3302fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent if (nSession == NULL) { 3312fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent LOGE("Error creating AudioTrack: Error retrieving session id pointer"); 3322fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent goto native_init_failure; 3332fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent } 334619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent // read the audio session ID back from AudioTrack in case we create a new session 335619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent nSession[0] = lpTrack->getSessionId(); 336619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent env->ReleasePrimitiveArrayCritical(jSession, nSession, 0); 337619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent nSession = NULL; 338619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // save our newly created C++ AudioTrack in the "nativeTrackInJavaObj" field 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // of the Java object (in mNativeTrackInJavaObj) 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(thiz, javaAudioTrackFields.nativeTrackInJavaObj, (int)lpTrack); 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // save the JNI resources so we can free them later 34471f2cf116aab893e224056c38ab146bd1538dd3eSteve Block //ALOGV("storing lpJniStorage: %x\n", (int)lpJniStorage); 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(thiz, javaAudioTrackFields.jniData, (int)lpJniStorage); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AUDIOTRACK_SUCCESS; 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // failures: 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnative_init_failure: 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete lpTrack; 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(thiz, javaAudioTrackFields.nativeTrackInJavaObj, 0); 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnative_track_failure: 355619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent if (nSession != NULL) { 356619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent env->ReleasePrimitiveArrayCritical(jSession, nSession, 0); 357619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent } 3588a1496855cb81a6f2e9e8d51dd6b6ed595047a2aJean-Michel Trivi env->DeleteGlobalRef(lpJniStorage->mCallbackData.audioTrack_class); 3598a1496855cb81a6f2e9e8d51dd6b6ed595047a2aJean-Michel Trivi env->DeleteGlobalRef(lpJniStorage->mCallbackData.audioTrack_ref); 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete lpJniStorage; 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(thiz, javaAudioTrackFields.jniData, 0); 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AUDIOTRACK_ERROR_SETUP_NATIVEINITFAILED; 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_AudioTrack_start(JNIEnv *env, jobject thiz) 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioTrack *lpTrack = (AudioTrack *)env->GetIntField( 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thiz, javaAudioTrackFields.nativeTrackInJavaObj); 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpTrack == NULL ) { 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Unable to retrieve AudioTrack pointer for start()"); 3767070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent return; 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37821dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpTrack->start(); 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_AudioTrack_stop(JNIEnv *env, jobject thiz) 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioTrack *lpTrack = (AudioTrack *)env->GetIntField( 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thiz, javaAudioTrackFields.nativeTrackInJavaObj); 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpTrack == NULL ) { 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Unable to retrieve AudioTrack pointer for stop()"); 3927070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent return; 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpTrack->stop(); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_AudioTrack_pause(JNIEnv *env, jobject thiz) 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioTrack *lpTrack = (AudioTrack *)env->GetIntField( 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thiz, javaAudioTrackFields.nativeTrackInJavaObj); 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpTrack == NULL ) { 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Unable to retrieve AudioTrack pointer for pause()"); 4087070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent return; 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpTrack->pause(); 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_AudioTrack_flush(JNIEnv *env, jobject thiz) 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioTrack *lpTrack = (AudioTrack *)env->GetIntField( 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thiz, javaAudioTrackFields.nativeTrackInJavaObj); 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpTrack == NULL ) { 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Unable to retrieve AudioTrack pointer for flush()"); 4247070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent return; 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpTrack->flush(); 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_AudioTrack_set_volume(JNIEnv *env, jobject thiz, jfloat leftVol, jfloat rightVol ) 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioTrack *lpTrack = (AudioTrack *)env->GetIntField( 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thiz, javaAudioTrackFields.nativeTrackInJavaObj); 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpTrack == NULL ) { 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Unable to retrieve AudioTrack pointer for setVolume()"); 4397070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent return; 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpTrack->setVolume(leftVol, rightVol); 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_media_AudioTrack_native_finalize(JNIEnv *env, jobject thiz) { 44771f2cf116aab893e224056c38ab146bd1538dd3eSteve Block //ALOGV("android_media_AudioTrack_native_finalize jobject: %x\n", (int)thiz); 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // delete the AudioTrack object 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioTrack *lpTrack = (AudioTrack *)env->GetIntField( 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thiz, javaAudioTrackFields.nativeTrackInJavaObj); 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpTrack) { 45371f2cf116aab893e224056c38ab146bd1538dd3eSteve Block //ALOGV("deleting lpTrack: %x\n", (int)lpTrack); 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpTrack->stop(); 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete lpTrack; 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // delete the JNI data 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioTrackJniStorage* pJniStorage = (AudioTrackJniStorage *)env->GetIntField( 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thiz, javaAudioTrackFields.jniData); 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pJniStorage) { 4628a1496855cb81a6f2e9e8d51dd6b6ed595047a2aJean-Michel Trivi // delete global refs created in native_setup 4638a1496855cb81a6f2e9e8d51dd6b6ed595047a2aJean-Michel Trivi env->DeleteGlobalRef(pJniStorage->mCallbackData.audioTrack_class); 4648a1496855cb81a6f2e9e8d51dd6b6ed595047a2aJean-Michel Trivi env->DeleteGlobalRef(pJniStorage->mCallbackData.audioTrack_ref); 46571f2cf116aab893e224056c38ab146bd1538dd3eSteve Block //ALOGV("deleting pJniStorage: %x\n", (int)pJniStorage); 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete pJniStorage; 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_media_AudioTrack_native_release(JNIEnv *env, jobject thiz) { 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // do everything a call to finalize would 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_media_AudioTrack_native_finalize(env, thiz); 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + reset the native resources in the Java object so any attempt to access 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // them after a call to release fails. 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(thiz, javaAudioTrackFields.nativeTrackInJavaObj, 0); 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(thiz, javaAudioTrackFields.jniData, 0); 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 48321dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivijint writeToTrack(AudioTrack* pTrack, jint audioFormat, jbyte* data, 48421dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi jint offsetInBytes, jint sizeInBytes) { 48521dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi // give the data to the native AudioTrack object (the data starts at the offset) 48621dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi ssize_t written = 0; 48721dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi // regular write() or copy the data to the AudioTrack's shared memory? 48821dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi if (pTrack->sharedBuffer() == 0) { 48921dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi written = pTrack->write(data + offsetInBytes, sizeInBytes); 49021dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi } else { 49121dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi if (audioFormat == javaAudioTrackFields.PCM16) { 49221dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi // writing to shared memory, check for capacity 49321dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi if ((size_t)sizeInBytes > pTrack->sharedBuffer()->size()) { 49421dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi sizeInBytes = pTrack->sharedBuffer()->size(); 49521dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi } 49621dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi memcpy(pTrack->sharedBuffer()->pointer(), data + offsetInBytes, sizeInBytes); 49721dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi written = sizeInBytes; 49821dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi } else if (audioFormat == javaAudioTrackFields.PCM8) { 49921dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi // data contains 8bit data we need to expand to 16bit before copying 50021dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi // to the shared memory 50121dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi // writing to shared memory, check for capacity, 50221dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi // note that input data will occupy 2X the input space due to 8 to 16bit conversion 50321dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi if (((size_t)sizeInBytes)*2 > pTrack->sharedBuffer()->size()) { 50421dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi sizeInBytes = pTrack->sharedBuffer()->size() / 2; 50521dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi } 50621dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi int count = sizeInBytes; 50721dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi int16_t *dst = (int16_t *)pTrack->sharedBuffer()->pointer(); 50821dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi const int8_t *src = (const int8_t *)(data + offsetInBytes); 50921dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi while(count--) { 51021dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi *dst++ = (int16_t)(*src++^0x80) << 8; 51121dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi } 51221dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi // even though we wrote 2*sizeInBytes, we only report sizeInBytes as written to hide 51321dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi // the 8bit mixer restriction from the user of this function 51421dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi written = sizeInBytes; 51521dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi } 51621dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi } 51721dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi return written; 51821dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi 51921dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi} 52021dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi 52121dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi// ---------------------------------------------------------------------------- 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_media_AudioTrack_native_write(JNIEnv *env, jobject thiz, 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyteArray javaAudioData, 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint offsetInBytes, jint sizeInBytes, 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint javaAudioFormat) { 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyte* cAudioData = NULL; 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioTrack *lpTrack = NULL; 52871f2cf116aab893e224056c38ab146bd1538dd3eSteve Block //ALOGV("android_media_AudioTrack_native_write(offset=%d, sizeInBytes=%d) called", 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // offsetInBytes, sizeInBytes); 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // get the audio track to load with samples 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpTrack = (AudioTrack *)env->GetIntField(thiz, javaAudioTrackFields.nativeTrackInJavaObj); 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpTrack == NULL) { 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Unable to retrieve AudioTrack pointer for write()"); 5367070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent return 0; 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // get the pointer for the audio data from the java array 540421ddc014b31478ba0ef115e098d8780a35af331Eric Laurent // NOTE: We may use GetPrimitiveArrayCritical() when the JNI implementation changes in such 541421ddc014b31478ba0ef115e098d8780a35af331Eric Laurent // a way that it becomes much more efficient. When doing so, we will have to prevent the 542421ddc014b31478ba0ef115e098d8780a35af331Eric Laurent // AudioSystem callback to be called while in critical section (in case of media server 543421ddc014b31478ba0ef115e098d8780a35af331Eric Laurent // process crash for instance) 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (javaAudioData) { 545421ddc014b31478ba0ef115e098d8780a35af331Eric Laurent cAudioData = (jbyte *)env->GetByteArrayElements(javaAudioData, NULL); 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cAudioData == NULL) { 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Error retrieving source of audio data to play, can't play"); 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; // out of memory or no data to load 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("NULL java array of audio data to play, can't play"); 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55521dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi jint written = writeToTrack(lpTrack, javaAudioFormat, cAudioData, offsetInBytes, sizeInBytes); 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 557421ddc014b31478ba0ef115e098d8780a35af331Eric Laurent env->ReleaseByteArrayElements(javaAudioData, cAudioData, 0); 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55971f2cf116aab893e224056c38ab146bd1538dd3eSteve Block //ALOGV("write wrote %d (tried %d) bytes in the native AudioTrack with offset %d", 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // (int)written, (int)(sizeInBytes), (int)offsetInBytes); 56121dc037e7e7c51e33b5808320f47339ee3a2b103Jean-Michel Trivi return written; 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_media_AudioTrack_native_write_short(JNIEnv *env, jobject thiz, 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jshortArray javaAudioData, 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint offsetInShorts, jint sizeInShorts, 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint javaAudioFormat) { 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (android_media_AudioTrack_native_write(env, thiz, 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (jbyteArray) javaAudioData, 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offsetInShorts*2, sizeInShorts*2, 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project javaAudioFormat) 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project / 2); 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_media_AudioTrack_get_native_frame_count(JNIEnv *env, jobject thiz) { 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioTrack *lpTrack = (AudioTrack *)env->GetIntField( 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thiz, javaAudioTrackFields.nativeTrackInJavaObj); 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpTrack) { 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return lpTrack->frameCount(); 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Unable to retrieve AudioTrack pointer for frameCount()"); 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AUDIOTRACK_ERROR; 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 59488e209dcf8c2ebddda5c272f46d1bd5478bc639cEric Laurentstatic jint android_media_AudioTrack_set_playback_rate(JNIEnv *env, jobject thiz, 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint sampleRateInHz) { 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioTrack *lpTrack = (AudioTrack *)env->GetIntField( 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thiz, javaAudioTrackFields.nativeTrackInJavaObj); 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpTrack) { 60088e209dcf8c2ebddda5c272f46d1bd5478bc639cEric Laurent return android_media_translateErrorCode(lpTrack->setSampleRate(sampleRateInHz)); 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Unable to retrieve AudioTrack pointer for setSampleRate()"); 60488e209dcf8c2ebddda5c272f46d1bd5478bc639cEric Laurent return AUDIOTRACK_ERROR; 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_media_AudioTrack_get_playback_rate(JNIEnv *env, jobject thiz) { 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioTrack *lpTrack = (AudioTrack *)env->GetIntField( 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thiz, javaAudioTrackFields.nativeTrackInJavaObj); 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpTrack) { 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jint) lpTrack->getSampleRate(); 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Unable to retrieve AudioTrack pointer for getSampleRate()"); 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AUDIOTRACK_ERROR; 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_media_AudioTrack_set_marker_pos(JNIEnv *env, jobject thiz, 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint markerPos) { 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioTrack *lpTrack = (AudioTrack *)env->GetIntField( 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thiz, javaAudioTrackFields.nativeTrackInJavaObj); 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpTrack) { 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return android_media_translateErrorCode( lpTrack->setMarkerPosition(markerPos) ); 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Unable to retrieve AudioTrack pointer for setMarkerPosition()"); 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AUDIOTRACK_ERROR; 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_media_AudioTrack_get_marker_pos(JNIEnv *env, jobject thiz) { 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioTrack *lpTrack = (AudioTrack *)env->GetIntField( 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thiz, javaAudioTrackFields.nativeTrackInJavaObj); 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t markerPos = 0; 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpTrack) { 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpTrack->getMarkerPosition(&markerPos); 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jint)markerPos; 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Unable to retrieve AudioTrack pointer for getMarkerPosition()"); 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AUDIOTRACK_ERROR; 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_media_AudioTrack_set_pos_update_period(JNIEnv *env, jobject thiz, 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint period) { 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioTrack *lpTrack = (AudioTrack *)env->GetIntField( 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thiz, javaAudioTrackFields.nativeTrackInJavaObj); 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpTrack) { 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return android_media_translateErrorCode( lpTrack->setPositionUpdatePeriod(period) ); 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Unable to retrieve AudioTrack pointer for setPositionUpdatePeriod()"); 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AUDIOTRACK_ERROR; 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_media_AudioTrack_get_pos_update_period(JNIEnv *env, jobject thiz) { 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioTrack *lpTrack = (AudioTrack *)env->GetIntField( 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thiz, javaAudioTrackFields.nativeTrackInJavaObj); 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t period = 0; 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpTrack) { 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpTrack->getPositionUpdatePeriod(&period); 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jint)period; 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Unable to retrieve AudioTrack pointer for getPositionUpdatePeriod()"); 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AUDIOTRACK_ERROR; 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_media_AudioTrack_set_position(JNIEnv *env, jobject thiz, 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint position) { 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioTrack *lpTrack = (AudioTrack *)env->GetIntField( 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thiz, javaAudioTrackFields.nativeTrackInJavaObj); 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpTrack) { 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return android_media_translateErrorCode( lpTrack->setPosition(position) ); 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Unable to retrieve AudioTrack pointer for setPosition()"); 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AUDIOTRACK_ERROR; 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_media_AudioTrack_get_position(JNIEnv *env, jobject thiz) { 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioTrack *lpTrack = (AudioTrack *)env->GetIntField( 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thiz, javaAudioTrackFields.nativeTrackInJavaObj); 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t position = 0; 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpTrack) { 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpTrack->getPosition(&position); 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jint)position; 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Unable to retrieve AudioTrack pointer for getPosition()"); 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AUDIOTRACK_ERROR; 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_media_AudioTrack_set_loop(JNIEnv *env, jobject thiz, 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint loopStart, jint loopEnd, jint loopCount) { 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioTrack *lpTrack = (AudioTrack *)env->GetIntField( 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thiz, javaAudioTrackFields.nativeTrackInJavaObj); 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpTrack) { 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return android_media_translateErrorCode( lpTrack->setLoop(loopStart, loopEnd, loopCount) ); 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Unable to retrieve AudioTrack pointer for setLoop()"); 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AUDIOTRACK_ERROR; 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_media_AudioTrack_reload(JNIEnv *env, jobject thiz) { 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioTrack *lpTrack = (AudioTrack *)env->GetIntField( 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thiz, javaAudioTrackFields.nativeTrackInJavaObj); 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpTrack) { 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return android_media_translateErrorCode( lpTrack->reload() ); 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Unable to retrieve AudioTrack pointer for reload()"); 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AUDIOTRACK_ERROR; 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_media_AudioTrack_get_output_sample_rate(JNIEnv *env, jobject thiz, 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint javaStreamType) { 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int afSamplingRate; 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // convert the stream type from Java to native value 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // FIXME: code duplication with android_media_AudioTrack_native_setup() 76624fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin audio_stream_type_t nativeStreamType; 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (javaStreamType == javaAudioTrackFields.STREAM_VOICE_CALL) { 76824fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin nativeStreamType = AUDIO_STREAM_VOICE_CALL; 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (javaStreamType == javaAudioTrackFields.STREAM_SYSTEM) { 77024fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin nativeStreamType = AUDIO_STREAM_SYSTEM; 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (javaStreamType == javaAudioTrackFields.STREAM_RING) { 77224fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin nativeStreamType = AUDIO_STREAM_RING; 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (javaStreamType == javaAudioTrackFields.STREAM_MUSIC) { 77424fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin nativeStreamType = AUDIO_STREAM_MUSIC; 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (javaStreamType == javaAudioTrackFields.STREAM_ALARM) { 77624fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin nativeStreamType = AUDIO_STREAM_ALARM; 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (javaStreamType == javaAudioTrackFields.STREAM_NOTIFICATION) { 77824fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin nativeStreamType = AUDIO_STREAM_NOTIFICATION; 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (javaStreamType == javaAudioTrackFields.STREAM_BLUETOOTH_SCO) { 78024fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin nativeStreamType = AUDIO_STREAM_BLUETOOTH_SCO; 78183b368505052f59616d29558e65e2250d01fd848Eric Laurent } else if (javaStreamType == javaAudioTrackFields.STREAM_DTMF) { 78224fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin nativeStreamType = AUDIO_STREAM_DTMF; 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 78424fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin nativeStreamType = AUDIO_STREAM_DEFAULT; 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (AudioSystem::getOutputSamplingRate(&afSamplingRate, nativeStreamType) != NO_ERROR) { 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("AudioSystem::getOutputSamplingRate() for stream type %d failed in AudioTrack JNI", 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nativeStreamType); 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return DEFAULT_OUTPUT_SAMPLE_RATE; 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return afSamplingRate; 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// returns the minimum required size for the successful creation of a streaming AudioTrack 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// returns -1 if there was an error querying the hardware. 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_media_AudioTrack_get_min_buff_size(JNIEnv *env, jobject thiz, 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint sampleRateInHertz, jint nbChannels, jint audioFormat) { 802c3308074cd6f06bbb35c1999b5260f938742a9e7Chia-chi Yeh 803c3308074cd6f06bbb35c1999b5260f938742a9e7Chia-chi Yeh int frameCount = 0; 80424fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin if (AudioTrack::getMinFrameCount(&frameCount, AUDIO_STREAM_DEFAULT, 805c3308074cd6f06bbb35c1999b5260f938742a9e7Chia-chi Yeh sampleRateInHertz) != NO_ERROR) { 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 808c3308074cd6f06bbb35c1999b5260f938742a9e7Chia-chi Yeh return frameCount * nbChannels * (audioFormat == javaAudioTrackFields.PCM16 ? 2 : 1); 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8117070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent// ---------------------------------------------------------------------------- 8127070b36549d511d6627538c73dfbab23fbae5b43Eric Laurentstatic void 8137070b36549d511d6627538c73dfbab23fbae5b43Eric Laurentandroid_media_AudioTrack_setAuxEffectSendLevel(JNIEnv *env, jobject thiz, jfloat level ) 8147070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent{ 8157070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent AudioTrack *lpTrack = (AudioTrack *)env->GetIntField( 8167070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent thiz, javaAudioTrackFields.nativeTrackInJavaObj); 8177070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent if (lpTrack == NULL ) { 8187070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent jniThrowException(env, "java/lang/IllegalStateException", 8197070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent "Unable to retrieve AudioTrack pointer for setAuxEffectSendLevel()"); 8207070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent return; 8217070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent } 8227070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent 8237070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent lpTrack->setAuxEffectSendLevel(level); 8247070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent} 8257070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent 8267070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent// ---------------------------------------------------------------------------- 8277070b36549d511d6627538c73dfbab23fbae5b43Eric Laurentstatic jint android_media_AudioTrack_attachAuxEffect(JNIEnv *env, jobject thiz, 8287070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent jint effectId) { 8297070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent 8307070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent AudioTrack *lpTrack = (AudioTrack *)env->GetIntField( 8317070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent thiz, javaAudioTrackFields.nativeTrackInJavaObj); 8327070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent 8337070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent if (lpTrack) { 8347070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent return android_media_translateErrorCode( lpTrack->attachAuxEffect(effectId) ); 8357070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent } else { 8367070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent jniThrowException(env, "java/lang/IllegalStateException", 8377070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent "Unable to retrieve AudioTrack pointer for attachAuxEffect()"); 8387070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent return AUDIOTRACK_ERROR; 8397070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent } 8407070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent} 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gMethods[] = { 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // name, signature, funcPtr 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_start", "()V", (void *)android_media_AudioTrack_start}, 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_stop", "()V", (void *)android_media_AudioTrack_stop}, 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_pause", "()V", (void *)android_media_AudioTrack_pause}, 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_flush", "()V", (void *)android_media_AudioTrack_flush}, 850619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent {"native_setup", "(Ljava/lang/Object;IIIIII[I)I", 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void *)android_media_AudioTrack_native_setup}, 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_finalize", "()V", (void *)android_media_AudioTrack_native_finalize}, 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_release", "()V", (void *)android_media_AudioTrack_native_release}, 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_write_byte", "([BIII)I", (void *)android_media_AudioTrack_native_write}, 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_write_short", "([SIII)I", (void *)android_media_AudioTrack_native_write_short}, 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_setVolume", "(FF)V", (void *)android_media_AudioTrack_set_volume}, 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_get_native_frame_count", 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "()I", (void *)android_media_AudioTrack_get_native_frame_count}, 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_set_playback_rate", 86088e209dcf8c2ebddda5c272f46d1bd5478bc639cEric Laurent "(I)I", (void *)android_media_AudioTrack_set_playback_rate}, 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_get_playback_rate", 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "()I", (void *)android_media_AudioTrack_get_playback_rate}, 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_set_marker_pos","(I)I", (void *)android_media_AudioTrack_set_marker_pos}, 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_get_marker_pos","()I", (void *)android_media_AudioTrack_get_marker_pos}, 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_set_pos_update_period", 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "(I)I", (void *)android_media_AudioTrack_set_pos_update_period}, 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_get_pos_update_period", 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "()I", (void *)android_media_AudioTrack_get_pos_update_period}, 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_set_position", "(I)I", (void *)android_media_AudioTrack_set_position}, 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_get_position", "()I", (void *)android_media_AudioTrack_get_position}, 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_set_loop", "(III)I", (void *)android_media_AudioTrack_set_loop}, 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_reload_static", "()I", (void *)android_media_AudioTrack_reload}, 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_get_output_sample_rate", 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "(I)I", (void *)android_media_AudioTrack_get_output_sample_rate}, 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_get_min_buff_size", 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "(III)I", (void *)android_media_AudioTrack_get_min_buff_size}, 8777070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent {"native_setAuxEffectSendLevel", 8787070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent "(F)V", (void *)android_media_AudioTrack_setAuxEffectSendLevel}, 8797070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent {"native_attachAuxEffect", 8807070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent "(I)I", (void *)android_media_AudioTrack_attachAuxEffect}, 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// field names found in android/media/AudioTrack.java 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define JAVA_POSTEVENT_CALLBACK_NAME "postEventFromNative" 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define JAVA_CONST_PCM16_NAME "ENCODING_PCM_16BIT" 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define JAVA_CONST_PCM8_NAME "ENCODING_PCM_8BIT" 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define JAVA_CONST_BUFFER_COUNT_NAME "BUFFER_COUNT" 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define JAVA_CONST_STREAM_VOICE_CALL_NAME "STREAM_VOICE_CALL" 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define JAVA_CONST_STREAM_SYSTEM_NAME "STREAM_SYSTEM" 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define JAVA_CONST_STREAM_RING_NAME "STREAM_RING" 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define JAVA_CONST_STREAM_MUSIC_NAME "STREAM_MUSIC" 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define JAVA_CONST_STREAM_ALARM_NAME "STREAM_ALARM" 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define JAVA_CONST_STREAM_NOTIFICATION_NAME "STREAM_NOTIFICATION" 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define JAVA_CONST_STREAM_BLUETOOTH_SCO_NAME "STREAM_BLUETOOTH_SCO" 89683b368505052f59616d29558e65e2250d01fd848Eric Laurent#define JAVA_CONST_STREAM_DTMF_NAME "STREAM_DTMF" 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define JAVA_CONST_MODE_STREAM_NAME "MODE_STREAM" 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define JAVA_CONST_MODE_STATIC_NAME "MODE_STATIC" 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define JAVA_NATIVETRACKINJAVAOBJ_FIELD_NAME "mNativeTrackInJavaObj" 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define JAVA_JNIDATA_FIELD_NAME "mJniData" 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define JAVA_AUDIOFORMAT_CLASS_NAME "android/media/AudioFormat" 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define JAVA_AUDIOMANAGER_CLASS_NAME "android/media/AudioManager" 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// preconditions: 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// theClass is valid 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool android_media_getIntConstantFromClass(JNIEnv* pEnv, jclass theClass, const char* className, 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* constName, int* constVal) { 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID javaConst = NULL; 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project javaConst = pEnv->GetStaticFieldID(theClass, constName, "I"); 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (javaConst != NULL) { 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *constVal = pEnv->GetStaticIntField(theClass, javaConst); 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Can't find %s.%s", className, constName); 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_media_AudioTrack(JNIEnv *env) 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project javaAudioTrackFields.nativeTrackInJavaObj = NULL; 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project javaAudioTrackFields.postNativeEventInJava = NULL; 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get the AudioTrack class 92946e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom jclass audioTrackClass = env->FindClass(kClassPathName); 93046e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom if (audioTrackClass == NULL) { 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Can't find %s", kClassPathName); 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get the postEvent method 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project javaAudioTrackFields.postNativeEventInJava = env->GetStaticMethodID( 93746e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom audioTrackClass, 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JAVA_POSTEVENT_CALLBACK_NAME, "(Ljava/lang/Object;IIILjava/lang/Object;)V"); 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (javaAudioTrackFields.postNativeEventInJava == NULL) { 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Can't find AudioTrack.%s", JAVA_POSTEVENT_CALLBACK_NAME); 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get the variables fields 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // nativeTrackInJavaObj 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project javaAudioTrackFields.nativeTrackInJavaObj = env->GetFieldID( 94746e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom audioTrackClass, 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JAVA_NATIVETRACKINJAVAOBJ_FIELD_NAME, "I"); 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (javaAudioTrackFields.nativeTrackInJavaObj == NULL) { 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Can't find AudioTrack.%s", JAVA_NATIVETRACKINJAVAOBJ_FIELD_NAME); 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // jniData; 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project javaAudioTrackFields.jniData = env->GetFieldID( 95546e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom audioTrackClass, 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JAVA_JNIDATA_FIELD_NAME, "I"); 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (javaAudioTrackFields.jniData == NULL) { 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Can't find AudioTrack.%s", JAVA_JNIDATA_FIELD_NAME); 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get the memory mode constants 96346e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom if ( !android_media_getIntConstantFromClass(env, audioTrackClass, 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project kClassPathName, 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JAVA_CONST_MODE_STATIC_NAME, &(javaAudioTrackFields.MODE_STATIC)) 96646e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom || !android_media_getIntConstantFromClass(env, audioTrackClass, 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project kClassPathName, 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JAVA_CONST_MODE_STREAM_NAME, &(javaAudioTrackFields.MODE_STREAM)) ) { 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // error log performed in android_media_getIntConstantFromClass() 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get the format constants from the AudioFormat class 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass audioFormatClass = NULL; 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audioFormatClass = env->FindClass(JAVA_AUDIOFORMAT_CLASS_NAME); 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (audioFormatClass == NULL) { 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Can't find %s", JAVA_AUDIOFORMAT_CLASS_NAME); 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ( !android_media_getIntConstantFromClass(env, audioFormatClass, 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JAVA_AUDIOFORMAT_CLASS_NAME, 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JAVA_CONST_PCM16_NAME, &(javaAudioTrackFields.PCM16)) 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || !android_media_getIntConstantFromClass(env, audioFormatClass, 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JAVA_AUDIOFORMAT_CLASS_NAME, 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JAVA_CONST_PCM8_NAME, &(javaAudioTrackFields.PCM8)) ) { 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // error log performed in android_media_getIntConstantFromClass() 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get the stream types from the AudioManager class 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass audioManagerClass = NULL; 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audioManagerClass = env->FindClass(JAVA_AUDIOMANAGER_CLASS_NAME); 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (audioManagerClass == NULL) { 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Can't find %s", JAVA_AUDIOMANAGER_CLASS_NAME); 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ( !android_media_getIntConstantFromClass(env, audioManagerClass, 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JAVA_AUDIOMANAGER_CLASS_NAME, 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JAVA_CONST_STREAM_VOICE_CALL_NAME, &(javaAudioTrackFields.STREAM_VOICE_CALL)) 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || !android_media_getIntConstantFromClass(env, audioManagerClass, 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JAVA_AUDIOMANAGER_CLASS_NAME, 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JAVA_CONST_STREAM_MUSIC_NAME, &(javaAudioTrackFields.STREAM_MUSIC)) 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || !android_media_getIntConstantFromClass(env, audioManagerClass, 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JAVA_AUDIOMANAGER_CLASS_NAME, 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JAVA_CONST_STREAM_SYSTEM_NAME, &(javaAudioTrackFields.STREAM_SYSTEM)) 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || !android_media_getIntConstantFromClass(env, audioManagerClass, 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JAVA_AUDIOMANAGER_CLASS_NAME, 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JAVA_CONST_STREAM_RING_NAME, &(javaAudioTrackFields.STREAM_RING)) 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || !android_media_getIntConstantFromClass(env, audioManagerClass, 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JAVA_AUDIOMANAGER_CLASS_NAME, 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JAVA_CONST_STREAM_ALARM_NAME, &(javaAudioTrackFields.STREAM_ALARM)) 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || !android_media_getIntConstantFromClass(env, audioManagerClass, 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JAVA_AUDIOMANAGER_CLASS_NAME, 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JAVA_CONST_STREAM_NOTIFICATION_NAME, &(javaAudioTrackFields.STREAM_NOTIFICATION)) 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || !android_media_getIntConstantFromClass(env, audioManagerClass, 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JAVA_AUDIOMANAGER_CLASS_NAME, 101783b368505052f59616d29558e65e2250d01fd848Eric Laurent JAVA_CONST_STREAM_BLUETOOTH_SCO_NAME, &(javaAudioTrackFields.STREAM_BLUETOOTH_SCO)) 101883b368505052f59616d29558e65e2250d01fd848Eric Laurent || !android_media_getIntConstantFromClass(env, audioManagerClass, 101983b368505052f59616d29558e65e2250d01fd848Eric Laurent JAVA_AUDIOMANAGER_CLASS_NAME, 102083b368505052f59616d29558e65e2250d01fd848Eric Laurent JAVA_CONST_STREAM_DTMF_NAME, &(javaAudioTrackFields.STREAM_DTMF))) { 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // error log performed in android_media_getIntConstantFromClass() 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods)); 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 1030