/**
* Copyright 2007 DFKI GmbH.
* All Rights Reserved. Use is subject to license terms.
*
* This file is part of MARY TTS.
*
* 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.
*
* 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.
*
* 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.FileNotFoundException;
import java.io.IOException;
import marytts.util.io.FileUtils;
import marytts.util.io.MaryRandomAccessFile;
/**
*
* A class for handling file I/O of binary weighted codebook files
*
* @author Oytun Türk
*/
public class WeightedCodebookFile {
int status;
public static int NOT_OPENED = -1;
public static int OPEN_FOR_READ = 0;
public static int OPEN_FOR_WRITE = 1;
public MaryRandomAccessFile stream;
public String currentFile;
public static final String DEFAULT_EXTENSION = ".wcf";
public WeightedCodebookFile() {
this("");
}
public WeightedCodebookFile(String codebookFile) {
this(codebookFile, NOT_OPENED);
}
public WeightedCodebookFile(String codebookFile, int desiredStatus) {
init(codebookFile, desiredStatus);
}
private void init(String codebookFile, int desiredStatus) {
status = NOT_OPENED;
stream = null;
currentFile = "";
if (desiredStatus == OPEN_FOR_READ) {
status = desiredStatus;
try {
stream = new MaryRandomAccessFile(codebookFile, "r");
currentFile = codebookFile;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else if (desiredStatus == OPEN_FOR_WRITE) {
FileUtils.delete(codebookFile);
status = desiredStatus;
try {
stream = new MaryRandomAccessFile(codebookFile, "rw");
currentFile = codebookFile;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void close() {
if (status != NOT_OPENED) {
if (stream != null) {
try {
stream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
stream = null;
status = NOT_OPENED;
}
}
public WeightedCodebookFileHeader readCodebookHeader(String codebookFile, boolean bCloseAfterReading) {
init(codebookFile, OPEN_FOR_READ);
return readCodebookHeader();
}
public WeightedCodebookFileHeader readCodebookHeader() {
try {
return readCodebookHeader(stream);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public static WeightedCodebookFileHeader readCodebookHeader(MaryRandomAccessFile ler) throws IOException {
WeightedCodebookFileHeader header = new WeightedCodebookFileHeader();
header.read(ler);
return header;
}
public MaryRandomAccessFile writeCodebookHeader(String codebookFile, WeightedCodebookFileHeader header) {
init(codebookFile, OPEN_FOR_WRITE);
return writeCodebookHeader(header);
}
public MaryRandomAccessFile writeCodebookHeader(WeightedCodebookFileHeader header) {
try {
writeCodebookHeader(stream, header);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return stream;
}
public void writeCodebookHeader(MaryRandomAccessFile ler, WeightedCodebookFileHeader header) throws IOException {
header.write(ler);
}
public WeightedCodebook readCodebookFile() throws IOException {
return readCodebookFile(currentFile);
}
// Read whole codebook from a file into memory
public WeightedCodebook readCodebookFile(String codebookFile) throws IOException {
WeightedCodebook codebook = null;
if (FileUtils.exists(codebookFile)) {
if (status != OPEN_FOR_READ) {
if (status != NOT_OPENED)
close();
init(codebookFile, OPEN_FOR_READ);
}
if (status == OPEN_FOR_READ) {
codebook = new WeightedCodebook();
codebook.header = readCodebookHeader();
readCodebookFileExcludingHeader(codebook);
}
}
return codebook;
}
public void readCodebookFileExcludingHeader(WeightedCodebook codebook) {
codebook.allocate();
System.out.println("Reading codebook file: " + currentFile + "...");
int i;
for (i = 0; i < codebook.header.totalEntries; i++)
codebook.entries[i] = readEntry(codebook.header.lsfParams.dimension, codebook.header.mfccParams.dimension);
close();
System.out.println("Reading completed...");
}
public void WriteCodebookFile(String codebookFile, WeightedCodebook codebook) {
if (status != OPEN_FOR_WRITE) {
if (status != NOT_OPENED)
close();
init(codebookFile, OPEN_FOR_WRITE);
}
codebook.header.totalEntries = codebook.entries.length;
writeCodebookHeader(codebookFile, codebook.header);
int i;
for (i = 0; i < codebook.header.totalEntries; i++)
writeEntry(codebook.entries[i]);
close();
}
// Append a new codebook entry to a codebook file opened with write permission
public void writeEntry(WeightedCodebookEntry w) {
if (status != OPEN_FOR_WRITE) {
if (status != NOT_OPENED)
close();
init(currentFile, OPEN_FOR_WRITE);
}
if (status == OPEN_FOR_WRITE) {
w.write(stream);
incrementTotalEntries();
}
}
// Read a codebook entry from a codebook file opened with read permission
public WeightedCodebookEntry readEntry(int lpOrder, int mfccDimension) {
WeightedCodebookEntry w = new WeightedCodebookEntry();
if (status != OPEN_FOR_READ) {
if (status != NOT_OPENED)
close();
init(currentFile, OPEN_FOR_READ);
}
if (status == OPEN_FOR_READ)
w.read(stream, lpOrder, mfccDimension);
return w;
}
//
public void incrementTotalEntries() {
if (status == OPEN_FOR_WRITE) {
try {
long currentPos = stream.getFilePointer();
stream.seek(0);
int totalEntries = stream.readInt();
totalEntries++;
stream.seek(0);
stream.writeInt(totalEntries);
System.out.println("Wrote codebook entry " + String.valueOf(totalEntries));
stream.seek(currentPos);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}