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 Hudsonpackage com.android.ex.variablespeed; 18b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 19b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudsonimport com.android.common.io.MoreCloseables; 20b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 21b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudsonimport android.content.Context; 22b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudsonimport android.content.res.AssetFileDescriptor; 23b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudsonimport android.net.Uri; 24b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 25b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudsonimport java.io.FileDescriptor; 26b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudsonimport java.io.FileNotFoundException; 27b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudsonimport java.lang.reflect.Field; 28b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 29b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson/** 30b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * Provides all the native calls through to the underlying audio library. 31b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * <p> 32b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * You should not use this class directly. Prefer to use the {@link VariableSpeed} 33b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * class instead. 34b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson */ 35b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson/*package*/ class VariableSpeedNative { 36b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson /*package*/ static void loadLibrary() throws UnsatisfiedLinkError, SecurityException { 37b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson System.loadLibrary("variablespeed"); 38b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson } 39b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 40b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson /*package*/ static boolean playFromContext(Context context, Uri uri) 41b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson throws FileNotFoundException { 42b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson AssetFileDescriptor afd = context.getContentResolver().openAssetFileDescriptor(uri, "r"); 43b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson try { 44b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson FileDescriptor fileDescriptor = afd.getFileDescriptor(); 45b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson Field descriptorField = fileDescriptor.getClass().getDeclaredField("descriptor"); 46b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson descriptorField.setAccessible(true); 47b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson int fd = descriptorField.getInt(fileDescriptor); 48b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson VariableSpeedNative.playFileDescriptor(fd, afd.getStartOffset(), afd.getLength()); 49b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson return true; 50b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson } catch (SecurityException e) { 51b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson // Fall through. 52b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson } catch (NoSuchFieldException e) { 53b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson // Fall through. 54b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson } catch (IllegalArgumentException e) { 55b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson // Fall through. 56b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson } catch (IllegalAccessException e) { 57b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson // Fall through. 58b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson } finally { 59b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson MoreCloseables.closeQuietly(afd); 60b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson } 61b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson return false; 62b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson } 63b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 64b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson /*package*/ static native void playUri(String uri); 65b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 66b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson /*package*/ static native void playFileDescriptor(int fd, long offset, long length); 67b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 68b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson /*package*/ static native void setVariableSpeed(float speed); 69b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 70b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson /*package*/ static native void startPlayback(); 71b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 72b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson /*package*/ static native void stopPlayback(); 73b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 74b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson /*package*/ static native void shutdownEngine(); 75b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 76b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson /*package*/ static native int getCurrentPosition(); 77b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 78b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson /*package*/ static native int getTotalDuration(); 79b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 80b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson /*package*/ static void initializeEngine(EngineParameters params) { 810bd6ec5bc06b869131ee0facf38ff02f81f65c10Hugo Hudson initializeEngine(params.getTargetFrames(), 82b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson params.getWindowDuration(), params.getWindowOverlapDuration(), 83b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson params.getMaxPlayBufferCount(), params.getInitialRate(), 84b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson params.getDecodeBufferInitialSize(), params.getDecodeBufferMaxSize(), 85dc442b4d99512bf7c41ee5ceae6c93a3c3568b57Flavio Lerda params.getStartPositionMillis(), params.getAudioStreamType()); 86b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson } 87b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 880bd6ec5bc06b869131ee0facf38ff02f81f65c10Hugo Hudson private static native void initializeEngine(int targetFrames, 89b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson float windowDuration, float windowOverlapDuration, int maxPlayBufferCount, 90b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson float initialRate, int decodeBufferInitialSize, int decodeBufferMaxSize, 91dc442b4d99512bf7c41ee5ceae6c93a3c3568b57Flavio Lerda int startPositionMillis, int audioStreamType); 92b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson} 93