/* * Copyright (C) 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.example.android.midisynth; import android.app.ActionBar; import android.app.Activity; import android.content.pm.PackageManager; import android.media.midi.MidiDevice.MidiConnection; import android.media.midi.MidiDeviceInfo; import android.media.midi.MidiManager; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.WindowManager; import android.widget.Toast; import android.widget.Toolbar; import com.example.android.common.midi.MidiOutputPortConnectionSelector; import com.example.android.common.midi.MidiPortConnector; import com.example.android.common.midi.MidiTools; /** * Simple synthesizer as a MIDI Device. */ public class MainActivity extends Activity { static final String TAG = "MidiSynthExample"; private MidiManager mMidiManager; private MidiOutputPortConnectionSelector mPortSelector; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setActionBar((Toolbar) findViewById(R.id.toolbar)); ActionBar actionBar = getActionBar(); if (actionBar != null) { actionBar.setDisplayShowTitleEnabled(false); } if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_MIDI)) { setupMidi(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); setKeepScreenOn(menu.findItem(R.id.action_keep_screen_on).isChecked()); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_keep_screen_on: boolean checked = !item.isChecked(); setKeepScreenOn(checked); item.setChecked(checked); break; } return super.onOptionsItemSelected(item); } private void setKeepScreenOn(boolean keepScreenOn) { if (keepScreenOn) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } else { getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } } private void setupMidi() { // Setup MIDI mMidiManager = (MidiManager) getSystemService(MIDI_SERVICE); MidiDeviceInfo synthInfo = MidiTools.findDevice(mMidiManager, "AndroidTest", "SynthExample"); int portIndex = 0; mPortSelector = new MidiOutputPortConnectionSelector(mMidiManager, this, R.id.spinner_synth_sender, synthInfo, portIndex); mPortSelector.setConnectedListener(new MyPortsConnectedListener()); } private void closeSynthResources() { if (mPortSelector != null) { mPortSelector.close(); } } // TODO A better way would be to 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 MidiConnection connection) { runOnUiThread(new Runnable() { @Override public void run() { if (connection == null) { Toast.makeText(MainActivity.this, R.string.error_port_busy, Toast.LENGTH_SHORT) .show(); mPortSelector.clearSelection(); } else { Toast.makeText(MainActivity.this, R.string.port_open_ok, Toast.LENGTH_SHORT) .show(); } } }); } } @Override public void onDestroy() { closeSynthResources(); super.onDestroy(); } }