import javax.sound.midi.Receiver;
import javax.sound.midi.Sequencer;
import javax.sound.midi.Transmitter;
-import javax.swing.AbstractListModel;
/**
* {@link Transmitter} のリストを表す {@link javax.swing.ListModel}
*/
-public class TransmitterListModel extends AbstractListModel<Transmitter> {
- protected Transmitter dummyTransmitter = new DummyTransmitter();
- protected MidiDeviceModel deviceModel;
- public TransmitterListModel(MidiDeviceModel deviceModel) {
- this.deviceModel = deviceModel;
+public class TransmitterListModel extends AbstractTransceiverListModel<Transmitter> {
+ public TransmitterListModel(MidiDeviceModel deviceModel) { super(deviceModel); }
+ protected List<Transmitter> getTransceivers() {
+ return deviceModel.getMidiDevice().getTransmitters();
}
+ private Transmitter dummyTx = new DummyTransmitter();
@Override
public Transmitter getElementAt(int index) {
- List<Transmitter> txList = deviceModel.getMidiDevice().getTransmitters();
+ List<Transmitter> txList = getTransceivers();
int length = txList.size();
- if( index == length ) return dummyTransmitter;
+ if( index == length ) return dummyTx;
if( index > length || index < 0 ) return null;
return txList.get(index);
}
@Override
- public int getSize() {
- return deviceModel.getMidiDevice().getTransmitters().size() + 1;
- }
+ public int getSize() { return super.getSize() + 1; }
+ @Override
public int indexOf(Object element) {
- List<Transmitter> txList = deviceModel.getMidiDevice().getTransmitters();
- return dummyTransmitter.equals(element) ? txList.size() : txList.indexOf(element);
+ List<Transmitter> txList = getTransceivers();
+ return dummyTx.equals(element) ? txList.size() : txList.indexOf(element);
}
/**
- * レシーバに未接続の最初の{@link Transmitter}を返します。
- * ã\81ªã\81\84å ´å\90\88ã\81¯{@link MidiDevice#getTransmitter}ã\81§æ\96°ã\81\9fã\81«å\8f\96å¾\97ã\81\97ã\81¦è¿\94します。
+ * 新しい{@link Transmitter}を{@link MidiDevice#getTransmitter}で生成し、
+ * ã\81\93ã\81®ã\83¢ã\83\87ã\83«ã\82\92å\8f\82ç\85§ã\81\97ã\81¦ã\81\84ã\82\8bã\83\93ã\83¥ã\83¼ã\81«é\80\9aç\9f¥します。
*
* @return 未接続の{@link Transmitter}
* @throws MidiUnavailableException リソースの制約のためにトランスミッタを使用できない場合にスローされる
*/
- public Transmitter getUnconnectedTransmitter() throws MidiUnavailableException {
- MidiDevice device = deviceModel.getMidiDevice();
- List<Transmitter> txList = device.getTransmitters();
- for( Transmitter tx : txList ) if( tx.getReceiver() == null ) return tx;
- Transmitter tx;
- tx = device.getTransmitter();
+ public Transmitter openTransmitter() throws MidiUnavailableException {
+ Transmitter tx = deviceModel.getMidiDevice().getTransmitter();
fireIntervalAdded(this, 0, getSize());
return tx;
}
/**
- * このリストモデルの{@link #getUnconnectedTransmitter()}が返した{@link Transmitter}を、
- * 相手のMIDIデバイスが持つ最初の{@link Receiver}に接続します。
+ * 相手のMIDIデバイスが持つ最初の{@link Receiver}を、
+ * このリストモデルの新規{@link Transmitter}に接続します。
*
* @param anotherDeviceModel 接続相手のMIDIデバイス
* @throws MidiUnavailableException リソースの制約のためにトランスミッタを使用できない場合にスローされる
*/
public void connectToFirstReceiverOfDevice(MidiDeviceModel anotherDeviceModel) throws MidiUnavailableException {
List<Receiver> rxList = anotherDeviceModel.getMidiDevice().getReceivers();
- if( ! rxList.isEmpty() )
- deviceModel.getTransmitterListModel().getUnconnectedTransmitter().setReceiver(rxList.get(0));
+ if( rxList.isEmpty() ) return;
+ deviceModel.getTransmitterListModel().openTransmitter().setReceiver(rxList.get(0));
}
/**
- * æ\8c\87å®\9aã\81®{@link Transmitter}ã\81\8cã\83ªã\82¹ã\83\88ã\81«ã\81\82ã\82\8cã\81°ã\80\81ã\81\9dã\82\8cã\82\92é\96\89ã\81\98ã\81¾ã\81\99ã\80\82
- * 閉じるとリストから自動的に削除されるので、表示の更新も行います。
+ * æ\8c\87å®\9aã\81®{@link Transmitter}ã\82\92é\96\89ã\81\98ã\80\81è¦\81ç´ ã\81\8cæ¸\9bã\81£ã\81\9fã\81\93ã\81¨ã\82\92ã\80\81
+ * このモデルを参照しているビューに通知します。
*
* @param tx このリストモデルで開いている{@link Transmitter}
*/
- public void close(Transmitter tx) {
- if( ! deviceModel.getMidiDevice().getTransmitters().contains(tx) ) return;
+ public void closeTransmitter(Transmitter tx) {
tx.close();
fireIntervalRemoved(this, 0, getSize());
}
*/
public void closePeerTransmitterOf(Receiver rx) {
List<Transmitter> closingTxList = new Vector<Transmitter>();
- List<Transmitter> txList = deviceModel.getMidiDevice().getTransmitters();
+ List<Transmitter> txList = getTransceivers();
for( Transmitter tx : txList ) if( tx.getReceiver() == rx ) closingTxList.add(tx);
if( closingTxList.isEmpty() ) return;
int length = getSize();
Receiver rx = tx.getReceiver();
if( rx != null ) peerRxList.add(rx);
}
- List<Receiver> myRxList = device.getReceivers();
List<Transmitter> peerTxList = new Vector<Transmitter>();
MidiDeviceModelList deviceModelList = deviceModel.getDeviceModelList();
- for( Receiver rx : myRxList ) {
+ List<Receiver> rxList = device.getReceivers();
+ for( Receiver rx : rxList ) {
for( MidiDeviceModel m : deviceModelList ) {
if( m == deviceModel ) continue;
List<Transmitter> peerSourceTxList = m.getMidiDevice().getTransmitters();
device.close();
try {
device.open();
- for( Receiver peerRx : peerRxList ) getUnconnectedTransmitter().setReceiver(peerRx);
- if( ! myRxList.isEmpty() ) {
- Receiver rx = myRxList.get(0);
+ for( Receiver peerRx : peerRxList ) openTransmitter().setReceiver(peerRx);
+ if( ! rxList.isEmpty() ) {
+ Receiver rx = rxList.get(0);
for( Transmitter peerTx : peerTxList ) peerTx.setReceiver(rx);
}
} catch( MidiUnavailableException e ) {