Skip to content

Commit a80311d

Browse files
committed
MP3Decoder: make testable in coverage build
An mp3 decoder (note that this needs `audiocore.get_buffer`, not enabled on devices): ```py import sys import audiomp3 import audiocore GET_BUFFER_DONE, GET_BUFFER_MORE_DATA, GET_BUFFER_ERROR = range(3) with audiomp3.MP3Decoder(sys.argv[1]) as decoder, open(sys.argv[2], "wb") as target: while True: res, samples = audiocore.get_buffer(decoder) if res != GET_BUFFER_ERROR: target.write(samples) if res != GET_BUFFER_MORE_DATA: break ``` this doesn't actually add any tests though
1 parent d6ddd55 commit a80311d

File tree

4 files changed

+41
-7
lines changed

4 files changed

+41
-7
lines changed

ports/unix/variants/coverage/mpconfigvariant.mk

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ SRC_BITMAP := \
3434
shared-bindings/audiomixer/__init__.c \
3535
shared-bindings/audiomixer/Mixer.c \
3636
shared-bindings/audiomixer/MixerVoice.c \
37+
shared-bindings/audiomp3/__init__.c \
38+
shared-bindings/audiomp3/MP3Decoder.c \
3739
shared-bindings/bitmapfilter/__init__.c \
3840
shared-bindings/bitmaptools/__init__.c \
3941
shared-bindings/codeop/__init__.c \
@@ -62,6 +64,7 @@ SRC_BITMAP := \
6264
shared-module/audiocore/RawSample.c \
6365
shared-module/audiocore/WaveFile.c \
6466
shared-module/audiomixer/__init__.c \
67+
shared-module/audiomp3/MP3Decoder.c \
6568
shared-module/audiomixer/Mixer.c \
6669
shared-module/audiomixer/MixerVoice.c \
6770
shared-module/bitmapfilter/__init__.c \
@@ -88,10 +91,32 @@ SRC_BITMAP := \
8891

8992
SRC_C += $(SRC_BITMAP)
9093

94+
SRC_C += $(addprefix lib/mp3/src/, \
95+
bitstream.c \
96+
buffers.c \
97+
dct32.c \
98+
dequant.c \
99+
dqchan.c \
100+
huffman.c \
101+
hufftabs.c \
102+
imdct.c \
103+
mp3dec.c \
104+
mp3tabs.c \
105+
polyphase.c \
106+
scalfact.c \
107+
stproc.c \
108+
subband.c \
109+
trigtabs.c \
110+
)
111+
112+
$(BUILD)/lib/mp3/src/buffers.o: CFLAGS += -include "shared-module/audiomp3/__init__.h" -D'MPDEC_ALLOCATOR(x)=malloc(x)' -D'MPDEC_FREE(x)=free(x)' -fwrapv
113+
91114
CFLAGS += \
92115
-DCIRCUITPY_AESIO=1 \
93116
-DCIRCUITPY_AUDIOCORE=1 \
94117
-DCIRCUITPY_AUDIOMIXER=1 \
118+
-DCIRCUITPY_AUDIOMP3=1 \
119+
-DCIRCUITPY_AUDIOMP3_USE_PORT_ALLOCATOR=0 \
95120
-DCIRCUITPY_AUDIOCORE_DEBUG=1 \
96121
-DCIRCUITPY_BITMAPTOOLS=1 \
97122
-DCIRCUITPY_CODEOP=1 \

shared-bindings/audiomp3/MP3Decoder.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,13 +137,15 @@ static mp_obj_t audiomp3_mp3file_obj_get_file(mp_obj_t self_in) {
137137
}
138138
MP_DEFINE_CONST_FUN_OBJ_1(audiomp3_mp3file_get_file_obj, audiomp3_mp3file_obj_get_file);
139139

140-
static mp_obj_t audiomp3_mp3file_obj_set_file(mp_obj_t self_in, mp_obj_t file) {
140+
static mp_obj_t audiomp3_mp3file_obj_set_file(mp_obj_t self_in, mp_obj_t stream) {
141141
audiomp3_mp3file_obj_t *self = MP_OBJ_TO_PTR(self_in);
142142
check_for_deinit(self);
143-
if (!mp_obj_is_type(file, &mp_type_fileio)) {
143+
const mp_stream_p_t *stream_p = mp_get_stream_raise(stream, MP_STREAM_OP_READ);
144+
145+
if (stream_p->is_text) {
144146
mp_raise_TypeError(MP_ERROR_TEXT("file must be a file opened in byte mode"));
145147
}
146-
common_hal_audiomp3_mp3file_set_file(self, file);
148+
common_hal_audiomp3_mp3file_set_file(self, stream);
147149
return mp_const_none;
148150
}
149151
MP_DEFINE_CONST_FUN_OBJ_2(audiomp3_mp3file_set_file_obj, audiomp3_mp3file_obj_set_file);

shared-module/audiomp3/MP3Decoder.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@
2323

2424
#define MAX_BUFFER_LEN (MAX_NSAMP * MAX_NGRAN * MAX_NCHAN * sizeof(int16_t))
2525

26+
#if defined(MICROPY_UNIX_COVERAGE)
27+
#define background_callback_prevent() ((void)0)
28+
#define background_callback_allow() ((void)0)
29+
#define background_callback_add(buf, fn, arg) ((fn)((arg)))
30+
#endif
31+
2632
// (near copy of mp_stream_posix_read, but with changes)
2733
// (circuitpy doesn't enable posix stream routines anyway)
2834
STATIC ssize_t stream_read(void *stream, void *buf, size_t len) {
@@ -42,7 +48,8 @@ STATIC ssize_t stream_read(void *stream, void *buf, size_t len) {
4248

4349
// (near copy of mp_stream_posix_read, but with changes)
4450
// (circuitpy doesn't enable posix stream routines anyway)
45-
STATIC ssize_t stream_read_all(void *stream, void *buf, size_t len) {
51+
// (and the return value semantic is different)
52+
STATIC ssize_t stream_read_all(void *stream, uint8_t *buf, size_t len) {
4653
ssize_t total_read = 0;
4754
while (len) {
4855
ssize_t r = stream_read(stream, buf, len);
@@ -170,7 +177,7 @@ static void mp3file_skip_id3v2(audiomp3_mp3file_obj_t *self) {
170177
(data[9] & 0x80) == 0)) {
171178
return;
172179
}
173-
uint32_t size = (data[6] << 21) | (data[7] << 14) | (data[8] << 7) | (data[9]);
180+
int32_t size = (data[6] << 21) | (data[7] << 14) | (data[8] << 7) | (data[9]);
174181
size += 10; // size excludes the "header" (but not the "extended header")
175182
// First, deduct from size whatever is left in buffer
176183
uint32_t to_consume = MIN(size, BYTES_LEFT(self));

shared-module/audiomp3/MP3Decoder.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ typedef struct {
1818
struct _MP3DecInfo *decoder;
1919
background_callback_t inbuf_fill_cb;
2020
uint8_t *inbuf;
21-
uint32_t inbuf_length;
22-
uint32_t inbuf_offset;
21+
int32_t inbuf_length;
22+
int32_t inbuf_offset;
2323
int16_t *buffers[2];
2424
uint32_t len;
2525
uint32_t frame_buffer_size;

0 commit comments

Comments
 (0)