1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.example.nativeaudio; 18 19 import android.app.Activity; 20 import android.content.res.AssetManager; 21 import android.os.Bundle; 22 import android.view.View; 23 import android.view.View.OnClickListener; 24 import android.widget.Button; 25 26 public class NativeAudio extends Activity { 27 28 static final int CLIP_NONE = 0; 29 static final int CLIP_HELLO = 1; 30 static final int CLIP_ANDROID = 2; 31 static final int CLIP_SAWTOOTH = 3; 32 static final int CLIP_PLAYBACK = 4; 33 34 static final String URI = "http://upload.wikimedia.org/wikipedia/commons/6/6d/Banana.ogg"; 35 static AssetManager assetManager; 36 37 static boolean isPlayingAsset = false; 38 static boolean isPlayingUri = false; 39 40 /** Called when the activity is first created. */ 41 @Override 42 protected void onCreate(Bundle icicle) { 43 super.onCreate(icicle); 44 setContentView(R.layout.main); 45 46 assetManager = getAssets(); 47 48 // initialize native audio system 49 50 createEngine(); 51 createBufferQueueAudioPlayer(); 52 53 // initialize button click handlers 54 55 ((Button) findViewById(R.id.hello)).setOnClickListener(new OnClickListener() { 56 public void onClick(View view) { 57 // ignore the return value 58 selectClip(CLIP_HELLO, 5); 59 } 60 }); 61 62 ((Button) findViewById(R.id.android)).setOnClickListener(new OnClickListener() { 63 public void onClick(View view) { 64 // ignore the return value 65 selectClip(CLIP_ANDROID, 7); 66 } 67 }); 68 69 ((Button) findViewById(R.id.sawtooth)).setOnClickListener(new OnClickListener() { 70 public void onClick(View view) { 71 // ignore the return value 72 selectClip(CLIP_SAWTOOTH, 1); 73 } 74 }); 75 76 ((Button) findViewById(R.id.reverb)).setOnClickListener(new OnClickListener() { 77 boolean enabled = false; 78 public void onClick(View view) { 79 enabled = !enabled; 80 if (!enableReverb(enabled)) { 81 enabled = !enabled; 82 } 83 } 84 }); 85 86 ((Button) findViewById(R.id.embedded_soundtrack)).setOnClickListener(new OnClickListener() { 87 boolean created = false; 88 public void onClick(View view) { 89 if (!created) { 90 created = createAssetAudioPlayer(assetManager, "background.mp3"); 91 } 92 if (created) { 93 isPlayingAsset = !isPlayingAsset; 94 setPlayingAssetAudioPlayer(isPlayingAsset); 95 } 96 } 97 }); 98 99 ((Button) findViewById(R.id.uri_soundtrack)).setOnClickListener(new OnClickListener() { 100 boolean created = false; 101 public void onClick(View view) { 102 if (!created) { 103 created = createUriAudioPlayer(URI); 104 } 105 if (created) { 106 isPlayingUri = !isPlayingUri; 107 setPlayingUriAudioPlayer(isPlayingUri); 108 } 109 } 110 }); 111 112 ((Button) findViewById(R.id.record)).setOnClickListener(new OnClickListener() { 113 boolean created = false; 114 public void onClick(View view) { 115 if (!created) { 116 created = createAudioRecorder(); 117 } 118 if (created) { 119 startRecording(); 120 } 121 } 122 }); 123 124 ((Button) findViewById(R.id.playback)).setOnClickListener(new OnClickListener() { 125 public void onClick(View view) { 126 // ignore the return value 127 selectClip(CLIP_PLAYBACK, 3); 128 } 129 }); 130 131 } 132 133 /** Called when the activity is about to be destroyed. */ 134 @Override 135 protected void onPause() 136 { 137 // turn off all audio 138 selectClip(CLIP_NONE, 0); 139 isPlayingAsset = false; 140 setPlayingAssetAudioPlayer(false); 141 isPlayingUri = false; 142 setPlayingUriAudioPlayer(false); 143 super.onPause(); 144 } 145 146 /** Called when the activity is about to be destroyed. */ 147 @Override 148 protected void onDestroy() 149 { 150 shutdown(); 151 super.onDestroy(); 152 } 153 154 /** Native methods, implemented in jni folder */ 155 public static native void createEngine(); 156 public static native void createBufferQueueAudioPlayer(); 157 public static native boolean createAssetAudioPlayer(AssetManager assetManager, String filename); 158 public static native void setPlayingAssetAudioPlayer(boolean isPlaying); 159 public static native boolean createUriAudioPlayer(String uri); 160 public static native void setPlayingUriAudioPlayer(boolean isPlaying); 161 public static native boolean selectClip(int which, int count); 162 public static native boolean enableReverb(boolean enabled); 163 public static native boolean createAudioRecorder(); 164 public static native void startRecording(); 165 public static native void shutdown(); 166 167 /** Load jni .so on initialization */ 168 static { 169 System.loadLibrary("native-audio-jni"); 170 } 171 172 } 173