libvlcpp | branch: master | Hugo Beauzée-Luyssen <[email protected]> | Mon Sep 28 18:31:23 2015 +0200| [109ff137444ccd1d6f39bdc871e9adde24414a60] | committer: Hugo Beauzée-Luyssen
cppcx: Expose logSet > http://git.videolan.org/gitweb.cgi/libvlcpp.git/?a=commit;h=109ff137444ccd1d6f39bdc871e9adde24414a60 --- cppcx/InstanceCX.cpp | 19 +++++++++++++++++++ cppcx/InstanceCX.hpp | 30 ++++++++++++++++++++++++++++++ vlcpp/Instance.hpp | 21 ++++++++++++++------- 3 files changed, 63 insertions(+), 7 deletions(-) diff --git a/cppcx/InstanceCX.cpp b/cppcx/InstanceCX.cpp index b756202..91af4d8 100644 --- a/cppcx/InstanceCX.cpp +++ b/cppcx/InstanceCX.cpp @@ -118,6 +118,25 @@ namespace libVLCX m_instance.setAppId(VLCString(id), VLCString(version), VLCString(icon)); } + void Instance::logUnset() + { + m_instance.logUnset(); + } + + void Instance::logSet(LogCallback^ logCb) + { + m_instance.logSet([logCb](int logLevel, const libvlc_log_t* Log, std::string msgStr) + { + size_t len = MultiByteToWideChar(CP_UTF8, 0, msgStr.c_str(), -1, nullptr, 0); + if (len == 0) + return; + wchar_t *out = new wchar_t[len]; + std::unique_ptr<wchar_t[]> out_u(out); + MultiByteToWideChar(CP_UTF8, 0, msgStr.c_str(), -1, out, len); + logCb(logLevel, ref new Platform::String(out)); + }); + } + Windows::Foundation::Collections::IVector<ModuleDescription^>^ Instance::audioFilterList() { return MarshallVector<ModuleDescription, VLC::ModuleDescription>(m_instance.audioFilterList()); diff --git a/cppcx/InstanceCX.hpp b/cppcx/InstanceCX.hpp index 9b0754d..46853f9 100644 --- a/cppcx/InstanceCX.hpp +++ b/cppcx/InstanceCX.hpp @@ -32,6 +32,7 @@ namespace libVLCX { + public delegate void LogCallback(int, Platform::String^); public ref class Instance sealed { public: @@ -101,6 +102,35 @@ namespace libVLCX void setAppId(Platform::String^ id, Platform::String^ version, Platform::String^ icon); /** + * Unsets the logging callback for a LibVLC instance. This is rarely + * needed: the callback is implicitly unset when the instance is + * destroyed. This function will wait for any pending callbacks + * invocation to complete (causing a deadlock if called from within the + * callback). + * + * \version LibVLC 2.1.0 or later + */ + void logUnset(); + + /** + * Sets the logging callback for a LibVLC instance. This function is + * thread-safe: it will wait for any pending callbacks invocation to + * complete. + * + * \note Some log messages (especially debug) are emitted by LibVLC while + * is being initialized. These messages cannot be captured with this + * interface. + * + * \param logCb A delegate of the form void(int logLevel, String message) + * + * \warning A deadlock may occur if this function is called from the + * callback. + * + * \version LibVLC 2.1.0 or later + */ + void logSet(LogCallback^ logCb); + + /** * Returns a list of audio filters that are available. * * \return a list of module descriptions. It should be freed with diff --git a/vlcpp/Instance.hpp b/vlcpp/Instance.hpp index 0ba78e5..d4a61e5 100644 --- a/vlcpp/Instance.hpp +++ b/vlcpp/Instance.hpp @@ -192,17 +192,24 @@ public: static_assert(signature_match<LogCb, void(int, const libvlc_log_t*, std::string)>::value, "Mismatched log callback" ); auto wrapper = [logCb](int level, const libvlc_log_t* ctx, const char* format, va_list va) { - VaCopy vaCopy( va ); - int len = vsnprintf( nullptr, 0, format, vaCopy.va ); - if ( len > 0 ) +#ifndef _MSC_VER + VaCopy vaCopy(va); + int len = vsnprintf(nullptr, 0, format, vaCopy.va); + if (len > 0) { std::unique_ptr<char[]> message{ new char[len] }; - if ( vsnprintf( message.get(), len, format, va ) != -1 ) - logCb( level, ctx, std::string{ message.get() } ); + if (vsnprintf(message.get(), len, format, va) != -1) + logCb(level, ctx, std::string{ message.get() }); } +#else + //MSVC treats passing nullptr as 1st vsnprintf(_s) as an error + char buff[512]; + vsnprintf(buff, sizeof(buff) - 1, format, va); + logCb(level, ctx, std::string{ buff }); +#endif }; - libvlc_log_set( *this, CallbackWrapper<(unsigned int)CallbackIdx::Log, libvlc_log_cb>::wrap( this, std::move( wrapper ) ), - static_cast<CallbackOwner<2>*>( this ) ); + libvlc_log_set(*this, CallbackWrapper<(unsigned int)CallbackIdx::Log, libvlc_log_cb>::wrap(this, std::move(wrapper)), + static_cast<CallbackOwner<2>*>(this)); } /** _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
