M5Unified
Mic_Class.hpp
Go to the documentation of this file.
1 // Copyright (c) M5Stack. All rights reserved.
2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3 
4 #ifndef __M5_Mic_Class_H__
5 #define __M5_Mic_Class_H__
6 
7 #include "m5unified_common.h"
8 
9 #if defined ( ESP_PLATFORM )
10 
11 #include <freertos/FreeRTOS.h>
12 #include <freertos/semphr.h>
13 #include <freertos/task.h>
14 #include <soc/i2s_struct.h>
15 
16 #if __has_include(<driver/i2s_std.h>)
17  #include <driver/i2s_std.h>
18 #else
19  #include <driver/i2s.h>
20 #endif
21 
22 #endif
23 
24 #include <stdint.h>
25 
26 #ifndef I2S_PIN_NO_CHANGE
27 #define I2S_PIN_NO_CHANGE (-1)
28 #endif
29 
30 namespace m5
31 {
32  class M5Unified;
33 
34  struct mic_config_t
35  {
37  int pin_data_in = -1;
38 
41 
44 
47 
49  uint32_t sample_rate = 16000;
50 
52  bool stereo = false;
53 
55  int input_offset = 0;
56 
58  uint8_t over_sampling = 2;
59 
61  uint8_t magnification = 16;
62 
64  uint8_t noise_filter_level = 0;
65 
67  bool use_adc = false;
68 
70  size_t dma_buf_len = 256;
71 
73  size_t dma_buf_count = 3;
74 
76  uint8_t task_priority = 2;
77 
79  uint8_t task_pinned_core = -1;
80 
82  i2s_port_t i2s_port = i2s_port_t::I2S_NUM_0;
83  };
84 
85  class Mic_Class
86  {
87  friend M5Unified;
88 
89  public:
90 
91  mic_config_t config(void) const { return _cfg; }
92  void config(const mic_config_t& cfg) { _cfg = cfg; }
93 
94  bool begin(void);
95 
96  void end(void);
97 
98  bool isRunning(void) const { return _task_running; }
99 
100  bool isEnabled(void) const { return _cfg.pin_data_in >= 0; }
101 
104  size_t isRecording(void) const { return _is_recording ? ((bool)_rec_info[0].length) + ((bool)_rec_info[1].length) : 0; }
105 
108  void setSampleRate(uint32_t sample_rate) { _cfg.sample_rate = sample_rate; }
109 
115  bool record(uint8_t* rec_data, size_t array_len, uint32_t sample_rate, bool stereo = false)
116  {
117  return _rec_raw(rec_data, array_len, false, sample_rate, stereo);
118  }
119 
125  bool record(int16_t* rec_data, size_t array_len, uint32_t sample_rate, bool stereo = false)
126  {
127  return _rec_raw(rec_data, array_len, true, sample_rate, stereo);
128  }
129 
133  bool record(uint8_t* rec_data, size_t array_len)
134  {
135  return _rec_raw(rec_data, array_len, false, _cfg.sample_rate, false);
136  }
137 
141  bool record(int16_t* rec_data, size_t array_len)
142  {
143  return _rec_raw(rec_data, array_len, true, _cfg.sample_rate, false);
144  }
145 
146  protected:
147 
148  void setCallback(void* args, bool(*func)(void*, bool)) { _cb_set_enabled = func; _cb_set_enabled_args = args; }
149 
151  {
152  void* data = nullptr;
153  size_t length = 0;
154  size_t index = 0;
155  bool is_stereo = false;
156  bool is_16bit = false;
157  };
158 
160  volatile bool _rec_flip = false;
161 
162  static void mic_task(void* args);
163 
164  uint32_t _calc_rec_rate(void) const;
165  esp_err_t _setup_i2s(void);
166  bool _rec_raw(void* recdata, size_t array_len, bool flg_16bit, uint32_t sample_rate, bool stereo);
167 
169  uint32_t _rec_sample_rate = 0;
170 
171  bool (*_cb_set_enabled)(void* args, bool enabled) = nullptr;
172  void* _cb_set_enabled_args = nullptr;
173 
174  volatile bool _task_running = false;
175  volatile bool _is_recording = false;
176 #if defined (SDL_h_)
177  SDL_Thread* _task_handle = nullptr;
178 #else
179  TaskHandle_t _task_handle = nullptr;
180  volatile SemaphoreHandle_t _task_semaphore = nullptr;
181 #endif
182  };
183 }
184 
185 #endif
#define I2S_PIN_NO_CHANGE
Definition: Mic_Class.hpp:27
bool isEnabled(void) const
Definition: Mic_Class.hpp:100
esp_err_t _setup_i2s(void)
bool begin(void)
size_t isRecording(void) const
Definition: Mic_Class.hpp:104
void setCallback(void *args, bool(*func)(void *, bool))
Definition: Mic_Class.hpp:148
volatile bool _task_running
Definition: Mic_Class.hpp:174
recording_info_t _rec_info[2]
Definition: Mic_Class.hpp:159
bool record(uint8_t *rec_data, size_t array_len, uint32_t sample_rate, bool stereo=false)
Definition: Mic_Class.hpp:115
static void mic_task(void *args)
volatile bool _is_recording
Definition: Mic_Class.hpp:175
mic_config_t config(void) const
Definition: Mic_Class.hpp:91
uint32_t _rec_sample_rate
Definition: Mic_Class.hpp:169
bool record(uint8_t *rec_data, size_t array_len)
Definition: Mic_Class.hpp:133
volatile SemaphoreHandle_t _task_semaphore
Definition: Mic_Class.hpp:180
bool isRunning(void) const
Definition: Mic_Class.hpp:98
void config(const mic_config_t &cfg)
Definition: Mic_Class.hpp:92
bool(* _cb_set_enabled)(void *args, bool enabled)
Definition: Mic_Class.hpp:171
void * _cb_set_enabled_args
Definition: Mic_Class.hpp:172
bool record(int16_t *rec_data, size_t array_len, uint32_t sample_rate, bool stereo=false)
Definition: Mic_Class.hpp:125
bool record(int16_t *rec_data, size_t array_len)
Definition: Mic_Class.hpp:141
uint32_t _calc_rec_rate(void) const
void setSampleRate(uint32_t sample_rate)
Definition: Mic_Class.hpp:108
void end(void)
volatile bool _rec_flip
Definition: Mic_Class.hpp:160
TaskHandle_t _task_handle
Definition: Mic_Class.hpp:179
mic_config_t _cfg
Definition: Mic_Class.hpp:168
bool _rec_raw(void *recdata, size_t array_len, bool flg_16bit, uint32_t sample_rate, bool stereo)
Definition: M5Unified.cpp:48
uint8_t task_priority
background task priority
Definition: Mic_Class.hpp:76
i2s_port_t i2s_port
I2S port.
Definition: Mic_Class.hpp:82
int pin_bck
i2s_bclk
Definition: Mic_Class.hpp:40
int pin_data_in
i2s_data_in (for mic)
Definition: Mic_Class.hpp:37
uint8_t over_sampling
Sampling times of obtain the average value.
Definition: Mic_Class.hpp:58
int pin_mck
i2s_mclk
Definition: Mic_Class.hpp:43
int input_offset
<<This value is no longer used>>
Definition: Mic_Class.hpp:55
size_t dma_buf_count
for I2S dma_buf_count
Definition: Mic_Class.hpp:73
uint32_t sample_rate
input sampling rate (Hz)
Definition: Mic_Class.hpp:49
int pin_ws
i2s_ws (lrck)
Definition: Mic_Class.hpp:46
uint8_t noise_filter_level
Coefficient of the previous value, used for noise filtering.
Definition: Mic_Class.hpp:64
bool use_adc
use analog input mic ( need only pin_data_in )
Definition: Mic_Class.hpp:67
size_t dma_buf_len
for I2S dma_buf_len
Definition: Mic_Class.hpp:70
bool stereo
use stereo output
Definition: Mic_Class.hpp:52
uint8_t task_pinned_core
background task pinned core
Definition: Mic_Class.hpp:79
uint8_t magnification
multiplier for input value
Definition: Mic_Class.hpp:61