1*90c8c64dSAndroid Build Coastguard Worker /* 2*90c8c64dSAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project 3*90c8c64dSAndroid Build Coastguard Worker * 4*90c8c64dSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*90c8c64dSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*90c8c64dSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*90c8c64dSAndroid Build Coastguard Worker * 8*90c8c64dSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*90c8c64dSAndroid Build Coastguard Worker * 10*90c8c64dSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*90c8c64dSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*90c8c64dSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*90c8c64dSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*90c8c64dSAndroid Build Coastguard Worker * limitations under the License. 15*90c8c64dSAndroid Build Coastguard Worker */ 16*90c8c64dSAndroid Build Coastguard Worker 17*90c8c64dSAndroid Build Coastguard Worker package com.example.android.common.midi; 18*90c8c64dSAndroid Build Coastguard Worker 19*90c8c64dSAndroid Build Coastguard Worker import android.media.midi.MidiSender; 20*90c8c64dSAndroid Build Coastguard Worker import android.util.Log; 21*90c8c64dSAndroid Build Coastguard Worker 22*90c8c64dSAndroid Build Coastguard Worker import java.io.IOException; 23*90c8c64dSAndroid Build Coastguard Worker 24*90c8c64dSAndroid Build Coastguard Worker public class MidiEventThread extends MidiEventScheduler { 25*90c8c64dSAndroid Build Coastguard Worker protected static final String TAG = "MidiEventThread"; 26*90c8c64dSAndroid Build Coastguard Worker 27*90c8c64dSAndroid Build Coastguard Worker private EventThread mEventThread; 28*90c8c64dSAndroid Build Coastguard Worker MidiDispatcher mDispatcher = new MidiDispatcher(); 29*90c8c64dSAndroid Build Coastguard Worker 30*90c8c64dSAndroid Build Coastguard Worker class EventThread extends Thread { 31*90c8c64dSAndroid Build Coastguard Worker private boolean go = true; 32*90c8c64dSAndroid Build Coastguard Worker 33*90c8c64dSAndroid Build Coastguard Worker @Override run()34*90c8c64dSAndroid Build Coastguard Worker public void run() { 35*90c8c64dSAndroid Build Coastguard Worker while (go) { 36*90c8c64dSAndroid Build Coastguard Worker try { 37*90c8c64dSAndroid Build Coastguard Worker MidiEvent event = (MidiEvent) waitNextEvent(); 38*90c8c64dSAndroid Build Coastguard Worker try { 39*90c8c64dSAndroid Build Coastguard Worker Log.i(TAG, "Fire event " + event.data[0] + " at " 40*90c8c64dSAndroid Build Coastguard Worker + event.getTimestamp()); 41*90c8c64dSAndroid Build Coastguard Worker mDispatcher.send(event.data, 0, 42*90c8c64dSAndroid Build Coastguard Worker event.count, event.getTimestamp()); 43*90c8c64dSAndroid Build Coastguard Worker } catch (IOException e) { 44*90c8c64dSAndroid Build Coastguard Worker e.printStackTrace(); 45*90c8c64dSAndroid Build Coastguard Worker } 46*90c8c64dSAndroid Build Coastguard Worker // Put event back in the pool for future use. 47*90c8c64dSAndroid Build Coastguard Worker addEventToPool(event); 48*90c8c64dSAndroid Build Coastguard Worker } catch (InterruptedException e) { 49*90c8c64dSAndroid Build Coastguard Worker // OK, this is how we stop the thread. 50*90c8c64dSAndroid Build Coastguard Worker } 51*90c8c64dSAndroid Build Coastguard Worker } 52*90c8c64dSAndroid Build Coastguard Worker } 53*90c8c64dSAndroid Build Coastguard Worker 54*90c8c64dSAndroid Build Coastguard Worker /** 55*90c8c64dSAndroid Build Coastguard Worker * Asynchronously tell the thread to stop. 56*90c8c64dSAndroid Build Coastguard Worker */ requestStop()57*90c8c64dSAndroid Build Coastguard Worker public void requestStop() { 58*90c8c64dSAndroid Build Coastguard Worker go = false; 59*90c8c64dSAndroid Build Coastguard Worker interrupt(); 60*90c8c64dSAndroid Build Coastguard Worker } 61*90c8c64dSAndroid Build Coastguard Worker } 62*90c8c64dSAndroid Build Coastguard Worker start()63*90c8c64dSAndroid Build Coastguard Worker public void start() { 64*90c8c64dSAndroid Build Coastguard Worker stop(); 65*90c8c64dSAndroid Build Coastguard Worker mEventThread = new EventThread(); 66*90c8c64dSAndroid Build Coastguard Worker mEventThread.start(); 67*90c8c64dSAndroid Build Coastguard Worker } 68*90c8c64dSAndroid Build Coastguard Worker 69*90c8c64dSAndroid Build Coastguard Worker /** 70*90c8c64dSAndroid Build Coastguard Worker * Asks the thread to stop then waits for it to stop. 71*90c8c64dSAndroid Build Coastguard Worker */ stop()72*90c8c64dSAndroid Build Coastguard Worker public void stop() { 73*90c8c64dSAndroid Build Coastguard Worker if (mEventThread != null) { 74*90c8c64dSAndroid Build Coastguard Worker mEventThread.requestStop(); 75*90c8c64dSAndroid Build Coastguard Worker try { 76*90c8c64dSAndroid Build Coastguard Worker mEventThread.join(500); 77*90c8c64dSAndroid Build Coastguard Worker } catch (InterruptedException e) { 78*90c8c64dSAndroid Build Coastguard Worker Log.e(TAG, 79*90c8c64dSAndroid Build Coastguard Worker "Interrupted while waiting for MIDI EventScheduler thread to stop."); 80*90c8c64dSAndroid Build Coastguard Worker } finally { 81*90c8c64dSAndroid Build Coastguard Worker mEventThread = null; 82*90c8c64dSAndroid Build Coastguard Worker } 83*90c8c64dSAndroid Build Coastguard Worker } 84*90c8c64dSAndroid Build Coastguard Worker } 85*90c8c64dSAndroid Build Coastguard Worker getSender()86*90c8c64dSAndroid Build Coastguard Worker public MidiSender getSender() { 87*90c8c64dSAndroid Build Coastguard Worker return mDispatcher.getSender(); 88*90c8c64dSAndroid Build Coastguard Worker } 89*90c8c64dSAndroid Build Coastguard Worker 90*90c8c64dSAndroid Build Coastguard Worker } 91