From 92e64c144dc470081c2b8dd121589e1178658e80 Mon Sep 17 00:00:00 2001 From: Iwan Timmer Date: Wed, 12 Feb 2014 17:53:39 +0100 Subject: [PATCH] Possible to specify audio device and default to hw:0 to stop using PusleAudio --- jni/nv_alsa/nv_alsa.c | 4 ++-- jni/nv_alsa/nv_alsa.h | 2 +- jni/nv_alsa/nv_alsa_jni.c | 14 ++++++++++++-- src/com/limelight/Limelight.java | 18 ++++++++++++++---- src/com/limelight/binding/PlatformBinding.java | 4 ++-- src/com/limelight/binding/audio/AlsaAudio.java | 2 +- .../binding/audio/AlsaAudioRenderer.java | 8 +++++++- 7 files changed, 39 insertions(+), 13 deletions(-) diff --git a/jni/nv_alsa/nv_alsa.c b/jni/nv_alsa/nv_alsa.c index e1de5b9..3ecd8a3 100644 --- a/jni/nv_alsa/nv_alsa.c +++ b/jni/nv_alsa/nv_alsa.c @@ -7,13 +7,13 @@ snd_pcm_t *handle; -int nv_alsa_init(unsigned int channelCount, unsigned int sampleRate) { +int nv_alsa_init(unsigned int channelCount, unsigned int sampleRate, unsigned char* device) { int rc; snd_pcm_hw_params_t *params; int dir; /* Open PCM device for playback. */ - if ((rc = snd_pcm_open(&handle, "default", SND_PCM_STREAM_PLAYBACK, 0)) != 0) + if ((rc = snd_pcm_open(&handle, device, SND_PCM_STREAM_PLAYBACK, 0)) != 0) return rc; snd_pcm_hw_params_alloca(¶ms); diff --git a/jni/nv_alsa/nv_alsa.h b/jni/nv_alsa/nv_alsa.h index be3c34e..465ba79 100644 --- a/jni/nv_alsa/nv_alsa.h +++ b/jni/nv_alsa/nv_alsa.h @@ -1,5 +1,5 @@ #include -int nv_alsa_init(unsigned int channelCount, unsigned int sampleRate); +int nv_alsa_init(unsigned int channelCount, unsigned int sampleRate, unsigned char* indata); int nv_alsa_play(unsigned char* indata, int inlen); void nv_alsa_close(void); diff --git a/jni/nv_alsa/nv_alsa_jni.c b/jni/nv_alsa/nv_alsa_jni.c index 17b7c06..79abb89 100644 --- a/jni/nv_alsa/nv_alsa_jni.c +++ b/jni/nv_alsa/nv_alsa_jni.c @@ -6,9 +6,19 @@ // This function must be called before // any other decoding functions JNIEXPORT jint JNICALL -Java_com_limelight_binding_audio_AlsaAudio_init(JNIEnv *env, jobject this, jint channelCount, jint sampleRate) +Java_com_limelight_binding_audio_AlsaAudio_init(JNIEnv *env, jobject this, jint channelCount, jint sampleRate, jbyteArray device) { - return nv_alsa_init(channelCount, sampleRate); + jint ret; + jbyte* jni_device; + + jni_device = (*env)->GetByteArrayElements(env, device, 0); + + ret = nv_alsa_init(channelCount, sampleRate, jni_device); + + // The input data isn't changed so it can be safely aborted + (*env)->ReleaseByteArrayElements(env, device, jni_device, JNI_ABORT); + + return ret; } JNIEXPORT void JNICALL diff --git a/src/com/limelight/Limelight.java b/src/com/limelight/Limelight.java index 61c4ec6..96f7aea 100644 --- a/src/com/limelight/Limelight.java +++ b/src/com/limelight/Limelight.java @@ -43,7 +43,7 @@ public class Limelight implements NvConnectionListener { /* * Creates a connection to the host and starts up the stream. */ - private void startUp(StreamConfiguration streamConfig, List inputs, String mappingFile) { + private void startUp(StreamConfiguration streamConfig, List inputs, String mappingFile, String audioDevice) { String vm = System.getProperties().getProperty("java.vm.name"); if (!vm.contains("HotSpot")) { System.err.println("You are using a unsupported VM: " + vm); @@ -87,11 +87,11 @@ public class Limelight implements NvConnectionListener { displayError("Input", "Are you running as root?"); return; } - } + } conn.start(PlatformBinding.getDeviceName(), null, VideoDecoderRenderer.FLAG_PREFER_QUALITY, - PlatformBinding.getAudioRenderer(), + PlatformBinding.getAudioRenderer(audioDevice), PlatformBinding.getVideoDecoderRenderer()); } @@ -151,6 +151,7 @@ public class Limelight implements NvConnectionListener { int refresh = 60; boolean parse = true; String mapping = null; + String audio = "hw:0"; for (int i = 0; i < args.length - 1; i++) { if (args[i].equals("-input")) { @@ -169,6 +170,14 @@ public class Limelight implements NvConnectionListener { System.out.println("Syntax error: mapping file expected after -mapping"); System.exit(3); } + } else if (args[i].equals("-audio")) { + if (i + 1 < args.length) { + audio = args[i+1]; + i++; + } else { + System.out.println("Syntax error: audio device expected after -audio"); + System.exit(3); + } } else if (args[i].equals("-pair")) { pair = true; } else if (args[i].equals("-720")) { @@ -194,6 +203,7 @@ public class Limelight implements NvConnectionListener { System.out.println("\t-input \tUse as input. Can be used multiple times"); System.out.println("\t\t\t[default uses all devices in /dev/input]"); System.out.println("\t-mapping \tUse as gamepad mapping configuration file"); + System.out.println("\t-audio \tUse as ALSA audio output device (default hw:0)"); System.out.println("\t-pair\t\tPair with host"); System.out.println(); System.out.println("Use ctrl-c to exit application"); @@ -205,7 +215,7 @@ public class Limelight implements NvConnectionListener { Limelight limelight = new Limelight(host); if (!pair) - limelight.startUp(streamConfig, inputs, mapping); + limelight.startUp(streamConfig, inputs, mapping, audio); else limelight.pair(); } diff --git a/src/com/limelight/binding/PlatformBinding.java b/src/com/limelight/binding/PlatformBinding.java index c197ec1..836c095 100644 --- a/src/com/limelight/binding/PlatformBinding.java +++ b/src/com/limelight/binding/PlatformBinding.java @@ -39,7 +39,7 @@ public class PlatformBinding { * Gets an instance of an audio decoder/renderer. * @return an audio decoder and renderer */ - public static AudioRenderer getAudioRenderer() { - return new AlsaAudioRenderer(); + public static AudioRenderer getAudioRenderer(String device) { + return new AlsaAudioRenderer(device); } } diff --git a/src/com/limelight/binding/audio/AlsaAudio.java b/src/com/limelight/binding/audio/AlsaAudio.java index 3f50713..c33bc87 100644 --- a/src/com/limelight/binding/audio/AlsaAudio.java +++ b/src/com/limelight/binding/audio/AlsaAudio.java @@ -9,7 +9,7 @@ public class AlsaAudio { System.loadLibrary("nv_alsa"); } - public static native int init(int channelCount, int sampleRate); + public static native int init(int channelCount, int sampleRate, byte[] device); public static native void close(); diff --git a/src/com/limelight/binding/audio/AlsaAudioRenderer.java b/src/com/limelight/binding/audio/AlsaAudioRenderer.java index 7dbd60a..5a590e7 100644 --- a/src/com/limelight/binding/audio/AlsaAudioRenderer.java +++ b/src/com/limelight/binding/audio/AlsaAudioRenderer.java @@ -7,10 +7,16 @@ import com.limelight.nvstream.av.audio.AudioRenderer; * @author Iwan Timmer */ public class AlsaAudioRenderer implements AudioRenderer { + + private String device; + + public AlsaAudioRenderer(String device) { + this.device = device; + } @Override public void streamInitialized(int channelCount, int sampleRate) { - int ret = AlsaAudio.init(channelCount, sampleRate); + int ret = AlsaAudio.init(channelCount, sampleRate, device.getBytes()); if (ret != 0) throw new IllegalStateException("AVC decoder initialization failure: "+ret); }