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