summaryrefslogtreecommitdiff
path: root/shared-bindings/audiomp3/MP3File.c
diff options
context:
space:
mode:
authorJeff Epler <jepler@gmail.com>2019-12-23 09:36:46 -0600
committerJeff Epler <jepler@gmail.com>2019-12-23 09:36:46 -0600
commit02154caf24a73ac706505661d487261e70342116 (patch)
tree3fcf6fe956254411b6e491174a4295e897b967c1 /shared-bindings/audiomp3/MP3File.c
parente6fd513cfa5460e2dfec138346749ede46afd243 (diff)
MP3File: Add a settable ".file" property
This enables jeplayer to allocate just one MP3File at startup, rather than have to make repeated large allocations while the application is running. The buffers have to be allocated their theoretical maximum, but that doesn't matter much as all the real-life MP3 files I checked needed that much allocation anyway.
Diffstat (limited to 'shared-bindings/audiomp3/MP3File.c')
-rw-r--r--shared-bindings/audiomp3/MP3File.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/shared-bindings/audiomp3/MP3File.c b/shared-bindings/audiomp3/MP3File.c
index f518bae4b..d867643f9 100644
--- a/shared-bindings/audiomp3/MP3File.c
+++ b/shared-bindings/audiomp3/MP3File.c
@@ -129,6 +129,37 @@ STATIC mp_obj_t audiomp3_mp3file_obj___exit__(size_t n_args, const mp_obj_t *arg
}
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(audiomp3_mp3file___exit___obj, 4, 4, audiomp3_mp3file_obj___exit__);
+//| .. attribute:: file
+//|
+//| File to play back.
+//|
+STATIC mp_obj_t audiomp3_mp3file_obj_get_file(mp_obj_t self_in) {
+ audiomp3_mp3file_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ check_for_deinit(self);
+ return self->file;
+}
+MP_DEFINE_CONST_FUN_OBJ_1(audiomp3_mp3file_get_file_obj, audiomp3_mp3file_obj_get_file);
+
+STATIC mp_obj_t audiomp3_mp3file_obj_set_file(mp_obj_t self_in, mp_obj_t file) {
+ audiomp3_mp3file_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ check_for_deinit(self);
+ if (!MP_OBJ_IS_TYPE(file, &mp_type_fileio)) {
+ mp_raise_TypeError(translate("file must be a file opened in byte mode"));
+ }
+ common_hal_audiomp3_mp3file_set_file(self, file);
+ return mp_const_none;
+}
+MP_DEFINE_CONST_FUN_OBJ_2(audiomp3_mp3file_set_file_obj, audiomp3_mp3file_obj_set_file);
+
+const mp_obj_property_t audiomp3_mp3file_file_obj = {
+ .base.type = &mp_type_property,
+ .proxy = {(mp_obj_t)&audiomp3_mp3file_get_file_obj,
+ (mp_obj_t)&audiomp3_mp3file_set_file_obj,
+ (mp_obj_t)&mp_const_none_obj},
+};
+
+
+
//| .. attribute:: sample_rate
//|
//| 32 bit value that dictates how quickly samples are loaded into the DAC
@@ -201,6 +232,7 @@ STATIC const mp_rom_map_elem_t audiomp3_mp3file_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&audiomp3_mp3file___exit___obj) },
// Properties
+ { MP_ROM_QSTR(MP_QSTR_file), MP_ROM_PTR(&audiomp3_mp3file_file_obj) },
{ MP_ROM_QSTR(MP_QSTR_sample_rate), MP_ROM_PTR(&audiomp3_mp3file_sample_rate_obj) },
{ MP_ROM_QSTR(MP_QSTR_bits_per_sample), MP_ROM_PTR(&audiomp3_mp3file_bits_per_sample_obj) },
{ MP_ROM_QSTR(MP_QSTR_channel_count), MP_ROM_PTR(&audiomp3_mp3file_channel_count_obj) },