Package net.pms.io

Source Code of net.pms.io.PipeIPCProcess

/*
* PS3 Media Server, for streaming any medias to your PS3.
* Copyright (C) 2008  A.Brochard
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; version 2
* of the License only.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
*/
package net.pms.io;

import com.sun.jna.Platform;
import net.pms.util.DTSAudioOutputStream;
import net.pms.util.H264AnnexBInputStream;
import net.pms.util.PCMAudioOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;

public class PipeIPCProcess extends Thread implements ProcessWrapper {
  private static final Logger logger = LoggerFactory.getLogger(PipeIPCProcess.class);
  private PipeProcess mkin;
  private PipeProcess mkout;
  private StreamModifier modifier;

  public StreamModifier getModifier() {
    return modifier;
  }

  public void setModifier(StreamModifier modifier) {
    this.modifier = modifier;
  }

  public PipeIPCProcess(String pipeName, String pipeNameOut, boolean forcereconnect1, boolean forcereconnect2) {
    mkin = new PipeProcess(pipeName, forcereconnect1 ? "reconnect" : "dummy");
    mkout = new PipeProcess(pipeNameOut, "out", forcereconnect2 ? "reconnect" : "dummy");
  }

  public void run() {
    byte[] b = new byte[512 * 1024];
    int n = -1;
    InputStream in = null;
    OutputStream out = null;
    OutputStream debug = null;

    try {
      in = mkin.getInputStream();
      out = mkout.getOutputStream();

      if (modifier != null && modifier.isH264AnnexB()) {
        in = new H264AnnexBInputStream(in, modifier.getHeader());
      } else if (modifier != null && modifier.isDtsEmbed()) {
        out = new DTSAudioOutputStream(new PCMAudioOutputStream(out, modifier.getNbChannels(), modifier.getSampleFrequency(), modifier.getBitsPerSample()));
      } else if (modifier != null && modifier.isPcm()) {
        out = new PCMAudioOutputStream(out, modifier.getNbChannels(), modifier.getSampleFrequency(), modifier.getBitsPerSample());
      }

      if (modifier != null && modifier.getHeader() != null && !modifier.isH264AnnexB()) {
        out.write(modifier.getHeader());
      }

      while ((n = in.read(b)) > -1) {
        out.write(b, 0, n);
        if (debug != null) {
          debug.write(b, 0, n);
        }
      }
    } catch (IOException e) {
      logger.debug("Error :" + e.getMessage());
    } finally {
      try {
        // in and out may not have been initialized:
        // http://ps3mediaserver.org/forum/viewtopic.php?f=6&t=9885&view=unread#p45142
        if (in != null) {
          in.close();
        }
        if (out != null) {
          out.close();
        }
        if (debug != null) {
          debug.close();
        }
      } catch (IOException e) {
        logger.debug("Error :" + e.getMessage());
      }
    }
  }

  public String getInputPipe() {
    return mkin.getInputPipe();
  }

  public String getOutputPipe() {
    return mkout.getOutputPipe();
  }

  public ProcessWrapper getPipeProcess() {
    return this;
  }

  public void deleteLater() {
    mkin.deleteLater();
    mkout.deleteLater();
  }

  public InputStream getInputStream() throws IOException {
    return mkin.getInputStream();
  }

  public OutputStream getOutputStream() throws IOException {
    return mkout.getOutputStream();
  }

  @Override
  public InputStream getInputStream(long seek) throws IOException {
    return null;
  }

  @Override
  public ArrayList<String> getResults() {
    return null;
  }

  @Override
  public boolean isDestroyed() {
    return isAlive();
  }

  @Override
  public void runInNewThread() {
    if (!Platform.isWindows()) {
      mkin.getPipeProcess().runInNewThread();
      mkout.getPipeProcess().runInNewThread();

      // Allow the threads some time to do their work before
      // starting the main thread
      try {
        Thread.sleep(150);
      } catch (InterruptedException e) {
      }
    }

    start();
  }

  @Override
  public void runInSameThread() {
    if (!Platform.isWindows()) {
      mkin.getPipeProcess().runInNewThread();
      mkout.getPipeProcess().runInNewThread();

      // Allow the threads some time to do their work before
      // running the main thread
      try {
        Thread.sleep(150);
      } catch (InterruptedException e) {
      }
    }

    run();
  }

  @Override
  public boolean isReadyToStop() {
    return false;
  }

  @Override
  public void setReadyToStop(boolean nullable) {
  }

  @Override
  public void stopProcess() {
    this.interrupt();
    mkin.getPipeProcess().stopProcess();
    mkout.getPipeProcess().stopProcess();
  }
}
TOP

Related Classes of net.pms.io.PipeIPCProcess

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.