DSP tutorial: Simple audio recording

This example records audio to a .wav file using the built-in Java methods.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
public class AudioRecorder implements Runnable {

    // note that this is declared as static so if we stop/close it, the thread will stop
    private static TargetDataLine tdl;
    private File outputFile;

    AudioRecorder(final TargetDataLine tdl, final File outputFile) {
        AudioRecorder.tdl = tdl;
        this.outputFile = outputFile;
    }

    @Override
    public void run() {
        tdl.start();
        try {
            // this will block until tdl doesn't get closed
            AudioSystem.write(new AudioInputStream(tdl), AudioFileFormat.Type.WAVE, outputFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void stopRecording() {
        tdl.stop();
        tdl.close();
    }
   
    public static void main(String[] args) {
        File outputFile = new File("output.wav");

        AudioFormat audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 44100.0F, 16, 2, 4, 44100.0F, false);
        DataLine.Info info = new DataLine.Info(TargetDataLine.class, audioFormat);

        TargetDataLine targetDataLine = null;
        try {
            targetDataLine = (TargetDataLine) AudioSystem.getLine(info);
            targetDataLine.open(audioFormat);
        } catch (LineUnavailableException e1) {
            e1.printStackTrace();
        }

        // creating the recorder thread from this class' instance
        AudioRecorder audioRecorder = new AudioRecorder(targetDataLine, outputFile);
        Thread audioRecorderThread = new Thread(audioRecorder);

        // we use this to read line from the standard input
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Press ENTER to start recording!");
        try {
            br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }

        audioRecorderThread.start();

        System.out.println("Recording... press ENTER to stop recording!");
        try {
            br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }

        audioRecorder.stopRecording();
       
        try {
            // waiting for the recorder thread to stop
            audioRecorderThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Recording stopped.");
    }
}

As you can see, we start a thread to handle the recording. This way we can wait for a keypress to stop recording.

download (4.9 kb)

Edd 2013-10-31 15:20:22

Hi, for me it looks like this is just the source code with just a few explanations. Would be nice if there would be more comments. But thx :)

 
Name (required)
E-mail (required - never shown publicly)
Webpage URL
Comment:
You may use <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> in your comment.

Trackback responses to this post

About me

Nonoo
I'm Nonoo. This is my blog about music, sounds, filmmaking, amateur radio, computers, programming, electronics and other things I'm obsessed with. ... »

Twitter

Listening now

My favorite artists