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}