Home | History | Annotate | Download | only in 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.content.pm.PackageManager;
     20 import android.media.midi.MidiDevice.MidiConnection;
     21 import android.media.midi.MidiDeviceInfo;
     22 import android.media.midi.MidiManager;
     23 import android.os.Bundle;
     24 import android.support.v7.app.ActionBar;
     25 import android.support.v7.app.AppCompatActivity;
     26 import android.support.v7.widget.Toolbar;
     27 import android.view.Menu;
     28 import android.view.MenuItem;
     29 import android.view.WindowManager;
     30 import android.widget.Toast;
     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 AppCompatActivity {
     40 
     41     private MidiOutputPortConnectionSelector mPortSelector;
     42 
     43     @Override
     44     public void onCreate(Bundle savedInstanceState) {
     45         super.onCreate(savedInstanceState);
     46         setContentView(R.layout.main);
     47         setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
     48         ActionBar actionBar = getSupportActionBar();
     49         if (actionBar != null) {
     50             actionBar.setDisplayShowTitleEnabled(false);
     51         }
     52 
     53         if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_MIDI)) {
     54             setupMidi();
     55         }
     56     }
     57 
     58     @Override
     59     public boolean onCreateOptionsMenu(Menu menu) {
     60         getMenuInflater().inflate(R.menu.main, menu);
     61         setKeepScreenOn(menu.findItem(R.id.action_keep_screen_on).isChecked());
     62         return true;
     63     }
     64 
     65     @Override
     66     public boolean onOptionsItemSelected(MenuItem item) {
     67         switch (item.getItemId()) {
     68             case R.id.action_keep_screen_on:
     69                 boolean checked = !item.isChecked();
     70                 setKeepScreenOn(checked);
     71                 item.setChecked(checked);
     72                 break;
     73         }
     74         return super.onOptionsItemSelected(item);
     75     }
     76 
     77     private void setKeepScreenOn(boolean keepScreenOn) {
     78         if (keepScreenOn) {
     79             getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
     80         } else {
     81             getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
     82         }
     83     }
     84 
     85     private void setupMidi() {
     86         // Setup MIDI
     87         MidiManager midiManager = (MidiManager) getSystemService(MIDI_SERVICE);
     88 
     89         MidiDeviceInfo synthInfo = MidiTools.findDevice(midiManager, "AndroidTest",
     90                 "SynthExample");
     91         int portIndex = 0;
     92         mPortSelector = new MidiOutputPortConnectionSelector(midiManager, this,
     93                 R.id.spinner_synth_sender, synthInfo, portIndex);
     94         mPortSelector.setConnectedListener(new MyPortsConnectedListener());
     95     }
     96 
     97     private void closeSynthResources() {
     98         if (mPortSelector != null) {
     99             mPortSelector.close();
    100         }
    101     }
    102 
    103     // TODO A better way would be to listen to the synth server
    104     // for open/close events and then disable/enable the spinner.
    105     private class MyPortsConnectedListener
    106             implements MidiPortConnector.OnPortsConnectedListener {
    107         @Override
    108         public void onPortsConnected(final MidiConnection connection) {
    109             runOnUiThread(new Runnable() {
    110                 @Override
    111                 public void run() {
    112                     if (connection == null) {
    113                         Toast.makeText(MainActivity.this,
    114                                 R.string.error_port_busy, Toast.LENGTH_SHORT)
    115                                 .show();
    116                         mPortSelector.clearSelection();
    117                     } else {
    118                         Toast.makeText(MainActivity.this,
    119                                 R.string.port_open_ok, Toast.LENGTH_SHORT)
    120                                 .show();
    121                     }
    122                 }
    123             });
    124         }
    125     }
    126 
    127     @Override
    128     public void onDestroy() {
    129         closeSynthResources();
    130         super.onDestroy();
    131     }
    132 
    133 }
    134