Move media playback detection to OS namespace

This commit is contained in:
Hyper 2024-12-08 18:00:12 +00:00
parent 26dbd7c697
commit 7b2383e8ad
6 changed files with 95 additions and 77 deletions

View file

@ -67,12 +67,14 @@ set(SWA_KERNEL_CXX_SOURCES
) )
set(SWA_OS_CXX_SOURCES set(SWA_OS_CXX_SOURCES
"os/media.cpp"
"os/process.cpp" "os/process.cpp"
"os/version.cpp" "os/version.cpp"
) )
if (WIN32) if (WIN32)
list(APPEND SWA_OS_CXX_SOURCES list(APPEND SWA_OS_CXX_SOURCES
"os/win32/media_win32.cpp"
"os/win32/process_win32.cpp" "os/win32/process_win32.cpp"
"os/win32/version_win32.cpp" "os/win32/version_win32.cpp"
) )

View file

@ -0,0 +1,7 @@
#include <os/media.h>
#include <os/media_detail.h>
bool os::media::IsExternalMediaPlaying()
{
return detail::IsExternalMediaPlaying();
}

View file

@ -0,0 +1,6 @@
#pragma once
namespace os::media
{
bool IsExternalMediaPlaying();
}

View file

@ -0,0 +1,6 @@
#pragma once
namespace os::media::detail
{
bool IsExternalMediaPlaying();
}

View file

@ -0,0 +1,72 @@
#include <os/media_detail.h>
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Media.Control.h>
using namespace winrt;
using namespace winrt::Windows::Foundation;
using namespace winrt::Windows::Media::Control;
static GlobalSystemMediaTransportControlsSessionManager g_sessionManager = nullptr;
static GlobalSystemMediaTransportControlsSessionManager GetSessionManager()
{
if (g_sessionManager)
return g_sessionManager;
try
{
init_apartment();
return g_sessionManager = GlobalSystemMediaTransportControlsSessionManager::RequestAsync().get();
}
catch (...)
{
printf("[*] Failed to retrieve GSMTC session manager: 0x%08X\n", to_hresult().value);
return nullptr;
}
}
static GlobalSystemMediaTransportControlsSession GetCurrentSession()
{
auto sessionManager = GetSessionManager();
if (!sessionManager)
return nullptr;
try
{
return sessionManager.GetCurrentSession();
}
catch (...)
{
printf("[*] Failed to retrieve current GSMTC session: 0x%08X\n", to_hresult().value);
return nullptr;
}
}
static GlobalSystemMediaTransportControlsSessionPlaybackInfo GetPlaybackInfo()
{
auto session = GetCurrentSession();
if (!session)
return nullptr;
try
{
return session.GetPlaybackInfo();
}
catch (...)
{
printf("[*] Failed to retrieve GSMTC playback info: 0x%08X\n", to_hresult().value);
return nullptr;
}
}
bool os::media::detail::IsExternalMediaPlaying()
{
auto playbackInfo = GetPlaybackInfo();
if (!playbackInfo)
return false;
return playbackInfo.PlaybackStatus() == GlobalSystemMediaTransportControlsSessionPlaybackStatus::Playing;
}

View file

@ -1,85 +1,12 @@
#include <cpu/guest_code.h> #include <cpu/guest_code.h>
#include <user/config.h> #include <user/config.h>
#include <kernel/function.h> #include <kernel/function.h>
#include <os/media.h>
#include <os/version.h> #include <os/version.h>
#include <patches/audio_patches.h> #include <patches/audio_patches.h>
#include <api/SWA.h> #include <api/SWA.h>
#if _WIN32
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Media.Control.h>
using namespace winrt;
using namespace winrt::Windows::Foundation;
using namespace winrt::Windows::Media::Control;
static GlobalSystemMediaTransportControlsSessionManager g_sessionManager = nullptr;
static GlobalSystemMediaTransportControlsSessionManager GetSessionManager()
{
if (g_sessionManager)
return g_sessionManager;
try
{
init_apartment();
return g_sessionManager = GlobalSystemMediaTransportControlsSessionManager::RequestAsync().get();
}
catch (...)
{
printf("[*] Failed to retrieve GSMTC session manager: 0x%08X\n", to_hresult().value);
return nullptr;
}
}
static GlobalSystemMediaTransportControlsSession GetCurrentSession()
{
auto sessionManager = GetSessionManager();
if (!sessionManager)
return nullptr;
try
{
return sessionManager.GetCurrentSession();
}
catch (...)
{
printf("[*] Failed to retrieve current GSMTC session: 0x%08X\n", to_hresult().value);
return nullptr;
}
}
static GlobalSystemMediaTransportControlsSessionPlaybackInfo GetPlaybackInfo()
{
auto session = GetCurrentSession();
if (!session)
return nullptr;
try
{
return session.GetPlaybackInfo();
}
catch (...)
{
printf("[*] Failed to retrieve GSMTC playback info: 0x%08X\n", to_hresult().value);
return nullptr;
}
}
static bool IsExternalAudioPlaying()
{
auto playbackInfo = GetPlaybackInfo();
if (!playbackInfo)
return false;
return playbackInfo.PlaybackStatus() == GlobalSystemMediaTransportControlsSessionPlaybackStatus::Playing;
}
int AudioPatches::m_isAttenuationSupported = -1; int AudioPatches::m_isAttenuationSupported = -1;
#endif
static be<float>* GetVolume(bool isMusic = true) static be<float>* GetVolume(bool isMusic = true)
{ {
@ -116,12 +43,11 @@ void AudioPatches::Update(float deltaTime)
if (!pMusicVolume || !pEffectsVolume) if (!pMusicVolume || !pEffectsVolume)
return; return;
#if _WIN32
if (Config::MusicAttenuation && CanAttenuate()) if (Config::MusicAttenuation && CanAttenuate())
{ {
auto time = 1.0f - expf(2.5f * -deltaTime); auto time = 1.0f - expf(2.5f * -deltaTime);
if (IsExternalAudioPlaying()) if (os::media::IsExternalMediaPlaying())
{ {
*pMusicVolume = std::lerp(*pMusicVolume, 0.0f, time); *pMusicVolume = std::lerp(*pMusicVolume, 0.0f, time);
} }
@ -131,7 +57,6 @@ void AudioPatches::Update(float deltaTime)
} }
} }
else else
#endif
{ {
*pMusicVolume = Config::MusicVolume; *pMusicVolume = Config::MusicVolume;
} }