/* * jlscp - a java LinuxSampler control protocol API * * Copyright (C) 2005 Grigor Kirilov Iliev * * This file is part of jlscp. * * jlscp is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 * as published by the Free Software Foundation. * * jlscp is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with jlscp; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA */ package org.linuxsampler.lscp; /** * Provides information about current settings of a specific sampler channel. * @author Grigor Iliev */ public class SamplerChannel implements Parseable { /** Indicates that the channel is muted because of the presence of a solo channel. */ private final static int MUTED_BY_SOLO = -1; private int chnID = -1; private SamplerEngine engine = null; private int aoDevice = -1; private int aoChannels = 0; private Integer[] aor = null; private String instrFile = null; private int instrIdx = 0; private String instrName = null; private int instrStat = 0; private int miDev = -1; private int miPort = 0; private int miChn = -1; private float vol = 0; private int mute = 0; private boolean solo = false; /** Creates a new instance of SamplerChannel */ public SamplerChannel() { } /** * Creates a new instance of SamplerChannel and parses the information * about a specific sampler channel described by resultSet. * @param resultSet An array with information categories about a sampler channel. * @throws LscpException If the parse fail. */ public SamplerChannel(String[] resultSet) throws LscpException { for(String s : resultSet) if(!parse(s)) Client.getLogger().info(LscpI18n.getLogMsg("unknownLine", s)); } /** * Gets the sampler channel number. * @return The sampler channel number or -1 if the sampler channel number is not set. */ public int getChannelID() { return chnID; } /** * Sets the sampler channel number. * @param id The new sampler channel number. */ public void setChannelID(int id) { chnID = id; } /** * Gets the engine that is deployed on the sampler channel. * @return The engine that is deployed on the sampler channel * or null if there is no engine deployed yet for this sampler channel. */ public SamplerEngine getEngine() { return engine; } /** * Associates the specified sampler engine to this sampler channel. * @param engine A SamplerEngine instance containing the information * about the engine to be assigned to this channel. */ public void setEngine(SamplerEngine engine) { this.engine = engine; } /** * Gets the numerical ID of the audio output device which is currently connected * to this sampler channel to output the audio signal. * * @return The numerical ID of the audio output device or -1 if there is no * device connected to this sampler channel. */ public int getAudioOutputDevice() { return aoDevice; } /** * Gets the number of output channels the sampler channel offers. * @return The number of output channels the sampler channel offers. */ public int getAudioOutputChannels() { return aoChannels; } /** * Gets a list which reflects to which audio channel of the selected audio output device * each sampler output channel is routed to. * @return A list which reflects to which audio channel of the selected audio output device * each sampler output channel is routed to. */ public Integer[] getAudioOutputRouting() { return aor; } /** * Gets the file name of the loaded instrument. * @return The file name of the loaded instrument. * or null if there is no instrument yet loaded for this sampler channel. */ public String getInstrumentFile() { return instrFile; } /** * Gets the instrument index number of the loaded instrument. * @return The instrument index number of the loaded instrument. */ public int getInstrumentIndex() { return instrIdx; } /** * Gets the name of the loaded instrument. * @return The name of the loaded instrument or * null if there is no instrument loaded. */ public String getInstrumentName() { return instrName; } /** * Gets the instrument status - an integer values from 0 to 100 indicating loading * progress percentage for the instrument. Negative value indicates a loading exception. * Value of 100 indicates that the instrument is fully loaded. * @return The instrument status. */ public int getInstrumentStatus() { return instrStat; } /** * Gets the numerical ID of the MIDI input device which is currently connected * to this sampler channel to deliver MIDI input commands. * @return The numerical ID of the MIDI input device which is currently connected * to this sampler channel to deliver MIDI input commands or -1 if there is no device * connected to this sampler channel. */ public int getMidiInputDevice() { return miDev; } /** * Gets the port number of the MIDI input device. * @return The port number of the MIDI input device. */ public int getMidiInputPort() { return miPort; } /** * Gets the MIDI input channel number this sampler channel should listen to * or -1 to listen on all MIDI channels. * @return The MIDI input channel number this sampler channel should listen to * or -1 to listen on all MIDI channels. */ public int getMidiInputChannel() { return miChn; } /** * Gets the channel volume factor. Value less then 1.0 means attenuation, * value greater then 1.0 means amplification. * @return The channel volume factor. */ public float getVolume() { return vol; } /** * Determines whether this channel is muted. * @return true if the channel is muted, false otherwise. */ public boolean isMuted() { return mute != 0; } /** * Determines whether this channel is muted because of the presence of a solo channel. * All channels, muted because of the presence of a solo channel, will be * automatically unmuted when there are no solo channels left. * @return true if the channel is muted because of the presence of a solo * channel, false otherwise. */ public boolean isMutedBySolo() { return mute == MUTED_BY_SOLO; } /** * Determines whether this channel is a solo channel. * @return true if the channel is a solo channel, false otherwise. */ public boolean isSoloChannel() { return solo; } /** * Parses a line of text. * @param s The string to be parsed. * @return true if the line has been processed, false otherwise. * @throws LscpException If some error occurs. */ public boolean parse(String s) throws LscpException { if(s.startsWith("ENGINE_NAME: ")) { s = s.substring("ENGINE_NAME: ".length()); if(s.equals("NONE")) engine = null; else { engine = new SamplerEngine(); engine.setName(s); } } else if(s.startsWith("AUDIO_OUTPUT_DEVICE: ")) { s = s.substring("AUDIO_OUTPUT_DEVICE: ".length()); if(s.equals("NONE")) aoDevice = -1; else aoDevice = Parser.parseInt(s); } else if(s.startsWith("AUDIO_OUTPUT_CHANNELS: ")) { s = s.substring("AUDIO_OUTPUT_CHANNELS: ".length()); if(s.equals("NONE")) aoChannels = -1; else aoChannels = Parser.parseInt(s); } else if(s.startsWith("AUDIO_OUTPUT_ROUTING: ")) { s = s.substring("AUDIO_OUTPUT_ROUTING: ".length()); aor = Parser.parseIntList(s); } else if(s.startsWith("INSTRUMENT_FILE: ")) { s = s.substring("INSTRUMENT_FILE: ".length()); if(s.equals("NONE")) instrFile = null; else instrFile = s; } else if(s.startsWith("INSTRUMENT_NR: ")) { s = s.substring("INSTRUMENT_NR: ".length()); if(s.equals("NONE")) instrIdx = -1; else instrIdx = Parser.parseInt(s); } else if(s.startsWith("INSTRUMENT_NAME: ")) { s = s.substring("INSTRUMENT_NAME: ".length()); if(s.equals("NONE")) instrName = null; else instrName = s; } else if(s.startsWith("INSTRUMENT_STATUS: ")) { s = s.substring("INSTRUMENT_STATUS: ".length()); instrStat = Parser.parseInt(s); } else if(s.startsWith("MIDI_INPUT_DEVICE: ")) { s = s.substring("MIDI_INPUT_DEVICE: ".length()); if(s.equals("NONE")) miDev = -1; else miDev = Parser.parseInt(s); } else if(s.startsWith("MIDI_INPUT_PORT: ")) { s = s.substring("MIDI_INPUT_PORT: ".length()); if(s.equals("NONE")) miPort = -1; else miPort = Parser.parseInt(s); } else if(s.startsWith("MIDI_INPUT_CHANNEL: ")) { s = s.substring("MIDI_INPUT_CHANNEL: ".length()); if(s.equals("ALL")) miChn = -1; else miChn = Parser.parseInt(s); } else if(s.startsWith("VOLUME: ")) { s = s.substring("VOLUME: ".length()); try { vol = Float.parseFloat(s); } catch(NumberFormatException x) { throw new LscpException ( LscpI18n.getLogMsg("CommandFailed!"), x );} } else if(s.startsWith("MUTE: ")) { s = s.substring("MUTE: ".length()); if(s.equals("MUTED_BY_SOLO")) mute = MUTED_BY_SOLO; else mute = Boolean.parseBoolean(s) ? 1 : 0; } else if(s.startsWith("SOLO: ")) { s = s.substring("SOLO: ".length()); solo = Boolean.parseBoolean(s); } else return false; return true; } /** * Returns the numerical ID of this sampler channel. * @return The numerical ID of this sampler channel. */ public String toString() { return String.valueOf(getChannelID()); } }