Gravar Audio em Java, e Salvar em disco!

Olá, recentemente eu estava programando um gravador de tela, o poblema é que ele faz oque o nome diz “grava a tela” não o audio!, então eu pensei em adicionar um codigo para ele gravar o audio do microfone e depois ão finalizar a gravação ele gravar o video e o audio separados, o poblema é que eu não encontrei nenhum que funcionou direito!, eu fiquei 1 dia enteiro na internet procurando, em todos que procurei a maioria tinha erros, o AudioSystem.write() trava a thread, e para a gravação e também desabilita qualquer tentativa de parar a Gravação, alguem pode me ajudar?
o Codigo fonte:
como é um pouco grande… deixei o download no mediafire.
https://www.mediafire.com/file/gjnyp7m2ayuoc1t/Interface.java/file

Bem, infelizmente eu não tive resposta porém sem poblema!, provavelmente se você está lendo em um futuro proximo, aqui está o codigo que eu usei para poder gravar o audio e salvar em um .wav, espero que ajude, ah é ele não para a thread. ele separa ela aqui está o codigo:

Classe que Grava o Audio:

[code]
package com.fakenuger.thefakerecorder;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;

import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.TargetDataLine;

public class Recorder {
private static final int BUFFER_SIZE = 4096;
private ByteArrayOutputStream recordBytes;
private TargetDataLine audioLine;
private AudioFormat format;

private boolean isRunning;

/**
 * Defines a default audio format used to record
 */
AudioFormat getAudioFormat() {
	float sampleRate = 16000;
	int sampleSizeInBits = 8;
	int channels = 2;
	boolean signed = true;
	boolean bigEndian = true;
	return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed, bigEndian);
}
public void start() throws LineUnavailableException {
	format = getAudioFormat();
	DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
	if (!AudioSystem.isLineSupported(info)) {
		throw new LineUnavailableException("The system does not support the specified format.");
	}

	audioLine = AudioSystem.getTargetDataLine(format);

	audioLine.open(format);
	audioLine.start();

	byte[] buffer = new byte[BUFFER_SIZE];
	int bytesRead = 0;

	recordBytes = new ByteArrayOutputStream();
	isRunning = true;

	while (isRunning) {
		bytesRead = audioLine.read(buffer, 0, buffer.length);
		recordBytes.write(buffer, 0, bytesRead);
	}
}

public void stop() throws IOException {
	isRunning = false;

	if (audioLine != null) {
		audioLine.drain();
		audioLine.close();
	}
}
public void save(File wavFile) throws IOException {
	byte[] audioData = recordBytes.toByteArray();
	ByteArrayInputStream bais = new ByteArrayInputStream(audioData);
	AudioInputStream audioInputStream = new AudioInputStream(bais, format,
			audioData.length / format.getFrameSize());

	AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, wavFile);

	audioInputStream.close();
	recordBytes.close();
}

}

[code]
Classe responsavel por “Executar” o Gravador:

[code]
package com.fakenuger.thefakerecorder;

import java.io.File;
import java.io.IOException;
import javax.sound.sampled.LineUnavailableException;

public class RecorderController {

private File wavFile = new File("/home/angela/Records/testeRC.wav");
private Recorder recorder;

public void startAudioRecord(String path,String name) {
	wavFile = new File(path + name + ".wav");

	recorder = new Recorder();

	// create a separate thread for recording
	Thread recordThread = new Thread(new Runnable() {
		@Override
		public void run() {
			try {
				System.out.println("Start recording...");
		 		recorder.start();
			} catch (LineUnavailableException ex) {
				ex.printStackTrace();
				System.exit(-1);
			}
		}
	});

	recordThread.start();
}

public void stopAudioRecord() {
	try {
		recorder.stop();
		recorder.save(wavFile);
		System.out.println("STOPPED");
	} catch (IOException ex) {
		ex.printStackTrace();
	}
	System.out.println("DONE");
}

}

[code]