diff --git a/src/android/app/src/main/cpp/native-lib.cpp b/src/android/app/src/main/cpp/native-lib.cpp index 4eeea4ce..b6a316b8 100644 --- a/src/android/app/src/main/cpp/native-lib.cpp +++ b/src/android/app/src/main/cpp/native-lib.cpp @@ -13,7 +13,7 @@ #include "config/NetworkSettings.h" #include "input/InputManager.h" #include "Cafe/HW/Latte/Renderer/Vulkan/VulkanAPI.h" - +#include "AndroidGui/AndroidAudio.h" #include "JNIUtils.h" @@ -297,6 +297,11 @@ Java_info_cemu_Cemu_NativeLibrary_initializeEmulation(JNIEnv *env, jclass clazz) InputManager::instance().load(); InitializeGlobalVulkan(); createCemuDirectories(); + g_config.Load(); + auto &config = g_config.data(); + AndroidAudio::createAudioDevice(IAudioAPI::AudioAPI::Cubeb, + config.tv_channels, + config.tv_volume); } extern "C" JNIEXPORT void JNICALL diff --git a/src/gui/AndroidGui/AndroidAudio.cpp b/src/gui/AndroidGui/AndroidAudio.cpp new file mode 100644 index 00000000..eaa8a9c8 --- /dev/null +++ b/src/gui/AndroidGui/AndroidAudio.cpp @@ -0,0 +1,44 @@ +#include "AndroidAudio.h" + +#include "Cafe/OS/libs/snd_core/ax.h" +#include "audio/IAudioAPI.h" + +#if HAS_CUBEB +#include "audio/CubebAPI.h" +#endif // HAS_CUBEB + +namespace AndroidAudio +{ + +void createAudioDevice(IAudioAPI::AudioAPI audioApi, sint32 channels, sint32 volume, bool isTV) +{ + static constexpr int AX_FRAMES_PER_GROUP = 4; + std::unique_lock lock(g_audioMutex); + auto& audioDevice = isTV ? g_tvAudio : g_padAudio; + switch (audioApi) + { +#if HAS_CUBEB + case IAudioAPI::AudioAPI::Cubeb: + { + audioDevice.reset(); + std::shared_ptr deviceDescriptionPtr = std::make_shared(nullptr, std::string(), std::wstring()); + audioDevice = IAudioAPI::CreateDevice(IAudioAPI::AudioAPI::Cubeb, deviceDescriptionPtr, 48000, channels, snd_core::AX_SAMPLES_PER_3MS_48KHZ * AX_FRAMES_PER_GROUP, 16); + audioDevice->SetVolume(volume); + break; + } +#endif // HAS_CUBEB + default: + cemuLog_log(LogType::Force, fmt::format("Invalid audio api: {}", audioApi)); + break; + } +} + +void setAudioVolume(sint32 volume, bool isTV) +{ + std::shared_lock lock(g_audioMutex); + auto& audioDevice = isTV ? g_tvAudio : g_padAudio; + if (audioDevice) + audioDevice->SetVolume(volume); +} + +}; // namespace AndroidAudio diff --git a/src/gui/AndroidGui/AndroidAudio.h b/src/gui/AndroidGui/AndroidAudio.h new file mode 100644 index 00000000..ce03ab85 --- /dev/null +++ b/src/gui/AndroidGui/AndroidAudio.h @@ -0,0 +1,9 @@ +#pragma once + +#include "audio/IAudioAPI.h" + +namespace AndroidAudio +{ +void createAudioDevice(IAudioAPI::AudioAPI audioApi, sint32 channels, sint32 volume, bool isTV = true); +void setAudioVolume(sint32 volume, bool isTV = true); +}; // namespace AndroidAudio diff --git a/src/gui/AndroidGui/CMakeLists.txt b/src/gui/AndroidGui/CMakeLists.txt index 53f8662e..3531c06d 100644 --- a/src/gui/AndroidGui/CMakeLists.txt +++ b/src/gui/AndroidGui/CMakeLists.txt @@ -1,5 +1,7 @@ add_library(CemuAndroidGui + AndroidAudio.cpp + AndroidAudio.h AndroidGuiWrapper.cpp AndroidGuiWrapper.h GameIconLoader.cpp @@ -11,7 +13,7 @@ add_library(CemuAndroidGui Image.h Utils.cpp Utils.h - ) +) target_include_directories(CemuAndroidGui PUBLIC "../") @@ -30,4 +32,4 @@ target_link_libraries(CemuAndroidGui PRIVATE OpenSSL::Crypto pugixml::pugixml ZArchive::zarchive - ) +)