arduino-audio-tools
LockGuard.h
1 #pragma once
2 #include "AudioConfig.h"
3 #include "AudioTools/AudioLogger.h"
4 
5 #ifdef USE_STD_CONCURRENCY
6 # include <mutex>
7 #endif
8 
9 #if defined(USE_CONCURRENCY)
10 #ifdef ESP32
11 # include "freertos/FreeRTOS.h"
12 # include "freertos/semphr.h"
13 #else
14 # include "FreeRTOS.h"
15 # include "semphr.h"
16 #endif
17 
18 namespace audio_tools {
19 
26 class MutexBase {
27 public:
28  virtual void lock() {}
29  virtual void unlock() {}
30 };
31 
32 #if defined(USE_STD_CONCURRENCY)
33 
40 class StdMutex : public MutexBase {
41 public:
42  void lock() override { std_mutex.lock(); }
43  void unlock() override { std_mutex.unlock(); }
44 
45 protected:
46  std::mutex std_mutex;
47 };
48 
49 #endif
50 
51 
58 class Mutex : public MutexBase {
59 public:
60  Mutex() {
61  TRACED();
62  xSemaphore = xSemaphoreCreateBinary();
63  xSemaphoreGive(xSemaphore);
64  }
65  ~Mutex() {
66  TRACED();
67  vSemaphoreDelete(xSemaphore);
68  }
69  void lock() override {
70  TRACED();
71  xSemaphoreTake(xSemaphore, portMAX_DELAY);
72  }
73  void unlock() override {
74  TRACED();
75  xSemaphoreGive(xSemaphore);
76  }
77 
78 protected:
79  SemaphoreHandle_t xSemaphore = NULL;
80 };
81 
82 
92 class LockGuard {
93 public:
94  LockGuard(Mutex &mutex) {
95  TRACED();
96  p_mutex = &mutex;
97  p_mutex->lock();
98  }
99  LockGuard(Mutex *mutex) {
100  TRACED();
101  p_mutex = mutex;
102  p_mutex->lock();
103  }
104  ~LockGuard() {
105  TRACED();
106  p_mutex->unlock();
107  }
108 
109 protected:
110  Mutex *p_mutex = nullptr;
111 };
112 
113 }
114 
115 #endif
RAII implementaion using a Mutex: Only a few microcontrollers provide lock guards,...
Definition: LockGuard.h:92
Empty Mutex implementation which does nothing.
Definition: LockGuard.h:26
Mutex implemntation using FreeRTOS.
Definition: LockGuard.h:58
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition: AnalogAudio.h:10