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