1b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson/*
2b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * Copyright (C) 2011 The Android Open Source Project
3b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson *
4b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * Licensed under the Apache License, Version 2.0 (the "License");
5b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * you may not use this file except in compliance with the License.
6b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * You may obtain a copy of the License at
7b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson *
8b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson *      http://www.apache.org/licenses/LICENSE-2.0
9b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson *
10b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * Unless required by applicable law or agreed to in writing, software
11b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * distributed under the License is distributed on an "AS IS" BASIS,
12b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * See the License for the specific language governing permissions and
14b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * limitations under the License.
15b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson */
16b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
17b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudsonpackage com.android.ex.variablespeed;
18b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
19dc442b4d99512bf7c41ee5ceae6c93a3c3568b57Flavio Lerdaimport android.media.AudioManager;
20dc442b4d99512bf7c41ee5ceae6c93a3c3568b57Flavio Lerda
21b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudsonimport javax.annotation.concurrent.Immutable;
22b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudsonimport javax.annotation.concurrent.NotThreadSafe;
23b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
24b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson/**
25b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * Encapsulates the parameters required to configure the audio engine.
26b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * <p>
27b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * You should not need to use this class directly, it exists for the benefit of
28b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * this package and the classes contained therein.
29b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson */
30b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson@Immutable
31b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson/*package*/ final class EngineParameters {
32b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    private final int mTargetFrames;
33b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    private final int mMaxPlayBufferCount;
34b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    private final float mWindowDuration;
35b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    private final float mWindowOverlapDuration;
36b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    private final float mInitialRate;
37b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    private final int mDecodeBufferInitialSize;
38b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    private final int mDecodeBufferMaxSize;
39b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    private final int mStartPositionMillis;
40dc442b4d99512bf7c41ee5ceae6c93a3c3568b57Flavio Lerda    private final int mAudioStreamType;
41b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
42b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    public int getTargetFrames() {
43b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        return mTargetFrames;
44b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    }
45b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
46b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    public int getMaxPlayBufferCount() {
47b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        return mMaxPlayBufferCount;
48b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    }
49b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
50b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    public float getWindowDuration() {
51b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        return mWindowDuration;
52b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    }
53b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
54b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    public float getWindowOverlapDuration() {
55b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        return mWindowOverlapDuration;
56b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    }
57b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
58b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    public float getInitialRate() {
59b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        return mInitialRate;
60b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    }
61b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
62b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    public int getDecodeBufferInitialSize() {
63b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        return mDecodeBufferInitialSize;
64b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    }
65b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
66b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    public int getDecodeBufferMaxSize() {
67b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        return mDecodeBufferMaxSize;
68b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    }
69b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
70b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    public int getStartPositionMillis() {
71b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        return mStartPositionMillis;
72b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    }
73b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
74dc442b4d99512bf7c41ee5ceae6c93a3c3568b57Flavio Lerda    public int getAudioStreamType() {
75dc442b4d99512bf7c41ee5ceae6c93a3c3568b57Flavio Lerda        return mAudioStreamType;
76dc442b4d99512bf7c41ee5ceae6c93a3c3568b57Flavio Lerda    }
77dc442b4d99512bf7c41ee5ceae6c93a3c3568b57Flavio Lerda
780bd6ec5bc06b869131ee0facf38ff02f81f65c10Hugo Hudson    private EngineParameters(int targetFrames, int maxPlayBufferCount, float windowDuration,
790bd6ec5bc06b869131ee0facf38ff02f81f65c10Hugo Hudson            float windowOverlapDuration, float initialRate, int decodeBufferInitialSize,
80dc442b4d99512bf7c41ee5ceae6c93a3c3568b57Flavio Lerda            int decodeBufferMaxSize, int startPositionMillis, int audioStreamType) {
81b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        mTargetFrames = targetFrames;
82b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        mMaxPlayBufferCount = maxPlayBufferCount;
83b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        mWindowDuration = windowDuration;
84b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        mWindowOverlapDuration = windowOverlapDuration;
85b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        mInitialRate = initialRate;
86b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        mDecodeBufferInitialSize = decodeBufferInitialSize;
87b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        mDecodeBufferMaxSize = decodeBufferMaxSize;
88b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        mStartPositionMillis = startPositionMillis;
89dc442b4d99512bf7c41ee5ceae6c93a3c3568b57Flavio Lerda        mAudioStreamType = audioStreamType;
90b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    }
91b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
92b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    /**
93b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson     * We use the builder pattern to construct an {@link EngineParameters}
94b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson     * object.
95b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson     * <p>
96b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson     * This class is not thread safe, you should confine its use to one thread
97b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson     * or provide your own synchronization.
98b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson     */
99b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    @NotThreadSafe
100b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    public static class Builder {
101b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        private int mTargetFrames = 1000;
102b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        private int mMaxPlayBufferCount = 2;
103b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        private float mWindowDuration = 0.08f;
104b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        private float mWindowOverlapDuration = 0.008f;
105b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        private float mInitialRate = 1.0f;
106b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        private int mDecodeBufferInitialSize = 5 * 1024;
107b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        private int mDecodeBufferMaxSize = 20 * 1024;
108b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        private int mStartPositionMillis = 0;
109dc442b4d99512bf7c41ee5ceae6c93a3c3568b57Flavio Lerda        private int mAudioStreamType = AudioManager.STREAM_MUSIC;
110b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
111b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        public EngineParameters build() {
1120bd6ec5bc06b869131ee0facf38ff02f81f65c10Hugo Hudson            return new EngineParameters(mTargetFrames, mMaxPlayBufferCount,
113b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson                    mWindowDuration, mWindowOverlapDuration, mInitialRate,
114dc442b4d99512bf7c41ee5ceae6c93a3c3568b57Flavio Lerda                    mDecodeBufferInitialSize, mDecodeBufferMaxSize, mStartPositionMillis,
115dc442b4d99512bf7c41ee5ceae6c93a3c3568b57Flavio Lerda                    mAudioStreamType);
116b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        }
117b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
118b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        public Builder maxPlayBufferCount(int maxPlayBufferCount) {
119b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson            mMaxPlayBufferCount = maxPlayBufferCount;
120b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson            return this;
121b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        }
122b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
123b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        public Builder windowDuration(int windowDuration) {
124b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson            mWindowDuration = windowDuration;
125b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson            return this;
126b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        }
127b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
128b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        public Builder windowOverlapDuration(int windowOverlapDuration) {
129b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson            mWindowOverlapDuration = windowOverlapDuration;
130b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson            return this;
131b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        }
132b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
133b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        public Builder initialRate(float initialRate) {
134b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson            mInitialRate = initialRate;
135b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson            return this;
136b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        }
137b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
138b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        public Builder decodeBufferInitialSize(int decodeBufferInitialSize) {
139b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson            mDecodeBufferInitialSize = decodeBufferInitialSize;
140b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson            return this;
141b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        }
142b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
143b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        public Builder decodeBufferMaxSize(int decodeBufferMaxSize) {
144b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson            mDecodeBufferMaxSize = decodeBufferMaxSize;
145b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson            return this;
146b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        }
147b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
148b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        public Builder startPositionMillis(int startPositionMillis) {
149b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson            mStartPositionMillis = startPositionMillis;
150b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson            return this;
151b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson        }
152dc442b4d99512bf7c41ee5ceae6c93a3c3568b57Flavio Lerda
153dc442b4d99512bf7c41ee5ceae6c93a3c3568b57Flavio Lerda        public Builder audioStreamType(int audioStreamType) {
154dc442b4d99512bf7c41ee5ceae6c93a3c3568b57Flavio Lerda            mAudioStreamType = audioStreamType;
155dc442b4d99512bf7c41ee5ceae6c93a3c3568b57Flavio Lerda            return this;
156dc442b4d99512bf7c41ee5ceae6c93a3c3568b57Flavio Lerda        }
157b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    }
158b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson}
159