1263b4c97823295c41900210515d0c769a236190cAndy Hung/* 2263b4c97823295c41900210515d0c769a236190cAndy Hung * Copyright 2015 The Android Open Source Project 3263b4c97823295c41900210515d0c769a236190cAndy Hung * 4263b4c97823295c41900210515d0c769a236190cAndy Hung * Licensed under the Apache License, Version 2.0 (the "License"); 5263b4c97823295c41900210515d0c769a236190cAndy Hung * you may not use this file except in compliance with the License. 6263b4c97823295c41900210515d0c769a236190cAndy Hung * You may obtain a copy of the License at 7263b4c97823295c41900210515d0c769a236190cAndy Hung * 8263b4c97823295c41900210515d0c769a236190cAndy Hung * http://www.apache.org/licenses/LICENSE-2.0 9263b4c97823295c41900210515d0c769a236190cAndy Hung * 10263b4c97823295c41900210515d0c769a236190cAndy Hung * Unless required by applicable law or agreed to in writing, software 11263b4c97823295c41900210515d0c769a236190cAndy Hung * distributed under the License is distributed on an "AS IS" BASIS, 12263b4c97823295c41900210515d0c769a236190cAndy Hung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13263b4c97823295c41900210515d0c769a236190cAndy Hung * See the License for the specific language governing permissions and 14263b4c97823295c41900210515d0c769a236190cAndy Hung * limitations under the License. 15263b4c97823295c41900210515d0c769a236190cAndy Hung */ 16263b4c97823295c41900210515d0c769a236190cAndy Hung 17263b4c97823295c41900210515d0c769a236190cAndy Hungpackage android.media; 18263b4c97823295c41900210515d0c769a236190cAndy Hung 1976c4fc297723aceea9d4021b26b39c26768b54c3Jae Seoimport android.annotation.IntDef; 2076c4fc297723aceea9d4021b26b39c26768b54c3Jae Seoimport android.os.Parcel; 2176c4fc297723aceea9d4021b26b39c26768b54c3Jae Seoimport android.os.Parcelable; 2276c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo 23263b4c97823295c41900210515d0c769a236190cAndy Hungimport java.lang.annotation.Retention; 24263b4c97823295c41900210515d0c769a236190cAndy Hungimport java.lang.annotation.RetentionPolicy; 25263b4c97823295c41900210515d0c769a236190cAndy Hung 26263b4c97823295c41900210515d0c769a236190cAndy Hung/** 272d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia * Structure for common playback params. 28263b4c97823295c41900210515d0c769a236190cAndy Hung * 292d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia * Used by {@link AudioTrack} {@link AudioTrack#getPlaybackParams()} and 302d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia * {@link AudioTrack#setPlaybackParams(PlaybackParams)} 31263b4c97823295c41900210515d0c769a236190cAndy Hung * to control playback behavior. 32263b4c97823295c41900210515d0c769a236190cAndy Hung * <p> <strong>audio fallback mode:</strong> 33263b4c97823295c41900210515d0c769a236190cAndy Hung * select out-of-range parameter handling. 34263b4c97823295c41900210515d0c769a236190cAndy Hung * <ul> 352d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia * <li> {@link PlaybackParams#AUDIO_FALLBACK_MODE_DEFAULT}: 36263b4c97823295c41900210515d0c769a236190cAndy Hung * System will determine best handling. </li> 372d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia * <li> {@link PlaybackParams#AUDIO_FALLBACK_MODE_MUTE}: 382d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia * Play silence for params normally out of range.</li> 392d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia * <li> {@link PlaybackParams#AUDIO_FALLBACK_MODE_FAIL}: 40263b4c97823295c41900210515d0c769a236190cAndy Hung * Return {@link java.lang.IllegalArgumentException} from 412d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia * <code>AudioTrack.setPlaybackParams(PlaybackParams)</code>.</li> 42263b4c97823295c41900210515d0c769a236190cAndy Hung * </ul> 43263b4c97823295c41900210515d0c769a236190cAndy Hung * <p> <strong>pitch:</strong> increases or decreases the tonal frequency of the audio content. 44263b4c97823295c41900210515d0c769a236190cAndy Hung * It is expressed as a multiplicative factor, where normal pitch is 1.0f. 45263b4c97823295c41900210515d0c769a236190cAndy Hung * <p> <strong>speed:</strong> increases or decreases the time to 46263b4c97823295c41900210515d0c769a236190cAndy Hung * play back a set of audio or video frames. 47263b4c97823295c41900210515d0c769a236190cAndy Hung * It is expressed as a multiplicative factor, where normal speed is 1.0f. 48263b4c97823295c41900210515d0c769a236190cAndy Hung * <p> Different combinations of speed and pitch may be used for audio playback; 49263b4c97823295c41900210515d0c769a236190cAndy Hung * some common ones: 50263b4c97823295c41900210515d0c769a236190cAndy Hung * <ul> 51263b4c97823295c41900210515d0c769a236190cAndy Hung * <li> <em>Pitch equals 1.0f.</em> Speed change will be done with pitch preserved, 52263b4c97823295c41900210515d0c769a236190cAndy Hung * often called <em>timestretching</em>.</li> 53263b4c97823295c41900210515d0c769a236190cAndy Hung * <li> <em>Pitch equals speed.</em> Speed change will be done by <em>resampling</em>, 54263b4c97823295c41900210515d0c769a236190cAndy Hung * similar to {@link AudioTrack#setPlaybackRate(int)}.</li> 55263b4c97823295c41900210515d0c769a236190cAndy Hung * </ul> 56263b4c97823295c41900210515d0c769a236190cAndy Hung */ 5776c4fc297723aceea9d4021b26b39c26768b54c3Jae Seopublic final class PlaybackParams implements Parcelable { 58263b4c97823295c41900210515d0c769a236190cAndy Hung /** @hide */ 59263b4c97823295c41900210515d0c769a236190cAndy Hung @IntDef( 60263b4c97823295c41900210515d0c769a236190cAndy Hung value = { 61263b4c97823295c41900210515d0c769a236190cAndy Hung AUDIO_FALLBACK_MODE_DEFAULT, 62263b4c97823295c41900210515d0c769a236190cAndy Hung AUDIO_FALLBACK_MODE_MUTE, 63263b4c97823295c41900210515d0c769a236190cAndy Hung AUDIO_FALLBACK_MODE_FAIL, 64263b4c97823295c41900210515d0c769a236190cAndy Hung } 65263b4c97823295c41900210515d0c769a236190cAndy Hung ) 66263b4c97823295c41900210515d0c769a236190cAndy Hung @Retention(RetentionPolicy.SOURCE) 67263b4c97823295c41900210515d0c769a236190cAndy Hung public @interface AudioFallbackMode {} 68263b4c97823295c41900210515d0c769a236190cAndy Hung public static final int AUDIO_FALLBACK_MODE_DEFAULT = 0; 69263b4c97823295c41900210515d0c769a236190cAndy Hung public static final int AUDIO_FALLBACK_MODE_MUTE = 1; 70263b4c97823295c41900210515d0c769a236190cAndy Hung public static final int AUDIO_FALLBACK_MODE_FAIL = 2; 71263b4c97823295c41900210515d0c769a236190cAndy Hung 72263b4c97823295c41900210515d0c769a236190cAndy Hung /** @hide */ 73263b4c97823295c41900210515d0c769a236190cAndy Hung @IntDef( 74263b4c97823295c41900210515d0c769a236190cAndy Hung value = { 75263b4c97823295c41900210515d0c769a236190cAndy Hung AUDIO_STRETCH_MODE_DEFAULT, 76263b4c97823295c41900210515d0c769a236190cAndy Hung AUDIO_STRETCH_MODE_VOICE, 77263b4c97823295c41900210515d0c769a236190cAndy Hung } 78263b4c97823295c41900210515d0c769a236190cAndy Hung ) 79263b4c97823295c41900210515d0c769a236190cAndy Hung @Retention(RetentionPolicy.SOURCE) 80263b4c97823295c41900210515d0c769a236190cAndy Hung public @interface AudioStretchMode {} 8118cb3b5a27148c7d4556db4a55e8c2bafafef32cAndy Hung /** @hide */ 82263b4c97823295c41900210515d0c769a236190cAndy Hung public static final int AUDIO_STRETCH_MODE_DEFAULT = 0; 8318cb3b5a27148c7d4556db4a55e8c2bafafef32cAndy Hung /** @hide */ 84263b4c97823295c41900210515d0c769a236190cAndy Hung public static final int AUDIO_STRETCH_MODE_VOICE = 1; 85263b4c97823295c41900210515d0c769a236190cAndy Hung 862d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia // flags to indicate which params are actually set 87263b4c97823295c41900210515d0c769a236190cAndy Hung private static final int SET_SPEED = 1 << 0; 88263b4c97823295c41900210515d0c769a236190cAndy Hung private static final int SET_PITCH = 1 << 1; 89263b4c97823295c41900210515d0c769a236190cAndy Hung private static final int SET_AUDIO_FALLBACK_MODE = 1 << 2; 90263b4c97823295c41900210515d0c769a236190cAndy Hung private static final int SET_AUDIO_STRETCH_MODE = 1 << 3; 91263b4c97823295c41900210515d0c769a236190cAndy Hung private int mSet = 0; 92263b4c97823295c41900210515d0c769a236190cAndy Hung 932d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia // params 94263b4c97823295c41900210515d0c769a236190cAndy Hung private int mAudioFallbackMode = AUDIO_FALLBACK_MODE_DEFAULT; 95263b4c97823295c41900210515d0c769a236190cAndy Hung private int mAudioStretchMode = AUDIO_STRETCH_MODE_DEFAULT; 96263b4c97823295c41900210515d0c769a236190cAndy Hung private float mPitch = 1.0f; 97263b4c97823295c41900210515d0c769a236190cAndy Hung private float mSpeed = 1.0f; 98263b4c97823295c41900210515d0c769a236190cAndy Hung 9976c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo public PlaybackParams() { 10076c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo } 10176c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo 10276c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo private PlaybackParams(Parcel in) { 10376c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo mSet = in.readInt(); 10476c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo mAudioFallbackMode = in.readInt(); 10576c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo mAudioStretchMode = in.readInt(); 10676c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo mPitch = in.readFloat(); 10776c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo if (mPitch < 0.f) { 10876c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo mPitch = 0.f; 10976c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo } 11076c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo mSpeed = in.readFloat(); 11176c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo } 11276c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo 113263b4c97823295c41900210515d0c769a236190cAndy Hung /** 114263b4c97823295c41900210515d0c769a236190cAndy Hung * Allows defaults to be returned for properties not set. 115263b4c97823295c41900210515d0c769a236190cAndy Hung * Otherwise a {@link java.lang.IllegalArgumentException} exception 116263b4c97823295c41900210515d0c769a236190cAndy Hung * is raised when getting those properties 117263b4c97823295c41900210515d0c769a236190cAndy Hung * which have defaults but have never been set. 1182d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia * @return this <code>PlaybackParams</code> instance. 119263b4c97823295c41900210515d0c769a236190cAndy Hung */ 1202d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia public PlaybackParams allowDefaults() { 121263b4c97823295c41900210515d0c769a236190cAndy Hung mSet |= SET_AUDIO_FALLBACK_MODE | SET_AUDIO_STRETCH_MODE | SET_PITCH | SET_SPEED; 122263b4c97823295c41900210515d0c769a236190cAndy Hung return this; 123263b4c97823295c41900210515d0c769a236190cAndy Hung } 124263b4c97823295c41900210515d0c769a236190cAndy Hung 125263b4c97823295c41900210515d0c769a236190cAndy Hung /** 126263b4c97823295c41900210515d0c769a236190cAndy Hung * Sets the audio fallback mode. 127263b4c97823295c41900210515d0c769a236190cAndy Hung * @param audioFallbackMode 1282d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia * @return this <code>PlaybackParams</code> instance. 129263b4c97823295c41900210515d0c769a236190cAndy Hung */ 1302d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia public PlaybackParams setAudioFallbackMode(@AudioFallbackMode int audioFallbackMode) { 131263b4c97823295c41900210515d0c769a236190cAndy Hung mAudioFallbackMode = audioFallbackMode; 132263b4c97823295c41900210515d0c769a236190cAndy Hung mSet |= SET_AUDIO_FALLBACK_MODE; 133263b4c97823295c41900210515d0c769a236190cAndy Hung return this; 134263b4c97823295c41900210515d0c769a236190cAndy Hung } 135263b4c97823295c41900210515d0c769a236190cAndy Hung 136263b4c97823295c41900210515d0c769a236190cAndy Hung /** 137263b4c97823295c41900210515d0c769a236190cAndy Hung * Retrieves the audio fallback mode. 138263b4c97823295c41900210515d0c769a236190cAndy Hung * @return audio fallback mode 139263b4c97823295c41900210515d0c769a236190cAndy Hung * @throws IllegalStateException if the audio fallback mode is not set. 140263b4c97823295c41900210515d0c769a236190cAndy Hung */ 141263b4c97823295c41900210515d0c769a236190cAndy Hung public @AudioFallbackMode int getAudioFallbackMode() { 142263b4c97823295c41900210515d0c769a236190cAndy Hung if ((mSet & SET_AUDIO_FALLBACK_MODE) == 0) { 143263b4c97823295c41900210515d0c769a236190cAndy Hung throw new IllegalStateException("audio fallback mode not set"); 144263b4c97823295c41900210515d0c769a236190cAndy Hung } 145263b4c97823295c41900210515d0c769a236190cAndy Hung return mAudioFallbackMode; 146263b4c97823295c41900210515d0c769a236190cAndy Hung } 147263b4c97823295c41900210515d0c769a236190cAndy Hung 148263b4c97823295c41900210515d0c769a236190cAndy Hung /** 14918cb3b5a27148c7d4556db4a55e8c2bafafef32cAndy Hung * @hide 150263b4c97823295c41900210515d0c769a236190cAndy Hung * Sets the audio stretch mode. 151263b4c97823295c41900210515d0c769a236190cAndy Hung * @param audioStretchMode 1522d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia * @return this <code>PlaybackParams</code> instance. 153263b4c97823295c41900210515d0c769a236190cAndy Hung */ 1542d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia public PlaybackParams setAudioStretchMode(@AudioStretchMode int audioStretchMode) { 155263b4c97823295c41900210515d0c769a236190cAndy Hung mAudioStretchMode = audioStretchMode; 156263b4c97823295c41900210515d0c769a236190cAndy Hung mSet |= SET_AUDIO_STRETCH_MODE; 157263b4c97823295c41900210515d0c769a236190cAndy Hung return this; 158263b4c97823295c41900210515d0c769a236190cAndy Hung } 159263b4c97823295c41900210515d0c769a236190cAndy Hung 160263b4c97823295c41900210515d0c769a236190cAndy Hung /** 16118cb3b5a27148c7d4556db4a55e8c2bafafef32cAndy Hung * @hide 162263b4c97823295c41900210515d0c769a236190cAndy Hung * Retrieves the audio stretch mode. 163263b4c97823295c41900210515d0c769a236190cAndy Hung * @return audio stretch mode 164263b4c97823295c41900210515d0c769a236190cAndy Hung * @throws IllegalStateException if the audio stretch mode is not set. 165263b4c97823295c41900210515d0c769a236190cAndy Hung */ 166263b4c97823295c41900210515d0c769a236190cAndy Hung public @AudioStretchMode int getAudioStretchMode() { 167263b4c97823295c41900210515d0c769a236190cAndy Hung if ((mSet & SET_AUDIO_STRETCH_MODE) == 0) { 168263b4c97823295c41900210515d0c769a236190cAndy Hung throw new IllegalStateException("audio stretch mode not set"); 169263b4c97823295c41900210515d0c769a236190cAndy Hung } 170263b4c97823295c41900210515d0c769a236190cAndy Hung return mAudioStretchMode; 171263b4c97823295c41900210515d0c769a236190cAndy Hung } 172263b4c97823295c41900210515d0c769a236190cAndy Hung 173263b4c97823295c41900210515d0c769a236190cAndy Hung /** 174263b4c97823295c41900210515d0c769a236190cAndy Hung * Sets the pitch factor. 175263b4c97823295c41900210515d0c769a236190cAndy Hung * @param pitch 1762d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia * @return this <code>PlaybackParams</code> instance. 177c9020aff3a3c45a52a234eae6e159a61af5811c5Lajos Molnar * @throws InvalidArgumentException if the pitch is negative 178263b4c97823295c41900210515d0c769a236190cAndy Hung */ 1792d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia public PlaybackParams setPitch(float pitch) { 180c9020aff3a3c45a52a234eae6e159a61af5811c5Lajos Molnar if (pitch < 0.f) { 181c9020aff3a3c45a52a234eae6e159a61af5811c5Lajos Molnar throw new IllegalArgumentException("pitch must not be negative"); 182c9020aff3a3c45a52a234eae6e159a61af5811c5Lajos Molnar } 183263b4c97823295c41900210515d0c769a236190cAndy Hung mPitch = pitch; 184263b4c97823295c41900210515d0c769a236190cAndy Hung mSet |= SET_PITCH; 185263b4c97823295c41900210515d0c769a236190cAndy Hung return this; 186263b4c97823295c41900210515d0c769a236190cAndy Hung } 187263b4c97823295c41900210515d0c769a236190cAndy Hung 188263b4c97823295c41900210515d0c769a236190cAndy Hung /** 189263b4c97823295c41900210515d0c769a236190cAndy Hung * Retrieves the pitch factor. 190263b4c97823295c41900210515d0c769a236190cAndy Hung * @return pitch 191263b4c97823295c41900210515d0c769a236190cAndy Hung * @throws IllegalStateException if pitch is not set. 192263b4c97823295c41900210515d0c769a236190cAndy Hung */ 193263b4c97823295c41900210515d0c769a236190cAndy Hung public float getPitch() { 194263b4c97823295c41900210515d0c769a236190cAndy Hung if ((mSet & SET_PITCH) == 0) { 195263b4c97823295c41900210515d0c769a236190cAndy Hung throw new IllegalStateException("pitch not set"); 196263b4c97823295c41900210515d0c769a236190cAndy Hung } 197263b4c97823295c41900210515d0c769a236190cAndy Hung return mPitch; 198263b4c97823295c41900210515d0c769a236190cAndy Hung } 199263b4c97823295c41900210515d0c769a236190cAndy Hung 200263b4c97823295c41900210515d0c769a236190cAndy Hung /** 201263b4c97823295c41900210515d0c769a236190cAndy Hung * Sets the speed factor. 202263b4c97823295c41900210515d0c769a236190cAndy Hung * @param speed 2032d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia * @return this <code>PlaybackParams</code> instance. 204263b4c97823295c41900210515d0c769a236190cAndy Hung */ 2052d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia public PlaybackParams setSpeed(float speed) { 206263b4c97823295c41900210515d0c769a236190cAndy Hung mSpeed = speed; 207263b4c97823295c41900210515d0c769a236190cAndy Hung mSet |= SET_SPEED; 208263b4c97823295c41900210515d0c769a236190cAndy Hung return this; 209263b4c97823295c41900210515d0c769a236190cAndy Hung } 210263b4c97823295c41900210515d0c769a236190cAndy Hung 211263b4c97823295c41900210515d0c769a236190cAndy Hung /** 212263b4c97823295c41900210515d0c769a236190cAndy Hung * Retrieves the speed factor. 213263b4c97823295c41900210515d0c769a236190cAndy Hung * @return speed 214263b4c97823295c41900210515d0c769a236190cAndy Hung * @throws IllegalStateException if speed is not set. 215263b4c97823295c41900210515d0c769a236190cAndy Hung */ 216263b4c97823295c41900210515d0c769a236190cAndy Hung public float getSpeed() { 217263b4c97823295c41900210515d0c769a236190cAndy Hung if ((mSet & SET_SPEED) == 0) { 218263b4c97823295c41900210515d0c769a236190cAndy Hung throw new IllegalStateException("speed not set"); 219263b4c97823295c41900210515d0c769a236190cAndy Hung } 220263b4c97823295c41900210515d0c769a236190cAndy Hung return mSpeed; 221263b4c97823295c41900210515d0c769a236190cAndy Hung } 22276c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo 22376c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo public static final Parcelable.Creator<PlaybackParams> CREATOR = 22476c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo new Parcelable.Creator<PlaybackParams>() { 22576c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo @Override 22676c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo public PlaybackParams createFromParcel(Parcel in) { 22776c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo return new PlaybackParams(in); 22876c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo } 22976c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo 23076c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo @Override 23176c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo public PlaybackParams[] newArray(int size) { 23276c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo return new PlaybackParams[size]; 23376c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo } 23476c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo }; 23576c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo 23676c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo 23776c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo @Override 23876c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo public int describeContents() { 23976c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo return 0; 24076c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo } 24176c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo 24276c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo @Override 24376c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo public void writeToParcel(Parcel dest, int flags) { 24476c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo dest.writeInt(mSet); 24576c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo dest.writeInt(mAudioFallbackMode); 24676c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo dest.writeInt(mAudioStretchMode); 24776c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo dest.writeFloat(mPitch); 24876c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo dest.writeFloat(mSpeed); 24976c4fc297723aceea9d4021b26b39c26768b54c3Jae Seo } 250263b4c97823295c41900210515d0c769a236190cAndy Hung} 251