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
80
81
82
83
84
85
86
87
88
89
|
/** @file
@ingroup bindings_java
@brief Example that shows how to play sine waves using JPortAudio.
*/
package com.portaudio;
import com.portaudio.TestBasic.SineOscillator;
public class PlaySine
{
/**
* Write a sine wave to the stream.
* @param stream
* @param framesPerBuffer
* @param numFrames
* @param sampleRate
*/
private void writeSineData( BlockingStream stream, int framesPerBuffer,
int numFrames, int sampleRate )
{
float[] buffer = new float[framesPerBuffer * 2];
SineOscillator osc1 = new SineOscillator( 200.0, sampleRate );
SineOscillator osc2 = new SineOscillator( 300.0, sampleRate );
int framesLeft = numFrames;
while( framesLeft > 0 )
{
int index = 0;
int framesToWrite = (framesLeft > framesPerBuffer) ? framesPerBuffer
: framesLeft;
for( int j = 0; j < framesToWrite; j++ )
{
buffer[index++] = (float) osc1.next();
buffer[index++] = (float) osc2.next();
}
stream.write( buffer, framesToWrite );
framesLeft -= framesToWrite;
}
}
/**
* Create a stream on the default device then play sine waves.
*/
public void play()
{
PortAudio.initialize();
// Get the default device and setup the stream parameters.
int deviceId = PortAudio.getDefaultOutputDevice();
DeviceInfo deviceInfo = PortAudio.getDeviceInfo( deviceId );
double sampleRate = deviceInfo.defaultSampleRate;
System.out.println( " deviceId = " + deviceId );
System.out.println( " sampleRate = " + sampleRate );
System.out.println( " device name = " + deviceInfo.name );
StreamParameters streamParameters = new StreamParameters();
streamParameters.channelCount = 2;
streamParameters.device = deviceId;
streamParameters.suggestedLatency = deviceInfo.defaultLowOutputLatency;
System.out.println( " suggestedLatency = "
+ streamParameters.suggestedLatency );
int framesPerBuffer = 256;
int flags = 0;
// Open a stream for output.
BlockingStream stream = PortAudio.openStream( null, streamParameters,
(int) sampleRate, framesPerBuffer, flags );
int numFrames = (int) (sampleRate * 4); // enough for 4 seconds
stream.start();
writeSineData( stream, framesPerBuffer, numFrames, (int) sampleRate );
stream.stop();
stream.close();
PortAudio.terminate();
System.out.println( "JPortAudio test complete." );
}
public static void main( String[] args )
{
PlaySine player = new PlaySine();
player.play();
}
}
|