diff options
Diffstat (limited to 'songdbj/de/jarnbjo/util/audio/FadeableAudioInputStream.java')
| -rw-r--r-- | songdbj/de/jarnbjo/util/audio/FadeableAudioInputStream.java | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/songdbj/de/jarnbjo/util/audio/FadeableAudioInputStream.java b/songdbj/de/jarnbjo/util/audio/FadeableAudioInputStream.java new file mode 100644 index 0000000..4916102 --- /dev/null +++ b/songdbj/de/jarnbjo/util/audio/FadeableAudioInputStream.java @@ -0,0 +1,62 @@ +package de.jarnbjo.util.audio; + +import java.io.*; +import javax.sound.sampled.*; + +public class FadeableAudioInputStream extends AudioInputStream { + + private AudioInputStream stream; + private boolean fading=false; + private double phi=0.0; + + public FadeableAudioInputStream(AudioInputStream stream) throws IOException { + super(stream, stream.getFormat(), -1L); + } + + public void fadeOut() { + fading=true; + phi=0.0; + } + + public int read(byte[] b) throws IOException { + return read(b, 0, b.length); + } + + public int read(byte[] b, int offset, int length) throws IOException { + int read=super.read(b, offset, length); + + //System.out.println("read "+read); + + if(fading) { + int j=0, l=0, r=0; + double gain=0.0; + + for(int i=offset; i<offset+read; i+=4) { + j=i; + l=((int)b[j++])&0xff; + l|=((int)b[j++])<<8; + r=((int)b[j++])&0xff; + r|=((int)b[j])<<8; + + if(phi<Math.PI/2) { + phi+=0.000015; + } + + gain=Math.cos(phi); + //System.out.println("gain "+gain); + + l=(int)(l*gain); + r=(int)(r*gain); + + j=i; + b[j++]=(byte)(l&0xff); + b[j++]=(byte)((l>>8)&0xff); + b[j++]=(byte)(r&0xff); + b[j++]=(byte)((r>>8)&0xff); + } + } + + return read; + } + +}
\ No newline at end of file |