content: /**
   * Copyright 2007 DFKI GmbH.
   * All Rights Reserved.  Use is subject to license terms.
   * <p/>
   * This file is part of MARY TTS.
   * <p/>
   * MARY TTS is free software: you can redistribute it and/or modify
   * it under the terms of the GNU Lesser General Public License as published by
   * the Free Software Foundation, version 3 of the License.
   * <p/>
   * 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 Lesser General Public License for more details.
   * <p/>
   * You should have received a copy of the GNU Lesser General Public License
   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
   */
  package marytts.signalproc.adaptation.codebook;
  
  import java.io.IOException;
  
  import marytts.signalproc.adaptation.BaselineFeatureExtractor;
  import marytts.signalproc.analysis.EnergyFileHeader;
  import marytts.signalproc.analysis.LsfFileHeader;
  import marytts.signalproc.analysis.MfccFileHeader;
  import marytts.signalproc.analysis.PitchFileHeader;
  import marytts.util.io.MaryRandomAccessFile;
  
  
  /**
   * A class for handling file I/O of weighted codebook file headers
   *
   * @author Oytun T&uumlrk
   */
  public class WeightedCodebookFileHeader {
      public static int FRAMES = 1; //Frame-by-frame mapping of features
      public static int FRAME_GROUPS = 2; //Mapping of frame average features (no label information but fixed amount of neighbouring frames is used)
      public static int LABELS = 3; //Mapping of label average features
      public static int LABEL_GROUPS = 4; //Mapping of average features collected across label groups (i.e. vowels, consonants, etc)
      public static int SPEECH = 5; //Mapping of average features collected across all speech parts (i.e. like spectral equalization)
      public int totalEntries;
      //Codebook type
      public int codebookType;
      //
      public String sourceTag; //Source name tag (i.e. style or speaker identity)
      public String targetTag; //Target name tag (i.e. style or speaker identity)
  
      public LsfFileHeader lsfParams;
      public PitchFileHeader ptcParams;
      public EnergyFileHeader energyParams;
      public MfccFileHeader mfccParams;
  
      public int numNeighboursInFrameGroups; //Functional only when codebookType == FRAME_GROUPS
      public int numNeighboursInLabelGroups; //Functional only when codebookType == LABEL_GROUPS
  
      public int vocalTractFeature; //Feature to be used for representing vocal tract 
  
      public WeightedCodebookFileHeader() {
          this(0);
      }
  
      public WeightedCodebookFileHeader(int totalEntriesIn) {
          totalEntries = totalEntriesIn;
  
          codebookType = FRAMES;
  
          sourceTag = "source"; //Source name tag (i.e. style or speaker identity)
          targetTag = "target"; //Target name tag (i.e. style or speaker identity)
  
          lsfParams = new LsfFileHeader();
          ptcParams = new PitchFileHeader();
          energyParams = new EnergyFileHeader();
          mfccParams = new MfccFileHeader();
  
          vocalTractFeature = BaselineFeatureExtractor.LSF_FEATURES;
      }
  
      public WeightedCodebookFileHeader(WeightedCodebookFileHeader h) {
          totalEntries = h.totalEntries;
  
          codebookType = h.codebookType;
  
          sourceTag = h.sourceTag;
          targetTag = h.targetTag;
  
          lsfParams = new LsfFileHeader(h.lsfParams);
          ptcParams = new PitchFileHeader(h.ptcParams);
          energyParams = new EnergyFileHeader(h.energyParams);
          mfccParams = new MfccFileHeader(h.mfccParams);
  
          numNeighboursInFrameGroups = h.numNeighboursInFrameGroups;
          numNeighboursInLabelGroups = h.numNeighboursInLabelGroups;
  
          vocalTractFeature = h.vocalTractFeature;
      }
  
      public void resetTotalEntries() {
          totalEntries = 0;
      }
  
      public void read(MaryRandomAccessFile ler) throws IOException {
          totalEntries = ler.readInt();
  
          lsfParams = new LsfFileHeader();
          lsfParams.readHeader(ler);
  
          ptcParams = new PitchFileHeader();
          ptcParams.readPitchHeader(ler);
  
          energyParams = new EnergyFileHeader();
          energyParams.read(ler, true);
  
          mfccParams.readHeader(ler);
  
          codebookType = ler.readInt();
          numNeighboursInFrameGroups = ler.readInt();
          numNeighboursInLabelGroups = ler.readInt();
  
          int tagLen = ler.readInt();
          sourceTag = String.copyValueOf(ler.readChar(tagLen));
          tagLen = ler.readInt();
          targetTag = String.copyValueOf(ler.readChar(tagLen));
  
          vocalTractFeature = ler.readInt();
      }
  
      public void write(MaryRandomAccessFile ler) throws IOException {
          ler.writeInt(totalEntries);
  
          lsfParams.writeHeader(ler);
          ptcParams.writePitchHeader(ler);
          energyParams.write(ler);
          mfccParams.writeHeader(ler);
  
          ler.writeInt(codebookType);
          ler.writeInt(numNeighboursInFrameGroups);
          ler.writeInt(numNeighboursInLabelGroups);
  
          int tagLen = sourceTag.length();
          ler.writeInt(tagLen);
          ler.writeChar(sourceTag.toCharArray());
  
          tagLen = targetTag.length();
          ler.writeInt(tagLen);
          ler.writeChar(targetTag.toCharArray());
  
          ler.writeInt(vocalTractFeature);
      }
  }
  
  