Skip to content

Commit e9c62bf

Browse files
committed
feature/m5: Add interface of Speaker class
Signed-off-by: lbuque <[email protected]>
1 parent a050be7 commit e9c62bf

File tree

5 files changed

+489
-168
lines changed

5 files changed

+489
-168
lines changed

m5stack/cmodules/m5unified/m5unified.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ target_sources(usermod_M5UNIFIED INTERFACE
1313
${CMAKE_CURRENT_LIST_DIR}/m5unified_widgets.c
1414
${CMAKE_CURRENT_LIST_DIR}/m5unified.c
1515
${CMAKE_CURRENT_LIST_DIR}/mic_config_t.c
16+
${CMAKE_CURRENT_LIST_DIR}/speaker_config_t.c
1617
)
1718

1819
target_include_directories(usermod_M5UNIFIED INTERFACE

m5stack/cmodules/m5unified/m5unified_speaker.c

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,43 @@
11
#include "m5unified.h"
22

33
// -------- Speaker wrapper
4-
MAKE_METHOD_KW(spk, config, 1);
5-
MAKE_METHOD_0(spk, getVolume);
6-
MAKE_METHOD_1(spk, getChannelVolume);
4+
MAKE_METHOD_KW(spk, config, 0);
5+
MAKE_METHOD_0(spk, begin);
6+
MAKE_METHOD_0(spk, end);
7+
MAKE_METHOD_0(spk, isRunning);
8+
MAKE_METHOD_0(spk, isEnabled);
9+
MAKE_METHOD_V(spk, isPlaying, 1, 2);
10+
MAKE_METHOD_0(spk, getPlayingChannels);
711
MAKE_METHOD_KW(spk, setVolume, 1);
8-
MAKE_METHOD_KW(spk, setChannelVolume, 1);
12+
MAKE_METHOD_0(spk, getVolume);
13+
MAKE_METHOD_1(spk, setVolumePercentage);
14+
MAKE_METHOD_0(spk, getVolumePercentage);
915
MAKE_METHOD_KW(spk, setAllChannelVolume, 1);
16+
MAKE_METHOD_KW(spk, setChannelVolume, 1);
17+
MAKE_METHOD_1(spk, getChannelVolume);
1018
MAKE_METHOD_KW(spk, stop, 1);
1119
MAKE_METHOD_KW(spk, tone, 1);
20+
MAKE_METHOD_KW(spk, playRaw, 1);
1221
MAKE_METHOD_KW(spk, playWav, 1);
1322

1423
STATIC const mp_rom_map_elem_t spk_member_table[] = {
1524
MAKE_TABLE(spk, config),
16-
MAKE_TABLE(spk, getVolume),
17-
MAKE_TABLE(spk, getChannelVolume),
25+
MAKE_TABLE(spk, begin),
26+
MAKE_TABLE(spk, end),
27+
MAKE_TABLE(spk, isRunning),
28+
MAKE_TABLE(spk, isEnabled),
29+
MAKE_TABLE(spk, isPlaying),
30+
MAKE_TABLE(spk, getPlayingChannels),
1831
MAKE_TABLE(spk, setVolume),
19-
MAKE_TABLE(spk, setChannelVolume),
32+
MAKE_TABLE(spk, getVolume),
33+
MAKE_TABLE(spk, setVolumePercentage),
34+
MAKE_TABLE(spk, getVolumePercentage),
2035
MAKE_TABLE(spk, setAllChannelVolume),
36+
MAKE_TABLE(spk, setChannelVolume),
37+
MAKE_TABLE(spk, getChannelVolume),
2138
MAKE_TABLE(spk, stop),
2239
MAKE_TABLE(spk, tone),
40+
MAKE_TABLE(spk, playRaw),
2341
MAKE_TABLE(spk, playWav),
2442
};
2543
STATIC MP_DEFINE_CONST_DICT(spk_member, spk_member_table);
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
#include "speaker_config_t.h"
2+
3+
/* *FORMAT-OFF* */
4+
5+
STATIC mp_obj_t speaker_config_t_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
6+
mp_speaker_config_t *self = m_new_obj(mp_speaker_config_t);
7+
self->base.type = &mp_speaker_config_t_type;
8+
self->pin_data_out = mp_obj_new_int(-1);
9+
self->pin_bck = mp_obj_new_int(-1);
10+
self->pin_ws = mp_obj_new_int(-1);
11+
self->sample_rate = mp_obj_new_int(64000);
12+
self->stereo = mp_obj_new_bool(false);
13+
self->buzzer = mp_obj_new_bool(false);
14+
self->use_dac = mp_obj_new_int(2);
15+
self->dac_zero_level = mp_obj_new_int(0);
16+
self->magnification = mp_obj_new_int(16);
17+
self->dma_buf_len = mp_obj_new_bool(256);
18+
self->dma_buf_count = mp_obj_new_int(8);
19+
self->task_priority = mp_obj_new_int(2);
20+
self->task_pinned_core = mp_obj_new_int(255);
21+
self->i2s_port = mp_obj_new_int(0);
22+
return MP_OBJ_FROM_PTR(self);
23+
}
24+
25+
STATIC void speaker_config_t_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
26+
mp_speaker_config_t *self = (mp_speaker_config_t *)MP_OBJ_TO_PTR(self_in);
27+
if (dest[0] == MP_OBJ_NULL) {
28+
// Load
29+
if (attr == MP_QSTR_pin_data_out) {
30+
dest[0] = self->pin_data_out;
31+
} else if (attr == MP_QSTR_pin_bck) {
32+
dest[0] = self->pin_bck;
33+
} else if (attr == MP_QSTR_pin_ws) {
34+
dest[0] = self->pin_ws;
35+
} else if (attr == MP_QSTR_sample_rate) {
36+
dest[0] = self->sample_rate;
37+
} else if (attr == MP_QSTR_stereo) {
38+
dest[0] = self->stereo;
39+
} else if (attr == MP_QSTR_buzzer) {
40+
dest[0] = self->buzzer;
41+
} else if (attr == MP_QSTR_use_dac) {
42+
dest[0] = self->use_dac;
43+
} else if (attr == MP_QSTR_dac_zero_level) {
44+
dest[0] = self->dac_zero_level;
45+
} else if (attr == MP_QSTR_magnification) {
46+
dest[0] = self->magnification;
47+
} else if (attr == MP_QSTR_dma_buf_len) {
48+
dest[0] = self->dma_buf_len;
49+
} else if (attr == MP_QSTR_dma_buf_count) {
50+
dest[0] = self->dma_buf_count;
51+
} else if (attr == MP_QSTR_task_priority) {
52+
dest[0] = self->task_priority;
53+
} else if (attr == MP_QSTR_task_pinned_core) {
54+
dest[0] = self->task_pinned_core;
55+
} else if (attr == MP_QSTR_i2s_port) {
56+
dest[0] = self->i2s_port;
57+
}
58+
} else if (dest[1] != MP_OBJ_NULL) {
59+
// Store
60+
if (attr == MP_QSTR_pin_data_out) {
61+
self->pin_data_out = dest[1];
62+
dest[0] = MP_OBJ_NULL;
63+
} else if (attr == MP_QSTR_pin_bck) {
64+
self->pin_bck = dest[1];
65+
dest[0] = MP_OBJ_NULL;
66+
} else if (attr == MP_QSTR_pin_ws) {
67+
self->pin_ws = dest[1];
68+
dest[0] = MP_OBJ_NULL;
69+
} else if (attr == MP_QSTR_sample_rate) {
70+
self->sample_rate = dest[1];
71+
dest[0] = MP_OBJ_NULL;
72+
} else if (attr == MP_QSTR_stereo) {
73+
self->stereo = dest[1];
74+
dest[0] = MP_OBJ_NULL;
75+
} else if (attr == MP_QSTR_buzzer) {
76+
self->buzzer = dest[1];
77+
dest[0] = MP_OBJ_NULL;
78+
} else if (attr == MP_QSTR_use_dac) {
79+
self->use_dac = dest[1];
80+
dest[0] = MP_OBJ_NULL;
81+
} else if (attr == MP_QSTR_dac_zero_level) {
82+
self->dac_zero_level = dest[1];
83+
dest[0] = MP_OBJ_NULL;
84+
} else if (attr == MP_QSTR_magnification) {
85+
self->magnification = dest[1];
86+
dest[0] = MP_OBJ_NULL;
87+
} else if (attr == MP_QSTR_dma_buf_len) {
88+
self->dma_buf_len = dest[1];
89+
dest[0] = MP_OBJ_NULL;
90+
} else if (attr == MP_QSTR_dma_buf_count) {
91+
self->dma_buf_count = dest[1];
92+
dest[0] = MP_OBJ_NULL;
93+
} else if (attr == MP_QSTR_task_priority) {
94+
self->task_priority = dest[1];
95+
dest[0] = MP_OBJ_NULL;
96+
} else if (attr == MP_QSTR_task_pinned_core) {
97+
self->task_pinned_core = dest[1];
98+
dest[0] = MP_OBJ_NULL;
99+
} else if (attr == MP_QSTR_i2s_port) {
100+
self->i2s_port = dest[1];
101+
dest[0] = MP_OBJ_NULL;
102+
}
103+
}
104+
}
105+
106+
#ifdef MP_OBJ_TYPE_GET_SLOT
107+
MP_DEFINE_CONST_OBJ_TYPE(
108+
mp_speaker_config_t_type,
109+
MP_QSTR_speaker_config_t,
110+
MP_TYPE_FLAG_NONE,
111+
make_new, speaker_config_t_make_new,
112+
attr, speaker_config_t_attr
113+
);
114+
#else
115+
const mp_obj_type_t mp_speaker_config_t_type = {
116+
.base = { &mp_type_type },
117+
.name = MP_QSTR_speaker_config_t,
118+
.make_new = speaker_config_t_make_new,
119+
.attr = speaker_config_t_attr,
120+
};
121+
#endif
122+
123+
/* *FORMAT-ON* */
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#pragma once
2+
3+
#include <py/runtime.h>
4+
#include <py/objstr.h>
5+
#include <py/objmodule.h>
6+
7+
typedef struct _mp_speaker_config_t {
8+
mp_obj_base_t base;
9+
mp_obj_t pin_data_out;
10+
mp_obj_t pin_bck;
11+
mp_obj_t pin_ws;
12+
mp_obj_t sample_rate;
13+
mp_obj_t stereo;
14+
mp_obj_t buzzer;
15+
mp_obj_t use_dac;
16+
mp_obj_t dac_zero_level;
17+
mp_obj_t magnification;
18+
mp_obj_t dma_buf_len;
19+
mp_obj_t dma_buf_count;
20+
mp_obj_t task_priority;
21+
mp_obj_t task_pinned_core;
22+
mp_obj_t i2s_port;
23+
} mp_speaker_config_t;
24+
25+
extern const mp_obj_type_t mp_speaker_config_t_type;

0 commit comments

Comments
 (0)