jni_entry.cc revision 0bd6ec5bc06b869131ee0facf38ff02f81f65c10
1b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson/* 2b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * Copyright (C) 2011 The Android Open Source Project 3b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * 4b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * Licensed under the Apache License, Version 2.0 (the "License"); 5b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * you may not use this file except in compliance with the License. 6b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * You may obtain a copy of the License at 7b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * 8b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * http://www.apache.org/licenses/LICENSE-2.0 9b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * 10b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * Unless required by applicable law or agreed to in writing, software 11b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * distributed under the License is distributed on an "AS IS" BASIS, 12b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * See the License for the specific language governing permissions and 14b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * limitations under the License. 15b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson */ 16b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 17b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson#include <stdlib.h> 18b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson#include <assert.h> 19b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 20b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson#include <jni.h> 21b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson#include <variablespeed.h> 22b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 23b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson// Quick #define to make sure I get all the JNI method calls right. 24b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson#define JNI_METHOD(x, y) \ 25b83ad73794088498d6d38cd3b4fc9311f505d051Hugo HudsonJNIEXPORT y JNICALL \ 26b83ad73794088498d6d38cd3b4fc9311f505d051Hugo HudsonJava_com_android_ex_variablespeed_VariableSpeedNative_##x 27b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 28b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudsonclass MethodLog { 29b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson public: 30b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson explicit MethodLog(const char* name) : name_(name) { 310bd6ec5bc06b869131ee0facf38ff02f81f65c10Hugo Hudson LOGV("+ %s", name); 32b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson } 33b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson virtual ~MethodLog() { 340bd6ec5bc06b869131ee0facf38ff02f81f65c10Hugo Hudson LOGV("- %s", name_); 35b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson } 36b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 37b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson private: 38b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson const char* name_; 39b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson}; 40b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 41b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudsonextern "C" { 42b83ad73794088498d6d38cd3b4fc9311f505d051Hugo HudsonJNI_METHOD(playFileDescriptor, void) (JNIEnv*, jclass, int fd, jlong offset, 43b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson jlong length) { 44b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson MethodLog _("playFileDescriptor"); 45b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson AudioEngine::GetEngine()->PlayFileDescriptor(fd, offset, length); 46b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson} 47b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 48b83ad73794088498d6d38cd3b4fc9311f505d051Hugo HudsonJNI_METHOD(playUri, void) (JNIEnv* env, jclass, jstring uri) { 49b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson MethodLog _("playUri"); 50b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson const char* utf8 = env->GetStringUTFChars(uri, NULL); 51b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson CHECK(NULL != utf8); 52b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson AudioEngine::GetEngine()->PlayUri(utf8); 53b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson} 54b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 55b83ad73794088498d6d38cd3b4fc9311f505d051Hugo HudsonJNI_METHOD(setVariableSpeed, void) (JNIEnv*, jclass, float speed) { 56b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson MethodLog _("setVariableSpeed"); 57b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson AudioEngine::GetEngine()->SetVariableSpeed(speed); 58b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson} 59b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 60b83ad73794088498d6d38cd3b4fc9311f505d051Hugo HudsonJNI_METHOD(startPlayback, void) (JNIEnv*, jclass) { 61b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson MethodLog _("startPlayback"); 62b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson AudioEngine::GetEngine()->RequestStart(); 63b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson} 64b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 65b83ad73794088498d6d38cd3b4fc9311f505d051Hugo HudsonJNI_METHOD(stopPlayback, void) (JNIEnv*, jclass) { 66b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson MethodLog _("stopPlayback"); 67b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson AudioEngine::GetEngine()->RequestStop(); 68b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson} 69b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 70b83ad73794088498d6d38cd3b4fc9311f505d051Hugo HudsonJNI_METHOD(getCurrentPosition, int) (JNIEnv*, jclass) { 71b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson return AudioEngine::GetEngine()->GetCurrentPosition(); 72b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson} 73b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 74b83ad73794088498d6d38cd3b4fc9311f505d051Hugo HudsonJNI_METHOD(getTotalDuration, int) (JNIEnv*, jclass) { 75b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson return AudioEngine::GetEngine()->GetTotalDuration(); 76b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson} 77b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 780bd6ec5bc06b869131ee0facf38ff02f81f65c10Hugo HudsonJNI_METHOD(initializeEngine, void) (JNIEnv*, jclass, 790bd6ec5bc06b869131ee0facf38ff02f81f65c10Hugo Hudson int targetFrames, float windowDuration, 80b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson float windowOverlapDuration, size_t maxPlayBufferCount, 81b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson float initialRate, size_t decodeInitialSize, size_t decodeMaxSize, 82b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson size_t startPositionMillis) { 83b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson MethodLog _("initializeEngine"); 840bd6ec5bc06b869131ee0facf38ff02f81f65c10Hugo Hudson AudioEngine::SetEngine(new AudioEngine(targetFrames, 85b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson windowDuration, windowOverlapDuration, maxPlayBufferCount, initialRate, 86b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson decodeInitialSize, decodeMaxSize, startPositionMillis)); 87b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson} 88b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 89b83ad73794088498d6d38cd3b4fc9311f505d051Hugo HudsonJNI_METHOD(shutdownEngine, void) (JNIEnv*, jclass) { 90b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson MethodLog _("shutdownEngine"); 91b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson AudioEngine::DeleteEngine(); 92b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson} 93b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson} // extern "C" 94