nntp2http.com
Posting
Suche
Optionen
Hilfe & Kontakt

javax.sound.sampled: Falsche Samplingrate einer TargetDataLine?

Von: Benedikt Gollatz (benedikt@gollatz.net) [Profil]
Datum: 05.09.2006 17:41
Message-ID: <4m5k2mF4m7gpU1@uni-berlin.de>
Newsgroup: de.comp.lang.java
Hallo NG,

im Moment verwende ich folgenden provisorischen Code, um eine
TargetDataLine zu bekommen:

Mixer.Info[] mixers = AudioSystem.getMixerInfo();
Mixer mixer = null;
for (int i = 0; i < mixers.length; i++) {
Mixer m = AudioSystem.getMixer(mixers[i]);
Line.Info lineInfo = new Line.Info(TargetDataLine.class);
if (m.isLineSupported(lineInfo))
mixer = m;
}

AudioFormat format
new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
(float)SAMPLING_RATE,  // sampling rate
RESOLUTION * 8,        // sample size in bits
1,                     // channels
RESOLUTION,            // frame size
(float)SAMPLING_RATE,  // frame rate
MSB_FIRST              // endianess					        );

DataLine.Info info = new DataLine.Info(TargetDataLine.class,
format);

line = null;
if (mixer != null) {
try {
line = (TargetDataLine)mixer.getLine(info);
line.open(format);
} catch (LineUnavailableException e) {
e.printStackTrace();
}

Im Prinzip suche ich mir also das letzte Gerät aus, das aufnehmen kann,
(quasi eine Heuristik, um externe Soundkarten zu bevorzugen; nicht
schön, ich weiß) und fordere von dem eine TargetDataLine eines
bestimmten Formats an, in meinem Fall hätte ich gerne eine Samplingrate
von 44,1 kHz und eine Auflösung von 16 bit.

Das funktioniert auf diversen Systemen problemlos, auf einem PPC-System
mit J2SE 1.5.0_06 und Mac OS X 10.4 jedoch tritt folgendes seltsames
Phänomen auf: Ich bekomme eine TargetDataLine, so wie ich es will, wenn
ich allerdings eine FFT des anliegenden Signals mache, sind alle
Frequenzen ungefähr um den Faktor 0.92 gestaucht, d.h., wenn ich einen
Sinus von 110 Hz anlege, hat die FFT einen Peak bei ca. 102 Hz, ein
Sinus von 1 kHz hat einen Peak bei ungefähr 919 Hz.

Für mich sieht das stark danach aus, dass ich meine Samples statt mit
44,1 kHz mit 48 kHz bekomme. Von der verwendeten Soundkarte (es ist eine
Terratec Aureon 5.1 USB) weiß ich auch, dass sie eine Samplingrate von
48 kHz unterstützt.

Mache ich etwas falsch beim Anfordern der TargetDataLine? Ist es ein Bug
in Java oder des Betriebssystems?

Danke im Voraus,
Benedikt

[ Auf dieses Posting antworten ]