Может записывать с TargetDataLine только первый раз - PullRequest
0 голосов
/ 21 декабря 2011

У меня есть Runnable, который получает линию на микрофон, читает с нее и сохраняет ее в OutputStream. Когда я запускаю 1-й экземпляр этой темы, он работает. После завершения 1-го потока (существует метод run ()) я запускаю другой экземпляр потока, но на этот раз я получаю:

javax.sound.sampled.LineUnavailableException: line with format PCM_SIGNED 44100.0 Hz, 8 bit, stereo, 2 bytes/frame,  not supported.
at com.sun.media.sound.DirectAudioDevice$DirectDL.implOpen(Unknown Source)
at com.sun.media.sound.AbstractDataLine.open(Unknown Source)
at com.sun.media.sound.AbstractDataLine.open(Unknown Source)

Моя тема выглядит так:

public void run() {
     float sampleRate = 44100.00F;
        //8000,11025,16000,22050,44100
        int sampleSizeInBits = 8;
        //8,16
        int channels = 2;
        //1,2
        boolean signed = true;
        //true,false
        boolean bigEndian = false;
        //true,false
    AudioFormat format = new AudioFormat(sampleRate,
           sampleSizeInBits,
           channels,
           signed,
           bigEndian);

    DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); // format is an AudioFormat object

    // Obtain and open the line.
    try {
        targetLine = (TargetDataLine) AudioSystem.getLine(info);
        targetLine.open(format); //exception is throw here
        targetLine.start();
        ByteArrayOutputStream out  = new ByteArrayOutputStream();
        CountingOutputStream countingOutStream = new CountingOutputStream(out);
        int numBytesRead;
        byte[] data = new byte[targetLine.getBufferSize() / 5];

        File binFile = new File("C:\\audio\\random4.txt");
        FileOutputStream fr = new FileOutputStream(binFile);


        while ( (countingOutStream.getCount()/1024) < targetSizeKB) {
           numBytesRead =  targetLine.read(data, 0, data.length);
           countingOutStream.write(data, 0, numBytesRead);
        }    




        fr.write(newByte,0,ii);
        countingOutStream.close();
        fr.close();

       targetLine.flush();
        targetLine.stop();
        targetLine = null;
}

1 Ответ

2 голосов
/ 21 декабря 2011

Вы звоните flush и stop на targetLine, но вы не звоните close - я подозреваю, что вам нужно сделать это, чтобы освободить его должным образом. (Между прочим, непонятно, почему targetLine является переменной экземпляра - нужно ли это?)

Вы также должны выполнять всю очистку в finally блоках, чтобы потоки закрывались, даже если выдается исключение.

...