Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/classes/com/sun/media/sound/DirectAudioDeviceProvider.java
38924 views
1
/*
2
* Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation. Oracle designates this
8
* particular file as subject to the "Classpath" exception as provided
9
* by Oracle in the LICENSE file that accompanied this code.
10
*
11
* This code is distributed in the hope that it will be useful, but WITHOUT
12
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14
* version 2 for more details (a copy is included in the LICENSE file that
15
* accompanied this code).
16
*
17
* You should have received a copy of the GNU General Public License version
18
* 2 along with this work; if not, write to the Free Software Foundation,
19
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20
*
21
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22
* or visit www.oracle.com if you need additional information or have any
23
* questions.
24
*/
25
26
package com.sun.media.sound;
27
28
import javax.sound.sampled.Mixer;
29
import javax.sound.sampled.spi.MixerProvider;
30
31
32
/**
33
* DirectAudioDevice provider.
34
*
35
* @author Florian Bomers
36
*/
37
public final class DirectAudioDeviceProvider extends MixerProvider {
38
39
// STATIC VARIABLES
40
41
/**
42
* Set of info objects for all port input devices on the system.
43
*/
44
private static DirectAudioDeviceInfo[] infos;
45
46
/**
47
* Set of all port input devices on the system.
48
*/
49
private static DirectAudioDevice[] devices;
50
51
52
// STATIC
53
54
static {
55
// initialize
56
Platform.initialize();
57
}
58
59
60
// CONSTRUCTOR
61
62
63
/**
64
* Required public no-arg constructor.
65
*/
66
public DirectAudioDeviceProvider() {
67
synchronized (DirectAudioDeviceProvider.class) {
68
if (Platform.isDirectAudioEnabled()) {
69
init();
70
} else {
71
infos = new DirectAudioDeviceInfo[0];
72
devices = new DirectAudioDevice[0];
73
}
74
}
75
}
76
77
private static void init() {
78
// get the number of input devices
79
int numDevices = nGetNumDevices();
80
81
if (infos == null || infos.length != numDevices) {
82
if (Printer.trace) Printer.trace("DirectAudioDeviceProvider: init()");
83
// initialize the arrays
84
infos = new DirectAudioDeviceInfo[numDevices];
85
devices = new DirectAudioDevice[numDevices];
86
87
// fill in the info objects now.
88
for (int i = 0; i < infos.length; i++) {
89
infos[i] = nNewDirectAudioDeviceInfo(i);
90
}
91
if (Printer.trace) Printer.trace("DirectAudioDeviceProvider: init(): found numDevices: " + numDevices);
92
}
93
}
94
95
public Mixer.Info[] getMixerInfo() {
96
synchronized (DirectAudioDeviceProvider.class) {
97
Mixer.Info[] localArray = new Mixer.Info[infos.length];
98
System.arraycopy(infos, 0, localArray, 0, infos.length);
99
return localArray;
100
}
101
}
102
103
104
public Mixer getMixer(Mixer.Info info) {
105
synchronized (DirectAudioDeviceProvider.class) {
106
// if the default device is asked, we provide the mixer
107
// with SourceDataLine's
108
if (info == null) {
109
for (int i = 0; i < infos.length; i++) {
110
Mixer mixer = getDevice(infos[i]);
111
if (mixer.getSourceLineInfo().length > 0) {
112
return mixer;
113
}
114
}
115
}
116
// otherwise get the first mixer that matches
117
// the requested info object
118
for (int i = 0; i < infos.length; i++) {
119
if (infos[i].equals(info)) {
120
return getDevice(infos[i]);
121
}
122
}
123
}
124
throw new IllegalArgumentException("Mixer " + info.toString() + " not supported by this provider.");
125
}
126
127
128
private static Mixer getDevice(DirectAudioDeviceInfo info) {
129
int index = info.getIndex();
130
if (devices[index] == null) {
131
devices[index] = new DirectAudioDevice(info);
132
}
133
return devices[index];
134
}
135
136
// INNER CLASSES
137
138
139
/**
140
* Info class for DirectAudioDevices. Adds an index value and a string for
141
* making native references to a particular device.
142
* This constructor is called from native.
143
*/
144
static final class DirectAudioDeviceInfo extends Mixer.Info {
145
private final int index;
146
private final int maxSimulLines;
147
148
// For ALSA, the deviceID contains the encoded card index, device index, and sub-device-index
149
private final int deviceID;
150
151
private DirectAudioDeviceInfo(int index, int deviceID, int maxSimulLines,
152
String name, String vendor,
153
String description, String version) {
154
super(name, vendor, "Direct Audio Device: "+description, version);
155
this.index = index;
156
this.maxSimulLines = maxSimulLines;
157
this.deviceID = deviceID;
158
}
159
160
int getIndex() {
161
return index;
162
}
163
164
int getMaxSimulLines() {
165
return maxSimulLines;
166
}
167
168
int getDeviceID() {
169
return deviceID;
170
}
171
} // class DirectAudioDeviceInfo
172
173
// NATIVE METHODS
174
private static native int nGetNumDevices();
175
// index: [0..nGetNumDevices()-1]
176
private static native DirectAudioDeviceInfo nNewDirectAudioDeviceInfo(int deviceIndex);
177
}
178
179