AudioTrack.java revision 105925376f8d0f6b318c9938c7b83ef7fef094da
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.media; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.IllegalArgumentException; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.IllegalStateException; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Looper; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.AudioManager; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The AudioTrack class manages and plays a single audio resource for Java applications. 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It allows to stream PCM audio buffers to the audio hardware for playback. This is 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * achieved by "pushing" the data to the AudioTrack object using one of the 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #write(byte[], int, int)} and {@link #write(short[], int, int)} methods. 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>An AudioTrack instance can operate under two modes: static of streaming.<br> 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Streaming mode consists in continuously writing data to the AudioTrack, using one 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the write() methods. These are blocking and return when the data has been transferred 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from the Java layer to the native layer, and is queued for playback. The streaming mode 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is most useful when playing blocks of audio data that for instance are: 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>too big to fit in memory because of the duration of the sound to play,</li> 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>too big to fit in memory because of the characteristics of the audio data 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (high sampling rate, bits per sample ...)</li> 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>chosen, received or generated as the audio keeps playing.</li> 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The static mode is to be chosen when dealing with short sounds that fit in memory and 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that need to be played with the smallest latency possible. Static mode AudioTrack instances can 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * play the sound without the need to transfer the audio data from Java to the audio hardware 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * each time the sound is to be played. The static mode will therefore be preferred for UI and 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * game sounds that are played often, and with the smallest overhead possible. 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Upon creation, an AudioTrack object initializes its associated audio buffer. 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The size of this buffer, specified during the construction, determines how long an AudioTrack 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can play before running out of data.<br> 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For an AudioTrack using the static mode, this size is the maximum size of the sound that can 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be played from it.<br> 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For the streaming mode, data will be written to the hardware in chunks of 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sizes inferior to the total buffer size. 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class AudioTrack 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //--------------------------------------------------------- 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Constants 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //-------------------- 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Minimum value for a channel volume */ 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final float VOLUME_MIN = 0.0f; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Maximum value for a channel volume */ 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final float VOLUME_MAX = 1.0f; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** state of an AudioTrack this is stopped */ 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int PLAYSTATE_STOPPED = 1; // matches SL_PLAYSTATE_STOPPED 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** state of an AudioTrack this is paused */ 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int PLAYSTATE_PAUSED = 2; // matches SL_PLAYSTATE_PAUSED 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** state of an AudioTrack this is playing */ 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int PLAYSTATE_PLAYING = 3; // matches SL_PLAYSTATE_PLAYING 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creation mode where audio data is transferred from Java to the native layer 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * only once before the audio starts playing. 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int MODE_STATIC = 0; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creation mode where audio data is streamed from Java to the native layer 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as the audio is playing. 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int MODE_STREAM = 1; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * State of an AudioTrack that was not successfully initialized upon creation 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STATE_UNINITIALIZED = 0; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * State of an AudioTrack that is ready to be used. 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STATE_INITIALIZED = 1; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * State of a successfully initialized AudioTrack that uses static data, 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but that hasn't received that data yet. 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STATE_NO_STATIC_DATA = 2; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Error codes: 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to keep in sync with frameworks/base/core/jni/android_media_AudioTrack.cpp 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Denotes a successful operation. 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SUCCESS = 0; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Denotes a generic operation failure. 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ERROR = -1; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Denotes a failure due to the use of an invalid value. 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ERROR_BAD_VALUE = -2; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Denotes a failure due to the improper use of a method. 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ERROR_INVALID_OPERATION = -3; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int ERROR_NATIVESETUP_AUDIOSYSTEM = -16; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int ERROR_NATIVESETUP_INVALIDCHANNELCOUNT = -17; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int ERROR_NATIVESETUP_INVALIDFORMAT = -18; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int ERROR_NATIVESETUP_INVALIDSTREAMTYPE = -19; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int ERROR_NATIVESETUP_NATIVEINITFAILED = -20; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Events: 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to keep in sync with frameworks/base/include/media/AudioTrack.h 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Event id for when the playback head has reached a previously set marker. 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int NATIVE_EVENT_MARKER = 3; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Event id for when the previously set update period has passed during playback. 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int NATIVE_EVENT_NEW_POS = 4; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final static String TAG = "AudioTrack-Java"; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //-------------------------------------------------------------------------- 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Member variables 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //-------------------- 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Indicates the state of the AudioTrack instance 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mState = STATE_UNINITIALIZED; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Indicates the play state of the AudioTrack instance 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mPlayState = PLAYSTATE_STOPPED; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lock to make sure mPlayState updates are reflecting the actual state of the object. 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Object mPlayStateLock = new Object(); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1564df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * The listener the AudioTrack notifies when the playback position reaches a marker 1574df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * or for periodic updates during the progression of the playback head. 1584df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @see #setPlaybackPositionUpdateListener(OnPlaybackPositionUpdateListener) 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1604df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project private OnPlaybackPositionUpdateListener mPositionListener = null; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1624df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * Lock to protect event listener updates against event notifications 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1644df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project private final Object mPositionListenerLock = new Object(); 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Size of the native audio buffer. 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mNativeBufferSizeInBytes = 0; 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1704df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * Handler for marker events coming from the native code 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1724df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project private NativeEventHandlerDelegate mEventHandlerDelegate = null; 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 174105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * Looper associated with the thread that creates the AudioTrack instance 175105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project */ 176105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project private Looper mInitializationLooper = null; 177105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project /** 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The audio data sampling rate in Hz. 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mSampleRate = 22050; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of input audio channels (1 is mono, 2 is stereo) 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mChannelCount = 1; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The type of the audio stream to play. See 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link AudioManager#STREAM_VOICE_CALL}, {@link AudioManager#STREAM_SYSTEM}, 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link AudioManager#STREAM_RING}, {@link AudioManager#STREAM_MUSIC} and 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link AudioManager#STREAM_ALARM} 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mStreamType = AudioManager.STREAM_MUSIC; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The way audio is consumed by the hardware, streaming or static. 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mDataLoadMode = MODE_STREAM; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The current audio channel configuration 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mChannelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The encoding of the audio samples. 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see AudioFormat#ENCODING_PCM_8BIT 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see AudioFormat#ENCODING_PCM_16BIT 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mAudioFormat = AudioFormat.ENCODING_PCM_16BIT; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //-------------------------------- 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Used exclusively by native code 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //-------------------- 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Accessed by native methods: provides access to C++ AudioTrack object 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings("unused") 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mNativeTrackInJavaObj; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Accessed by native methods: provides access to the JNI data (i.e. resources used by 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the native AudioTrack object, but not stored in it). 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings("unused") 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mJniData; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //-------------------------------------------------------------------------- 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Constructor, Finalize 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //-------------------- 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Class constructor. 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param streamType the type of the audio stream. See 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link AudioManager#STREAM_VOICE_CALL}, {@link AudioManager#STREAM_SYSTEM}, 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link AudioManager#STREAM_RING}, {@link AudioManager#STREAM_MUSIC} and 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link AudioManager#STREAM_ALARM} 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sampleRateInHz the sample rate expressed in Hertz. Examples of rates are (but 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not limited to) 44100, 22050 and 11025. 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param channelConfig describes the configuration of the audio channels. 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See {@link AudioFormat#CHANNEL_CONFIGURATION_MONO} and 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link AudioFormat#CHANNEL_CONFIGURATION_STEREO} 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param audioFormat the format in which the audio data is represented. 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See {@link AudioFormat#ENCODING_PCM_16BIT} and 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link AudioFormat#ENCODING_PCM_8BIT} 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bufferSizeInBytes the total size (in bytes) of the buffer where audio data is read 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from for playback. If using the AudioTrack in streaming mode, you can write data into 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this buffer in smaller chunks than this size. If using the AudioTrack in static mode, 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this is the maximum size of the sound that will be played for this instance. 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param mode streaming or static buffer. See {@link #MODE_STATIC} and {@link #MODE_STREAM} 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws java.lang.IllegalArgumentException 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AudioTrack(int streamType, int sampleRateInHz, int channelConfig, int audioFormat, 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int bufferSizeInBytes, int mode) 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IllegalArgumentException { 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mState = STATE_UNINITIALIZED; 255105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 256105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project // remember which looper is associated with the AudioTrack instanciation 257105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if ((mInitializationLooper = Looper.myLooper()) == null) { 258105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mInitializationLooper = Looper.getMainLooper(); 259105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audioParamCheck(streamType, sampleRateInHz, channelConfig, audioFormat, mode); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audioBuffSizeCheck(bufferSizeInBytes); 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // native initialization 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int initResult = native_setup(new WeakReference<AudioTrack>(this), 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStreamType, mSampleRate, mChannelCount, mAudioFormat, 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNativeBufferSizeInBytes, mDataLoadMode); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (initResult != SUCCESS) { 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project loge("Error code "+initResult+" when initializing AudioTrack."); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; // with mState == STATE_UNINITIALIZED 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDataLoadMode == MODE_STATIC) { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mState = STATE_NO_STATIC_DATA; 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mState = STATE_INITIALIZED; 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Convenience method for the constructor's parameter checks. 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This is where constructor IllegalArgumentException-s are thrown 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // postconditions: 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // mStreamType is valid 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // mChannelCount is valid 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // mAudioFormat is valid 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // mSampleRate is valid 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // mDataLoadMode is valid 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void audioParamCheck(int streamType, int sampleRateInHz, 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelConfig, int audioFormat, int mode) { 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //-------------- 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // stream type 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if( (streamType != AudioManager.STREAM_ALARM) && (streamType != AudioManager.STREAM_MUSIC) 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (streamType != AudioManager.STREAM_RING) && (streamType != AudioManager.STREAM_SYSTEM) 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (streamType != AudioManager.STREAM_VOICE_CALL) 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (streamType != AudioManager.STREAM_NOTIFICATION) 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (streamType != AudioManager.STREAM_BLUETOOTH_SCO)) { 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw (new IllegalArgumentException("Invalid stream type.")); 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStreamType = streamType; 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //-------------- 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // sample rate 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ( (sampleRateInHz < 4000) || (sampleRateInHz > 48000) ) { 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw (new IllegalArgumentException(sampleRateInHz 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "Hz is not a supported sample rate.")); 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSampleRate = sampleRateInHz; 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //-------------- 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // channel config 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (channelConfig) { 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case AudioFormat.CHANNEL_CONFIGURATION_DEFAULT: 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case AudioFormat.CHANNEL_CONFIGURATION_MONO: 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChannelCount = 1; 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChannelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case AudioFormat.CHANNEL_CONFIGURATION_STEREO: 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChannelCount = 2; 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChannelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_STEREO; 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChannelCount = 0; 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChannelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_INVALID; 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw(new IllegalArgumentException("Unsupported channel configuration.")); 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //-------------- 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // audio format 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (audioFormat) { 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case AudioFormat.ENCODING_DEFAULT: 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAudioFormat = AudioFormat.ENCODING_PCM_16BIT; 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case AudioFormat.ENCODING_PCM_16BIT: 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case AudioFormat.ENCODING_PCM_8BIT: 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAudioFormat = audioFormat; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAudioFormat = AudioFormat.ENCODING_INVALID; 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw(new IllegalArgumentException("Unsupported sample encoding." 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " Should be ENCODING_PCM_8BIT or ENCODING_PCM_16BIT.")); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //-------------- 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // audio load mode 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ( (mode != MODE_STREAM) && (mode != MODE_STATIC) ) { 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw(new IllegalArgumentException("Invalid mode.")); 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDataLoadMode = mode; 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Convenience method for the contructor's audio buffer size check. 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // preconditions: 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // mChannelCount is valid 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // mAudioFormat is valid 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // postcondition: 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // mNativeBufferSizeInBytes is valid (multiple of frame size, positive) 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void audioBuffSizeCheck(int audioBufferSize) { 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // NB: this section is only valid with PCM data. 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // To update when supporting compressed formats 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameSizeInBytes = mChannelCount 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (mAudioFormat == AudioFormat.ENCODING_PCM_8BIT ? 1 : 2); 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((audioBufferSize % frameSizeInBytes != 0) || (audioBufferSize < 1)) { 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw (new IllegalArgumentException("Invalid audio buffer size.")); 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNativeBufferSizeInBytes = audioBufferSize; 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Releases the native AudioTrack resources. 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void release() { 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // even though native_release() stops the native AudioTrack, we need to stop 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // AudioTrack subclasses too. 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stop(); 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch(IllegalStateException ise) { 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // don't raise an exception, we're releasing the resources. 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_release(); 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mState = STATE_UNINITIALIZED; 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() { 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_finalize(); 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //-------------------------------------------------------------------------- 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Getters 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //-------------------- 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the minimum valid volume value. Volume values set under this one will 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be clamped at this value. 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the minimum volume expressed as a linear attenuation. 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static public float getMinVolume() { 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AudioTrack.VOLUME_MIN; 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the maximum valid volume value. Volume values set above this one will 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be clamped at this value. 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the maximum volume expressed as a linear attenuation. 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static public float getMaxVolume() { 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AudioTrack.VOLUME_MAX; 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the configured audio data sample rate in Hz 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getSampleRate() { 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSampleRate; 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current playback rate in Hz. Note that this rate may differ from one set using 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #setPlaybackRate(int)} as the value effectively set is implementation-dependent. 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getPlaybackRate() { 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return native_get_playback_rate(); 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the configured audio data format. See {@link AudioFormat#ENCODING_PCM_16BIT} 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and {@link AudioFormat#ENCODING_PCM_8BIT}. 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getAudioFormat() { 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAudioFormat; 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the type of audio stream this AudioTrack is configured for. 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Compare the result against {@link AudioManager#STREAM_VOICE_CALL}, 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link AudioManager#STREAM_SYSTEM}, {@link AudioManager#STREAM_RING}, 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link AudioManager#STREAM_MUSIC} or {@link AudioManager#STREAM_ALARM} 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getStreamType() { 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStreamType; 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the configured channel configuration. 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See {@link AudioFormat#CHANNEL_CONFIGURATION_MONO} 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and {@link AudioFormat#CHANNEL_CONFIGURATION_STEREO}. 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getChannelConfiguration() { 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mChannelConfiguration; 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the configured number of channels. 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getChannelCount() { 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mChannelCount; 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the state of the AudioTrack instance. This is useful after the 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * AudioTrack instance has been created to check if it was initialized 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * properly. This ensures that the appropriate hardware resources have been 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * acquired. 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getState() { 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mState; 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the playback state of the AudioTrack instance. 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #PLAYSTATE_STOPPED 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #PLAYSTATE_PAUSED 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #PLAYSTATE_PLAYING 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getPlayState() { 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPlayState; 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the native frame count used by the hardware 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected int getNativeFrameCount() { 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return native_get_native_frame_count(); 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return marker position in frames 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getNotificationMarkerPosition() { 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return native_get_marker_pos(); 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return update period in frames 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getPositionNotificationPeriod() { 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return native_get_pos_update_period(); 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return playback head position in frames 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getPlaybackHeadPosition() { 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return native_get_position(); 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the hardware output sample rate 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static public int getNativeOutputSampleRate(int streamType) { 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return native_get_output_sample_rate(streamType); 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the minimum buffer size required for the successful creation of an AudioTrack 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object to be created in the {@link #MODE_STREAM} mode. 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sampleRateInHz the sample rate expressed in Hertz. 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param channelConfig describes the configuration of the audio channels. 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See {@link AudioFormat#CHANNEL_CONFIGURATION_MONO} and 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link AudioFormat#CHANNEL_CONFIGURATION_STEREO} 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param audioFormat the format in which the audio data is represented. 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See {@link AudioFormat#ENCODING_PCM_16BIT} and 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link AudioFormat#ENCODING_PCM_8BIT} 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@link #ERROR_BAD_VALUE} if an invalid parameter was passed, 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or {@link #ERROR} if the implementation was unable to query the hardware for its output 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * properties, 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or the minimum buffer size expressed in number of bytes. 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static public int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat) { 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount = 0; 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch(channelConfig) { 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case AudioFormat.CHANNEL_CONFIGURATION_MONO: 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project channelCount = 1; 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case AudioFormat.CHANNEL_CONFIGURATION_STEREO: 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project channelCount = 2; 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project loge("getMinBufferSize(): Invalid channel configuration."); 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AudioTrack.ERROR_BAD_VALUE; 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((audioFormat != AudioFormat.ENCODING_PCM_16BIT) 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (audioFormat != AudioFormat.ENCODING_PCM_8BIT)) { 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project loge("getMinBufferSize(): Invalid audio format."); 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AudioTrack.ERROR_BAD_VALUE; 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ( (sampleRateInHz < 4000) || (sampleRateInHz > 48000) ) { 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project loge("getMinBufferSize(): " + sampleRateInHz +"Hz is not a supported sample rate."); 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AudioTrack.ERROR_BAD_VALUE; 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int size = native_get_min_buff_size(sampleRateInHz, channelCount, audioFormat); 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((size == -1) || (size == 0)) { 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project loge("getMinBufferSize(): error querying hardware"); 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AudioTrack.ERROR; 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else { 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return size; 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //-------------------------------------------------------------------------- 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Initialization / configuration 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //-------------------- 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5804df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * Sets the listener the AudioTrack notifies when a previously set marker is reached or 5814df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * for each periodic playback head position update. 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param listener 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5844df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project public void setPlaybackPositionUpdateListener(OnPlaybackPositionUpdateListener listener) { 5854df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project setPlaybackPositionUpdateListener(listener, null); 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5874df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5894df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project public void setPlaybackPositionUpdateListener(OnPlaybackPositionUpdateListener listener, 5904df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project Handler handler) { 5914df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project synchronized (mPositionListenerLock) { 5924df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mPositionListener = listener; 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5944df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (listener != null) { 5954df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mEventHandlerDelegate = new NativeEventHandlerDelegate(this, handler); 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5974df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6014df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the specified left/right output volume values on the AudioTrack. Values are clamped 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the ({@link #getMinVolume()}, {@link #getMaxVolume()}) interval if outside this range. 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param leftVolume output attenuation for the left channel. A value of 0.0f is silence, 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a value of 1.0f is no attenuation. 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rightVolume output attenuation for the right channel 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return error code or success, see {@link #SUCCESS}, 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #ERROR_INVALID_OPERATION} 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int setStereoVolume(float leftVolume, float rightVolume) { 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mState != STATE_INITIALIZED) { 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ERROR_INVALID_OPERATION; 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // clamp the volumes 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (leftVolume < getMinVolume()) { 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project leftVolume = getMinVolume(); 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (leftVolume > getMaxVolume()) { 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project leftVolume = getMaxVolume(); 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rightVolume < getMinVolume()) { 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rightVolume = getMinVolume(); 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rightVolume > getMaxVolume()) { 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rightVolume = getMaxVolume(); 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_setVolume(leftVolume, rightVolume); 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SUCCESS; 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the playback sample rate for this track. This sets the sampling rate at which 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the audio data will be consumed and played back, not the original sampling rate of the 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * content. Setting it to half the sample rate of the content will cause the playback to 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * last twice as long, but will also result result in a negative pitch shift. 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The current implementation supports a maximum sample rate of twice the hardware output 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sample rate (see {@link #getNativeOutputSampleRate(int)}). Use {@link #getSampleRate()} to 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * check the rate actually used in hardware after potential clamping. 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sampleRateInHz 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return error code or success, see {@link #SUCCESS}, {@link #ERROR_BAD_VALUE}, 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #ERROR_INVALID_OPERATION} 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int setPlaybackRate(int sampleRateInHz) { 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mState != STATE_INITIALIZED) { 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ERROR_INVALID_OPERATION; 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sampleRateInHz <= 0) { 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ERROR_BAD_VALUE; 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_set_playback_rate(sampleRateInHz); 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SUCCESS; 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param markerInFrames marker in frames 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return error code or success, see {@link #SUCCESS}, {@link #ERROR_BAD_VALUE}, 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #ERROR_INVALID_OPERATION} 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int setNotificationMarkerPosition(int markerInFrames) { 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mState != STATE_INITIALIZED) { 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ERROR_INVALID_OPERATION; 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return native_set_marker_pos(markerInFrames); 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param periodInFrames update period in frames 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return error code or success, see {@link #SUCCESS}, {@link #ERROR_INVALID_OPERATION} 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int setPositionNotificationPeriod(int periodInFrames) { 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mState != STATE_INITIALIZED) { 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ERROR_INVALID_OPERATION; 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return native_set_pos_update_period(periodInFrames); 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the playback head position. The track must be stopped for the position to be changed. 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param positionInFrames playback head position in frames 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return error code or success, see {@link #SUCCESS}, {@link #ERROR_BAD_VALUE}, 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #ERROR_INVALID_OPERATION} 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int setPlaybackHeadPosition(int positionInFrames) { 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mPlayStateLock) { 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mPlayState == PLAYSTATE_STOPPED) || (mPlayState == PLAYSTATE_PAUSED)) { 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return native_set_position(positionInFrames); 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ERROR_INVALID_OPERATION; 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the loop points and the loop count. The loop can be infinite. 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param startInFrames loop start marker in frames 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param endInFrames loop end marker in frames 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param loopCount the number of times the loop is looped. 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A value of -1 means infinite looping. 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return error code or success, see {@link #SUCCESS}, {@link #ERROR_BAD_VALUE}, 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #ERROR_INVALID_OPERATION} 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int setLoopPoints(int startInFrames, int endInFrames, int loopCount) { 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDataLoadMode == MODE_STREAM) { 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ERROR_INVALID_OPERATION; 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return native_set_loop(startInFrames, endInFrames, loopCount); 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the initialization state of the instance. To be used in an AudioTrack subclass 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * constructor to set a subclass-specific post-initialization state. 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param state the state of the AudioTrack instance 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void setState(int state) { 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mState = state; 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //--------------------------------------------------------- 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Transport control methods 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //-------------------- 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Starts playing an AudioTrack. 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IllegalStateException 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void play() 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IllegalStateException { 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mState != STATE_INITIALIZED) { 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw(new IllegalStateException("play() called on uninitialized AudioTrack.")); 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mPlayStateLock) { 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_start(); 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPlayState = PLAYSTATE_PLAYING; 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Stops playing the audio data. 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IllegalStateException 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void stop() 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IllegalStateException { 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mState != STATE_INITIALIZED) { 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw(new IllegalStateException("stop() called on uninitialized AudioTrack.")); 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // stop playing 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mPlayStateLock) { 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_stop(); 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPlayState = PLAYSTATE_STOPPED; 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Pauses the playback of the audio data. 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IllegalStateException 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void pause() 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IllegalStateException { 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mState != STATE_INITIALIZED) { 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw(new IllegalStateException("pause() called on uninitialized AudioTrack.")); 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //logd("pause()"); 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pause playback 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mPlayStateLock) { 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_pause(); 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPlayState = PLAYSTATE_PAUSED; 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //--------------------------------------------------------- 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Audio data supply 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //-------------------- 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flushes the audio data currently queued for playback. 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void flush() { 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mState == STATE_INITIALIZED) { 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // flush the data in native layer 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_flush(); 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Writes the audio data to the audio hardware for playback. 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param audioData the array that holds the data to play. 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param offsetInBytes the offset in audioData where the data to play starts. 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sizeInBytes the number of bytes to read in audioData after the offset. 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the number of bytes that were written or {@link #ERROR_INVALID_OPERATION} 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if the object wasn't properly initialized, or {@link #ERROR_BAD_VALUE} if 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the parameters don't resolve to valid data and indexes. 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int write(byte[] audioData,int offsetInBytes, int sizeInBytes) { 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mDataLoadMode == MODE_STATIC) 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (mState == STATE_NO_STATIC_DATA) 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (sizeInBytes > 0)) { 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mState = STATE_INITIALIZED; 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mState != STATE_INITIALIZED) { 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ERROR_INVALID_OPERATION; 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ( (audioData == null) || (offsetInBytes < 0 ) || (sizeInBytes < 0) 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (offsetInBytes + sizeInBytes > audioData.length)) { 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ERROR_BAD_VALUE; 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return native_write_byte(audioData, offsetInBytes, sizeInBytes, mAudioFormat); 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Writes the audio data to the audio hardware for playback. 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param audioData the array that holds the data to play. 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param offsetInShorts the offset in audioData where the data to play starts. 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sizeInShorts the number of bytes to read in audioData after the offset. 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the number of shorts that were written or {@link #ERROR_INVALID_OPERATION} 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if the object wasn't properly initialized, or {@link #ERROR_BAD_VALUE} if 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the parameters don't resolve to valid data and indexes. 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int write(short[] audioData, int offsetInShorts, int sizeInShorts) { 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mDataLoadMode == MODE_STATIC) 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (mState == STATE_NO_STATIC_DATA) 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (sizeInShorts > 0)) { 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mState = STATE_INITIALIZED; 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mState != STATE_INITIALIZED) { 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ERROR_INVALID_OPERATION; 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ( (audioData == null) || (offsetInShorts < 0 ) || (sizeInShorts < 0) 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (offsetInShorts + sizeInShorts > audioData.length)) { 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ERROR_BAD_VALUE; 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return native_write_short(audioData, offsetInShorts, sizeInShorts, mAudioFormat); 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Notifies the native resource to reuse the audio data already loaded in the native 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * layer. This call is only valid with AudioTrack instances that don't use the streaming 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * model. 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return error code or success, see {@link #SUCCESS}, {@link #ERROR_BAD_VALUE}, 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #ERROR_INVALID_OPERATION} 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int reloadStaticData() { 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDataLoadMode == MODE_STREAM) { 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ERROR_INVALID_OPERATION; 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return native_reload_static(); 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //--------------------------------------------------------- 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Interface definitions 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //-------------------- 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8784df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * Interface definition for a callback to be invoked when the playback head position of 8794df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * an AudioTrack has reached a notification marker or has increased by a certain period. 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8814df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project public interface OnPlaybackPositionUpdateListener { 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called on the listener to notify it that the previously set marker has been reached 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * by the playback head. 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onMarkerReached(AudioTrack track); 8874df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called on the listener to periodically notify it that the playback head has reached 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a multiple of the notification period. 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onPeriodicNotification(AudioTrack track); 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //--------------------------------------------------------- 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Inner classes 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //-------------------- 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9004df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * Helper class to handle the forwarding of native events to the appropriate listener 9014df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * (potentially) handled in a different thread 9024df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project */ 9034df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project private class NativeEventHandlerDelegate { 9044df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project private final AudioTrack mAudioTrack; 9054df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project private final Handler mHandler; 9064df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 9074df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project NativeEventHandlerDelegate(AudioTrack track, Handler handler) { 9084df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mAudioTrack = track; 9094df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project // find the looper for our new event handler 9104df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project Looper looper; 9114df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (handler != null) { 9124df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project looper = handler.getLooper(); 9134df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } else { 914105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project // no given handler, use the looper the AudioTrack was created in 915105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project looper = mInitializationLooper; 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 917105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 9184df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project // construct the event handler with this looper 9194df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (looper != null) { 9204df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project // implement the event handler delegate 9214df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mHandler = new Handler(looper) { 9224df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project @Override 9234df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project public void handleMessage(Message msg) { 9244df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (mAudioTrack == null) { 9254df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return; 9264df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 9274df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project OnPlaybackPositionUpdateListener listener = null; 9284df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project synchronized (mPositionListenerLock) { 9294df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project listener = mAudioTrack.mPositionListener; 9304df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 9314df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project switch(msg.what) { 9324df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project case NATIVE_EVENT_MARKER: 9334df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (listener != null) { 9344df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project listener.onMarkerReached(mAudioTrack); 9354df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 9364df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project break; 9374df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project case NATIVE_EVENT_NEW_POS: 9384df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (listener != null) { 9394df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project listener.onPeriodicNotification(mAudioTrack); 9404df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 9414df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project break; 9424df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project default: 9434df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project Log.e(TAG, "[ android.media.AudioTrack.NativeEventHandler ] " + 9444df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project "Unknown event type: " + msg.what); 9454df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project break; 9464df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 9474df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 9484df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project }; 9494df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } else { 9504df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mHandler = null; 9514df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 9524df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 9534df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 9544df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project Handler getHandler() { 9554df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return mHandler; 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //--------------------------------------------------------- 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Java methods called from the native side 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //-------------------- 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings("unused") 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static void postEventFromNative(Object audiotrack_ref, 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int what, int arg1, int arg2, Object obj) { 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //logd("Event posted from the native side: event="+ what + " args="+ arg1+" "+arg2); 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioTrack track = (AudioTrack)((WeakReference)audiotrack_ref).get(); 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (track == null) { 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9724df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (track.mEventHandlerDelegate != null) { 9734df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project Message m = 9744df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project track.mEventHandlerDelegate.getHandler().obtainMessage(what, arg1, arg2, obj); 9754df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project track.mEventHandlerDelegate.getHandler().sendMessage(m); 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //--------------------------------------------------------- 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Native methods called from the Java side 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //-------------------- 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final int native_setup(Object audiotrack_this, 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int streamType, int sampleRate, int nbChannels, int audioFormat, 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int buffSizeInBytes, int mode); 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final void native_finalize(); 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final void native_release(); 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final void native_start(); 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final void native_stop(); 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final void native_pause(); 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final void native_flush(); 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final int native_write_byte(byte[] audioData, 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int offsetInBytes, int sizeInBytes, int format); 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final int native_write_short(short[] audioData, 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int offsetInShorts, int sizeInShorts, int format); 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final int native_reload_static(); 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final int native_get_native_frame_count(); 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final void native_setVolume(float leftVolume, float rightVolume); 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final void native_set_playback_rate(int sampleRateInHz); 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final int native_get_playback_rate(); 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final int native_set_marker_pos(int marker); 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final int native_get_marker_pos(); 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final int native_set_pos_update_period(int updatePeriod); 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final int native_get_pos_update_period(); 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final int native_set_position(int position); 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final int native_get_position(); 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final int native_set_loop(int start, int end, int loopCount); 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static private native final int native_get_output_sample_rate(int streamType); 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static private native final int native_get_min_buff_size( 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int sampleRateInHz, int channelConfig, int audioFormat); 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //--------------------------------------------------------- 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Utility methods 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //------------------ 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static void logd(String msg) { 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(TAG, "[ android.media.AudioTrack ] " + msg); 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static void loge(String msg) { 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "[ android.media.AudioTrack ] " + msg); 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1045