arduino-audio-tools
Loading...
Searching...
No Matches
AudioLoggerSTD.h
Go to the documentation of this file.
1#pragma once
2
4#include "AudioToolsConfig.h"
5
6#if USE_AUDIO_LOGGING
7
8namespace audio_tools {
9
17class AudioLogger {
18 public:
24 enum LogLevel { Debug, Info, Warning, Error };
25
27 void begin(Print& out, LogLevel level = LOG_LEVEL) {
28 this->log_print_ptr = &out;
29 this->log_level = level;
30 }
31
32 // defines the log level
33 void setLogLevel(LogLevel level) { this->log_level = level; }
34
36 bool isLogging(LogLevel level = Info) {
37 return log_print_ptr != nullptr && level >= log_level;
38 }
39
40 AudioLogger& prefix(const char* file, int line, LogLevel current_level) {
42 return *this;
43 }
44
45 void println() {
46#if defined(IS_DESKTOP) || defined(IS_DESKTOP_WITH_TIME_ONLY)
47 fprintf(stderr, "%s\n", print_buffer);
49#elif defined(IS_ZEPHYR)
50 if (log_print_ptr != nullptr) {
52 log_print_ptr->flush();
53 } else {
55 printk("\n");
56 }
57#else
59 log_print_ptr->flush();
60#endif
61 print_buffer[0] = 0;
62 }
63
64 char* str() { return print_buffer; }
65
67 static AudioLogger& instance() {
68 static AudioLogger* ptr;
69 if (ptr == nullptr) {
70 ptr = new AudioLogger;
71 }
72 return *ptr;
73 }
74
75 LogLevel level() { return log_level; }
76
77 void print(const char* c) { log_print_ptr->print(c); }
78
79 void printChar(char c) { log_print_ptr->print(c); }
80
81 void printCharHex(char c) {
82 char tmp[5];
83 unsigned char val = c;
84 snprintf(tmp, 5, "%02X ", val);
85 log_print_ptr->print(tmp);
86 }
87
88 protected:
92
93 AudioLogger() {}
94
95 const char* levelName(LogLevel level) const {
96 switch (level) {
97 case Debug:
98 return "D";
99 case Info:
100 return "I";
101 case Warning:
102 return "W";
103 case Error:
104 return "E";
105 }
106 return "";
107 }
108
109 int printPrefix(const char* file, int line, LogLevel current_level) const {
110 const char* file_name = strrchr(file, '/') ? strrchr(file, '/') + 1 : file;
111 const char* level_code = levelName(current_level);
112 int len = log_print_ptr->print("[");
113 len += log_print_ptr->print(level_code);
114 len += log_print_ptr->print("] ");
115 len += log_print_ptr->print(file_name);
116 len += log_print_ptr->print(" : ");
117 len += log_print_ptr->print(line);
118 len += log_print_ptr->print(" - ");
119 return len;
120 }
121};
122
124static AudioLogger& AudioToolsLogger = AudioLogger::instance();
125
127using AudioToolsLogLevel = AudioLogger::LogLevel;
128
130class CustomLogLevel {
131 public:
132 AudioLogger::LogLevel getActual() { return actual; }
133
135 void set(AudioLogger::LogLevel level) {
136 active = true;
137 original = AudioLogger::instance().level();
138 actual = level;
139 }
140
142 void set() {
143 if (active) {
144 AudioLogger::instance().begin(Serial, actual);
145 }
146 }
148 void reset() {
149 if (active) {
150 AudioLogger::instance().begin(Serial, original);
151 }
152 }
153
154 protected:
155 bool active = false;
156 AudioLogger::LogLevel original;
157 AudioLogger::LogLevel actual;
158};
159
160} // namespace audio_tools
161
162#define LOG_OUT_PGMEM(level, fmt, ...) \
163 { \
164 ::audio_tools::AudioToolsLogger.prefix(__FILE__, __LINE__, level); \
165 snprintf(::audio_tools::AudioToolsLogger.str(), LOG_PRINTF_BUFFER_SIZE, PSTR(fmt), \
166 ##__VA_ARGS__); \
167 ::audio_tools::AudioToolsLogger.println(); \
168 }
169
170#define LOG_OUT(level, fmt, ...) \
171 { \
172 ::audio_tools::AudioToolsLogger.prefix(__FILE__, __LINE__, level); \
173 snprintf(::audio_tools::AudioToolsLogger.str(), LOG_PRINTF_BUFFER_SIZE, fmt, \
174 ##__VA_ARGS__); \
175 ::audio_tools::AudioToolsLogger.println(); \
176 }
177#define LOG_MIN(level) \
178 { \
179 ::audio_tools::AudioToolsLogger.prefix(__FILE__, __LINE__, level); \
180 ::audio_tools::AudioToolsLogger.println(); \
181 }
182
183#ifdef LOG_NO_MSG
184#define LOGD(fmt, ...) \
185 if (::audio_tools::AudioToolsLogger.level() <= AudioLogger::Debug) { \
186 LOG_MIN(AudioLogger::Debug); \
187 }
188#define LOGI(fmt, ...) \
189 if (::audio_tools::AudioToolsLogger.level() <= AudioLogger::Info) { \
190 LOG_MIN(AudioLogger::Info); \
191 }
192#define LOGW(fmt, ...) \
193 if (::audio_tools::AudioToolsLogger.level() <= AudioLogger::Warning) { \
194 LOG_MIN(AudioLogger::Warning); \
195 }
196#define LOGE(fmt, ...) \
197 if (::audio_tools::AudioToolsLogger.level() <= AudioLogger::Error) { \
198 LOG_MIN(AudioLogger::Error); \
199 }
200#else
201// Log statments which store the fmt string in Progmem
202#define LOGD(fmt, ...) \
203 if (::audio_tools::AudioToolsLogger.level() <= AudioLogger::Debug) { \
204 LOG_OUT_PGMEM(AudioLogger::Debug, fmt, ##__VA_ARGS__); \
205 }
206#define LOGI(fmt, ...) \
207 if (::audio_tools::AudioToolsLogger.level() <= AudioLogger::Info) { \
208 LOG_OUT_PGMEM(AudioLogger::Info, fmt, ##__VA_ARGS__); \
209 }
210#define LOGW(fmt, ...) \
211 if (::audio_tools::AudioToolsLogger.level() <= AudioLogger::Warning) { \
212 LOG_OUT_PGMEM(AudioLogger::Warning, fmt, ##__VA_ARGS__); \
213 }
214#define LOGE(fmt, ...) \
215 if (::audio_tools::AudioToolsLogger.level() <= AudioLogger::Error) { \
216 LOG_OUT_PGMEM(AudioLogger::Error, fmt, ##__VA_ARGS__); \
217 }
218#endif
219
220// Just log file and line
221#if defined(NO_TRACED) || defined(NO_TRACE)
222#define TRACED()
223#else
224#define TRACED() \
225 if (::audio_tools::AudioToolsLogger.level() <= AudioLogger::Debug) { \
226 LOG_OUT(AudioLogger::Debug, LOG_METHOD); \
227 }
228#endif
229
230#if defined(NO_TRACEI) || defined(NO_TRACE)
231#define TRACEI()
232#else
233#define TRACEI() \
234 if (::audio_tools::AudioToolsLogger.level() <= AudioLogger::Info) { \
235 LOG_OUT(AudioLogger::Info, LOG_METHOD); \
236 }
237#endif
238
239#if defined(NO_TRACEW) || defined(NO_TRACE)
240#define TRACEW()
241#else
242#define TRACEW() \
243 if (::audio_tools::AudioToolsLogger.level() <= AudioLogger::Warning) { \
244 LOG_OUT(AudioLogger::Warning, LOG_METHOD); \
245 }
246#endif
247
248#if defined(NO_TRACEE) || defined(NO_TRACE)
249#define TRACEE()
250#else
251#define TRACEE() \
252 if (::audio_tools::AudioToolsLogger.level() <= AudioLogger::Error) { \
253 LOG_OUT(AudioLogger::Error, LOG_METHOD); \
254 }
255#endif
256
257#else
258
259// Switch off logging
260#define LOGD(...)
261#define LOGI(...)
262#define LOGW(...)
263#define LOGE(...)
264#define TRACED()
265#define TRACEI()
266#define TRACEW()
267#define TRACEE()
268
269#endif
static HardwareSerial Serial
Definition Arduino.h:179
#define LOG_LEVEL
Definition AudioToolsConfig.h:62
#define LOG_STREAM
Definition AudioToolsConfig.h:66
#define LOG_PRINTF_BUFFER_SIZE
Definition avr.h:25
Definition Arduino.h:56
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
size_t writeData(Print *p_out, T *data, int samples, int maxSamples=512)
Definition AudioTypes.h:508
constexpr const _Ep * begin(initializer_list< _Ep > __il) noexcept
Definition InitializerList.h:55