/[svn]/jsampler/trunk/src/org/jsampler/CC.java
ViewVC logotype

Diff of /jsampler/trunk/src/org/jsampler/CC.java

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1285 by iliev, Fri Aug 10 19:55:03 2007 UTC revision 1786 by iliev, Wed Oct 8 22:38:15 2008 UTC
# Line 1  Line 1 
1  /*  /*
2   *   JSampler - a java front-end for LinuxSampler   *   JSampler - a java front-end for LinuxSampler
3   *   *
4   *   Copyright (C) 2005-2007 Grigor Iliev <grigor@grigoriliev.com>   *   Copyright (C) 2005-2008 Grigor Iliev <grigor@grigoriliev.com>
5   *   *
6   *   This file is part of JSampler.   *   This file is part of JSampler.
7   *   *
# Line 25  package org.jsampler; Line 25  package org.jsampler;
25  import java.awt.event.ActionEvent;  import java.awt.event.ActionEvent;
26  import java.awt.event.ActionListener;  import java.awt.event.ActionListener;
27    
 import java.io.ByteArrayInputStream;  
28  import java.io.ByteArrayOutputStream;  import java.io.ByteArrayOutputStream;
29  import java.io.File;  import java.io.File;
30  import java.io.FileInputStream;  import java.io.FileInputStream;
# Line 40  import java.util.logging.Logger; Line 39  import java.util.logging.Logger;
39  import java.util.logging.SimpleFormatter;  import java.util.logging.SimpleFormatter;
40  import java.util.logging.StreamHandler;  import java.util.logging.StreamHandler;
41    
42    import javax.swing.SwingUtilities;
43  import javax.swing.Timer;  import javax.swing.Timer;
44    
45    import javax.swing.event.ChangeEvent;
46    import javax.swing.event.ChangeListener;
47    
48  import net.sf.juife.Task;  import net.sf.juife.Task;
49  import net.sf.juife.TaskQueue;  import net.sf.juife.TaskQueue;
50    
# Line 99  public class CC { Line 102  public class CC {
102          private final static TaskQueue taskQueue = new TaskQueue();          private final static TaskQueue taskQueue = new TaskQueue();
103          private final static Timer timer = new Timer(2000, null);          private final static Timer timer = new Timer(2000, null);
104                    
105            private static int connectionFailureCount = 0;
106            
107          /** Forbits the instantiation of this class. */          /** Forbits the instantiation of this class. */
108          private          private
109          CC() { }          CC() { }
# Line 132  public class CC { Line 137  public class CC {
137          scheduleTask(Task t) {          scheduleTask(Task t) {
138                  while(getTaskQueue().removeTask(t)) { }                  while(getTaskQueue().removeTask(t)) { }
139                                    
                 if(getTaskQueue().getPendingTaskCount() == 0) {  
                         if(t.equals(getTaskQueue().getRunningTask())) return;  
                 }  
                   
140                  getTaskQueue().add(t);                  getTaskQueue().add(t);
141          }          }
142                    
143          /**          /**
144             * Adds the specified task to the task queue only if the last
145             * task in the is not equal to <code>t</code>.
146             */
147            public static void
148            addTask(Task t) {
149                    Task[] tasks = getTaskQueue().getPendingTasks();
150                    if(tasks.length > 0 && tasks[tasks.length - 1].equals(t)) return;
151                    getTaskQueue().add(t);
152            }
153            
154            /**
155           * Gets the configuration of the current view.           * Gets the configuration of the current view.
156           */           */
157          public static JSViewConfig          public static JSViewConfig
158          getViewConfig() { return viewConfig; }          getViewConfig() { return viewConfig; }
159                    
160            public static JSPrefs
161            preferences() { return getViewConfig().preferences(); }
162            
163          /**          /**
164           * Sets the configuration of the current view.           * Sets the configuration of the current view.
165           */           */
# Line 229  public class CC { Line 244  public class CC {
244                          run() { if(handler != null) handler.flush(); }                          run() { if(handler != null) handler.flush(); }
245                  }, 1000, 1000);                  }, 1000, 1000);
246                                    
247                  CC.getLogger().fine("CC.jsStarted");                  getLogger().fine("CC.jsStarted");
248                                    
249                  HF.setUIDefaultFont(Prefs.getInterfaceFont());                  HF.setUIDefaultFont(Prefs.getInterfaceFont());
250                                    
                 getClient().setServerAddress(Prefs.getLSAddress());  
                 getClient().setServerPort(Prefs.getLSPort());  
                   
251                  timer.setRepeats(false);                  timer.setRepeats(false);
252                                    
253                  timer.addActionListener(new ActionListener() {                  timer.addActionListener(new ActionListener() {
# Line 265  public class CC { Line 277  public class CC {
277                  getClient().removeVoiceCountListener(getHandler());                  getClient().removeVoiceCountListener(getHandler());
278                  getClient().addVoiceCountListener(getHandler());                  getClient().addVoiceCountListener(getHandler());
279                                    
280                    getClient().removeTotalStreamCountListener(getHandler());
281                    getClient().addTotalStreamCountListener(getHandler());
282                    
283                  getClient().removeTotalVoiceCountListener(getHandler());                  getClient().removeTotalVoiceCountListener(getHandler());
284                  getClient().addTotalVoiceCountListener(getHandler());                  getClient().addTotalVoiceCountListener(getHandler());
285                                    
# Line 294  public class CC { Line 309  public class CC {
309                                    
310                  getClient().removeGlobalInfoListener(getHandler());                  getClient().removeGlobalInfoListener(getHandler());
311                  getClient().addGlobalInfoListener(getHandler());                  getClient().addGlobalInfoListener(getHandler());
312                    
313                    getClient().removeChannelMidiDataListener(getHandler());
314                    getClient().addChannelMidiDataListener(getHandler());
315                    
316                    CC.addConnectionEstablishedListener(new ActionListener() {
317                            public void
318                            actionPerformed(ActionEvent e) {
319                                    connectionFailureCount = 0;
320                            }
321                    });
322          }          }
323                    
324          /**          /**
# Line 312  public class CC { Line 337  public class CC {
337                          }                          }
338                  }                  }
339                                    
340                  CC.getMainFrame().installJSamplerHome();                  getMainFrame().installJSamplerHome();
341          }          }
342                    
343          /**          /**
# Line 369  public class CC { Line 394  public class CC {
394          public static OrchestraListModel          public static OrchestraListModel
395          getOrchestras() { return orchestras; }          getOrchestras() { return orchestras; }
396                    
397            private final static ServerList servers = new ServerList();
398            
399            /** Returns the server list. */
400            public static ServerList
401            getServerList() { return servers; }
402            
403            private static ServerListListener serverListListener = new ServerListListener();
404            
405            private static class ServerListListener implements ChangeListener {
406                    @Override
407                    public void
408                    stateChanged(ChangeEvent e) {
409                            saveServerList();
410                    }
411            }
412            
413            private static final Vector<ChangeListener> idtmListeners = new Vector<ChangeListener>();
414          private static InstrumentsDbTreeModel instrumentsDbTreeModel = null;          private static InstrumentsDbTreeModel instrumentsDbTreeModel = null;
415            
416          /**          /**
417           * Gets the tree model of the instruments database.           * Gets the tree model of the instruments database.
418           * If the currently used view doesn't have instruments           * If the currently used view doesn't have instruments
419           * database support the tree model is initialized on first use.           * database support the tree model is initialized on first use.
420           * @return The tree model of the instruments database or           * @return The tree model of the instruments database or
421           * <code>null</code> if the backend doesn't have instruments database support.           * <code>null</code> if the backend doesn't have instruments database support.
422           * @see org.jsampler.view.JSMainFrame#getInstrumentsDbSupport           * @see org.jsampler.view.JSViewConfig#getInstrumentsDbSupport
423           */           */
424          public static InstrumentsDbTreeModel          public static InstrumentsDbTreeModel
425          getInstrumentsDbTreeModel() {          getInstrumentsDbTreeModel() {
426                  if(!CC.getSamplerModel().getServerInfo().hasInstrumentsDbSupport()) return null;                  if(getSamplerModel().getServerInfo() == null) return null;
427                    if(!getSamplerModel().getServerInfo().hasInstrumentsDbSupport()) return null;
428                                    
429                  if(instrumentsDbTreeModel == null) {                  if(instrumentsDbTreeModel == null) {
430                          instrumentsDbTreeModel = new InstrumentsDbTreeModel();                          instrumentsDbTreeModel = new InstrumentsDbTreeModel();
431                            for(ChangeListener l : idtmListeners) l.stateChanged(null);
432                  }                  }
433                                    
434                  return instrumentsDbTreeModel;                  return instrumentsDbTreeModel;
435          }          }
436                    
437            public static void
438            addInstrumentsDbChangeListener(ChangeListener l) {
439                    idtmListeners.add(l);
440            }
441            
442            public static void
443            removeInstrumentsDbChangeListener(ChangeListener l) {
444                    idtmListeners.remove(l);
445            }
446            
447            private static final LostFilesModel lostFilesModel = new LostFilesModel();
448            
449            public static LostFilesModel
450            getLostFilesModel() { return lostFilesModel; }
451            
452          /**          /**
453           * Loads the orchestras described in <code>&lt;jsampler_home&gt;/orchestras.xml</code>.           * Loads the orchestras described in <code>&lt;jsampler_home&gt;/orchestras.xml</code>.
454           * If file with name <code>orchestras.xml.bkp</code> exist in the JSampler's home           * If file with name <code>orchestras.xml.bkp</code> exist in the JSampler's home
# Line 400  public class CC { Line 460  public class CC {
460          loadOrchestras() {          loadOrchestras() {
461                  if(getJSamplerHome() == null) return;                  if(getJSamplerHome() == null) return;
462                                    
                 //TODO: This should be removed in the next release (including loadOrchestras0())  
                 File f2 = new File(getJSamplerHome() + File.separator + "orchestras.xml");  
                 if(!f2.isFile()) {  
                         loadOrchestras0();  
                         saveOrchestras();  
                         return;  
                 }  
                 ///////  
                   
463                  try {                  try {
464                          String s = getJSamplerHome();                          String s = getJSamplerHome();
                         if(s == null) return;  
465                                                    
466                          File f = new File(s + File.separator + "orchestras.xml.bkp");                          File f = new File(s + File.separator + "orchestras.xml.bkp");
467                          if(f.isFile()) HF.createBackup("orchestras.xml.bkp", "orchestras.xml.rec");                          if(f.isFile()) HF.createBackup("orchestras.xml.bkp", "orchestras.xml.rec");
# Line 424  public class CC { Line 474  public class CC {
474                  } catch(Exception x) {                  } catch(Exception x) {
475                          getLogger().log(Level.INFO, HF.getErrorMessage(x), x);                          getLogger().log(Level.INFO, HF.getErrorMessage(x), x);
476                  }                  }
477                    
478                    getOrchestras().addOrchestraListListener(getHandler());
479          }          }
480                    
481                    
# Line 440  public class CC { Line 492  public class CC {
492                  for(int i = 0; i < getOrchestras().getOrchestraCount(); i++) {                  for(int i = 0; i < getOrchestras().getOrchestraCount(); i++) {
493                          getOrchestras().getOrchestra(i).addOrchestraListener(getHandler());                          getOrchestras().getOrchestra(i).addOrchestraListener(getHandler());
494                  }                  }
                 getOrchestras().addOrchestraListListener(getHandler());  
         }  
           
         private static void  
         loadOrchestras0() {  
                 String s = Prefs.getOrchestras();  
                 if(s == null) return;  
                   
                 ByteArrayInputStream bais = new ByteArrayInputStream(s.getBytes());  
                 Document doc = DOMUtils.readObject(bais);  
                   
                 try { getOrchestras().readObject(doc.getDocumentElement()); }  
                 catch(Exception x) { HF.showErrorMessage(x, "Loading orchestras: "); }  
495          }          }
496                    
497          private static void          private static void
# Line 463  public class CC { Line 502  public class CC {
502                                                    
503                          HF.createBackup("orchestras.xml", "orchestras.xml.bkp");                          HF.createBackup("orchestras.xml", "orchestras.xml.bkp");
504                                                    
505                          FileOutputStream fos;                          FileOutputStream fos2;
506                          fos = new FileOutputStream(s + File.separator + "orchestras.xml", false);                          fos2 = new FileOutputStream(s + File.separator + "orchestras.xml", false);
507                                                    
508                          Document doc = DOMUtils.createEmptyDocument();                          Document doc = DOMUtils.createEmptyDocument();
509                                    
# Line 475  public class CC { Line 514  public class CC {
514                                                    
515                          doc.replaceChild(node.getFirstChild(), node);                          doc.replaceChild(node.getFirstChild(), node);
516                                    
517                          DOMUtils.writeObject(doc, fos);                          DOMUtils.writeObject(doc, fos2);
518                                                    
519                          fos.close();                          fos2.close();
520                                                    
521                          HF.deleteFile("orchestras.xml.bkp");                          HF.deleteFile("orchestras.xml.bkp");
522                  } catch(Exception x) {                  } catch(Exception x) {
# Line 487  public class CC { Line 526  public class CC {
526          }          }
527                    
528          /**          /**
529             * Loads the servers' info described in <code>&lt;jsampler_home&gt;/servers.xml</code>.
530             * If file with name <code>servers.xml.bkp</code> exist in the JSampler's home
531             * directory, this means that the last save has failed. In that case a recovery file
532             * <code>servers.xml.rec</code> is created and a recovery procedure
533             * will be initiated.
534             */
535            public static void
536            loadServerList() {
537                    if(getJSamplerHome() == null) return;
538                    
539                    try {
540                            String s = getJSamplerHome();
541                            
542                            File f = new File(s + File.separator + "servers.xml.bkp");
543                            if(f.isFile()) HF.createBackup("servers.xml.bkp", "servers.xml.rec");
544                            
545                            FileInputStream fis;
546                            fis = new FileInputStream(s + File.separator + "servers.xml");
547                            
548                            loadServerList(fis);
549                            fis.close();
550                    } catch(Exception x) {
551                            getLogger().log(Level.INFO, HF.getErrorMessage(x), x);
552                    }
553                    
554                    getServerList().addChangeListener(serverListListener);
555                    
556                    /* We should have at least one server to connect. */
557                    if(getServerList().getServerCount() == 0) {
558                            Server server = new Server();
559                            server.setName("127.0.0.1:8888");
560                            server.setAddress("127.0.0.1");
561                            server.setPort(8888);
562                            getServerList().addServer(server);
563                    }
564            }
565            
566            
567            private static void
568            loadServerList(InputStream in) {
569                    Document doc = DOMUtils.readObject(in);
570                    
571                    try { getServerList().readObject(doc.getDocumentElement()); }
572                    catch(Exception x) {
573                            HF.showErrorMessage(x, "Loading server list: ");
574                            return;
575                    }
576            }
577            
578            private static void
579            saveServerList() {
580                    try {
581                            String s = getJSamplerHome();
582                            if(s == null) return;
583                            
584                            HF.createBackup("servers.xml", "servers.xml.bkp");
585                            
586                            FileOutputStream fos2;
587                            fos2 = new FileOutputStream(s + File.separator + "servers.xml", false);
588                            
589                            Document doc = DOMUtils.createEmptyDocument();
590                    
591                            Node node = doc.createElement("temp");
592                            doc.appendChild(node);
593                            
594                            getServerList().writeObject(doc, doc.getDocumentElement());
595                            
596                            doc.replaceChild(node.getFirstChild(), node);
597                    
598                            DOMUtils.writeObject(doc, fos2);
599                            
600                            fos2.close();
601                            
602                            HF.deleteFile("servers.xml.bkp");
603                    } catch(Exception x) {
604                            HF.showErrorMessage(x, "Saving server list: ");
605                            return;
606                    }
607            }
608            
609            /**
610           * The exit point of the application which ensures clean exit with default exit status 0.           * The exit point of the application which ensures clean exit with default exit status 0.
611           *  @see #cleanExit(int i)           *  @see #cleanExit(int i)
612           */           */
# Line 499  public class CC { Line 619  public class CC {
619           */           */
620          public static void          public static void
621          cleanExit(int i) {          cleanExit(int i) {
622                  CC.getLogger().fine("CC.jsEnded");                  getLogger().fine("CC.jsEnded");
623                    try { getClient().disconnect(); } // FIXME: this might block the EDT
624                    catch(Exception x) { x.printStackTrace(); }
625                    if(backendProcess != null) backendProcess.destroy();
626                    backendProcess = null;
627                    fireBackendProcessEvent();
628                  System.exit(i);                  System.exit(i);
629          }          }
630                    
# Line 532  public class CC { Line 657  public class CC {
657                  for(ActionListener l : listeners) l.actionPerformed(e);                  for(ActionListener l : listeners) l.actionPerformed(e);
658          }          }
659                    
660            private static final Vector<ActionListener> ceListeners = new Vector<ActionListener>();
661            
662            /**
663             * Registers the specified listener to be notified when
664             * jsampler is connected successfully to LinuxSampler.
665             * @param l The <code>ActionListener</code> to register.
666             */
667            public static void
668            addConnectionEstablishedListener(ActionListener l) { ceListeners.add(l); }
669            
670            /**
671             * Removes the specified listener.
672             * @param l The <code>ActionListener</code> to remove.
673             */
674            public static void
675            removeConnectionEstablishedListener(ActionListener l) { ceListeners.remove(l); }
676            
677            private static void
678            fireConnectionEstablishedEvent() {
679                    ActionEvent e = new ActionEvent(CC.class, ActionEvent.ACTION_PERFORMED, null);
680                    for(ActionListener l : ceListeners) l.actionPerformed(e);
681            }
682            
683          private static final SamplerModel samplerModel = new DefaultSamplerModel();          private static final SamplerModel samplerModel = new DefaultSamplerModel();
684                    
685          /**          /**
# Line 542  public class CC { Line 690  public class CC {
690          getSamplerModel() { return samplerModel; }          getSamplerModel() { return samplerModel; }
691                    
692          /**          /**
693             * Connects to LinuxSampler.
694             */
695            public static void
696            connect() { initSamplerModel(); }
697            
698            /**
699           * Reconnects to LinuxSampler.           * Reconnects to LinuxSampler.
700           */           */
701          public static void          public static void
702          reconnect() {          reconnect() { initSamplerModel(getCurrentServer()); }
703                  initSamplerModel();          
704                  fireReconnectEvent();          private static Server currentServer = null;
705            
706            /**
707             * Gets the server, to which the frontend is going to connect
708             * or is already connected.
709             */
710            public static Server
711            getCurrentServer() { return currentServer; }
712            
713            /**
714             * Sets the current server.
715             */
716            public static void
717            setCurrentServer(Server server) {
718                    if(server == currentServer) return;
719                    connectionFailureCount = 0;
720                    currentServer = server;
721          }          }
722                    
723          /**          /**
724           * This method updates the information about the backend state.           * Sets the LSCP client's read timeout.
725             * @param timeout The new timeout value (in seconds).
726           */           */
727          public static void          public static void
728            setClientReadTimeout(int timeout) {
729                    getTaskQueue().add(new Global.SetClientReadTimeout(timeout));
730            }
731            
732            /**
733             * This method updates the information about the backend state.
734             */
735            private static void
736          initSamplerModel() {          initSamplerModel() {
737                    Server srv = getMainFrame().getServer();
738                    if(srv == null) return;
739                    initSamplerModel(srv);
740            }
741            
742            /**
743             * This method updates the information about the backend state.
744             */
745            private static void
746            initSamplerModel(Server srv) {
747                    setCurrentServer(srv);
748                    final SetServerAddress ssa = new SetServerAddress(srv.getAddress(), srv.getPort());
749                    
750                  final DefaultSamplerModel model = (DefaultSamplerModel)getSamplerModel();                  final DefaultSamplerModel model = (DefaultSamplerModel)getSamplerModel();
751                                    
752                  final Global.GetServerInfo gsi = new Global.GetServerInfo();                  final Global.GetServerInfo gsi = new Global.GetServerInfo();
# Line 631  public class CC { Line 823  public class CC {
823                                          gfs.addTaskListener(new GetFxSendsListener());                                          gfs.addTaskListener(new GetFxSendsListener());
824                                          getTaskQueue().add(gfs);                                          getTaskQueue().add(gfs);
825                                  }                                  }
826                                    
827                                    // TODO: This should be done after the fx sends are set
828                                    //CC.getSamplerModel().setModified(false);
829                          }                          }
830                  });                  });
831                                    
832                                    
833                  final Connect cnt = new Connect();                  final Connect cnt = new Connect();
834                    boolean b = preferences().getBoolProperty(JSPrefs.LAUNCH_BACKEND_LOCALLY);
835                    if(b && srv.isLocal() && backendProcess == null) cnt.setSilent(true);
836                  cnt.addTaskListener(new TaskListener() {                  cnt.addTaskListener(new TaskListener() {
837                          public void                          public void
838                          taskPerformed(TaskEvent e) {                          taskPerformed(TaskEvent e) {
839                                  if(cnt.doneWithErrors()) return;                                  if(cnt.doneWithErrors()) {
840                                            onConnectFailure();
841                                            return;
842                                    }
843                                                                    
844                                  getTaskQueue().add(gsi);                                  getTaskQueue().add(gsi);
845                                  getTaskQueue().add(gaod);                                  getTaskQueue().add(gaod);
# Line 649  public class CC { Line 849  public class CC {
849                                  getTaskQueue().add(mgim);                                  getTaskQueue().add(mgim);
850                                  getTaskQueue().add(new Midi.UpdateDevices());                                  getTaskQueue().add(new Midi.UpdateDevices());
851                                  getTaskQueue().add(new Audio.UpdateDevices());                                  getTaskQueue().add(new Audio.UpdateDevices());
852                                  getTaskQueue().add(uc);                                  addTask(uc);
853                                    
854                                    fireConnectionEstablishedEvent();
855                            }
856                    });
857                    
858                    ssa.addTaskListener(new TaskListener() {
859                            public void
860                            taskPerformed(TaskEvent e) {
861                                    int t = preferences().getIntProperty(JSPrefs.SOCKET_READ_TIMEOUT);
862                                    CC.setClientReadTimeout(t * 1000);
863                                    CC.getTaskQueue().add(cnt);
864                            }
865                    });
866                    
867                    getSamplerModel().reset();
868                    if(instrumentsDbTreeModel != null) {
869                            instrumentsDbTreeModel.reset();
870                            instrumentsDbTreeModel = null;
871                    }
872                    
873                    getTaskQueue().removePendingTasks();
874                    getTaskQueue().add(ssa);
875                    
876                    fireReconnectEvent();
877            }
878            
879            private static void
880            onConnectFailure() {
881                    connectionFailureCount++;
882                    if(connectionFailureCount > 50) { // to prevent eventual infinite loop
883                            getLogger().warning("Reached maximum number of connection failures");
884                            return;
885                    }
886                    
887                    try {
888                            if(launchBackend()) {
889                                    int i = preferences().getIntProperty(JSPrefs.BACKEND_LAUNCH_DELAY);
890                                    if(i < 1) {
891                                            initSamplerModel(getCurrentServer());
892                                            return;
893                                    }
894                                    
895                                    LaunchBackend lb = new LaunchBackend(i, getBackendMonitor());
896                                    //CC.getTaskQueue().add(lb);
897                                    new Thread(lb).start();
898                                    return;
899                          }                          }
900                    } catch(Exception x) {
901                            final String s = JSI18n.i18n.getError("CC.failedToLaunchBackend");
902                            CC.getLogger().log(Level.INFO, s, x);
903                            
904                            SwingUtilities.invokeLater(new Runnable() {
905                                    public void
906                                    run() { HF.showErrorMessage(s); }
907                            });
908                            return;
909                    }
910                    
911                    retryToConnect();
912            }
913            
914            private static void
915            retryToConnect() {
916                    javax.swing.SwingUtilities.invokeLater(new Runnable() {
917                            public void
918                            run() { changeBackend(); }
919                  });                  });
920                  getTaskQueue().add(cnt);          }
921            
922            public static void
923            changeBackend() {
924                    Server s = getMainFrame().getServer(true);
925                    if(s != null) {
926                            connectionFailureCount = 0; // cleared because this change due to user interaction
927                            initSamplerModel(s);
928                    }
929            }
930            
931            private static final Vector<ActionListener> pListeners = new Vector<ActionListener>();
932            
933            /**
934             * Registers the specified listener to be notified when
935             * backend process is created/terminated.
936             * @param l The <code>ActionListener</code> to register.
937             */
938            public static void
939            addBackendProcessListener(ActionListener l) { pListeners.add(l); }
940            
941            /**
942             * Removes the specified listener.
943             * @param l The <code>ActionListener</code> to remove.
944             */
945            public static void
946            removeBackendProcessListener(ActionListener l) { pListeners.remove(l); }
947            
948            private static void
949            fireBackendProcessEvent() {
950                    ActionEvent e = new ActionEvent(CC.class, ActionEvent.ACTION_PERFORMED, null);
951                    for(ActionListener l : pListeners) l.actionPerformed(e);
952            }
953            
954            private static Process backendProcess = null;
955            
956            public static Process
957            getBackendProcess() { return backendProcess; }
958            
959            private static final Object backendMonitor = new Object();
960            
961            public static Object
962            getBackendMonitor() { return backendMonitor; }
963            
964            private static boolean
965            launchBackend() throws Exception {
966                    if(backendProcess != null) {
967                            try {
968                                    int i = backendProcess.exitValue();
969                                    getLogger().info("Backend exited with exit value " + i);
970                                    backendProcess = null;
971                                    fireBackendProcessEvent();
972                            } catch(IllegalThreadStateException x) { return false; }
973                    }
974                    
975                    if(!preferences().getBoolProperty(JSPrefs.LAUNCH_BACKEND_LOCALLY)) return false;
976                    if(connectionFailureCount > 1) return false;
977                    
978                    Server  s = getCurrentServer();
979                    if(s != null && s.isLocal()) {
980                            String cmd = preferences().getStringProperty(JSPrefs.BACKEND_LAUNCH_COMMAND);
981                            backendProcess = Runtime.getRuntime().exec(cmd);
982                            fireBackendProcessEvent();
983                            return true;
984                    }
985                    
986                    return false;
987          }          }
988                    
989          private static class GetFxSendsListener implements TaskListener {          private static class GetFxSendsListener implements TaskListener {
990                    @Override
991                  public void                  public void
992                  taskPerformed(TaskEvent e) {                  taskPerformed(TaskEvent e) {
993                          Channel.GetFxSends gfs = (Channel.GetFxSends)e.getSource();                          Channel.GetFxSends gfs = (Channel.GetFxSends)e.getSource();
# Line 689  public class CC { Line 1021  public class CC {
1021          exportInstrMapsToLscpScript(Client lscpClient) {          exportInstrMapsToLscpScript(Client lscpClient) {
1022                  try {                  try {
1023                          lscpClient.removeAllMidiInstrumentMaps();                          lscpClient.removeAllMidiInstrumentMaps();
1024                          MidiInstrumentMap[] maps = CC.getSamplerModel().getMidiInstrumentMaps();                          MidiInstrumentMap[] maps = getSamplerModel().getMidiInstrumentMaps();
1025                          for(int i = 0; i < maps.length; i++) {                          for(int i = 0; i < maps.length; i++) {
1026                                  lscpClient.addMidiInstrumentMap(maps[i].getName());                                  lscpClient.addMidiInstrumentMap(maps[i].getName());
1027                                  exportInstrumentsToLscpScript(i, maps[i], lscpClient);                                  exportInstrumentsToLscpScript(i, maps[i], lscpClient);
1028                          }                          }
1029                  } catch(Exception e) {                  } catch(Exception e) {
1030                          CC.getLogger().log(Level.FINE, HF.getErrorMessage(e), e);                          getLogger().log(Level.FINE, HF.getErrorMessage(e), e);
1031                          HF.showErrorMessage(e);                          HF.showErrorMessage(e);
1032                  }                  }
1033          }          }
# Line 704  public class CC { Line 1036  public class CC {
1036          exportInstrumentsToLscpScript(int mapId, MidiInstrumentMap map, Client lscpClient)          exportInstrumentsToLscpScript(int mapId, MidiInstrumentMap map, Client lscpClient)
1037                                                                                  throws Exception {                                                                                  throws Exception {
1038                    
1039                    boolean b = preferences().getBoolProperty(JSPrefs.LOAD_MIDI_INSTRUMENTS_IN_BACKGROUND);
1040                    
1041                  for(MidiInstrument i : map.getAllMidiInstruments()) {                  for(MidiInstrument i : map.getAllMidiInstruments()) {
1042                          lscpClient.mapMidiInstrument(mapId, i.getInfo().getEntry(), i.getInfo());                          lscpClient.mapMidiInstrument(mapId, i.getInfo().getEntry(), i.getInfo(), b);
1043                  }                  }
1044          }          }
1045                    
1046          public static String          public static String
1047          exportSessionToLscpScript() {          exportSessionToLscpScript() {
1048                    getSamplerModel().setModified(false);
1049                    
1050                  StringBuffer sb = new StringBuffer("# Exported by: ");                  StringBuffer sb = new StringBuffer("# Exported by: ");
1051                  sb.append("JSampler - a java front-end for LinuxSampler\r\n# Version: ");                  sb.append("JSampler - a java front-end for LinuxSampler\r\n# Version: ");
1052                  sb.append(JSampler.VERSION).append("\r\n");                  sb.append(JSampler.VERSION).append("\r\n");
# Line 725  public class CC { Line 1061  public class CC {
1061                          sb.append(out.toString());                          sb.append(out.toString());
1062                          out.reset();                          out.reset();
1063                          sb.append("\r\n");                          sb.append("\r\n");
1064                          lscpClient.setVolume(CC.getSamplerModel().getVolume());                          lscpClient.setVolume(getSamplerModel().getVolume());
1065                          sb.append(out.toString());                          sb.append(out.toString());
1066                          out.reset();                          out.reset();
1067                          sb.append("\r\n");                          sb.append("\r\n");
1068                  } catch(Exception e) { CC.getLogger().log(Level.FINE, HF.getErrorMessage(e), e); }                  } catch(Exception e) { getLogger().log(Level.FINE, HF.getErrorMessage(e), e); }
1069                                                                    
1070                  MidiDeviceModel[] mDevs = getSamplerModel().getMidiDevices();                  MidiDeviceModel[] mDevs = getSamplerModel().getMidiDevices();
1071                  for(int i = 0; i < mDevs.length; i++) {                  for(int i = 0; i < mDevs.length; i++) {
# Line 747  public class CC { Line 1083  public class CC {
1083                          sb.append("\r\n");                          sb.append("\r\n");
1084                  }                  }
1085                                    
1086                    boolean b = preferences().getBoolProperty(JSPrefs.EXPORT_MIDI_MAPS_TO_SESSION_SCRIPT);
1087                    if(b) {
1088                            exportInstrMapsToLscpScript(lscpClient);
1089                            sb.append(out.toString());
1090                            out.reset();
1091                            sb.append("\r\n");
1092                    }
1093                    
1094                  SamplerChannelModel[] channels = getSamplerModel().getChannels();                  SamplerChannelModel[] channels = getSamplerModel().getChannels();
1095                                    
1096                  for(int i = 0; i < channels.length; i++) {                  for(int i = 0; i < channels.length; i++) {
1097                          SamplerChannelModel scm = getSamplerModel().getChannelById(i);                          SamplerChannelModel scm = channels[i];
1098                          exportChannelToLscpScript(scm.getChannelInfo(), i, lscpClient);                          exportChannelToLscpScript(scm.getChannelInfo(), i, lscpClient);
1099                          sb.append(out.toString());                          sb.append(out.toString());
1100                          out.reset();                          out.reset();
# Line 764  public class CC { Line 1108  public class CC {
1108                          sb.append("\r\n");                          sb.append("\r\n");
1109                  }                  }
1110                                    
1111                  exportInstrMapsToLscpScript(lscpClient);                  //sb.append(getViewConfig().exportSessionViewConfig());
                 sb.append(out.toString());  
                 out.reset();  
1112                                    
1113                  return sb.toString();                  return sb.toString();
1114          }          }
# Line 789  public class CC { Line 1131  public class CC {
1131                                  }                                  }
1132                          }                          }
1133                  } catch(Exception e) {                  } catch(Exception e) {
1134                          CC.getLogger().log(Level.FINE, HF.getErrorMessage(e), e);                          getLogger().log(Level.FINE, HF.getErrorMessage(e), e);
1135                  }                  }
1136          }          }
1137                    
# Line 809  public class CC { Line 1151  public class CC {
1151                                  }                                  }
1152                          }                          }
1153                  } catch(Exception e) {                  } catch(Exception e) {
1154                          CC.getLogger().log(Level.FINE, HF.getErrorMessage(e), e);                          getLogger().log(Level.FINE, HF.getErrorMessage(e), e);
1155                  }                  }
1156          }          }
1157                    
# Line 818  public class CC { Line 1160  public class CC {
1160                  try {                  try {
1161                          lscpCLient.addSamplerChannel();                          lscpCLient.addSamplerChannel();
1162                                                    
1163                          int i = chn.getMidiInputDevice();                          SamplerModel sm = getSamplerModel();
1164                          if(i != -1) lscpCLient.setChannelMidiInputDevice(chnId, i);                          int id = chn.getMidiInputDevice();
1165                          lscpCLient.setChannelMidiInputPort(chnId, chn.getMidiInputPort());                          if(id != -1) {
1166                          lscpCLient.setChannelMidiInputChannel(chnId, chn.getMidiInputChannel());                                  for(int i = 0; i < sm.getMidiDeviceCount(); i++) {
1167                                                                    if(sm.getMidiDevice(i).getDeviceId() == id) {
1168                          i = chn.getAudioOutputDevice();                                                  lscpCLient.setChannelMidiInputDevice(chnId, i);
1169                          if(i != -1) {                                                  break;
1170                                  lscpCLient.setChannelAudioOutputDevice(chnId, i);                                          }
1171                                    }
1172                                    lscpCLient.setChannelMidiInputPort(chnId, chn.getMidiInputPort());
1173                                    lscpCLient.setChannelMidiInputChannel(chnId, chn.getMidiInputChannel());
1174                            }
1175                            
1176                            if(chn.getEngine() != null) {
1177                                    lscpCLient.loadSamplerEngine(chn.getEngine().getName(), chnId);
1178                                    lscpCLient.setChannelVolume(chnId, chn.getVolume());
1179                                    int mapId = chn.getMidiInstrumentMapId();
1180                                    lscpCLient.setChannelMidiInstrumentMap(chnId, mapId);
1181                            }
1182                            
1183                            id = chn.getAudioOutputDevice();
1184                            if(id != -1) {
1185                                    for(int i = 0; i < sm.getAudioDeviceCount(); i++) {
1186                                            if(sm.getAudioDevice(i).getDeviceId() == id) {
1187                                                    lscpCLient.setChannelAudioOutputDevice(chnId, i);
1188                                                    break;
1189                                            }
1190                                    }
1191                                    
1192                                  Integer[] routing = chn.getAudioOutputRouting();                                  Integer[] routing = chn.getAudioOutputRouting();
1193                                                                    
1194                                  for(int j = 0; j < routing.length; j++) {                                  for(int j = 0; j < routing.length; j++) {
# Line 836  public class CC { Line 1199  public class CC {
1199                                  }                                  }
1200                          }                          }
1201                                                    
                         if(chn.getEngine() != null) {  
                                 lscpCLient.loadSamplerEngine(chn.getEngine().getName(), chnId);  
                                 lscpCLient.setChannelVolume(chnId, chn.getVolume());  
                         }  
                           
1202                          String s = chn.getInstrumentFile();                          String s = chn.getInstrumentFile();
1203                          i = chn.getInstrumentIndex();                          int i = chn.getInstrumentIndex();
1204                          if(s != null) lscpCLient.loadInstrument(s, i, chnId, true);                          if(s != null) lscpCLient.loadInstrument(s, i, chnId, true);
1205                                                    
1206                          if(chn.isMuted()) lscpCLient.setChannelMute(chnId, true);                          if(chn.isMuted()) lscpCLient.setChannelMute(chnId, true);
1207                          if(chn.isSoloChannel()) lscpCLient.setChannelSolo(chnId, true);                          if(chn.isSoloChannel()) lscpCLient.setChannelSolo(chnId, true);
1208                  } catch(Exception e) {                  } catch(Exception e) {
1209                          CC.getLogger().log(Level.FINE, HF.getErrorMessage(e), e);                          getLogger().log(Level.FINE, HF.getErrorMessage(e), e);
1210                  }                  }
1211          }          }
1212                    
# Line 867  public class CC { Line 1225  public class CC {
1225                                  }                                  }
1226                          }                          }
1227                  } catch(Exception e) {                  } catch(Exception e) {
1228                          CC.getLogger().log(Level.FINE, HF.getErrorMessage(e), e);                          getLogger().log(Level.FINE, HF.getErrorMessage(e), e);
1229                    }
1230            }
1231            
1232            public static void
1233            scheduleInTaskQueue(final Runnable r) {
1234                    Task dummy = new Global.DummyTask();
1235                    dummy.addTaskListener(new TaskListener() {
1236                            public void
1237                            taskPerformed(TaskEvent e) {
1238                                    javax.swing.SwingUtilities.invokeLater(r);
1239                            }
1240                    });
1241                    
1242                    getTaskQueue().add(dummy);
1243            }
1244            
1245            public static boolean
1246            verifyConnection() {
1247                    if(getCurrentServer() == null) {
1248                            HF.showErrorMessage(i18n.getError("CC.notConnected"));
1249                            return false;
1250                  }                  }
1251                    
1252                    return true;
1253          }          }
1254                    
1255                    
# Line 879  public class CC { Line 1260  public class CC {
1260                    
1261          private static class EventHandler implements ChannelCountListener, ChannelInfoListener,          private static class EventHandler implements ChannelCountListener, ChannelInfoListener,
1262                  FxSendCountListener, FxSendInfoListener, StreamCountListener, VoiceCountListener,                  FxSendCountListener, FxSendInfoListener, StreamCountListener, VoiceCountListener,
1263                  TotalVoiceCountListener, TaskQueueListener, OrchestraListener,                  TotalStreamCountListener, TotalVoiceCountListener, TaskQueueListener,
1264                  ListListener<OrchestraModel>, MidiInstrumentCountListener,                  OrchestraListener, ListListener<OrchestraModel>, MidiInstrumentCountListener,
1265                  MidiInstrumentInfoListener, GlobalInfoListener {                  MidiInstrumentInfoListener, GlobalInfoListener, ChannelMidiDataListener {
1266                                    
1267                  /** Invoked when the number of channels has changed. */                  /** Invoked when the number of channels has changed. */
1268                    @Override
1269                  public void                  public void
1270                  channelCountChanged( ChannelCountEvent e) {                  channelCountChanged( ChannelCountEvent e) {
1271                          getTaskQueue().add(new UpdateChannels());                          addTask(new UpdateChannels());
1272                  }                  }
1273                                    
1274                  /** Invoked when changes to the sampler channel has occured. */                  /** Invoked when changes to the sampler channel has occured. */
1275                    @Override
1276                  public void                  public void
1277                  channelInfoChanged(ChannelInfoEvent e) {                  channelInfoChanged(ChannelInfoEvent e) {
1278                          /*                          /*
# Line 927  public class CC { Line 1310  public class CC {
1310                   * Invoked when the number of effect sends                   * Invoked when the number of effect sends
1311                   * on a particular sampler channel has changed.                   * on a particular sampler channel has changed.
1312                   */                   */
1313                    @Override
1314                  public void                  public void
1315                  fxSendCountChanged(FxSendCountEvent e) {                  fxSendCountChanged(FxSendCountEvent e) {
1316                          getTaskQueue().add(new Channel.UpdateFxSends(e.getChannel()));                          getTaskQueue().add(new Channel.UpdateFxSends(e.getChannel()));
# Line 935  public class CC { Line 1319  public class CC {
1319                  /**                  /**
1320                   * Invoked when the settings of an effect sends are changed.                   * Invoked when the settings of an effect sends are changed.
1321                   */                   */
1322                    @Override
1323                  public void                  public void
1324                  fxSendInfoChanged(FxSendInfoEvent e) {                  fxSendInfoChanged(FxSendInfoEvent e) {
1325                          Task t = new Channel.UpdateFxSendInfo(e.getChannel(), e.getFxSend());                          Task t = new Channel.UpdateFxSendInfo(e.getChannel(), e.getFxSend());
# Line 945  public class CC { Line 1330  public class CC {
1330                   * Invoked when the number of active disk                   * Invoked when the number of active disk
1331                   * streams in a specific sampler channel has changed.                   * streams in a specific sampler channel has changed.
1332                   */                   */
1333                    @Override
1334                  public void                  public void
1335                  streamCountChanged(StreamCountEvent e) {                  streamCountChanged(StreamCountEvent e) {
1336                          SamplerChannelModel scm =                          SamplerChannelModel scm =
# Line 967  public class CC { Line 1353  public class CC {
1353                   * Invoked when the number of active voices                   * Invoked when the number of active voices
1354                   * in a specific sampler channel has changed.                   * in a specific sampler channel has changed.
1355                   */                   */
1356                    @Override
1357                  public void                  public void
1358                  voiceCountChanged(VoiceCountEvent e) {                  voiceCountChanged(VoiceCountEvent e) {
1359                          SamplerChannelModel scm =                          SamplerChannelModel scm =
# Line 985  public class CC { Line 1372  public class CC {
1372                          scm.setVoiceCount(e.getVoiceCount());                          scm.setVoiceCount(e.getVoiceCount());
1373                  }                  }
1374                                    
1375                    /** Invoked when the total number of active streams has changed. */
1376                    @Override
1377                    public void
1378                    totalStreamCountChanged(TotalStreamCountEvent e) {
1379                            getSamplerModel().updateActiveStreamsInfo(e.getTotalStreamCount());
1380                    }
1381                    
1382                  /** Invoked when the total number of active voices has changed. */                  /** Invoked when the total number of active voices has changed. */
1383                    @Override
1384                  public void                  public void
1385                  totalVoiceCountChanged(TotalVoiceCountEvent e) {                  totalVoiceCountChanged(TotalVoiceCountEvent e) {
1386                          getTaskQueue().add(new UpdateTotalVoiceCount());                          getTaskQueue().add(new UpdateTotalVoiceCount());
1387                  }                  }
1388                                    
1389                  /** Invoked when the number of MIDI instruments in a MIDI instrument map is changed. */                  /** Invoked when the number of MIDI instruments in a MIDI instrument map is changed. */
1390                    @Override
1391                  public void                  public void
1392                  instrumentCountChanged(MidiInstrumentCountEvent e) {                  instrumentCountChanged(MidiInstrumentCountEvent e) {
1393                          getTaskQueue().add(new Midi.UpdateInstruments(e.getMapId()));                          scheduleTask(new Midi.UpdateInstruments(e.getMapId()));
1394                  }                  }
1395                                    
1396                  /** Invoked when a MIDI instrument in a MIDI instrument map is changed. */                  /** Invoked when a MIDI instrument in a MIDI instrument map is changed. */
1397                    @Override
1398                  public void                  public void
1399                  instrumentInfoChanged(MidiInstrumentInfoEvent e) {                  instrumentInfoChanged(MidiInstrumentInfoEvent e) {
1400                          Task t = new Midi.UpdateInstrumentInfo (                          Task t = new Midi.UpdateInstrumentInfo (
# Line 1008  public class CC { Line 1405  public class CC {
1405                  }                  }
1406                                    
1407                  /** Invoked when the global volume of the sampler is changed. */                  /** Invoked when the global volume of the sampler is changed. */
1408                    @Override
1409                  public void                  public void
1410                  volumeChanged(GlobalInfoEvent e) {                  volumeChanged(GlobalInfoEvent e) {
1411                          getSamplerModel().setVolume(e.getVolume());                          getSamplerModel().setVolume(e.getVolume());
# Line 1017  public class CC { Line 1415  public class CC {
1415                   * Invoked to indicate that the state of a task queue is changed.                   * Invoked to indicate that the state of a task queue is changed.
1416                   * This method is invoked only from the event-dispatching thread.                   * This method is invoked only from the event-dispatching thread.
1417                   */                   */
1418                    @Override
1419                  public void                  public void
1420                  stateChanged(TaskQueueEvent e) {                  stateChanged(TaskQueueEvent e) {
1421                          switch(e.getEventID()) {                          switch(e.getEventID()) {
# Line 1027  public class CC { Line 1426  public class CC {
1426                                  break;                                  break;
1427                          case TASK_DONE:                          case TASK_DONE:
1428                                  EnhancedTask t = (EnhancedTask)e.getSource();                                  EnhancedTask t = (EnhancedTask)e.getSource();
1429                                  if(t.doneWithErrors() && !t.isStopped()) {                                  if(t.doneWithErrors() && !t.isStopped() && !t.isSilent()) {
1430                                          showError(t);                                          showError(t);
1431                                  }                                  }
1432                                  break;                                  break;
# Line 1060  public class CC { Line 1459  public class CC {
1459                  }                  }
1460                                    
1461                  /** Invoked when the name of orchestra is changed. */                  /** Invoked when the name of orchestra is changed. */
1462                    @Override
1463                  public void                  public void
1464                  nameChanged(OrchestraEvent e) { saveOrchestras(); }                  nameChanged(OrchestraEvent e) { saveOrchestras(); }
1465                    
1466                  /** Invoked when the description of orchestra is changed. */                  /** Invoked when the description of orchestra is changed. */
1467                    @Override
1468                  public void                  public void
1469                  descriptionChanged(OrchestraEvent e) { saveOrchestras(); }                  descriptionChanged(OrchestraEvent e) { saveOrchestras(); }
1470                    
1471                  /** Invoked when an instrument is added to the orchestra. */                  /** Invoked when an instrument is added to the orchestra. */
1472                    @Override
1473                  public void                  public void
1474                  instrumentAdded(OrchestraEvent e) { saveOrchestras(); }                  instrumentAdded(OrchestraEvent e) { saveOrchestras(); }
1475                    
1476                  /** Invoked when an instrument is removed from the orchestra. */                  /** Invoked when an instrument is removed from the orchestra. */
1477                    @Override
1478                  public void                  public void
1479                  instrumentRemoved(OrchestraEvent e) { saveOrchestras(); }                  instrumentRemoved(OrchestraEvent e) { saveOrchestras(); }
1480                    
1481                  /** Invoked when the settings of an instrument are changed. */                  /** Invoked when the settings of an instrument are changed. */
1482                    @Override
1483                  public void                  public void
1484                  instrumentChanged(OrchestraEvent e) { saveOrchestras(); }                  instrumentChanged(OrchestraEvent e) { saveOrchestras(); }
1485                                    
1486                  /** Invoked when an orchestra is added to the orchestra list. */                  /** Invoked when an orchestra is added to the orchestra list. */
1487                    @Override
1488                  public void                  public void
1489                  entryAdded(ListEvent<OrchestraModel> e) {                  entryAdded(ListEvent<OrchestraModel> e) {
1490                          e.getEntry().addOrchestraListener(getHandler());                          e.getEntry().addOrchestraListener(getHandler());
# Line 1087  public class CC { Line 1492  public class CC {
1492                  }                  }
1493                    
1494                  /** Invoked when an orchestra is removed from the orchestra list. */                  /** Invoked when an orchestra is removed from the orchestra list. */
1495                    @Override
1496                  public void                  public void
1497                  entryRemoved(ListEvent<OrchestraModel> e) {                  entryRemoved(ListEvent<OrchestraModel> e) {
1498                          e.getEntry().removeOrchestraListener(getHandler());                          e.getEntry().removeOrchestraListener(getHandler());
1499                          saveOrchestras();                          saveOrchestras();
1500                  }                  }
1501                    
1502                    /**
1503                     * Invoked when MIDI data arrives.
1504                     */
1505                    @Override
1506                    public void
1507                    midiDataArrived(final ChannelMidiDataEvent e) {
1508                            try {
1509                                    javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
1510                                            public void
1511                                            run() { fireChannelMidiDataEvent(e); }
1512                                    });
1513                            } catch(Exception x) {
1514                                    CC.getLogger().log(Level.INFO, "Failed!", x);
1515                            }
1516                    }
1517            }
1518            
1519            private static void
1520            fireChannelMidiDataEvent(ChannelMidiDataEvent e) {
1521                    SamplerChannelModel chn;
1522                    chn = CC.getSamplerModel().getChannelById(e.getChannelId());
1523                    if(chn == null) {
1524                            CC.getLogger().info("Unknown channel ID: " + e.getChannelId());
1525                    }
1526                    
1527                    ((DefaultSamplerChannelModel)chn).fireMidiDataEvent(e);
1528          }          }
1529                    
1530          private static final AudioDeviceCountListener audioDeviceCountListener =          private static final AudioDeviceCountListener audioDeviceCountListener =
# Line 1099  public class CC { Line 1532  public class CC {
1532                    
1533          private static class AudioDeviceCountListener implements ItemCountListener {          private static class AudioDeviceCountListener implements ItemCountListener {
1534                  /** Invoked when the number of audio output devices has changed. */                  /** Invoked when the number of audio output devices has changed. */
1535                    @Override
1536                  public void                  public void
1537                  itemCountChanged(ItemCountEvent e) {                  itemCountChanged(ItemCountEvent e) {
1538                          getTaskQueue().add(new Audio.UpdateDevices());                          getTaskQueue().add(new Audio.UpdateDevices());
# Line 1110  public class CC { Line 1544  public class CC {
1544                    
1545          private static class AudioDeviceInfoListener implements ItemInfoListener {          private static class AudioDeviceInfoListener implements ItemInfoListener {
1546                  /** Invoked when the audio output device's settings are changed. */                  /** Invoked when the audio output device's settings are changed. */
1547                    @Override
1548                  public void                  public void
1549                  itemInfoChanged(ItemInfoEvent e) {                  itemInfoChanged(ItemInfoEvent e) {
1550                          getTaskQueue().add(new Audio.UpdateDeviceInfo(e.getItemID()));                          getTaskQueue().add(new Audio.UpdateDeviceInfo(e.getItemID()));
# Line 1121  public class CC { Line 1556  public class CC {
1556                    
1557          private static class MidiDeviceCountListener implements ItemCountListener {          private static class MidiDeviceCountListener implements ItemCountListener {
1558                  /** Invoked when the number of MIDI input devices has changed. */                  /** Invoked when the number of MIDI input devices has changed. */
1559                    @Override
1560                  public void                  public void
1561                  itemCountChanged(ItemCountEvent e) {                  itemCountChanged(ItemCountEvent e) {
1562                          getTaskQueue().add(new Midi.UpdateDevices());                          getTaskQueue().add(new Midi.UpdateDevices());
# Line 1132  public class CC { Line 1568  public class CC {
1568                    
1569          private static class MidiDeviceInfoListener implements ItemInfoListener {          private static class MidiDeviceInfoListener implements ItemInfoListener {
1570                  /** Invoked when the MIDI input device's settings are changed. */                  /** Invoked when the MIDI input device's settings are changed. */
1571                    @Override
1572                  public void                  public void
1573                  itemInfoChanged(ItemInfoEvent e) {                  itemInfoChanged(ItemInfoEvent e) {
1574                          getTaskQueue().add(new Midi.UpdateDeviceInfo(e.getItemID()));                          getTaskQueue().add(new Midi.UpdateDeviceInfo(e.getItemID()));
# Line 1143  public class CC { Line 1580  public class CC {
1580                    
1581          private static class MidiInstrMapCountListener implements ItemCountListener {          private static class MidiInstrMapCountListener implements ItemCountListener {
1582                  /** Invoked when the number of MIDI instrument maps is changed. */                  /** Invoked when the number of MIDI instrument maps is changed. */
1583                    @Override
1584                  public void                  public void
1585                  itemCountChanged(ItemCountEvent e) {                  itemCountChanged(ItemCountEvent e) {
1586                          getTaskQueue().add(new Midi.UpdateInstrumentMaps());                          getTaskQueue().add(new Midi.UpdateInstrumentMaps());
# Line 1154  public class CC { Line 1592  public class CC {
1592                    
1593          private static class MidiInstrMapInfoListener implements ItemInfoListener {          private static class MidiInstrMapInfoListener implements ItemInfoListener {
1594                  /** Invoked when the MIDI instrument map's settings are changed. */                  /** Invoked when the MIDI instrument map's settings are changed. */
1595                    @Override
1596                  public void                  public void
1597                  itemInfoChanged(ItemInfoEvent e) {                  itemInfoChanged(ItemInfoEvent e) {
1598                          getTaskQueue().add(new Midi.UpdateInstrumentMapInfo(e.getItemID()));                          getTaskQueue().add(new Midi.UpdateInstrumentMapInfo(e.getItemID()));

Legend:
Removed from v.1285  
changed lines
  Added in v.1786

  ViewVC Help
Powered by ViewVC