summaryrefslogtreecommitdiffstats
path: root/classes/MIDIStateManager.sc
blob: 1566a582d99e249f093828854567be535926e102 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
MIDIStateManager{

  var <>verbose, <deviceStates;

  *new{
    arg verbose;
    ^super.newCopyArgs(verbose).initManager();
  }

  initManager{
    deviceStates = Array();
  }

  // request a state
  // if a stored and unconnected state is available return that, else return a
  // new MIDIState
  // TODO: improve search algorithm
  requestState{
    arg name, uid, inPortNum, outPortNum;
    var devicePosition = -1, stateAvailable = false;
    deviceStates.do({|storedDevice, i|
      if((name == storedDevice.name) && (storedDevice.connected.not),{
        stateAvailable = true;
        devicePosition = i;
      });
    });
    if(stateAvailable && (devicePosition >= 0),{
      deviceStates[devicePosition].connected=true;
      deviceStates[devicePosition].takeOver();
      ^deviceStates[devicePosition];
    },{
      deviceStates = deviceStates.add(
        MIDIState.new(name, uid, inPortNum, outPortNum, verbose)
      );
      ^deviceStates[deviceStates.size-1];
    });
  }

  listStates{
    deviceStates.do({|state, i|
      postln(i.asString++": ["++state.name++", "++state.uid++", "
        ++state.inPortNum++", "++state.outPortNum++", "
        ++state.connected++"]");
    });
  }

}