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