blob: 57724613246ddf83ff70a8fa6cefd76680ba8238 [file] [log] [blame]
/*
* Copyright (C) 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.android.cts.verifier.audio;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import com.android.cts.verifier.audio.audiolib.StreamRecorder;
import com.android.cts.verifier.audio.audiolib.StreamRecorderListener;
import com.android.cts.verifier.audio.audiolib.WaveScopeView;
import com.android.cts.verifier.audio.peripheralprofile.PeripheralProfile;
import com.android.cts.verifier.audio.peripheralprofile.USBDeviceInfoHelper;
import com.android.cts.verifier.R; // needed to access resource in CTSVerifier project namespace.
public class USBAudioPeripheralRecordActivity extends USBAudioPeripheralPlayerActivity {
private static final String TAG = "USBAudioPeripheralRecordActivity";
// Recorder
private StreamRecorder mRecorder = null;
private RecordListener mRecordListener = null;
private boolean mIsRecording = false;
// Widgets
private Button mRecordBtn;
private Button mRecordLoopbackBtn;
private LocalClickListener mButtonClickListener = new LocalClickListener();
private WaveScopeView mWaveView = null;
private void connectWaveView() {
// Log.i(TAG, "connectWaveView() rec:" + (mRecorder != null));
if (mRecorder != null) {
float[] smplFloatBuff = mRecorder.getBurstBuffer();
int numChans = mRecorder.getNumChannels();
int numFrames = smplFloatBuff.length / numChans;
mWaveView.setPCMFloatBuff(smplFloatBuff, numChans, numFrames);
mWaveView.invalidate();
mRecorder.setListener(mRecordListener);
}
}
public boolean startRecording(boolean withLoopback) {
if (mInputDevInfo == null) {
return false;
}
if (mRecorder == null) {
mRecorder = new StreamRecorder();
} else if (mRecorder.isRecording()) {
mRecorder.stop();
}
int numChans = USBDeviceInfoHelper.calcMaxChannelCount(mInputDevInfo);
if (mRecorder.open(numChans, mSystemSampleRate, mSystemBufferSize)) {
connectWaveView(); // Setup the WaveView
mIsRecording = mRecorder.start();
if (withLoopback) {
startPlay();
}
return mIsRecording;
} else {
return false;
}
}
public void stopRecording() {
if (mRecorder != null) {
mRecorder.stop();
}
if (mPlayer != null && mPlayer.isPlaying()) {
mPlayer.stop();
}
mIsRecording = false;
}
public boolean isRecording() {
return mIsRecording;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.uap_record_panel);
connectPeripheralStatusWidgets();
// Local widgets
mRecordBtn = (Button)findViewById(R.id.uap_recordRecordBtn);
mRecordBtn.setOnClickListener(mButtonClickListener);
mRecordLoopbackBtn = (Button)findViewById(R.id.uap_recordRecordLoopBtn);
mRecordLoopbackBtn.setOnClickListener(mButtonClickListener);
setupPlayer();
mRecorder = new StreamRecorder();
mRecordListener = new RecordListener();
mWaveView = (WaveScopeView)findViewById(R.id.uap_recordWaveView);
mWaveView.setBackgroundColor(Color.DKGRAY);
mWaveView.setTraceColor(Color.WHITE);
setPassFailButtonClickListeners();
setInfoResources(R.string.usbaudio_record_test, R.string.usbaudio_record_info, -1);
}
//
// USBAudioPeripheralActivity
//
public void updateConnectStatus() {
mRecordBtn.setEnabled(mIsPeripheralAttached && mSelectedProfile != null);
mRecordLoopbackBtn.setEnabled(mIsPeripheralAttached && mSelectedProfile != null);
getPassButton().setEnabled(mSelectedProfile != null && mOutputDevInfo != null);
}
public class LocalClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
int id = view.getId();
switch (id) {
case R.id.uap_recordRecordBtn:
if (!isRecording()) {
if (startRecording(false)) {
mRecordBtn.setText(getString(R.string.audio_uap_record_stopBtn));
mRecordLoopbackBtn.setEnabled(false);
}
} else {
stopRecording();
mRecordBtn.setText(getString(R.string.audio_uap_record_recordBtn));
mRecordLoopbackBtn.setEnabled(true);
}
break;
case R.id.uap_recordRecordLoopBtn:
if (!isRecording()) {
if (startRecording(true)) {
mRecordLoopbackBtn.setText(getString(R.string.audio_uap_record_stopBtn));
mRecordBtn.setEnabled(false);
}
} else {
if (isPlaying()) {
stopPlay();
}
stopRecording();
mRecordLoopbackBtn.setText(
getString(R.string.audio_uap_record_recordLoopbackBtn));
mRecordBtn.setEnabled(true);
}
break;
}
}
}
private class RecordListener extends StreamRecorderListener {
/*package*/ RecordListener() {
super(Looper.getMainLooper());
}
@Override
public void handleMessage(Message msg) {
// Log.i(TAG, "RecordListener.HandleMessage(" + msg.what + ")");
switch (msg.what) {
case MSG_START:
break;
case MSG_BUFFER_FILL:
mWaveView.invalidate();
break;
case MSG_STOP:
break;
}
}
}
@Override
protected void onPause() {
super.onPause();
stopPlay();
}
}