mirror of
https://github.com/moonlight-stream/moonlight-android.git
synced 2025-07-20 11:33:06 +00:00
Allow renderer initialization to indicate failure
This commit is contained in:
parent
2f082b9f85
commit
00e81e87de
@ -234,15 +234,13 @@ public class NvConnection {
|
|||||||
private boolean startVideoStream() throws IOException
|
private boolean startVideoStream() throws IOException
|
||||||
{
|
{
|
||||||
videoStream = new VideoStream(hostAddr, listener, controlStream, config);
|
videoStream = new VideoStream(hostAddr, listener, controlStream, config);
|
||||||
videoStream.startVideoStream(videoDecoderRenderer, videoRenderTarget, drFlags);
|
return videoStream.startVideoStream(videoDecoderRenderer, videoRenderTarget, drFlags);
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean startAudioStream() throws IOException
|
private boolean startAudioStream() throws IOException
|
||||||
{
|
{
|
||||||
audioStream = new AudioStream(hostAddr, listener, audioRenderer);
|
audioStream = new AudioStream(hostAddr, listener, audioRenderer);
|
||||||
audioStream.startAudioStream();
|
return audioStream.startAudioStream();
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean startInputConnection() throws IOException
|
private boolean startInputConnection() throws IOException
|
||||||
|
@ -6,7 +6,7 @@ public interface AudioRenderer {
|
|||||||
|
|
||||||
public int getCapabilities();
|
public int getCapabilities();
|
||||||
|
|
||||||
public void streamInitialized(int channelCount, int sampleRate);
|
public boolean streamInitialized(int channelCount, int sampleRate);
|
||||||
|
|
||||||
public void playDecodedAudio(byte[] audioData, int offset, int length);
|
public void playDecodedAudio(byte[] audioData, int offset, int length);
|
||||||
|
|
||||||
|
@ -67,11 +67,14 @@ public class AudioStream {
|
|||||||
threads.clear();
|
threads.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startAudioStream() throws SocketException
|
public boolean startAudioStream() throws SocketException
|
||||||
{
|
{
|
||||||
setupRtpSession();
|
setupRtpSession();
|
||||||
|
|
||||||
setupAudio();
|
if (!setupAudio()) {
|
||||||
|
abort();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
startReceiveThread();
|
startReceiveThread();
|
||||||
|
|
||||||
@ -80,6 +83,8 @@ public class AudioStream {
|
|||||||
}
|
}
|
||||||
|
|
||||||
startUdpPingThread();
|
startUdpPingThread();
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setupRtpSession() throws SocketException
|
private void setupRtpSession() throws SocketException
|
||||||
@ -90,7 +95,7 @@ public class AudioStream {
|
|||||||
rtp.bind(new InetSocketAddress(RTP_PORT));
|
rtp.bind(new InetSocketAddress(RTP_PORT));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setupAudio()
|
private boolean setupAudio()
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
@ -99,7 +104,9 @@ public class AudioStream {
|
|||||||
throw new IllegalStateException("Opus decoder failed to initialize");
|
throw new IllegalStateException("Opus decoder failed to initialize");
|
||||||
}
|
}
|
||||||
|
|
||||||
streamListener.streamInitialized(OpusDecoder.getChannelCount(), OpusDecoder.getSampleRate());
|
if (!streamListener.streamInitialized(OpusDecoder.getChannelCount(), OpusDecoder.getSampleRate())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if ((streamListener.getCapabilities() & AudioRenderer.CAPABILITY_DIRECT_SUBMIT) != 0) {
|
if ((streamListener.getCapabilities() & AudioRenderer.CAPABILITY_DIRECT_SUBMIT) != 0) {
|
||||||
depacketizer = new AudioDepacketizer(streamListener);
|
depacketizer = new AudioDepacketizer(streamListener);
|
||||||
@ -107,6 +114,8 @@ public class AudioStream {
|
|||||||
else {
|
else {
|
||||||
depacketizer = new AudioDepacketizer(null);
|
depacketizer = new AudioDepacketizer(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void startDecoderThread()
|
private void startDecoderThread()
|
||||||
|
@ -7,9 +7,9 @@ public interface VideoDecoderRenderer {
|
|||||||
|
|
||||||
public int getCapabilities();
|
public int getCapabilities();
|
||||||
|
|
||||||
public void setup(int width, int height, int redrawRate, Object renderTarget, int drFlags);
|
public boolean setup(int width, int height, int redrawRate, Object renderTarget, int drFlags);
|
||||||
|
|
||||||
public void start(VideoDepacketizer depacketizer);
|
public boolean start(VideoDepacketizer depacketizer);
|
||||||
|
|
||||||
public void stop();
|
public void stop();
|
||||||
|
|
||||||
|
@ -132,20 +132,27 @@ public class VideoStream {
|
|||||||
rtp.bind(new InetSocketAddress(RTP_PORT));
|
rtp.bind(new InetSocketAddress(RTP_PORT));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setupDecoderRenderer(VideoDecoderRenderer decRend, Object renderTarget, int drFlags) {
|
public boolean setupDecoderRenderer(VideoDecoderRenderer decRend, Object renderTarget, int drFlags) {
|
||||||
this.decRend = decRend;
|
this.decRend = decRend;
|
||||||
if (decRend != null) {
|
if (decRend != null) {
|
||||||
decRend.setup(streamConfig.getWidth(), streamConfig.getHeight(),
|
if (!decRend.setup(streamConfig.getWidth(), streamConfig.getHeight(),
|
||||||
60, renderTarget, drFlags);
|
60, renderTarget, drFlags)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
depacketizer = new VideoDepacketizer(avConnListener, streamConfig.getMaxPacketSize());
|
depacketizer = new VideoDepacketizer(avConnListener, streamConfig.getMaxPacketSize());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startVideoStream(VideoDecoderRenderer decRend, Object renderTarget, int drFlags) throws IOException
|
public boolean startVideoStream(VideoDecoderRenderer decRend, Object renderTarget, int drFlags) throws IOException
|
||||||
{
|
{
|
||||||
// Setup the decoder and renderer
|
// Setup the decoder and renderer
|
||||||
setupDecoderRenderer(decRend, renderTarget, drFlags);
|
if (!setupDecoderRenderer(decRend, renderTarget, drFlags)) {
|
||||||
|
// Nothing to cleanup here
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Open RTP sockets and start session
|
// Open RTP sockets and start session
|
||||||
setupRtpSession();
|
setupRtpSession();
|
||||||
@ -167,9 +174,14 @@ public class VideoStream {
|
|||||||
startReceiveThread();
|
startReceiveThread();
|
||||||
|
|
||||||
// Start the renderer
|
// Start the renderer
|
||||||
decRend.start(depacketizer);
|
if (!decRend.start(depacketizer)) {
|
||||||
|
abort();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
startedRendering = true;
|
startedRendering = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void startReceiveThread()
|
private void startReceiveThread()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user