aboutsummaryrefslogtreecommitdiffstats
path: root/src/jogl/classes/jogamp/opengl/util/av/JavaSoundAudioSink.java
blob: 653a0211174b3c51b1a63a8a4ab83fc1e07f9ec1 (plain)
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
75
76
77
78
79
package jogamp.opengl.util.av;

import java.util.Arrays;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;

public class JavaSoundAudioSink implements AudioSink {

    // AudioFormat parameters
    public  static final int     SAMPLE_RATE = 44100;
    private static final int     SAMPLE_SIZE = 16;
    private static final int     CHANNELS = 2;
    private static final boolean SIGNED = true;
    private static final boolean BIG_ENDIAN = false;

    // Chunk of audio processed at one time
    public static final int BUFFER_SIZE = 1000;
    public static final int SAMPLES_PER_BUFFER = BUFFER_SIZE / 2;
    
    // Sample time values
    public static final double SAMPLE_TIME_IN_SECS = 1.0 / SAMPLE_RATE;
    public static final double BUFFER_TIME_IN_SECS = SAMPLE_TIME_IN_SECS * SAMPLES_PER_BUFFER;
    
    private static AudioFormat format;
    private static DataLine.Info info;
    private static SourceDataLine auline;
    private static int bufferCount;
    private static byte [] sampleData = new byte[BUFFER_SIZE];  
    
    private static boolean available;
    
    static {
     // Create the audio format we wish to use
        format = new AudioFormat(SAMPLE_RATE, SAMPLE_SIZE, CHANNELS, SIGNED, BIG_ENDIAN);

        // Create dataline info object describing line format
        info = new DataLine.Info(SourceDataLine.class, format);

        // Clear buffer initially
        Arrays.fill(sampleData, (byte) 0);
        try{
            // Get line to write data to
            auline = (SourceDataLine) AudioSystem.getLine(info);
            auline.open(format);
            auline.start();
            System.out.println("JavaSound audio sink");
            available=true;
        } catch (Exception e) {
            available=false;
        }
    }   
    
    public void writeData(byte[] sampleData, int data_size) {
         int written = 0;
         int len;
         while (data_size > 0) {
            len = auline.write(sampleData, written, data_size);
            data_size -= len;
            written += len;
        }        
    }

    public int getDataAvailable() {
        return auline.available();
    }
    
    public boolean isDataAvailable(int data_size) {
        return auline.available()>=data_size;
    }

    @Override
    public boolean isAudioSinkAvailable() {
        return available;
    }

}