/* Copyright (C) 2001 Paul Davis Copyright (C) 2004-2008 Grame Copyright (C) 2008 Nedko Arnaudov Copyright (C) 2013 Samsung Electronics This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include "JackError.h" #include "JackGlobals.h" #include "JackMessageBuffer.h" #define LOG_BUF_SIZE 1024 #undef LOG_TAG #ifdef SERVER_SIDE #define LOG_TAG "JackAudioServer" #else #define LOG_TAG "JackAudioClient" #endif #include using namespace Jack; static bool change_thread_log_function(jack_log_function_t log_function) { return (jack_tls_get(JackGlobals::fKeyLogFunction) == NULL && jack_tls_set(JackGlobals::fKeyLogFunction, (void*)log_function)); } SERVER_EXPORT int set_threaded_log_function() { return change_thread_log_function(JackMessageBufferAdd); } void jack_log_function(int level, const char *message) { void (* log_callback)(const char *); switch (level) { case LOG_LEVEL_INFO: log_callback = jack_info_callback; break; case LOG_LEVEL_ERROR: log_callback = jack_error_callback; break; default: return; } log_callback(message); } static void jack_format_and_log(int level, const char *prefix, const char *fmt, va_list ap) { char buffer[256]; size_t len; jack_log_function_t log_function; if (prefix != NULL) { len = strlen(prefix); assert(len < 256); memcpy(buffer, prefix, len); } else { len = 0; } vsnprintf(buffer + len, sizeof(buffer) - len, fmt, ap); log_function = (jack_log_function_t)jack_tls_get(JackGlobals::fKeyLogFunction); /* if log function is not overridden for thread, use default one */ if (log_function == NULL) { log_function = jack_log_function; //log_function(LOG_LEVEL_INFO, "------ Using default log function"); } else { //log_function(LOG_LEVEL_INFO, "++++++ Using thread-specific log function"); } log_function(level, buffer); } SERVER_EXPORT void jack_error(const char *fmt, ...) { va_list ap; char buf[LOG_BUF_SIZE]; va_start(ap, fmt); vsnprintf(buf, LOG_BUF_SIZE, fmt, ap); va_end(ap); __android_log_write(ANDROID_LOG_ERROR, LOG_TAG, buf); } SERVER_EXPORT void jack_info(const char *fmt, ...) { va_list ap; char buf[LOG_BUF_SIZE]; va_start(ap, fmt); vsnprintf(buf, LOG_BUF_SIZE, fmt, ap); va_end(ap); __android_log_write(ANDROID_LOG_INFO, LOG_TAG, buf); } SERVER_EXPORT void jack_log(const char *fmt,...) { va_list ap; char buf[LOG_BUF_SIZE]; if (JackGlobals::fVerbose) { va_start(ap, fmt); vsnprintf(buf, LOG_BUF_SIZE, fmt, ap); va_end(ap); __android_log_write(ANDROID_LOG_VERBOSE, LOG_TAG, buf); } } SERVER_EXPORT void default_jack_error_callback(const char *desc) { fprintf(stderr, "%s\n", desc); fflush(stderr); } SERVER_EXPORT void default_jack_info_callback(const char *desc) { fprintf(stdout, "%s\n", desc); fflush(stdout); } SERVER_EXPORT void silent_jack_error_callback(const char *desc) {} SERVER_EXPORT void silent_jack_info_callback(const char *desc) {} SERVER_EXPORT void (*jack_error_callback)(const char *desc) = &default_jack_error_callback; SERVER_EXPORT void (*jack_info_callback)(const char *desc) = &default_jack_info_callback;