Home | History | Annotate | Download | only in com.example.android.midisynth
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.example.android.midisynth;
     18 
     19 import android.app.ActionBar;
     20 import android.app.Activity;
     21 import android.content.pm.PackageManager;
     22 import android.media.midi.MidiDevice.MidiConnection;
     23 import android.media.midi.MidiDeviceInfo;
     24 import android.media.midi.MidiManager;
     25 import android.os.Bundle;
     26 import android.view.Menu;
     27 import android.view.MenuItem;
     28 import android.view.WindowManager;
     29 import android.widget.Toast;
     30 import android.widget.Toolbar;
     31 
     32 import com.example.android.common.midi.MidiOutputPortConnectionSelector;
     33 import com.example.android.common.midi.MidiPortConnector;
     34 import com.example.android.common.midi.MidiTools;
     35 
     36 /**
     37  * Simple synthesizer as a MIDI Device.
     38  */
     39 public class MainActivity extends Activity {
     40     static final String TAG = "MidiSynthExample";
     41 
     42     private MidiManager mMidiManager;
     43     private MidiOutputPortConnectionSelector mPortSelector;
     44 
     45     @Override
     46     public void onCreate(Bundle savedInstanceState) {
     47         super.onCreate(savedInstanceState);
     48         setContentView(R.layout.main);
     49         setActionBar((Toolbar) findViewById(R.id.toolbar));
     50         ActionBar actionBar = getActionBar();
     51         if (actionBar != null) {
     52             actionBar.setDisplayShowTitleEnabled(false);
     53         }
     54 
     55         if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_MIDI)) {
     56             setupMidi();
     57         }
     58     }
     59 
     60     @Override
     61     public boolean onCreateOptionsMenu(Menu menu) {
     62         getMenuInflater().inflate(R.menu.main, menu);
     63         setKeepScreenOn(menu.findItem(R.id.action_keep_screen_on).isChecked());
     64         return true;
     65     }
     66 
     67     @Override
     68     public boolean onOptionsItemSelected(MenuItem item) {
     69         switch (item.getItemId()) {
     70             case R.id.action_keep_screen_on:
     71                 boolean checked = !item.isChecked();
     72                 setKeepScreenOn(checked);
     73                 item.setChecked(checked);
     74                 break;
     75         }
     76         return super.onOptionsItemSelected(item);
     77     }
     78 
     79     private void setKeepScreenOn(boolean keepScreenOn) {
     80         if (keepScreenOn) {
     81             getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
     82         } else {
     83             getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
     84         }
     85     }
     86 
     87     private void setupMidi() {
     88         // Setup MIDI
     89         mMidiManager = (MidiManager) getSystemService(MIDI_SERVICE);
     90 
     91         MidiDeviceInfo synthInfo = MidiTools.findDevice(mMidiManager, "AndroidTest",
     92                 "SynthExample");
     93         int portIndex = 0;
     94         mPortSelector = new MidiOutputPortConnectionSelector(mMidiManager, this,
     95                 R.id.spinner_synth_sender, synthInfo, portIndex);
     96         mPortSelector.setConnectedListener(new MyPortsConnectedListener());
     97     }
     98 
     99     private void closeSynthResources() {
    100         if (mPortSelector != null) {
    101             mPortSelector.close();
    102         }
    103     }
    104 
    105     // TODO A better way would be to listen to the synth server
    106     // for open/close events and then disable/enable the spinner.
    107     private class MyPortsConnectedListener
    108             implements MidiPortConnector.OnPortsConnectedListener {
    109         @Override
    110         public void onPortsConnected(final MidiConnection connection) {
    111             runOnUiThread(new Runnable() {
    112                 @Override
    113                 public void run() {
    114                     if (connection == null) {
    115                         Toast.makeText(MainActivity.this,
    116                                 R.string.error_port_busy, Toast.LENGTH_SHORT)
    117                                 .show();
    118                         mPortSelector.clearSelection();
    119                     } else {
    120                         Toast.makeText(MainActivity.this,
    121                                 R.string.port_open_ok, Toast.LENGTH_SHORT)
    122                                 .show();
    123                     }
    124                 }
    125             });
    126         }
    127     }
    128 
    129     @Override
    130     public void onDestroy() {
    131         closeSynthResources();
    132         super.onDestroy();
    133     }
    134 
    135 }
    136