Mir ist da gerade mal wieder ein Problem mit den neueren Versionen der JRE6 aufgefallen. Betrifft zumindest Update 3 und 6 unter WinXP - in der ersten Version war das IMHO noch ok. Mit einer testweise installierten JRE1.4.2 tritt das Problem ebenfalls nicht auf. Eine 1.5er habe ich aktuell nicht installiert, da ist es aber ganz sicher auch nicht aufgetreten.
Das Problem betrifft die Wiedergabe von WAVs per Clip, wenn die eine niedrige und "krumme" Samplingfrequenz haben. Es äußert sich durch ein Störgeräusch nach der Wiedergabe des Clips, daß sich anhört, als würden die letzten paar Samples in einer Endlosschleife wiedergegeben. Java ist allerdings davon überzeugt, daß der Clip beendet ist (LineEvent.Type.STOP wird erzeugt). Das hinzufügen von drain/flush/stop im LineEvent bewirkt daher rein gar nichts.
Ich habe hier z.B. Files mit einer Abtastfrequenz von 7418Hz, bei denen das Problem defintiv auftritt. Wenn ich sie auf z.B. 8kHz konvertiere, tritt es nicht mehr auf.
Beispiel:
http://lemmini.de/sound_5.wav
Weil ich die Samples nicht anpassen möchte (habe meine Gründe), habe ich als Workaround eine (primitive) Konvertierung der entsprechenden WAVs auf 20050Hz eingebaut.
Das funktioniert wunderbar. Allerdings bin ich etwas irritiert, daß das anscheinend sonst noch niemandem aufgefallen ist. Habe jedenfalls auf die Schnelle keinen Eintrag im Bugtracker gefunden.
Oder ist das doch eine Wechselwirkung zwischen der JRE6 und meinem Soundtreiber und tritt auf anderen Systemen nicht auf?
Das Problem betrifft die Wiedergabe von WAVs per Clip, wenn die eine niedrige und "krumme" Samplingfrequenz haben. Es äußert sich durch ein Störgeräusch nach der Wiedergabe des Clips, daß sich anhört, als würden die letzten paar Samples in einer Endlosschleife wiedergegeben. Java ist allerdings davon überzeugt, daß der Clip beendet ist (LineEvent.Type.STOP wird erzeugt). Das hinzufügen von drain/flush/stop im LineEvent bewirkt daher rein gar nichts.
Ich habe hier z.B. Files mit einer Abtastfrequenz von 7418Hz, bei denen das Problem defintiv auftritt. Wenn ich sie auf z.B. 8kHz konvertiere, tritt es nicht mehr auf.
Beispiel:
http://lemmini.de/sound_5.wav
Weil ich die Samples nicht anpassen möchte (habe meine Gründe), habe ich als Workaround eine (primitive) Konvertierung der entsprechenden WAVs auf 20050Hz eingebaut.
Code:
public synchronized byte[] convertToDefault(byte buffer[], float frqSource) {
// sample up low frequency files to a DEFAULT_FREQUENCY to work around sound bug in JDK6
double scale = DEFAULT_FREQUENCY/frqSource;
int len = (int)((float)buffer.length*scale); // length of target buffer in samples
byte buf[] = new byte[len];
// create scaled buffer
for (int i=0; i<len; i++ ) {
int pos = (int)(i/scale);
double ofs = (double)i/scale - (double)pos;
if (pos >= buffer.length)
pos = buffer.length-1;
if (ofs < 0.1 || pos == buffer.length-1)
buf[i] = buffer[pos];
else {
// interpolate between sample points
buf[i] = (byte)( (buffer[pos]&0xff)*(1.0-ofs) + (buffer[pos+1]&0xff)*(ofs));
}
}
return buf;
}
Das funktioniert wunderbar. Allerdings bin ich etwas irritiert, daß das anscheinend sonst noch niemandem aufgefallen ist. Habe jedenfalls auf die Schnelle keinen Eintrag im Bugtracker gefunden.
Oder ist das doch eine Wechselwirkung zwischen der JRE6 und meinem Soundtreiber und tritt auf anderen Systemen nicht auf?