217 lines
6.1 KiB
Java
217 lines
6.1 KiB
Java
/*
|
|
* Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved.
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* This code is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License version 2 only, as
|
|
* published by the Free Software Foundation. Oracle designates this
|
|
* particular file as subject to the "Classpath" exception as provided
|
|
* by Oracle in the LICENSE file that accompanied this code.
|
|
*
|
|
* This code 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
|
|
* version 2 for more details (a copy is included in the LICENSE file that
|
|
* accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU General Public License version
|
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
* or visit www.oracle.com if you need additional information or have any
|
|
* questions.
|
|
*/
|
|
package com.sun.media.sound;
|
|
|
|
import java.io.InputStream;
|
|
|
|
import javax.sound.midi.Soundbank;
|
|
import javax.sound.midi.SoundbankResource;
|
|
import javax.sound.sampled.AudioFormat;
|
|
import javax.sound.sampled.AudioInputStream;
|
|
|
|
/**
|
|
* Soundfont sample storage.
|
|
*
|
|
* @author Karl Helgason
|
|
*/
|
|
public final class SF2Sample extends SoundbankResource {
|
|
|
|
String name = "";
|
|
long startLoop = 0;
|
|
long endLoop = 0;
|
|
long sampleRate = 44100;
|
|
int originalPitch = 60;
|
|
byte pitchCorrection = 0;
|
|
int sampleLink = 0;
|
|
int sampleType = 0;
|
|
ModelByteBuffer data;
|
|
ModelByteBuffer data24;
|
|
|
|
public SF2Sample(Soundbank soundBank) {
|
|
super(soundBank, null, AudioInputStream.class);
|
|
}
|
|
|
|
public SF2Sample() {
|
|
super(null, null, AudioInputStream.class);
|
|
}
|
|
|
|
public Object getData() {
|
|
|
|
AudioFormat format = getFormat();
|
|
/*
|
|
if (sampleFile != null) {
|
|
FileInputStream fis;
|
|
try {
|
|
fis = new FileInputStream(sampleFile);
|
|
RIFFReader riff = new RIFFReader(fis);
|
|
if (!riff.getFormat().equals("RIFF")) {
|
|
throw new RIFFInvalidDataException(
|
|
"Input stream is not a valid RIFF stream!");
|
|
}
|
|
if (!riff.getType().equals("sfbk")) {
|
|
throw new RIFFInvalidDataException(
|
|
"Input stream is not a valid SoundFont!");
|
|
}
|
|
while (riff.hasNextChunk()) {
|
|
RIFFReader chunk = riff.nextChunk();
|
|
if (chunk.getFormat().equals("LIST")) {
|
|
if (chunk.getType().equals("sdta")) {
|
|
while(chunk.hasNextChunk()) {
|
|
RIFFReader chunkchunk = chunk.nextChunk();
|
|
if(chunkchunk.getFormat().equals("smpl")) {
|
|
chunkchunk.skip(sampleOffset);
|
|
return new AudioInputStream(chunkchunk,
|
|
format, sampleLen);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
} catch (Exception e) {
|
|
return new Throwable(e.toString());
|
|
}
|
|
}
|
|
*/
|
|
InputStream is = data.getInputStream();
|
|
if (is == null)
|
|
return null;
|
|
return new AudioInputStream(is, format, data.capacity());
|
|
}
|
|
|
|
public ModelByteBuffer getDataBuffer() {
|
|
return data;
|
|
}
|
|
|
|
public ModelByteBuffer getData24Buffer() {
|
|
return data24;
|
|
}
|
|
|
|
public AudioFormat getFormat() {
|
|
return new AudioFormat(sampleRate, 16, 1, true, false);
|
|
}
|
|
|
|
public void setData(ModelByteBuffer data) {
|
|
this.data = data;
|
|
}
|
|
|
|
public void setData(byte[] data) {
|
|
this.data = new ModelByteBuffer(data);
|
|
}
|
|
|
|
public void setData(byte[] data, int offset, int length) {
|
|
this.data = new ModelByteBuffer(data, offset, length);
|
|
}
|
|
|
|
public void setData24(ModelByteBuffer data24) {
|
|
this.data24 = data24;
|
|
}
|
|
|
|
public void setData24(byte[] data24) {
|
|
this.data24 = new ModelByteBuffer(data24);
|
|
}
|
|
|
|
public void setData24(byte[] data24, int offset, int length) {
|
|
this.data24 = new ModelByteBuffer(data24, offset, length);
|
|
}
|
|
|
|
/*
|
|
public void setData(File file, int offset, int length) {
|
|
this.data = null;
|
|
this.sampleFile = file;
|
|
this.sampleOffset = offset;
|
|
this.sampleLen = length;
|
|
}
|
|
*/
|
|
|
|
public String getName() {
|
|
return name;
|
|
}
|
|
|
|
public void setName(String name) {
|
|
this.name = name;
|
|
}
|
|
|
|
public long getEndLoop() {
|
|
return endLoop;
|
|
}
|
|
|
|
public void setEndLoop(long endLoop) {
|
|
this.endLoop = endLoop;
|
|
}
|
|
|
|
public int getOriginalPitch() {
|
|
return originalPitch;
|
|
}
|
|
|
|
public void setOriginalPitch(int originalPitch) {
|
|
this.originalPitch = originalPitch;
|
|
}
|
|
|
|
public byte getPitchCorrection() {
|
|
return pitchCorrection;
|
|
}
|
|
|
|
public void setPitchCorrection(byte pitchCorrection) {
|
|
this.pitchCorrection = pitchCorrection;
|
|
}
|
|
|
|
public int getSampleLink() {
|
|
return sampleLink;
|
|
}
|
|
|
|
public void setSampleLink(int sampleLink) {
|
|
this.sampleLink = sampleLink;
|
|
}
|
|
|
|
public long getSampleRate() {
|
|
return sampleRate;
|
|
}
|
|
|
|
public void setSampleRate(long sampleRate) {
|
|
this.sampleRate = sampleRate;
|
|
}
|
|
|
|
public int getSampleType() {
|
|
return sampleType;
|
|
}
|
|
|
|
public void setSampleType(int sampleType) {
|
|
this.sampleType = sampleType;
|
|
}
|
|
|
|
public long getStartLoop() {
|
|
return startLoop;
|
|
}
|
|
|
|
public void setStartLoop(long startLoop) {
|
|
this.startLoop = startLoop;
|
|
}
|
|
|
|
public String toString() {
|
|
return "Sample: " + name;
|
|
}
|
|
}
|