diff options
Diffstat (limited to 'apps/OboeTester/app/src/main/java/com/google/sample/oboe/manualtest/TapToToneActivity.java')
-rw-r--r-- | apps/OboeTester/app/src/main/java/com/google/sample/oboe/manualtest/TapToToneActivity.java | 375 |
1 files changed, 0 insertions, 375 deletions
diff --git a/apps/OboeTester/app/src/main/java/com/google/sample/oboe/manualtest/TapToToneActivity.java b/apps/OboeTester/app/src/main/java/com/google/sample/oboe/manualtest/TapToToneActivity.java deleted file mode 100644 index cdb46f06..00000000 --- a/apps/OboeTester/app/src/main/java/com/google/sample/oboe/manualtest/TapToToneActivity.java +++ /dev/null @@ -1,375 +0,0 @@ -/* - * Copyright 2015 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; - -import android.Manifest; -import android.content.pm.PackageManager; -import android.media.midi.MidiDevice; -import android.media.midi.MidiDeviceInfo; -import android.media.midi.MidiInputPort; -import android.media.midi.MidiManager; -import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; -import android.util.Log; -import android.view.Menu; -import android.view.MenuItem; -import android.view.MotionEvent; -import android.view.View; -import android.widget.TextView; -import android.widget.Toast; - -import com.mobileer.miditools.MidiOutputPortConnectionSelector; -import com.mobileer.miditools.MidiPortConnector; -import com.mobileer.miditools.MidiTools; - -import java.io.IOException; - -import static com.google.sample.oboe.manualtest.AudioMidiTester.TestListener; -import static com.google.sample.oboe.manualtest.AudioMidiTester.TestResult; - -public class TapToToneActivity extends TestOutputActivityBase { - private static final int MY_PERMISSIONS_REQUEST_RECORD_AUDIO = 1234; - private TextView mResultView; - private MidiManager mMidiManager; - private MidiInputPort mInputPort; - - protected AudioMidiTester mAudioMidiTester; - - private MidiOutputPortConnectionSelector mPortSelector; - private MyTestListener mTestListener = new MyTestListener(); - private WaveformView mWaveformView; - // Stats for latency - private int mMeasurementCount; - private int mLatencySumSamples; - private int mLatencyMin; - private int mLatencyMax; - - @Override - protected void inflateActivity() { - setContentView(R.layout.activity_tap_to_tone); - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - mAudioOutTester = addAudioOutputTester(); - - mResultView = (TextView) findViewById(R.id.resultView); - - if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_MIDI)) { - setupMidi(); - } else { - Toast.makeText(TapToToneActivity.this, - "MIDI not supported!", Toast.LENGTH_LONG) - .show(); - } - - mWaveformView = (WaveformView) findViewById(R.id.waveview_audio); - - // Start a blip test when the waveform view is tapped. - mWaveformView.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View view, MotionEvent event) { - int action = event.getActionMasked(); - switch (action) { - case MotionEvent.ACTION_DOWN: - case MotionEvent.ACTION_POINTER_DOWN: - mAudioMidiTester.trigger(); - break; - case MotionEvent.ACTION_MOVE: - break; - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_POINTER_UP: - break; - } - // Must return true or we do not get the ACTION_MOVE and - // ACTION_UP events. - return true; - } - }); - - updateEnabledWidgets(); - } - - @Override - int getActivityType() { - return ACTIVITY_TAP_TO_TONE; - } - - @Override - protected void onDestroy() { - mAudioMidiTester.removeTestListener(mTestListener); - closeMidiResources(); - super.onDestroy(); - } - - private void setupMidi() { - // Setup MIDI - mMidiManager = (MidiManager) getSystemService(MIDI_SERVICE); - MidiDeviceInfo[] infos = mMidiManager.getDevices(); - - // Open the port now so that the AudioMidiTester gets created. - for (MidiDeviceInfo info : infos) { - Bundle properties = info.getProperties(); - String product = properties - .getString(MidiDeviceInfo.PROPERTY_PRODUCT); - - Log.i(TAG, "product = " + product); - if ("AudioLatencyTester".equals(product)) { - openPort(info); - break; - } - } - - } - - // These should only be set after mAudioMidiTester is set. - private void setSpinnerListeners() { - MidiDeviceInfo synthInfo = MidiTools.findDevice(mMidiManager, "AndroidTest", - "AudioLatencyTester"); - Log.i(TAG, "found tester virtual device info: " + synthInfo); - int portIndex = 0; - mPortSelector = new MidiOutputPortConnectionSelector(mMidiManager, this, - R.id.spinner_synth_sender, synthInfo, portIndex); - mPortSelector.setConnectedListener(new MyPortsConnectedListener()); - - } - - private class MyTestListener implements TestListener { - @Override - public void onTestFinished(final TestResult result) { - runOnUiThread(new Runnable() { - public void run() { - showTestResults(result); - } - }); - } - - @Override - public void onNoteOn(final int pitch) { - runOnUiThread(new Runnable() { - public void run() { - mStreamContexts.get(0).configurationView.setStatusText("MIDI pitch = " + pitch); - } - }); - } - } - - // Runs on UI thread. - private void showTestResults(TestResult result) { - String text; - int previous = 0; - if (result == null) { - text = ""; - mWaveformView.clearSampleData(); - } else { - if (result.events.length < 2) { - text = "Not enough edges. Use fingernail.\n"; - mWaveformView.setCursorData(null); - } else if (result.events.length > 2) { - text = "Too many edges.\n"; - mWaveformView.setCursorData(null); - } else { - int[] cursors = new int[2]; - cursors[0] = result.events[0].sampleIndex; - cursors[1] = result.events[1].sampleIndex; - int latencySamples = cursors[1] - cursors[0]; - mLatencySumSamples += latencySamples; - mMeasurementCount++; - - int latencyMillis = 1000 * latencySamples / result.frameRate; - if (mLatencyMin > latencyMillis) { - mLatencyMin = latencyMillis; - } - if (mLatencyMax < latencyMillis) { - mLatencyMax = latencyMillis; - } - - text = String.format("latency = %3d msec\n", latencyMillis); - mWaveformView.setCursorData(cursors); - } - mWaveformView.setSampleData(result.filtered); - } - - if (mMeasurementCount > 0) { - int averageLatencySamples = mLatencySumSamples / mMeasurementCount; - int averageLatencyMillis = 1000 * averageLatencySamples / result.frameRate; - final String plural = (mMeasurementCount == 1) ? "test" : "tests"; - text = text + String.format("min = %3d, avg = %3d, max = %3d, %d %s", - mLatencyMin, averageLatencyMillis, mLatencyMax, mMeasurementCount, plural); - } - final String postText = text; - mWaveformView.post(new Runnable() { - public void run() { - mResultView.setText(postText); - mWaveformView.postInvalidate(); - } - }); - } - - private void openPort(final MidiDeviceInfo info) { - mMidiManager.openDevice(info, new MidiManager.OnDeviceOpenedListener() { - @Override - public void onDeviceOpened(MidiDevice device) { - if (device == null) { - Log.e(TAG, "could not open device " + info); - } else { - mInputPort = device.openInputPort(0); - Log.i(TAG, "opened MIDI port = " + mInputPort + " on " + info); - mAudioMidiTester = AudioMidiTester.getInstance(); - - Log.i(TAG, "openPort() mAudioMidiTester = " + mAudioMidiTester); - // Now that we have created the AudioMidiTester, close the port so we can - // open it later. - try { - mInputPort.close(); - } catch (IOException e) { - e.printStackTrace(); - } - mAudioMidiTester.addTestListener(mTestListener); - - setSpinnerListeners(); - } - } - }, new Handler(Looper.getMainLooper()) - ); - } - - // TODO Listen to the synth server - // for open/close events and then disable/enable the spinner. - private class MyPortsConnectedListener - implements MidiPortConnector.OnPortsConnectedListener { - @Override - public void onPortsConnected(final MidiDevice.MidiConnection connection) { - Log.i(TAG, "onPortsConnected, connection = " + connection); - runOnUiThread(new Runnable() { - @Override - public void run() { - if (connection == null) { - Toast.makeText(TapToToneActivity.this, - R.string.error_port_busy, Toast.LENGTH_LONG) - .show(); - mPortSelector.clearSelection(); - } else { - Toast.makeText(TapToToneActivity.this, - R.string.port_open_ok, Toast.LENGTH_LONG) - .show(); - } - } - }); - } - } - - private void closeMidiResources() { - if (mPortSelector != null) { - mPortSelector.close(); - } - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - // Inflate the menu; this adds items to the action bar if it is present. - getMenuInflater().inflate(R.menu.menu_main, menu); - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - // Handle action bar item clicks here. The action bar will - // automatically handle clicks on the Home/Up button, so long - // as you specify a parent activity in AndroidManifest.xml. - int id = item.getItemId(); - - //noinspection SimplifiableIfStatement - if (id == R.id.action_settings) { - return true; - } - - return super.onOptionsItemSelected(item); - } - - private boolean hasRecordAudioPermission(){ - boolean hasPermission = (checkSelfPermission( - Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED); - Log.i(TAG, "Has RECORD_AUDIO permission? " + hasPermission); - return hasPermission; - } - - private void requestRecordAudioPermission(){ - - String requiredPermission = Manifest.permission.RECORD_AUDIO; - - // If the user previously denied this permission then show a message explaining why - // this permission is needed - if (shouldShowRequestPermissionRationale(requiredPermission)) { - showErrorToast("This app needs to record audio through the microphone...."); - } - - // request the permission. - requestPermissions(new String[]{requiredPermission}, - MY_PERMISSIONS_REQUEST_RECORD_AUDIO); - } - @Override - public void onRequestPermissionsResult(int requestCode, - String permissions[], int[] grantResults) { - // TODO - } - - @Override - public void startAudio() throws IOException { - if (hasRecordAudioPermission()) { - startAudioPermitted(); - } else { - requestRecordAudioPermission(); - } - } - - private void startAudioPermitted() throws IOException { - super.startAudio(); - resetLatency(); - mAudioMidiTester.start(); - } - - @Override - public void stopAudio() { - mAudioMidiTester.stop(); - super.stopAudio(); - } - - @Override - public void pauseAudio() { - mAudioMidiTester.stop(); - super.pauseAudio(); - } - - @Override - public void closeAudio() { - mAudioMidiTester.stop(); - super.closeAudio(); - } - - private void resetLatency() { - mMeasurementCount = 0; - mLatencySumSamples = 0; - mLatencyMin = Integer.MAX_VALUE; - mLatencyMax = 0; - showTestResults(null); - } - -} |