summaryrefslogtreecommitdiff
path: root/Source/Core/AudioCommon/CubebUtils.cpp
diff options
context:
space:
mode:
authorMichael Maltese <michaeljosephmaltese@gmail.com>2017-04-23 23:55:37 -0700
committerMichael Maltese <michaeljosephmaltese@gmail.com>2017-05-27 18:28:57 -0700
commitd416cbd9ed5efb391ad65c36ded74c17ab713622 (patch)
tree88d01f6fe28d6c1312eb19c68693aa3d728f66bf /Source/Core/AudioCommon/CubebUtils.cpp
parent34ad1eb5476b64c3697a26f0d4e74493aa075b2b (diff)
Add CubebUtils namespace and hook up cubeb logging
Diffstat (limited to 'Source/Core/AudioCommon/CubebUtils.cpp')
-rw-r--r--Source/Core/AudioCommon/CubebUtils.cpp75
1 files changed, 75 insertions, 0 deletions
diff --git a/Source/Core/AudioCommon/CubebUtils.cpp b/Source/Core/AudioCommon/CubebUtils.cpp
new file mode 100644
index 0000000000..07f4f530d6
--- /dev/null
+++ b/Source/Core/AudioCommon/CubebUtils.cpp
@@ -0,0 +1,75 @@
+// Copyright 2017 Dolphin Emulator Project
+// Licensed under GPLv2+
+// Refer to the license.txt file included.
+
+#include <cstdarg>
+#include <cstddef>
+#include <cstring>
+
+#include "AudioCommon/CubebUtils.h"
+#include "Common/CommonPaths.h"
+#include "Common/Logging/Log.h"
+#include "Common/Logging/LogManager.h"
+#include "Common/StringUtil.h"
+
+#include <cubeb/cubeb.h>
+
+static ptrdiff_t s_path_cutoff_point = 0;
+
+static void LogCallback(const char* format, ...)
+{
+ if (!LogManager::GetInstance())
+ return;
+
+ va_list args;
+ va_start(args, format);
+
+ const char* filename = va_arg(args, const char*) + s_path_cutoff_point;
+ int lineno = va_arg(args, int);
+ std::string adapted_format = StripSpaces(format + strlen("%s:%d:"));
+
+ LogManager::GetInstance()->LogWithFullPath(LogTypes::LNOTICE, LogTypes::AUDIO, filename, lineno,
+ adapted_format.c_str(), args);
+ va_end(args);
+}
+
+static void DestroyContext(cubeb* ctx)
+{
+ cubeb_destroy(ctx);
+ if (cubeb_set_log_callback(CUBEB_LOG_DISABLED, nullptr) != CUBEB_OK)
+ {
+ ERROR_LOG(AUDIO, "Error removing cubeb log callback");
+ }
+}
+
+std::shared_ptr<cubeb> CubebUtils::GetContext()
+{
+ static std::weak_ptr<cubeb> weak;
+
+ std::shared_ptr<cubeb> shared = weak.lock();
+ // Already initialized
+ if (shared)
+ return shared;
+
+ const char* filename = __FILE__;
+ const char* match_point = strstr(filename, DIR_SEP "Source" DIR_SEP "Core" DIR_SEP);
+ if (match_point)
+ {
+ s_path_cutoff_point = match_point - filename + strlen(DIR_SEP "Externals" DIR_SEP);
+ }
+ if (cubeb_set_log_callback(CUBEB_LOG_NORMAL, LogCallback) != CUBEB_OK)
+ {
+ ERROR_LOG(AUDIO, "Error setting cubeb log callback");
+ }
+
+ cubeb* ctx;
+ if (cubeb_init(&ctx, "Dolphin", nullptr) != CUBEB_OK)
+ {
+ ERROR_LOG(AUDIO, "Error initializing cubeb library");
+ return nullptr;
+ }
+ INFO_LOG(AUDIO, "Cubeb initialized using %s backend", cubeb_get_backend_id(ctx));
+
+ weak = shared = {ctx, DestroyContext};
+ return shared;
+}