diff --git a/include/ehs/io/audio/AudioDevice_PW.h b/include/ehs/io/audio/AudioDevice_PW.h index f94bddd..b366d05 100644 --- a/include/ehs/io/audio/AudioDevice_PW.h +++ b/include/ehs/io/audio/AudioDevice_PW.h @@ -25,6 +25,7 @@ namespace ehs pw_core *core; pw_stream *input; pw_stream *output; + spa_hook paramsHook; static void RegistryEventGlobal(void *data, UInt_32 id, UInt_32 permissions, const char *type, UInt_32 version, const spa_dict *props); diff --git a/include/ehs/system/Architecture.h b/include/ehs/system/Architecture.h index da29911..0db9b45 100644 --- a/include/ehs/system/Architecture.h +++ b/include/ehs/system/Architecture.h @@ -6,7 +6,7 @@ #define EHS_64_BIT #elif defined(_M_ARM64) || defined(__aarch64__) #define EHS_LITTLE_ENDIAN - #define EHS_ARCH_ARM64 + #define EHS_ARCH_AARCH64 #define EHS_64_BIT #else #error Unsupported architecture. diff --git a/include/ehs/system/CPU.h b/include/ehs/system/CPU.h index 3b3e5cf..59d7dc5 100644 --- a/include/ehs/system/CPU.h +++ b/include/ehs/system/CPU.h @@ -281,6 +281,8 @@ namespace ehs //static Str_8 ToStr(); + static UInt_64 RetrieveFreq_AARCH64(); + static UInt_64 RetrieveTSC_Freq(); static UInt_64 CalculateTSC_Freq(); diff --git a/src/Math.cpp b/src/Math.cpp index 31ec2ef..c876fef 100644 --- a/src/Math.cpp +++ b/src/Math.cpp @@ -51,7 +51,7 @@ namespace ehs } return result; - #elif defined(EHS_ARCH_ARM64) + #elif defined(EHS_ARCH_AARCH64) return Sqrt_VFP4(from); #endif } @@ -74,7 +74,7 @@ namespace ehs } return result; - #elif defined(EHS_ARCH_ARM64) + #elif defined(EHS_ARCH_AARCH64) return Sqrt_VFP4(from); #endif } diff --git a/src/io/audio/AudioDevice_PW.cpp b/src/io/audio/AudioDevice_PW.cpp index 9e1071e..efbadec 100644 --- a/src/io/audio/AudioDevice_PW.cpp +++ b/src/io/audio/AudioDevice_PW.cpp @@ -93,13 +93,13 @@ namespace ehs } AudioDevice::AudioDevice() - : id(0), loop(nullptr), context(nullptr), core(nullptr), input(nullptr), output(nullptr) + : id(0), loop(nullptr), context(nullptr), core(nullptr), input(nullptr), output(nullptr), paramsHook{} { } AudioDevice::AudioDevice(AudioDevice&& device) noexcept : BaseAudioDevice(device), id(device.id), name((Str_8 &&)device.name), loop(device.loop), - context(device.context), core(device.core), input(device.input), output(device.output) + context(device.context), core(device.core), input(device.input), output(device.output), paramsHook(device.paramsHook) { device.id = 0; device.loop = nullptr; @@ -107,11 +107,12 @@ namespace ehs device.core = nullptr; device.input = nullptr; device.output = nullptr; + device.paramsHook = {}; } AudioDevice::AudioDevice(const AudioDevice& device) : BaseAudioDevice(device), id(device.id), name(device.name), loop(nullptr), context(nullptr), core(nullptr), - input(nullptr), output(nullptr) + input(nullptr), output(nullptr), paramsHook{} { } @@ -129,6 +130,7 @@ namespace ehs core = device.core; input = device.input; output = device.output; + paramsHook = device.paramsHook; device.id = 0; device.loop = nullptr; @@ -136,6 +138,7 @@ namespace ehs device.core = nullptr; device.input = nullptr; device.output = nullptr; + device.paramsHook = {}; return *this; } @@ -154,6 +157,7 @@ namespace ehs core = nullptr; input = nullptr; output = nullptr; + paramsHook = {}; return *this; } @@ -206,14 +210,18 @@ namespace ehs return; } - pw_stream_connect( - output, + SInt_32 err = pw_stream_connect( + input, PW_DIRECTION_INPUT, id, (pw_stream_flags)(PW_STREAM_FLAG_AUTOCONNECT | PW_STREAM_FLAG_MAP_BUFFERS), pod, 1 ); + if (err) + { + EHS_LOG_INT(LogType::ERR, 2, "Failed to connect input stream for audio device."); + } } if (GetType() == AudioDeviceType::OUTPUT || GetType() == AudioDeviceType::ALL) @@ -225,7 +233,7 @@ namespace ehs return; } - pw_stream_connect( + SInt_32 err = pw_stream_connect( output, PW_DIRECTION_OUTPUT, id, @@ -233,6 +241,10 @@ namespace ehs pod, 1 ); + if (err) + { + EHS_LOG_INT(LogType::ERR, 2, "Failed to connect output stream for audio device."); + } } static constexpr pw_stream_events streamEvents = { @@ -240,8 +252,17 @@ namespace ehs .param_changed = OnParamChanged }; - spa_hook streamListener = {}; - pw_stream_add_listener(output, &streamListener, &streamEvents, this); + pw_stream_add_listener(output, ¶msHook, &streamEvents, this); + + while (pw_stream_get_state(output, nullptr) == PW_STREAM_STATE_CONNECTING) + { + SInt_32 err = pw_loop_iterate(loop, 0); + if (err < 0) + { + EHS_LOG_INT(LogType::ERR, 3, "Failed to update audio with error #" + Str_8::FromNum(err) + "."); + return; + } + } EHS_LOG_SUCCESS(); } @@ -283,7 +304,15 @@ namespace ehs return 0; } - pw_loop_iterate(loop, 0); + if (!data || !size) + return 0; + + SInt_32 err = pw_loop_iterate(loop, 0); + if (err < 0) + { + EHS_LOG_INT(LogType::ERR, 1, "Failed to update audio with error #" + Str_8::FromNum(err) + "."); + return 0; + } if (pw_stream_get_state(output, nullptr) != PW_STREAM_STATE_STREAMING) return 0; diff --git a/src/system/CPU.cpp b/src/system/CPU.cpp index 935a628..9f23fde 100644 --- a/src/system/CPU.cpp +++ b/src/system/CPU.cpp @@ -78,7 +78,7 @@ namespace ehs { #if defined(EHS_ARCH_X64) return Architecture::X64; - #elif defined(EHS_ARCH_ARM64) + #elif defined(EHS_ARCH_AARCH64) return Architecture::ARM64; #else return Architecture::UNKNOWN; @@ -113,13 +113,19 @@ namespace ehs return frequency.QuadPart; #elif defined(EHS_OS_LINUX) - if (!TSC_Freq) - TSC_Freq = RetrieveTSC_Freq(); + #if defined(EHS_ARCH_X64) + if (!TSC_Freq) + TSC_Freq = RetrieveTSC_Freq(); - return TSC_Freq; + return TSC_Freq; + #elif defined(EHS_ARCH_AARCH64) + return RetrieveFreq_AARCH64(); + #else + return 0; + #endif + #else + return 0; #endif - - return 0; } UInt_64 CPU::GetTSC() @@ -133,7 +139,7 @@ namespace ehs TSC tsc; RDTSCP(&tsc); - #if defined(EHS_ARCH_X64) + #if defined(EHS_ARCH_X64) || defined(EHS_ARCH_AARCH64) UInt_64 result = 0; #if defined(EHS_LITTLE_ENDIAN) diff --git a/src/system/CPU_GCC_AARCH64.s b/src/system/CPU_GCC_AARCH64.s index 4ec99ac..367a064 100644 --- a/src/system/CPU_GCC_AARCH64.s +++ b/src/system/CPU_GCC_AARCH64.s @@ -1,7 +1,14 @@ .global _ZN3ehs3CPU6RDTSCPEPNS_3TSCE +.global _ZN3ehs3CPU20RetrieveFreq_AARCH64Ev .section .text _ZN3ehs3CPU6RDTSCPEPNS_3TSCE: - MRS X1, CNTVCT_EL0 - STR X1, [X0, #4] - RET \ No newline at end of file + MRS X2, CNTVCT_EL0 + EOR W1, W1, W1 + STR W1, [X0] + STR X2, [X0, #4] + RET + + _ZN3ehs3CPU20RetrieveFreq_AARCH64Ev: + MRS X0, CNTFRQ_EL0 + RET