blob: 8ad101eb8021dbd5e9b028f823778676eb9e0945 [file] [log] [blame]
/*
* Copyright 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.sample.oboe.manualtest;
/**
* Container for the properties of a Stream.
*
* This can be used to build a stream, or as a base class for a Stream,
* or as a way to report the properties of a Stream.
*/
public class StreamConfiguration {
public static final int UNSPECIFIED = 0;
// These must match order in Spinner and in native code and in AAudio.h
public static final int NATIVE_API_UNSPECIFIED = 0;
public static final int NATIVE_API_OPENSLES = 1;
public static final int NATIVE_API_AAUDIO = 2;
public static final int SHARING_MODE_EXCLUSIVE = 0; // must match AAUDIO
public static final int SHARING_MODE_SHARED = 1; // must match AAUDIO
public static final int AUDIO_FORMAT_PCM_16 = 1; // must match AAUDIO
public static final int AUDIO_FORMAT_PCM_FLOAT = 2; // must match AAUDIO
public static final int DIRECTION_OUTPUT = 0; // must match AAUDIO
public static final int DIRECTION_INPUT = 1; // must match AAUDIO
public static final int SESSION_ID_NONE = -1; // must match AAUDIO
public static final int SESSION_ID_ALLOCATE = 0; // must match AAUDIO
public static final int PERFORMANCE_MODE_NONE = 10; // must match AAUDIO
public static final int PERFORMANCE_MODE_POWER_SAVING = 11; // must match AAUDIO
public static final int PERFORMANCE_MODE_LOW_LATENCY = 12; // must match AAUDIO
public static final int RATE_CONVERSION_QUALITY_NONE = 0; // must match Oboe
public static final int RATE_CONVERSION_QUALITY_FASTEST = 1; // must match Oboe
public static final int RATE_CONVERSION_QUALITY_LOW = 2; // must match Oboe
public static final int RATE_CONVERSION_QUALITY_MEDIUM = 3; // must match Oboe
public static final int RATE_CONVERSION_QUALITY_HIGH = 4; // must match Oboe
public static final int RATE_CONVERSION_QUALITY_BEST = 5; // must match Oboe
public static final int STREAM_STATE_STARTING = 3; // must match Oboe
public static final int STREAM_STATE_STARTED = 4; // must match Oboe
public static final int INPUT_PRESET_GENERIC = 1; // must match Oboe
public static final int INPUT_PRESET_CAMCORDER = 5; // must match Oboe
public static final int INPUT_PRESET_VOICE_RECOGNITION = 6; // must match Oboe
public static final int INPUT_PRESET_VOICE_COMMUNICATION = 7; // must match Oboe
public static final int INPUT_PRESET_UNPROCESSED = 9; // must match Oboe
public static final int INPUT_PRESET_VOICE_PERFORMANCE = 10; // must match Oboe
public static final int ERROR_DISCONNECTED = -899; // must match Oboe
private int mNativeApi;
private int mBufferCapacityInFrames;
private int mChannelCount;
private int mDeviceId;
private int mSessionId;
private int mDirection; // does not get reset
private int mFormat;
private int mSampleRate;
private int mSharingMode;
private int mPerformanceMode;
private boolean mFormatConversionAllowed;
private boolean mChannelConversionAllowed;
private int mRateConversionQuality;
private int mInputPreset;
private int mFramesPerBurst = 0;
private boolean mMMap = false;
public StreamConfiguration() {
reset();
}
public void reset() {
mNativeApi = NATIVE_API_UNSPECIFIED;
mBufferCapacityInFrames = UNSPECIFIED;
mChannelCount = UNSPECIFIED;
mDeviceId = UNSPECIFIED;
mSessionId = -1;
mFormat = AUDIO_FORMAT_PCM_FLOAT;
mSampleRate = UNSPECIFIED;
mSharingMode = SHARING_MODE_EXCLUSIVE;
mPerformanceMode = PERFORMANCE_MODE_LOW_LATENCY;
mInputPreset = INPUT_PRESET_VOICE_RECOGNITION;
mFormatConversionAllowed = false;
mChannelConversionAllowed = false;
mRateConversionQuality = RATE_CONVERSION_QUALITY_NONE;
mMMap = NativeEngine.isMMapSupported();
}
public int getFramesPerBurst() {
return mFramesPerBurst;
}
public void setFramesPerBurst(int framesPerBurst) {
this.mFramesPerBurst = framesPerBurst;
}
public int getBufferCapacityInFrames() {
return mBufferCapacityInFrames;
}
public void setBufferCapacityInFrames(int bufferCapacityInFrames) {
this.mBufferCapacityInFrames = bufferCapacityInFrames;
}
public int getFormat() {
return mFormat;
}
public void setFormat(int format) {
this.mFormat = format;
}
public int getDirection() {
return mDirection;
}
public void setDirection(int direction) {
this.mDirection = direction;
}
public int getPerformanceMode() {
return mPerformanceMode;
}
public void setPerformanceMode(int performanceMode) {
this.mPerformanceMode = performanceMode;
}
static String convertPerformanceModeToText(int performanceMode) {
switch(performanceMode) {
case PERFORMANCE_MODE_NONE:
return "NO";
case PERFORMANCE_MODE_POWER_SAVING:
return "PS";
case PERFORMANCE_MODE_LOW_LATENCY:
return "LL";
default:
return "??";
}
}
public int getInputPreset() {
return mInputPreset;
}
public void setInputPreset(int inputPreset) {
this.mInputPreset = inputPreset;
}
public int getSharingMode() {
return mSharingMode;
}
public void setSharingMode(int sharingMode) {
this.mSharingMode = sharingMode;
}
static String convertSharingModeToText(int sharingMode) {
switch(sharingMode) {
case SHARING_MODE_SHARED:
return "SH";
case SHARING_MODE_EXCLUSIVE:
return "EX";
default:
return "??";
}
}
public static String convertFormatToText(int format) {
switch(format) {
case UNSPECIFIED:
return "Unspecified";
case AUDIO_FORMAT_PCM_16:
return "I16";
case AUDIO_FORMAT_PCM_FLOAT:
return "Float";
default:
return "Invalid";
}
}
public static String convertNativeApiToText(int api) {
switch(api) {
case NATIVE_API_UNSPECIFIED:
return "Unspec";
case NATIVE_API_AAUDIO:
return "AAudio";
case NATIVE_API_OPENSLES:
return "OpenSL";
default:
return "Invalid";
}
}
public String dump() {
String prefix = (getDirection() == DIRECTION_INPUT) ? "in" : "out";
StringBuffer message = new StringBuffer();
message.append(String.format("%s.channels = %d\n", prefix, mChannelCount));
message.append(String.format("%s.perf = %s\n", prefix,
convertPerformanceModeToText(mPerformanceMode).toLowerCase()));
if (getDirection() == DIRECTION_INPUT) {
message.append(String.format("%s.preset = %s\n", prefix,
convertInputPresetToText(mInputPreset).toLowerCase()));
}
message.append(String.format("%s.sharing = %s\n", prefix,
convertSharingModeToText(mSharingMode).toLowerCase()));
message.append(String.format("%s.api = %s\n", prefix,
convertNativeApiToText(getNativeApi()).toLowerCase()));
message.append(String.format("%s.rate = %d\n", prefix, mSampleRate));
message.append(String.format("%s.device = %d\n", prefix, mDeviceId));
message.append(String.format("%s.mmap = %s\n", prefix, isMMap() ? "yes" : "no"));
message.append(String.format("%s.rate.conversion.quality = %d\n", prefix, mRateConversionQuality));
return message.toString();
}
// text must match menu values
public static final String NAME_INPUT_PRESET_GENERIC = "Generic";
public static final String NAME_INPUT_PRESET_CAMCORDER = "Camcorder";
public static final String NAME_INPUT_PRESET_VOICE_RECOGNITION = "VoiceRec";
public static final String NAME_INPUT_PRESET_VOICE_COMMUNICATION = "VoiceComm";
public static final String NAME_INPUT_PRESET_UNPROCESSED = "Unprocessed";
public static final String NAME_INPUT_PRESET_VOICE_PERFORMANCE = "Performance";
public static String convertInputPresetToText(int inputPreset) {
switch(inputPreset) {
case INPUT_PRESET_GENERIC:
return NAME_INPUT_PRESET_GENERIC;
case INPUT_PRESET_CAMCORDER:
return NAME_INPUT_PRESET_CAMCORDER;
case INPUT_PRESET_VOICE_RECOGNITION:
return NAME_INPUT_PRESET_VOICE_RECOGNITION;
case INPUT_PRESET_VOICE_COMMUNICATION:
return NAME_INPUT_PRESET_VOICE_COMMUNICATION;
case INPUT_PRESET_UNPROCESSED:
return NAME_INPUT_PRESET_UNPROCESSED;
case INPUT_PRESET_VOICE_PERFORMANCE:
return NAME_INPUT_PRESET_VOICE_PERFORMANCE;
default:
return "Invalid";
}
}
private static boolean matchInputPreset(String text, int preset) {
return convertInputPresetToText(preset).toLowerCase().equals(text);
}
/**
* Case insensitive.
* @param text
* @return inputPreset, eg. INPUT_PRESET_CAMCORDER
*/
public static int convertTextToInputPreset(String text) {
text = text.toLowerCase();
if (matchInputPreset(text, INPUT_PRESET_GENERIC)) {
return INPUT_PRESET_GENERIC;
} else if (matchInputPreset(text, INPUT_PRESET_CAMCORDER)) {
return INPUT_PRESET_CAMCORDER;
} else if (matchInputPreset(text, INPUT_PRESET_VOICE_RECOGNITION)) {
return INPUT_PRESET_VOICE_RECOGNITION;
} else if (matchInputPreset(text, INPUT_PRESET_VOICE_COMMUNICATION)) {
return INPUT_PRESET_VOICE_COMMUNICATION;
} else if (matchInputPreset(text, INPUT_PRESET_UNPROCESSED)) {
return INPUT_PRESET_UNPROCESSED;
} else if (matchInputPreset(text, INPUT_PRESET_VOICE_PERFORMANCE)) {
return INPUT_PRESET_VOICE_PERFORMANCE;
}
return -1;
}
public int getChannelCount() {
return mChannelCount;
}
public void setChannelCount(int channelCount) {
this.mChannelCount = channelCount;
}
public int getSampleRate() {
return mSampleRate;
}
public void setSampleRate(int sampleRate) {
this.mSampleRate = sampleRate;
}
public int getDeviceId() {
return mDeviceId;
}
public void setDeviceId(int deviceId) {
this.mDeviceId = deviceId;
}
public int getSessionId() {
return mSessionId;
}
public void setSessionId(int sessionId) {
mSessionId = sessionId;
}
public boolean isMMap() {
return mMMap;
}
public void setMMap(boolean b) { mMMap = b; }
public int getNativeApi() {
return mNativeApi;
}
public void setNativeApi(int nativeApi) {
mNativeApi = nativeApi;
}
public void setChannelConversionAllowed(boolean b) { mChannelConversionAllowed = b; }
public boolean getChannelConversionAllowed() {
return mChannelConversionAllowed;
}
public void setFormatConversionAllowed(boolean b) {
mFormatConversionAllowed = b;
}
public boolean getFormatConversionAllowed() {
return mFormatConversionAllowed;
}
public void setRateConversionQuality(int quality) { mRateConversionQuality = quality; }
public int getRateConversionQuality() {
return mRateConversionQuality;
}
}