Minor fixes

This commit is contained in:
Lynix 2023-11-28 20:05:09 +01:00
parent c7579fb9be
commit 079f153640
16 changed files with 53 additions and 47 deletions

View File

@ -61,6 +61,11 @@ namespace Nz
Music& operator=(Music&&) = delete; Music& operator=(Music&&) = delete;
private: private:
bool FillAndQueueBuffer(std::shared_ptr<AudioBuffer> buffer);
void MusicThread(std::condition_variable& cv, std::mutex& m, std::exception_ptr& err, bool startPaused);
void StartThread(bool startPaused);
void StopThread();
AudioFormat m_audioFormat; AudioFormat m_audioFormat;
std::atomic_bool m_streaming; std::atomic_bool m_streaming;
std::atomic<UInt64> m_processedSamples; std::atomic<UInt64> m_processedSamples;
@ -72,11 +77,7 @@ namespace Nz
UInt32 m_sampleRate; UInt32 m_sampleRate;
UInt64 m_streamOffset; UInt64 m_streamOffset;
bool m_looping; bool m_looping;
bool m_musicStarted;
bool FillAndQueueBuffer(std::shared_ptr<AudioBuffer> buffer);
void MusicThread(std::condition_variable& cv, std::mutex& m, std::exception_ptr& err, bool startPaused);
void StartThread(bool startPaused);
void StopThread();
}; };
} }

View File

@ -11,7 +11,7 @@
#include <Nazara/Renderer/Config.hpp> #include <Nazara/Renderer/Config.hpp>
#include <Nazara/Renderer/Enums.hpp> #include <Nazara/Renderer/Enums.hpp>
#include <NazaraUtils/FunctionRef.hpp> #include <NazaraUtils/FunctionRef.hpp>
#include <functional> #include <concepts>
#include <type_traits> #include <type_traits>
#include <vector> #include <vector>
@ -28,7 +28,7 @@ namespace Nz
class Releasable; class Releasable;
class ReleasableCallback; class ReleasableCallback;
template<typename T> class ReleasableData; template<typename T> class ReleasableData;
template<typename T> class ReleasableLambda; template<std::invocable T> class ReleasableFunctor;
virtual ~RenderResources(); virtual ~RenderResources();
@ -42,7 +42,7 @@ namespace Nz
template<typename T> void PushForRelease(const T& value) = delete; template<typename T> void PushForRelease(const T& value) = delete;
template<typename T> void PushForRelease(T&& value); template<typename T> void PushForRelease(T&& value);
template<typename F> void PushReleaseCallback(F&& callback); template<std::invocable F> void PushReleaseCallback(F&& callback);
virtual void SubmitCommandBuffer(CommandBuffer* commandBuffer, QueueTypeFlags queueTypeFlags) = 0; virtual void SubmitCommandBuffer(CommandBuffer* commandBuffer, QueueTypeFlags queueTypeFlags) = 0;
@ -93,19 +93,19 @@ namespace Nz
T m_data; T m_data;
}; };
template<typename T> template<std::invocable T>
class RenderResources::ReleasableLambda final : public ReleasableCallback class RenderResources::ReleasableFunctor final : public ReleasableCallback
{ {
public: public:
template<typename U> ReleasableLambda(U&& lambda); template<typename U> requires(std::constructible_from<T, U&&>) ReleasableFunctor(U&& lambda);
ReleasableLambda(const ReleasableLambda&) = delete; ReleasableFunctor(const ReleasableFunctor&) = delete;
ReleasableLambda(ReleasableLambda&&) = delete; ReleasableFunctor(ReleasableFunctor&&) = delete;
~ReleasableLambda() = default; ~ReleasableFunctor() = default;
void Release() override; void Release() override;
ReleasableLambda& operator=(const ReleasableLambda&) = delete; ReleasableFunctor& operator=(const ReleasableFunctor&) = delete;
ReleasableLambda& operator=(ReleasableLambda&&) = delete; ReleasableFunctor& operator=(ReleasableFunctor&&) = delete;
private: private:
T m_lambda; T m_lambda;

View File

@ -47,10 +47,10 @@ namespace Nz
m_releaseQueue.push_back(releasable); m_releaseQueue.push_back(releasable);
} }
template<typename F> template<std::invocable F>
void RenderResources::PushReleaseCallback(F&& callback) void RenderResources::PushReleaseCallback(F&& callback)
{ {
using ReleaseFunctor = ReleasableLambda<std::remove_cv_t<std::remove_reference_t<F>>>; using ReleaseFunctor = ReleasableFunctor<std::remove_cv_t<std::remove_reference_t<F>>>;
ReleaseFunctor* releasable = Allocate<ReleaseFunctor>(); ReleaseFunctor* releasable = Allocate<ReleaseFunctor>();
PlacementNew(releasable, std::forward<F>(callback)); PlacementNew(releasable, std::forward<F>(callback));
@ -117,19 +117,19 @@ namespace Nz
{ {
} }
template<typename T> template<std::invocable T>
template<typename U> template<typename U>
RenderResources::ReleasableLambda<T>::ReleasableLambda(U&& lambda) : requires(std::constructible_from<T, U&&>)
RenderResources::ReleasableFunctor<T>::ReleasableFunctor(U&& lambda) :
m_lambda(std::forward<U>(lambda)) m_lambda(std::forward<U>(lambda))
{ {
} }
template<typename T> template<std::invocable T>
void RenderResources::ReleasableLambda<T>::Release() void RenderResources::ReleasableFunctor<T>::Release()
{ {
m_lambda(); m_lambda();
} }
} }
#include <Nazara/Renderer/DebugOff.hpp> #include <Nazara/Renderer/DebugOff.hpp>
#include "RenderResources.hpp"

View File

@ -153,7 +153,7 @@ namespace Nz
inline void OBJParser::Error(const std::string& message) inline void OBJParser::Error(const std::string& message)
{ {
NazaraErrorFmt("{0} at line #{1}", message, m_lineCount); NazaraErrorFmt("{0} on line #{1}", message, m_lineCount);
} }
inline void OBJParser::Flush() const inline void OBJParser::Flush() const
@ -164,7 +164,7 @@ namespace Nz
inline void OBJParser::Warning(const std::string& message) inline void OBJParser::Warning(const std::string& message)
{ {
NazaraWarningFmt("{0} at line #{1}", message, m_lineCount); NazaraWarningFmt("{0} on line #{1}", message, m_lineCount);
} }
inline bool OBJParser::UnrecognizedLine(bool error) inline bool OBJParser::UnrecognizedLine(bool error)

View File

@ -472,6 +472,7 @@ namespace Nz
// Signal we're good // Signal we're good
{ {
std::unique_lock<std::mutex> lock(m); std::unique_lock<std::mutex> lock(m);
m_musicStarted = true;
cv.notify_all(); cv.notify_all();
} // m & cv no longer exists from here } // m & cv no longer exists from here
@ -519,10 +520,11 @@ namespace Nz
std::exception_ptr exceptionPtr; std::exception_ptr exceptionPtr;
std::unique_lock<std::mutex> lock(mutex); std::unique_lock<std::mutex> lock(mutex);
m_musicStarted = false;
m_thread = std::thread(&Music::MusicThread, this, std::ref(cv), std::ref(mutex), std::ref(exceptionPtr), startPaused); m_thread = std::thread(&Music::MusicThread, this, std::ref(cv), std::ref(mutex), std::ref(exceptionPtr), startPaused);
// Wait until thread signal it has properly started (or an error occurred) // Wait until thread signal it has properly started (or an error occurred)
cv.wait(lock); cv.wait(lock, [&] { return exceptionPtr || m_musicStarted; });
if (exceptionPtr) if (exceptionPtr)
std::rethrow_exception(exceptionPtr); std::rethrow_exception(exceptionPtr);

View File

@ -4,14 +4,11 @@
#include <Nazara/Audio/OpenALLibrary.hpp> #include <Nazara/Audio/OpenALLibrary.hpp>
#include <Nazara/Audio/OpenALDevice.hpp> #include <Nazara/Audio/OpenALDevice.hpp>
#include <Nazara/Core/Algorithm.hpp> #include <NazaraUtils/Algorithm.hpp>
#include <Nazara/Core/Error.hpp> #include <Nazara/Core/Error.hpp>
#include <Nazara/Core/ErrorFlags.hpp> #include <Nazara/Core/ErrorFlags.hpp>
#include <Nazara/Core/Log.hpp>
#include <Nazara/Core/StringExt.hpp>
#include <NazaraUtils/CallOnExit.hpp> #include <NazaraUtils/CallOnExit.hpp>
#include <array> #include <array>
#include <cstring>
#include <sstream> #include <sstream>
#include <stdexcept> #include <stdexcept>
#include <Nazara/Audio/Debug.hpp> #include <Nazara/Audio/Debug.hpp>
@ -30,7 +27,7 @@ namespace Nz
#define NAZARA_AUDIO_AL_ALC_FUNCTION(name) #define NAZARA_AUDIO_AL_ALC_FUNCTION(name)
#define NAZARA_AUDIO_AL_EXT_BEGIN(ext) if (alIsExtensionPresent(#ext)) { #define NAZARA_AUDIO_AL_EXT_BEGIN(ext) if (alIsExtensionPresent(#ext)) {
#define NAZARA_AUDIO_AL_EXT_END() } #define NAZARA_AUDIO_AL_EXT_END() }
#define NAZARA_AUDIO_AL_FUNCTION_EXT(name) name = reinterpret_cast<decltype(&::name)>(alGetProcAddress(#name)); #define NAZARA_AUDIO_AL_EXT_FUNCTION(name) name = reinterpret_cast<decltype(&::name)>(alGetProcAddress(#name));
#include <Nazara/Audio/OpenALFunctions.hpp> #include <Nazara/Audio/OpenALFunctions.hpp>
m_hasCaptureSupport = alcIsExtensionPresent(nullptr, "ALC_EXT_CAPTURE"); m_hasCaptureSupport = alcIsExtensionPresent(nullptr, "ALC_EXT_CAPTURE");
@ -67,7 +64,7 @@ namespace Nz
{ {
ErrorFlags disableError(ErrorMode::Silent, ~ErrorMode::ThrowException); ErrorFlags disableError(ErrorMode::Silent, ~ErrorMode::ThrowException);
if (!m_library.Load(libname)) if (!m_library.Load(Utf8Path(libname)))
continue; continue;
auto LoadSymbol = [this](const char* name, bool optional) auto LoadSymbol = [this](const char* name, bool optional)
@ -82,13 +79,16 @@ namespace Nz
try try
{ {
#define NAZARA_AUDIO_AL_ALC_FUNCTION(name) name = reinterpret_cast<decltype(&::name)>(LoadSymbol(#name, false)); #define NAZARA_AUDIO_AL_ALC_FUNCTION(name) name = reinterpret_cast<decltype(&::name)>(LoadSymbol(#name, false));
#define NAZARA_AUDIO_AL_EXT_BEGIN(name)
#define NAZARA_AUDIO_AL_EXT_END(name)
#define NAZARA_AUDIO_AL_EXT_FUNCTION(name)
#include <Nazara/Audio/OpenALFunctions.hpp> #include <Nazara/Audio/OpenALFunctions.hpp>
} }
catch (const std::exception& e) catch (const std::exception& e)
{ {
ErrorFlags disableSilent({}, ~ErrorMode::Silent); ErrorFlags disableSilent({}, ~ErrorMode::Silent);
NazaraWarning(std::string("failed to load ") + libname + ": " + e.what()); NazaraWarningFmt("failed to load {0}: {1}", libname, e.what());
continue; continue;
} }
@ -104,6 +104,8 @@ namespace Nz
// Load core // Load core
#define NAZARA_AUDIO_AL_ALC_FUNCTION(name) name = &::name; #define NAZARA_AUDIO_AL_ALC_FUNCTION(name) name = &::name;
#define NAZARA_AUDIO_AL_EXT_BEGIN(name)
#define NAZARA_AUDIO_AL_EXT_END(name)
#define NAZARA_AUDIO_AL_EXT_FUNCTION(name) #define NAZARA_AUDIO_AL_EXT_FUNCTION(name)
#include <Nazara/Audio/OpenALFunctions.hpp> #include <Nazara/Audio/OpenALFunctions.hpp>

View File

@ -37,7 +37,7 @@ namespace Nz
{ {
#if NAZARA_CORE_SAFE #if NAZARA_CORE_SAFE
if (m_referenceCount > 0) if (m_referenceCount > 0)
NazaraWarning("Resource destroyed while still referenced " + std::to_string(m_referenceCount) + " time(s)"); NazaraWarningFmt("Resource destroyed while still referenced {0} time(s)", m_referenceCount);
#endif #endif
} }

View File

@ -298,7 +298,7 @@ namespace Nz
while (ptr < ptrEnd && *patternPtr != '*') while (ptr < ptrEnd && *patternPtr != '*')
{ {
if (patternPtr < patternPtrEnd && *patternPtr != *ptr && *patternPtr != '?') if (patternPtr >= patternPtrEnd || (*patternPtr != *ptr && *patternPtr != '?'))
return false; return false;
patternPtr++; patternPtr++;
@ -307,7 +307,7 @@ namespace Nz
const char* cp = nullptr; const char* cp = nullptr;
const char* mp = nullptr; const char* mp = nullptr;
while (*ptr) while (ptr < ptrEnd)
{ {
if (*patternPtr == '*') if (*patternPtr == '*')
{ {

View File

@ -100,7 +100,7 @@ namespace Nz
if (it == m_materialInstances.end()) if (it == m_materialInstances.end())
{ {
auto& matPassEntry = m_materialInstances[&materialInstance]; auto& matPassEntry = m_materialInstances[&materialInstance];
matPassEntry.onMaterialInstancePipelineInvalidated.Connect(materialInstance.OnMaterialInstancePipelineInvalidated, [=](const MaterialInstance*, std::size_t passIndex) matPassEntry.onMaterialInstancePipelineInvalidated.Connect(materialInstance.OnMaterialInstancePipelineInvalidated, [this](const MaterialInstance*, std::size_t passIndex)
{ {
if (passIndex != m_passIndex) if (passIndex != m_passIndex)
return; return;

View File

@ -34,7 +34,7 @@ namespace Nz
const auto& uniformBlockData = material.GetUniformBlockData(m_uniformBlockIndex); const auto& uniformBlockData = material.GetUniformBlockData(m_uniformBlockIndex);
const ShaderReflection::StructData* structData = reflection.GetStructByIndex(uniformBlockData.structIndex); const ShaderReflection::StructData* structData = reflection.GetStructByIndex(uniformBlockData.structIndex);
NazaraAssert(structData, "invalid struct index " + std::to_string(uniformBlockData.structIndex)); NazaraAssertFmt(structData, "invalid struct index {0}", uniformBlockData.structIndex);
auto it = structData->members.find(m_memberTag); auto it = structData->members.find(m_memberTag);
if (it == structData->members.end()) if (it == structData->members.end())

View File

@ -475,7 +475,7 @@ namespace Nz
return SocketState::Connected; return SocketState::Connected;
else else
{ {
NazaraWarning("Socket " + std::to_string(handle) + " was returned by poll without POLLOUT nor error events (events: 0x" + NumberToString(descriptor.revents, 16) + ')'); NazaraWarningFmt("Socket {0} was returned by poll without POLLOUT nor error events (events: {1:#x})", handle, descriptor.revents);
return SocketState::NotConnected; return SocketState::NotConnected;
} }
} }

View File

@ -91,7 +91,7 @@ namespace Nz
if (shaderBinding) if (shaderBinding)
shaderBinding->Apply(*pipelineLayout, setIndex, context); shaderBinding->Apply(*pipelineLayout, setIndex, context);
else else
NazaraWarning("no shader binding for set #" + std::to_string(setIndex)); NazaraWarningFmt("no shader binding for set #{0}", setIndex);
setIndex++; setIndex++;
} }

View File

@ -45,17 +45,17 @@ namespace Nz::GL
if constexpr (std::is_same_v<Ret, void>) if constexpr (std::is_same_v<Ret, void>)
{ {
funcPtr(std::forward<Args>(args)...); funcPtr(args...);
if (context->ProcessErrorStack()) if (context->ProcessErrorStack())
context->PrintFunctionCall(FuncIndex, std::forward<Args>(args)...); context->PrintFunctionCall(FuncIndex, args...);
} }
else else
{ {
Ret r = funcPtr(std::forward<Args>(args)...); Ret r = funcPtr(args...);
if (context->ProcessErrorStack()) if (context->ProcessErrorStack())
context->PrintFunctionCall(FuncIndex, std::forward<Args>(args)...); context->PrintFunctionCall(FuncIndex, args...);
return r; return r;
} }

View File

@ -188,7 +188,7 @@ namespace Nz
m_byteStream >> minimumCodeSize; m_byteStream >> minimumCodeSize;
if (minimumCodeSize > 12) if (minimumCodeSize > 12)
{ {
NazaraInternalError("unexpected LZW Minimum Code Size (" + std::to_string(minimumCodeSize) + ")"); NazaraInternalErrorFmt("unexpected LZW Minimum Code Size ({0})", minimumCodeSize);
return false; return false;
} }

View File

@ -211,7 +211,7 @@ namespace Nz
void MD5MeshParser::Error(const std::string& message) void MD5MeshParser::Error(const std::string& message)
{ {
NazaraErrorFmt("{0} at line #1", message, m_lineCount); NazaraErrorFmt("{0} on line #{1}", message, m_lineCount);
} }
bool MD5MeshParser::ParseJoints() bool MD5MeshParser::ParseJoints()
@ -446,7 +446,7 @@ namespace Nz
void MD5MeshParser::Warning(const std::string& message) void MD5MeshParser::Warning(const std::string& message)
{ {
NazaraWarning(message + " at line #" + std::to_string(m_lineCount)); NazaraWarningFmt("{0} on line #{1}", message, m_lineCount);
} }
void MD5MeshParser::UnrecognizedLine(bool error) void MD5MeshParser::UnrecognizedLine(bool error)

View File

@ -79,6 +79,7 @@ SCENARIO("String", "[CORE][STRING]")
CHECK(Nz::MatchPattern("Lynix", "?????")); CHECK(Nz::MatchPattern("Lynix", "?????"));
CHECK(Nz::MatchPattern("Lynix", "*Lynix")); CHECK(Nz::MatchPattern("Lynix", "*Lynix"));
CHECK(Nz::MatchPattern("Lynox", "*Lyn?x")); CHECK(Nz::MatchPattern("Lynox", "*Lyn?x"));
CHECK_FALSE(Nz::MatchPattern("Lynix", "Ly"));
CHECK_FALSE(Nz::MatchPattern("", "?")); CHECK_FALSE(Nz::MatchPattern("", "?"));
CHECK_FALSE(Nz::MatchPattern("", "*")); CHECK_FALSE(Nz::MatchPattern("", "*"));