diff --git a/app/app.pro b/app/app.pro index 7d5514a9..4173f2a2 100644 --- a/app/app.pro +++ b/app/app.pro @@ -60,15 +60,21 @@ macx { } unix:!macx { - CONFIG += link_pkgconfig soundio + CONFIG += link_pkgconfig PKGCONFIG += openssl sdl2 SDL2_ttf opus - # For libsoundio - packagesExist(libpulse) { - PKGCONFIG += libpulse + # SLAudio is used on Steam Link + !config_SL { + CONFIG += soundio } - packagesExist(alsa) { - PKGCONFIG += alsa + + soundio { + packagesExist(libpulse) { + PKGCONFIG += libpulse + } + packagesExist(alsa) { + PKGCONFIG += alsa + } } packagesExist(libavcodec) { @@ -208,13 +214,15 @@ libvdpau { config_SL { message(Steam Link build configuration selected) - DEFINES += STEAM_LINK HAVE_SLVIDEO - LIBS += -lSLVideo + DEFINES += STEAM_LINK HAVE_SLVIDEO HAVE_SLAUDIO + LIBS += -lSLVideo -lSLAudio SOURCES += \ - streaming/video/slvid.cpp + streaming/video/slvid.cpp \ + streaming/audio/renderers/slaud.cpp HEADERS += \ - streaming/video/slvid.h + streaming/video/slvid.h \ + streaming/audio/renderers/slaud.h } win32:!winrt { message(DXVA2 renderer selected) @@ -270,7 +278,7 @@ else:unix: LIBS += -L$$OUT_PWD/../qmdnsengine/ -lqmdnsengine INCLUDEPATH += $$PWD/../qmdnsengine/qmdnsengine/src/include $$PWD/../qmdnsengine DEPENDPATH += $$PWD/../qmdnsengine/qmdnsengine/src/include $$PWD/../qmdnsengine -!winrt { +soundio { win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../soundio/release/ -lsoundio else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../soundio/debug/ -lsoundio else:unix: LIBS += -L$$OUT_PWD/../soundio/ -lsoundio diff --git a/app/streaming/audio/audio.cpp b/app/streaming/audio/audio.cpp index e77d2d2b..887d24c0 100644 --- a/app/streaming/audio/audio.cpp +++ b/app/streaming/audio/audio.cpp @@ -5,18 +5,24 @@ #include "renderers/soundioaudiorenderer.h" #endif +#ifdef HAVE_SLAUDIO +#include "renderers/slaud.h" +#endif + #include "renderers/sdl.h" #include IAudioRenderer* Session::createAudioRenderer() { -#ifdef HAVE_SOUNDIO +#if defined(HAVE_SOUNDIO) if (qgetenv("ML_AUDIO") == "SDL") { return new SdlAudioRenderer(); } return new SoundIoAudioRenderer(); +#elif defined(HAVE_SLAUDIO) + return new SLAudioRenderer(); #else return new SdlAudioRenderer(); #endif diff --git a/app/streaming/audio/renderers/slaud.cpp b/app/streaming/audio/renderers/slaud.cpp new file mode 100644 index 00000000..146d86d8 --- /dev/null +++ b/app/streaming/audio/renderers/slaud.cpp @@ -0,0 +1,58 @@ +#include "slaud.h" + +#include + +SLAudioRenderer::SLAudioRenderer() + : m_AudioContext(nullptr), + m_AudioStream(nullptr) +{ +} + +bool SLAudioRenderer::prepareForPlayback(const OPUS_MULTISTREAM_CONFIGURATION* opusConfig) +{ + m_AudioContext = SLAudio_CreateContext(); + if (m_AudioContext == nullptr) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, + "SLAudio_CreateContext() failed"); + return false; + } + + m_AudioStream = SLAudio_CreateStream(m_AudioContext, + opusConfig->sampleRate, + opusConfig->channelCount, + SAMPLES_PER_FRAME * sizeof(short) * opusConfig->channelCount, + 1); + if (m_AudioStream == nullptr) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, + "SLAudio_CreateStream() failed"); + return false; + } + + SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, + "Using SLAudio renderer"); + + return true; +} + +SLAudioRenderer::~SLAudioRenderer() +{ + if (m_AudioStream != nullptr) { + SLAudio_FreeStream(m_AudioStream); + } + + if (m_AudioContext != nullptr) { + SLAudio_FreeContext(m_AudioContext); + } +} + +bool SLAudioRenderer::submitAudio(short* audioBuffer, int audioSize) +{ + void* outputBuffer = SLAudio_BeginFrame(m_AudioStream); + + if (outputBuffer != nullptr) { + memcpy(outputBuffer, audioBuffer, audioSize); + SLAudio_SubmitFrame(m_AudioStream); + } + + return true; +} diff --git a/app/streaming/audio/renderers/slaud.h b/app/streaming/audio/renderers/slaud.h new file mode 100644 index 00000000..5c4ab9ec --- /dev/null +++ b/app/streaming/audio/renderers/slaud.h @@ -0,0 +1,20 @@ +#pragma once + +#include "renderer.h" +#include + +class SLAudioRenderer : public IAudioRenderer +{ +public: + SLAudioRenderer(); + + virtual ~SLAudioRenderer(); + + virtual bool prepareForPlayback(const OPUS_MULTISTREAM_CONFIGURATION* opusConfig); + + virtual bool submitAudio(short* audioBuffer, int audioSize); + +private: + CSLAudioContext* m_AudioContext; + CSLAudioStream* m_AudioStream; +};