Java Swing - Как остановить звуковой тон, созданный с помощью AudioFormatJAVA

Программисты JAVA общаются здесь
Anonymous
Java Swing - Как остановить звуковой тон, созданный с помощью AudioFormat

Сообщение Anonymous »

У меня есть кадр с двумя кнопками, чтобы запустить и остановить звуковой тон.
Запуск и запуск тона непрерывно работает нормально, но я не могу его остановить!
ниже используется код ....
Две кнопки для запуска и остановки аудионазона (iframe) Tonetest; < /p>

Код: Выделить всё

// This is the iFrame with two buttons
public class startFrame extends javax.swing.JFrame {
public startFrame() {
initComponents();
this.setLocationRelativeTo(null);
this.pack();
}
< /code>
Здесь я запускаю тон .... использовал Thread (), чтобы сохранить функциональную кнопку остановки, в то время как
играет тон. < /p>
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
new Thread(() -> {
soundClass nc = new soundClass();
try{
nc.ContinuousSound(440);
} catch (Exception ex) {}
}).start(); // End of Thread

}
< /code>
Здесь я хотел бы остановить тон ...
private void jbutton2actionperformed (java.awt.event.actionevent evt) {

// todo - Как остановить генератор тон? />import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;

public class soundClass {
private static final int SAMPLE_SIZE_IN_BITS = 16;
private static final int CHANNELS = 1;
private static final boolean SIGNED = true;
private static final boolean BIG_ENDIAN = false;
int SAMPLE_RATE = 44100;
int numSamples;

// Run continuously
public void ContinuousSound(float j) throws LineUnavailableException {

try {
float frequency = 440.0f; // Frequency in Hz (e.g., 440 for A4)

AudioFormat audioFormat = new AudioFormat(SAMPLE_RATE, SAMPLE_SIZE_IN_BITS,        CHANNELS, SIGNED, BIG_ENDIAN);
SourceDataLine line = AudioSystem.getSourceDataLine(audioFormat);
line.open(audioFormat);
line.start();

while(true){
byte[] buffer = generateSineWaveBuffer(frequency, SAMPLE_RATE);
line.write(buffer, 0, buffer.length);
}
} catch (LineUnavailableException e) {}
}

public byte[] generateSineWaveBuffer(float frequency, int sampleRate) {
SAMPLE_RATE = 44100; numSamples = sampleRate;

byte[] buffer = new byte[numSamples * 2]; // 2 bytes per sample (16-bit)
for (int i = 0; i < numSamples; i++) {

double angle = 2.0 * Math.PI * frequency * i / sampleRate;
short sampleValue = (short) (Math.sin(angle) * Short.MAX_VALUE);

buffer[i * 2] = (byte) (sampleValue & 0xFF);          // Low byte
buffer[i * 2 + 1] = (byte) (sampleValue >> 8);    // High byte
}
return buffer;
}
}
Я хотел бы иметь возможность остановить тон в любое время, используя кнопку остановки

Подробнее здесь: https://stackoverflow.com/questions/796 ... udioformat

Вернуться в «JAVA»