Hallo,
ich habe ein Programm geschrieben, was von der Soundkarte aufzeichnen kann. Leider funktioniert das nicht so ganz. Alle paar Sekunden kommen Aussetzer oder Stücke aus dem Puffer, die eigentlich erst später kommen sollten. Folgender Thread ist für das Aufzeichnen in einen Puffer verantwortlich:
AudioPacketBuffer ist dabei nur eine Klasse, die mehrere Objekte vom Typ AudioPacket aufnimmt. In AudioPacket gibt es eine Art Zeitcode, so dass der AudioBuffer die Pufferstücke auch auf jeden Fall in der sortierten Reihenfolge wieder rausrückt.
Diese Tonanomalien treten scheinbar innerhalb dieser größeren Pufferstückchen auf. meistens genau zu den Zeiten, wo die while Schleife verlassen wird und der Array aus Bytes in den AudioPacketBuffer geschrieben werden soll. Ich habe diesen Vorgang schon in einen Thread ausgelagert, damit die Aufnahme sofort zügig weitergehen kann. Offenbar ist die Pause dennoch zu lang.
Zum selbst ausprobieren: http://www.egoshare.com/ecdd019575d2a295dd8357c5f39b43d1/soundrecprobzip.html
Zusätzlich ist dort auch nochmal der komplette Quelltext enthalten.
Die enthaltene jar Datei mit der batch Datei starten... Dann nimmt sie 30 Sekunden lang auf (am besten man stellt im Betriebssystem den Aufnahmekanal auf WaveOut und spielt irgendwo Musik ab, die das Programm dann aufnehmen kann; so hört man am besten, dass da was schief läuft)
nach einem Druck auf ENTER wird das ganze dann wieder abgespielt. Die Abspielroutine ist an den Fehlern nicht schuld, da ich die Tondatei, welche das Prog anlegt, mal in einem Soundeditor, der raw pcm lesen kann, abgespielt hab und dort die gleichen Fehler zu hören sind.
ich habe ein Programm geschrieben, was von der Soundkarte aufzeichnen kann. Leider funktioniert das nicht so ganz. Alle paar Sekunden kommen Aussetzer oder Stücke aus dem Puffer, die eigentlich erst später kommen sollten. Folgender Thread ist für das Aufzeichnen in einen Puffer verantwortlich:
Code:
...
public static int FRAMESIZE = 1024;
...
public BufferedSoundInput(int buf) throws LineUnavailableException
{
super(buf);
soundBuf = new AudioPacketBuffer();
this.bufSize = buf;
active = true;
new Thread(this).start();
}
...
public void run()
{
byte[] tmpBuf = new byte[bufSize];
while (active)
{
int bytes = 0;
while (bytes < bufSize)
bytes += read(tmpBuf, bytes, (bufSize-bytes>FRAMESIZE?FRAMESIZE:bufSize-bytes));
final AudioPacketBuffer tSoundBuf = soundBuf;
final long tCurrentBytes = currentBytes;
final byte[] tTmpBuf = tmpBuf;
new Thread()
{
public void run()
{
tSoundBuf.insert(new AudioPacket(tCurrentBytes, tTmpBuf));
}
}.start();
currentBytes += bytes;
}
}
AudioPacketBuffer ist dabei nur eine Klasse, die mehrere Objekte vom Typ AudioPacket aufnimmt. In AudioPacket gibt es eine Art Zeitcode, so dass der AudioBuffer die Pufferstücke auch auf jeden Fall in der sortierten Reihenfolge wieder rausrückt.
Diese Tonanomalien treten scheinbar innerhalb dieser größeren Pufferstückchen auf. meistens genau zu den Zeiten, wo die while Schleife verlassen wird und der Array aus Bytes in den AudioPacketBuffer geschrieben werden soll. Ich habe diesen Vorgang schon in einen Thread ausgelagert, damit die Aufnahme sofort zügig weitergehen kann. Offenbar ist die Pause dennoch zu lang.
Zum selbst ausprobieren: http://www.egoshare.com/ecdd019575d2a295dd8357c5f39b43d1/soundrecprobzip.html
Zusätzlich ist dort auch nochmal der komplette Quelltext enthalten.
Die enthaltene jar Datei mit der batch Datei starten... Dann nimmt sie 30 Sekunden lang auf (am besten man stellt im Betriebssystem den Aufnahmekanal auf WaveOut und spielt irgendwo Musik ab, die das Programm dann aufnehmen kann; so hört man am besten, dass da was schief läuft)
nach einem Druck auf ENTER wird das ganze dann wieder abgespielt. Die Abspielroutine ist an den Fehlern nicht schuld, da ich die Tondatei, welche das Prog anlegt, mal in einem Soundeditor, der raw pcm lesen kann, abgespielt hab und dort die gleichen Fehler zu hören sind.