Allow streaming with no audio device. Fixes #52

This commit is contained in:
Cameron Gutman 2018-08-31 00:09:31 -04:00
parent 16d105d462
commit 762fe92933
3 changed files with 68 additions and 3 deletions

View file

@ -70,6 +70,60 @@ Exit:
return ret; return ret;
} }
bool Session::testAudio(int audioConfiguration)
{
SDL_AudioSpec want, have;
SDL_AudioDeviceID dev;
bool ret;
if (SDL_InitSubSystem(SDL_INIT_AUDIO) != 0) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
"Audio test - SDL_InitSubSystem(SDL_INIT_AUDIO) failed: %s",
SDL_GetError());
return false;
}
SDL_zero(want);
want.freq = 48000;
want.format = AUDIO_S16;
want.samples = SAMPLES_PER_FRAME;
switch (audioConfiguration) {
case AUDIO_CONFIGURATION_STEREO:
want.channels = 2;
break;
case AUDIO_CONFIGURATION_51_SURROUND:
want.channels = 6;
break;
default:
SDL_assert(false);
ret = false;
goto Exit;
}
// Test audio device for functionality
dev = SDL_OpenAudioDevice(NULL, 0, &want, &have, 0);
if (dev == 0) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
"Audio test - Failed to open audio device: %s",
SDL_GetError());
ret = false;
goto Exit;
}
SDL_CloseAudioDevice(dev);
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,
"Audio test - Successful with %d channels",
want.channels);
ret = true;
Exit:
SDL_QuitSubSystem(SDL_INIT_AUDIO);
return ret;
}
int Session::sdlAudioInit(int /* audioConfiguration */, int Session::sdlAudioInit(int /* audioConfiguration */,
POPUS_MULTISTREAM_CONFIGURATION opusConfig, POPUS_MULTISTREAM_CONFIGURATION opusConfig,
void* /* arContext */, int /* arFlags */) void* /* arContext */, int /* arFlags */)
@ -82,7 +136,7 @@ int Session::sdlAudioInit(int /* audioConfiguration */,
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
"SDL_InitSubSystem(SDL_INIT_AUDIO) failed: %s", "SDL_InitSubSystem(SDL_INIT_AUDIO) failed: %s",
SDL_GetError()); SDL_GetError());
return AUDIO_CONFIGURATION_STEREO; return -1;
} }
SDL_zero(want); SDL_zero(want);

View file

@ -275,7 +275,8 @@ Session::Session(NvComputer* computer, NvApp& app)
m_Window(nullptr), m_Window(nullptr),
m_VideoDecoder(nullptr), m_VideoDecoder(nullptr),
m_DecoderLock(0), m_DecoderLock(0),
m_NeedsIdr(false) m_NeedsIdr(false),
m_AudioDisabled(false)
{ {
qDebug() << "Server GPU:" << m_Computer->gpuModel; qDebug() << "Server GPU:" << m_Computer->gpuModel;
@ -472,6 +473,12 @@ bool Session::validateLaunch()
} }
} }
// Test that audio hardware is functional
m_AudioDisabled = !testAudio(m_StreamConfig.audioConfiguration);
if (m_AudioDisabled) {
emitLaunchWarning("Failed to open audio device. Audio will be unavailable during this session.");
}
if (m_Preferences.videoDecoderSelection == StreamingPreferences::VDS_FORCE_HARDWARE && if (m_Preferences.videoDecoderSelection == StreamingPreferences::VDS_FORCE_HARDWARE &&
!isHardwareDecodeAvailable(m_Preferences.videoDecoderSelection, !isHardwareDecodeAvailable(m_Preferences.videoDecoderSelection,
m_StreamConfig.supportsHevc ? VIDEO_FORMAT_H265 : VIDEO_FORMAT_H264, m_StreamConfig.supportsHevc ? VIDEO_FORMAT_H265 : VIDEO_FORMAT_H264,
@ -688,7 +695,8 @@ void Session::exec()
} }
int err = LiStartConnection(&hostInfo, &m_StreamConfig, &k_ConnCallbacks, int err = LiStartConnection(&hostInfo, &m_StreamConfig, &k_ConnCallbacks,
&m_VideoCallbacks, &k_AudioCallbacks, &m_VideoCallbacks,
m_AudioDisabled ? nullptr : &k_AudioCallbacks,
NULL, 0, NULL, 0); NULL, 0, NULL, 0);
if (err != 0) { if (err != 0) {
// We already displayed an error dialog in the stage failure // We already displayed an error dialog in the stage failure

View file

@ -49,6 +49,8 @@ private:
int sdlDetermineAudioConfiguration(); int sdlDetermineAudioConfiguration();
bool testAudio(int audioConfiguration);
void getWindowDimensions(bool fullScreen, void getWindowDimensions(bool fullScreen,
int& x, int& y, int& x, int& y,
int& width, int& height); int& width, int& height);
@ -107,6 +109,7 @@ private:
IVideoDecoder* m_VideoDecoder; IVideoDecoder* m_VideoDecoder;
SDL_SpinLock m_DecoderLock; SDL_SpinLock m_DecoderLock;
bool m_NeedsIdr; bool m_NeedsIdr;
bool m_AudioDisabled;
int m_ActiveVideoFormat; int m_ActiveVideoFormat;
int m_ActiveVideoWidth; int m_ActiveVideoWidth;