public void run() {
    // if (serial == null) return;

    // Init TNC
    try {
      writer =
          new SoundcardWriteThread(
              demodulator, modulator, sc, (double) Persist / 255.0, SlotTime, ptt);
    } catch (Exception e) {
      System.err.println("Error initializing Soundcard " + e.toString());
      return;
    }

    sc.receive();
  }
  public synchronized void init(Properties configuration) {
    initParams(configuration);
    if (firstTime) {
      firstTime = false;

      // try {TNCPort = Integer.parseInt(configuration.getProperty("SoundcardTNCDevice",
      // "1").trim());}
      // catch (Exception e){System.err.println("Exception parsing KISSTNCPortNumber
      // "+e.toString());}
      // tncPort =(byte)((TNCPort-1)<<4);
      try {
        TXDelay = (Integer.parseInt(configuration.getProperty("KISSTXDelay", "200").trim()) / 10);
      } catch (Exception e) {
        System.err.println("Exception parsing KISSTXDelay " + e.toString());
      }
      try {
        Persist = Integer.parseInt(configuration.getProperty("KISSPersist", "255").trim());
      } catch (Exception e) {
        System.err.println("Exception parsing KISSPersist " + e.toString());
      }
      try {
        SlotTime = (Integer.parseInt(configuration.getProperty("KISSSlotTime", "0").trim()));
      } catch (Exception e) {
        System.err.println("Exception parsing KISSPersist " + e.toString());
      }
      boolean fulldux = false;
      try {
        fulldux =
            Boolean.valueOf(configuration.getProperty("KISSFullDuplex", "false").trim())
                .booleanValue();
      } catch (Exception e) {
        System.err.println("Exception parsing KISSFullDuplex " + e.toString());
      }
      if (fulldux) FullDuplex = 1;
      try {
        TXTail = (Integer.parseInt(configuration.getProperty("KISSTXTail", "100").trim()) / 10);
      } catch (Exception e) {
        System.err.println("Exception parsing KISSTXTail " + e.toString());
      }

      try {
        rate = Integer.parseInt(configuration.getProperty("SoundcardSampleRate", "9600").trim());
      } catch (Exception e) {
        System.err.println("Exception parsing SoundcardSampleRate " + e.toString());
      }

      try {
        latency_ms = Integer.parseInt(configuration.getProperty("SoundcardLatency", "100").trim());
      } catch (Exception e) {
        System.err.println("Exception parsing SoundcardLatency " + e.toString());
      }

      // if (!configuration.containsKey("SoundCardName"))
      //	configuration.put("SerialPortName", configuration.getProperty("KISSPortName", ""));
      String soundcard = configuration.getProperty("SoundcardName", "default").trim();
      soundin = configuration.getProperty("SoundcardInputName", "default").trim();
      soundout = configuration.getProperty("SoundcardOutputName", "default").trim();
      if (soundin.equals("default")) soundin = soundcard;
      if (soundout.equals("default")) soundout = soundcard;

      System.err.println(
          "Starting up Afsk1200 modem on ["
              + soundin
              + ", "
              + soundout
              + "] at "
              + rate
              + " samples/s");

      try {
        modulator = new sivantoledo.ax25.Afsk1200Modulator(rate);
        demodulator = new sivantoledo.ax25.Afsk1200MultiDemodulator(rate, this);
        // afsk = new sivantoledo.ax25.Afsk1200(rate, this);
        modulator.setTxDelay(TXDelay);
      } catch (Exception e) {
        System.err.println("Afsk1200 constructor exception: " + e.getMessage());
        System.exit(1);
      }

      String ptt_port = configuration.getProperty("PTTPort", "none").trim();
      String ptt_signal = configuration.getProperty("PTTSignal", "RTS").trim();
      if (!ptt_port.equals("none")) {
        try {
          ptt = new SerialTransmitController(ptt_port, ptt_signal);
          System.err.println("Opened a serial PTT port: " + ptt_port);
        } catch (Exception e) {
          System.err.println("PTT initialization error: " + e.getMessage());
          ptt = null;
        }
      } else {
        System.err.println("Warning: No PTT port (okay for receive only or for VOX)");
      }

      sc =
          new sivantoledo.ax25.Soundcard(
              rate, soundin, soundout, latency_ms, demodulator, modulator);
      new Thread(this, "SoundInterface Read").start();
    }
  }