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