blob: 368d5bc8fa0ff23c1ca4868392c33bc7c0b10cab [file] [log] [blame]
/*
* Copyright 2018 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.mobileer.oboetester;
import android.Manifest;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.widget.Toast;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
/**
* Activity to measure latency on a full duplex stream.
*/
public class AnalyzerActivity extends TestInputActivity {
AudioOutputTester mAudioOutTester;
protected BufferSizeView mBufferSizeView;
protected AutomatedTestRunner mAutomatedTestRunner;
// Note that these string must match the enum result_code in LatencyAnalyzer.h
String resultCodeToString(int resultCode) {
switch (resultCode) {
case 0:
return "OK";
case -99:
return "ERROR_NOISY";
case -98:
return "ERROR_VOLUME_TOO_LOW";
case -97:
return "ERROR_VOLUME_TOO_HIGH";
case -96:
return "ERROR_CONFIDENCE";
case -95:
return "ERROR_INVALID_STATE";
case -94:
return "ERROR_GLITCHES";
case -93:
return "ERROR_NO_LOCK";
default:
return "UNKNOWN";
}
}
public native int getAnalyzerState();
public native boolean isAnalyzerDone();
public native int getMeasuredResult();
public native int getResetCount();
@Override
@NonNull
protected String getCommonTestReport() {
StringBuffer report = new StringBuffer();
// Add some extra information for the remote tester.
report.append("build.fingerprint = " + Build.FINGERPRINT + "\n");
try {
PackageInfo pinfo = getPackageManager().getPackageInfo(getPackageName(), 0);
report.append(String.format("test.version = %s\n", pinfo.versionName));
report.append(String.format("test.version.code = %d\n", pinfo.versionCode));
} catch (PackageManager.NameNotFoundException e) {
}
report.append("time.millis = " + System.currentTimeMillis() + "\n");
// INPUT
report.append(mAudioInputTester.actualConfiguration.dump());
AudioStreamBase inStream = mAudioInputTester.getCurrentAudioStream();
report.append(String.format("in.burst.frames = %d\n", inStream.getFramesPerBurst()));
report.append(String.format("in.xruns = %d\n", inStream.getXRunCount()));
// OUTPUT
report.append(mAudioOutTester.actualConfiguration.dump());
AudioStreamBase outStream = mAudioOutTester.getCurrentAudioStream();
report.append(String.format("out.burst.frames = %d\n", outStream.getFramesPerBurst()));
int bufferSize = outStream.getBufferSizeInFrames();
report.append(String.format("out.buffer.size.frames = %d\n", bufferSize));
int bufferCapacity = outStream.getBufferCapacityInFrames();
report.append(String.format("out.buffer.capacity.frames = %d\n", bufferCapacity));
report.append(String.format("out.xruns = %d\n", outStream.getXRunCount()));
return report.toString();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mAudioOutTester = addAudioOutputTester();
mBufferSizeView = (BufferSizeView) findViewById(R.id.buffer_size_view);
}
@Override
protected void resetConfiguration() {
super.resetConfiguration();
mAudioOutTester.reset();
StreamContext streamContext = getFirstInputStreamContext();
if (streamContext != null) {
if (streamContext.configurationView != null) {
streamContext.configurationView.setFormat(StreamConfiguration.AUDIO_FORMAT_PCM_FLOAT);
streamContext.configurationView.setFormatConversionAllowed(true);
}
}
streamContext = getFirstOutputStreamContext();
if (streamContext != null) {
if (streamContext.configurationView != null) {
streamContext.configurationView.setFormat(StreamConfiguration.AUDIO_FORMAT_PCM_FLOAT);
streamContext.configurationView.setFormatConversionAllowed(true);
}
}
}
@Override
public void openAudio() throws IOException {
super.openAudio();
if (mBufferSizeView != null) {
mBufferSizeView.onStreamOpened((OboeAudioStream) mAudioOutTester.getCurrentAudioStream());
}
}
public void onStreamClosed() {
Toast.makeText(getApplicationContext(),
"Stream was closed or disconnected!",
Toast.LENGTH_SHORT)
.show();
stopAudioTest();
}
public void stopAudioTest() {
}
@Override
public void saveIntentLog() {
if (mTestRunningByIntent) {
String report = mAutomatedTestRunner.getFullLogs();
maybeWriteTestResult(report);
mTestRunningByIntent = false;
mBundleFromIntent = null;
}
}
private void writeTestInBackground(final String resultString) {
new Thread() {
public void run() {
writeTestResult(resultString);
}
}.start();
}
}