001/*
002 * Title:        CoreMIDI4J
003 * Description:  Core MIDI Device Provider for Java on OS X
004 * Copyright:    Copyright (c) 2015-2016
005 * Company:      x.factory Librarians
006 *
007 * @author Derek Cook
008 * 
009 * CoreMIDI4J is an open source Service Provider Interface for supporting external MIDI devices on MAC OS X
010 * 
011 * CREDITS - This library uses principles established by OSXMIDI4J, but converted so it operates at the JNI level with no additional libraries required
012 * 
013 */
014
015package uk.co.xfactorylibrarians.coremidi4j;
016
017import javax.sound.midi.MidiDevice;
018import javax.sound.midi.MidiDeviceTransmitter;
019import javax.sound.midi.Receiver;
020import java.util.concurrent.atomic.AtomicBoolean;
021import java.util.concurrent.atomic.AtomicReference;
022
023/**
024 * CoreMidiTransmitter - used to receive data from the connected device and send it to the application.
025 *
026 */
027
028public class CoreMidiTransmitter implements MidiDeviceTransmitter {
029
030  private final CoreMidiSource device;
031  private final AtomicReference<Receiver> receiver = new AtomicReference<>();
032  private final AtomicBoolean closed = new AtomicBoolean(false);
033
034  /**
035   * CoreMidiTransmitter constructor
036   * 
037   * @param device      The MIDI device that contains the information required to receive MIDI data via OSX core MIDI
038   * 
039   */
040
041  CoreMidiTransmitter(final CoreMidiSource device) {
042
043    this.device = device;
044
045  }
046
047  /** 
048   * Sets a receiver on this transmitter
049   * 
050   * @see javax.sound.midi.Transmitter#setReceiver(javax.sound.midi.Receiver)
051   * 
052   * @param receiver    The receiver to set, replacing any previous value
053   * 
054   */
055
056  @Override
057  public void setReceiver(Receiver receiver) {
058
059    this.receiver.set(receiver);
060
061  }
062
063  /** 
064   * Gets the receiver set on this transmitter
065   * 
066   * @see javax.sound.midi.Transmitter#setReceiver(javax.sound.midi.Receiver)
067   * 
068   * @return    The receiver set on this transmitter
069   * 
070   */
071
072  @Override
073  public Receiver getReceiver() {
074
075    return receiver.get();
076
077  }
078
079  /**
080   * Closes this transmitter, causing it to no longer send MIDI events from its source
081   * 
082   * @see javax.sound.midi.Transmitter#close()
083   * 
084   */
085
086  @Override
087  public void close() {
088
089    if (closed.compareAndSet(false, true)) {
090
091      device.transmitterClosed(this);
092
093    }
094
095  }
096
097  /**
098   * Gets the MIDI Device that this receiver is attached to
099   * 
100   * @return the MIDI Device that this receiver is attached to
101   * 
102   */
103
104  @Override
105  public MidiDevice getMidiDevice() {
106
107    return device;
108
109  }
110
111}