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,
82dc442b4d99512bf7c41ee5ceae6c93a3c3568b57Flavio Lerda    size_t startPositionMillis, int audioStreamType) {
83b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson  MethodLog _("initializeEngine");
840bd6ec5bc06b869131ee0facf38ff02f81f65c10Hugo Hudson  AudioEngine::SetEngine(new AudioEngine(targetFrames,
85b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson      windowDuration, windowOverlapDuration, maxPlayBufferCount, initialRate,
86dc442b4d99512bf7c41ee5ceae6c93a3c3568b57Flavio Lerda      decodeInitialSize, decodeMaxSize, startPositionMillis, audioStreamType));
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