/*
* BaseAudioFileReaderTestCase.java
*/
/*
* Copyright (c) 2001 - 2003 by Matthias Pfisterer <Matthias.Pfisterer@web.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published
* by the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* 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 Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.tritonus.test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.spi.FormatConversionProvider;
import org.tritonus.share.sampled.Encodings;
public class BaseFormatConversionProviderTestCase
extends BaseProviderTestCase
{
private static final AudioFormat.Encoding[] EMPTY_ENCODING_ARRAY = new AudioFormat.Encoding[0];
private static final AudioFormat.Encoding[] ALL_ENCODINGS = new AudioFormat.Encoding[]
{
AudioFormat.Encoding.PCM_SIGNED,
AudioFormat.Encoding.PCM_UNSIGNED,
AudioFormat.Encoding.ULAW,
AudioFormat.Encoding.ALAW,
Encodings.getEncoding("GSM0610"),
Encodings.getEncoding("MPEG1L1"),
Encodings.getEncoding("MPEG1L2"),
Encodings.getEncoding("MPEG1L3"),
Encodings.getEncoding("MPEG2L1"),
Encodings.getEncoding("MPEG2L2"),
Encodings.getEncoding("MPEG2L3"),
Encodings.getEncoding("MPEG2DOT5L1"),
Encodings.getEncoding("MPEG2DOT5L2"),
Encodings.getEncoding("MPEG2DOT5L3"),
Encodings.getEncoding("VORBIS"),
Encodings.getEncoding("IMA_ADPCM"),
};
private static final boolean DEBUG = true;
private static final String RESOURCE_BASENAME = "formatconversionprovider";
public BaseFormatConversionProviderTestCase(String strName)
{
super(strName,
RESOURCE_BASENAME);
}
protected FormatConversionProvider getFormatConversionProvider()
{
return (FormatConversionProvider) getProvider();
}
public void testGetSourceEncodings()
{
AudioFormat.Encoding[] aEncodings = null;
if (getTestProvider())
{
aEncodings = getFormatConversionProvider().getSourceEncodings();
checkEncodings(aEncodings, true);
}
}
public void testGetTargetEncodings()
{
AudioFormat.Encoding[] aEncodings = null;
if (getTestProvider())
{
aEncodings = getFormatConversionProvider().getTargetEncodings();
checkEncodings(aEncodings, false);
}
}
private void checkEncodings(AudioFormat.Encoding[] aEncodings,
boolean bSource)
{
AudioFormat.Encoding[] aExpectedEncodings = getEncodings(bSource);
Iterator iter;
List encodings = Arrays.asList(aEncodings);
List expectedEncodings = Arrays.asList(aExpectedEncodings);
iter = encodings.iterator();
while (iter.hasNext())
{
Object encoding = iter.next();
assertTrue("returned encoding in expected encodings",
expectedEncodings.contains(encoding));
}
iter = expectedEncodings.iterator();
while (iter.hasNext())
{
Object encoding = iter.next();
assertTrue("expected encoding in returned encodings",
encodings.contains(encoding));
}
}
public void testIsSourceEncodingsSupported()
{
implTestIsEncodingSupported(true);
}
public void testIsTargetEncodingsSupported()
{
implTestIsEncodingSupported(false);
}
private void implTestIsEncodingSupported(boolean bSource)
{
if (getTestProvider())
{
AudioFormat.Encoding[] aExpectedEncodings = getEncodings(bSource);
for (int i = 0; i < aExpectedEncodings.length; i++)
{
boolean bSupported;
if (bSource)
{
bSupported = getFormatConversionProvider().isSourceEncodingSupported(aExpectedEncodings[i]);
}
else
{
bSupported = getFormatConversionProvider().isTargetEncodingSupported(aExpectedEncodings[i]);
}
assertTrue("expected encoding supported",
bSupported);
}
AudioFormat.Encoding[] aUnexpectedEncodings = getUnexpectedEncodings(bSource);
for (int i = 0; i < aUnexpectedEncodings.length; i++)
{
boolean bSupported;
if (bSource)
{
bSupported = getFormatConversionProvider().isSourceEncodingSupported(aUnexpectedEncodings[i]);
}
else
{
bSupported = getFormatConversionProvider().isTargetEncodingSupported(aUnexpectedEncodings[i]);
}
assertTrue("unexpected encoding supported",
! bSupported);
}
}
}
private void checkAudioInputStream(AudioInputStream audioInputStream, boolean bRealLengthExpected)
throws Exception
{
checkAudioFormat(audioInputStream.getFormat());
long lExpectedFrameLength = AudioSystem.NOT_SPECIFIED;
if (/*getCheckRealLengths() ||*/ bRealLengthExpected)
{
lExpectedFrameLength = getFrameLength();
}
assertEquals("frame length",
lExpectedFrameLength,
audioInputStream.getFrameLength());
if (/*getCheckRealLengths() ||*/ bRealLengthExpected)
{
int nExpectedDataLength = (int) (lExpectedFrameLength * getFrameSize());
byte[] abRetrievedData = new byte[nExpectedDataLength];
int nRead = audioInputStream.read(abRetrievedData);
assertEquals("reading data",
nExpectedDataLength,
nRead);
// for (int i = 0; i < nExpectedDataLength; i++)
// {
// assertEquals("data content", 0, abRetrievedData[i]);
// }
}
else
{
// TODO: try to at least read some bytes?
}
}
private void checkAudioFormat(AudioFormat audioFormat)
throws Exception
{
assertEquals("encoding",
getEncoding(),
audioFormat.getEncoding());
assertEquals("sample rate",
getSampleRate(),
audioFormat.getSampleRate(),
DELTA);
assertEquals("sample size (bits)",
getSampleSizeInBits(),
audioFormat.getSampleSizeInBits());
assertEquals("channels",
getChannels(),
audioFormat.getChannels());
assertEquals("frame size",
getFrameSize(),
audioFormat.getFrameSize());
assertEquals("frame rate",
getFrameRate(),
audioFormat.getFrameRate(),
DELTA);
assertEquals("big endian",
getBigEndian(),
audioFormat.isBigEndian());
}
private String getFilename()
{
String strFileName = getResourceString(getResourcePrefix() + ".filename");
return strFileName;
}
private long getByteLength()
{
String strByteLength = getResourceString(getResourcePrefix() + ".byteLength");
long lByteLength = Long.parseLong(strByteLength);
return lByteLength;
}
private AudioFormat.Encoding getEncoding()
{
String strEncodingName = getResourceString(getResourcePrefix() + ".format.encoding");
AudioFormat.Encoding encoding = Encodings.getEncoding(strEncodingName);
return encoding;
}
private float getSampleRate()
{
String strSampleRate = getResourceString(getResourcePrefix() + ".format.sampleRate");
float fSampleRate = Float.parseFloat(strSampleRate);
return fSampleRate;
}
private int getSampleSizeInBits()
{
String strSampleSizeInBits = getResourceString(getResourcePrefix() + ".format.sampleSizeInBits");
int nSampleSizeInBits = Integer.parseInt(strSampleSizeInBits);
return nSampleSizeInBits;
}
private int getChannels()
{
String strChannels = getResourceString(getResourcePrefix() + ".format.channels");
int nChannels = Integer.parseInt(strChannels);
return nChannels;
}
private int getFrameSize()
{
String strFrameSize = getResourceString(getResourcePrefix() + ".format.frameSize");
int nFrameSize = Integer.parseInt(strFrameSize);
return nFrameSize;
}
private float getFrameRate()
{
String strFrameRate = getResourceString(getResourcePrefix() + ".format.frameRate");
float fFrameRate = Float.parseFloat(strFrameRate);
return fFrameRate;
}
private boolean getBigEndian()
{
String strBigEndian = getResourceString(getResourcePrefix() + ".format.bigEndian");
boolean bBigEndian = strBigEndian.equals("true");
return bBigEndian;
}
private long getFrameLength()
{
String strFrameLength = getResourceString(getResourcePrefix() + ".frameLength");
long lFrameLength = Long.parseLong(strFrameLength);
return lFrameLength;
}
private AudioFormat.Encoding[] getEncodings(boolean bSource)
{
if (bSource)
{
return getEncodings("sourceEncodings");
}
else
{
return getEncodings("targetEncodings");
}
}
private AudioFormat.Encoding[] getUnexpectedEncodings(boolean bSource)
{
AudioFormat.Encoding[] aExpectedEncodings;
if (bSource)
{
aExpectedEncodings = getEncodings("sourceEncodings");
}
else
{
aExpectedEncodings = getEncodings("targetEncodings");
}
List expectedEncodings = Arrays.asList(aExpectedEncodings);
AudioFormat.Encoding[] aAllEncodings = ALL_ENCODINGS;
AudioFormat.Encoding[] aUnexpectedEncodings = new AudioFormat.Encoding[aAllEncodings.length - aExpectedEncodings.length];
int nIndex = 0;
for (int i = 0; i < aAllEncodings.length; i++)
{
if (! expectedEncodings.contains(aAllEncodings[i]))
{
aUnexpectedEncodings[nIndex] = aAllEncodings[i];
nIndex++;
}
}
return aUnexpectedEncodings;
}
private AudioFormat.Encoding[] getEncodings(String strKey)
{
String strEncodings = getResourceString(getResourcePrefix() + "." + strKey);
List<AudioFormat.Encoding> encodingsList =
new ArrayList<AudioFormat.Encoding>();
StringTokenizer tokenizer = new StringTokenizer(strEncodings);
while (tokenizer.hasMoreTokens())
{
String strEncodingName = tokenizer.nextToken();
AudioFormat.Encoding encoding = Encodings.getEncoding(strEncodingName);
encodingsList.add(encoding);
}
return (AudioFormat.Encoding[]) encodingsList.toArray(EMPTY_ENCODING_ARRAY);
}
}
/*** BaseFormatConversionProviderTestCase.java ***/