Skip to content

Commit 6550c3c

Browse files
committed
Audio device retrieval with the AudioDeviceModule
1 parent 824aaf1 commit 6550c3c

File tree

5 files changed

+91
-1
lines changed

5 files changed

+91
-1
lines changed

webrtc-jni/src/main/cpp/include/JNI_AudioDeviceModule.h

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

webrtc-jni/src/main/cpp/src/JNI_AudioDeviceModule.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,54 @@ JNIEXPORT void JNICALL Java_dev_onvoid_webrtc_media_audio_AudioDeviceModule_init
5454
}
5555
}
5656

57+
JNIEXPORT jobject JNICALL Java_dev_onvoid_webrtc_media_audio_AudioDeviceModule_getPlayoutDevices
58+
(JNIEnv* env, jobject caller)
59+
{
60+
webrtc::AudioDeviceModule * audioModule = GetHandle<webrtc::AudioDeviceModule>(env, caller);
61+
CHECK_HANDLEV(audioModule, nullptr);
62+
63+
char name[webrtc::kAdmMaxDeviceNameSize];
64+
char guid[webrtc::kAdmMaxGuidSize];
65+
66+
int16_t deviceCount = audioModule->PlayoutDevices();
67+
68+
jni::JavaArrayList deviceList(env, deviceCount);
69+
70+
for (int i = 0; i < deviceCount; ++i) {
71+
if (audioModule->PlayoutDeviceName(i, name, guid) == 0) {
72+
auto device = std::make_shared<jni::avdev::AudioDevice>(name, guid);
73+
74+
deviceList.add(jni::AudioDevice::toJavaAudioDevice(env, device));
75+
}
76+
}
77+
78+
return deviceList.listObject().release();
79+
}
80+
81+
JNIEXPORT jobject JNICALL Java_dev_onvoid_webrtc_media_audio_AudioDeviceModule_getRecordingDevices
82+
(JNIEnv* env, jobject caller)
83+
{
84+
webrtc::AudioDeviceModule * audioModule = GetHandle<webrtc::AudioDeviceModule>(env, caller);
85+
CHECK_HANDLEV(audioModule, nullptr);
86+
87+
char name[webrtc::kAdmMaxDeviceNameSize];
88+
char guid[webrtc::kAdmMaxGuidSize];
89+
90+
int16_t deviceCount = audioModule->RecordingDevices();
91+
92+
jni::JavaArrayList deviceList(env, deviceCount);
93+
94+
for (int i = 0; i < deviceCount; ++i) {
95+
if (audioModule->RecordingDeviceName(i, name, guid) == 0) {
96+
auto device = std::make_shared<jni::avdev::AudioDevice>(name, guid);
97+
98+
deviceList.add(jni::AudioDevice::toJavaAudioDevice(env, device));
99+
}
100+
}
101+
102+
return deviceList.listObject().release();
103+
}
104+
57105
JNIEXPORT void JNICALL Java_dev_onvoid_webrtc_media_audio_AudioDeviceModule_setPlayoutDevice
58106
(JNIEnv * env, jobject caller, jobject device)
59107
{
@@ -103,6 +151,7 @@ JNIEXPORT void JNICALL Java_dev_onvoid_webrtc_media_audio_AudioDeviceModule_setR
103151
jni::JavaObject obj(env, jni::JavaLocalRef<jobject>(env, device));
104152

105153
const auto javaClass = jni::JavaClasses::get<jni::AudioDevice::JavaAudioDeviceClass>(env);
154+
const std::string devName = jni::JavaString::toNative(env, obj.getString(javaClass->name));
106155
const std::string devGuid = jni::JavaString::toNative(env, obj.getString(javaClass->descriptor));
107156

108157
uint16_t index = 0;
@@ -113,6 +162,9 @@ JNIEXPORT void JNICALL Java_dev_onvoid_webrtc_media_audio_AudioDeviceModule_setR
113162

114163
for (int i = 0; i < deviceCount; ++i) {
115164
if ((audioModule->RecordingDeviceName(i, name, guid) == 0) && devGuid == std::string(guid)) {
165+
printf("selected audio device: %s - %s\n", name, guid);
166+
fflush(NULL);
167+
116168
index = i;
117169
break;
118170
}

webrtc-jni/src/main/cpp/src/JNI_PeerConnectionFactory.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
JNIEXPORT void JNICALL Java_dev_onvoid_webrtc_PeerConnectionFactory_initialize
3838
(JNIEnv * env, jobject caller, jobject audioModule)
3939
{
40-
webrtc::AudioDeviceModule * audioDevModule = GetHandle<webrtc::AudioDeviceModule>(env, caller);
40+
webrtc::AudioDeviceModule * audioDevModule = GetHandle<webrtc::AudioDeviceModule>(env, audioModule);
4141

4242
try {
4343
auto networkThread = rtc::Thread::CreateWithSocketServer();

webrtc/src/main/java/dev/onvoid/webrtc/media/MediaDevices.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import dev.onvoid.webrtc.internal.NativeLoader;
2020
import dev.onvoid.webrtc.media.audio.AudioDevice;
21+
import dev.onvoid.webrtc.media.audio.AudioDeviceModule;
2122
import dev.onvoid.webrtc.media.video.VideoCaptureCapability;
2223
import dev.onvoid.webrtc.media.video.VideoDevice;
2324

@@ -47,4 +48,19 @@ public class MediaDevices {
4748

4849
public static native List<VideoCaptureCapability> getVideoCaptureCapabilities(VideoDevice device);
4950

51+
public static List<AudioDevice> getNativeAudioRenderDevices() {
52+
AudioDeviceModule deviceModule = new AudioDeviceModule();
53+
List<AudioDevice> devices = deviceModule.getPlayoutDevices();
54+
deviceModule.dispose();
55+
56+
return devices;
57+
}
58+
59+
public static List<AudioDevice> getNativeAudioCaptureDevices() {
60+
AudioDeviceModule deviceModule = new AudioDeviceModule();
61+
List<AudioDevice> devices = deviceModule.getRecordingDevices();
62+
deviceModule.dispose();
63+
64+
return devices;
65+
}
5066
}

webrtc/src/main/java/dev/onvoid/webrtc/media/audio/AudioDeviceModule.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
import dev.onvoid.webrtc.internal.DisposableNativeObject;
2020

21+
import java.util.List;
22+
2123
public class AudioDeviceModule extends DisposableNativeObject {
2224

2325
public AudioDeviceModule() {
@@ -32,6 +34,10 @@ public AudioDeviceModule(AudioLayer audioLayer) {
3234

3335
public native void initRecording();
3436

37+
public native List<AudioDevice> getPlayoutDevices();
38+
39+
public native List<AudioDevice> getRecordingDevices();
40+
3541
public native void setPlayoutDevice(AudioDevice device);
3642

3743
public native void setRecordingDevice(AudioDevice device);

0 commit comments

Comments
 (0)