summaryrefslogtreecommitdiff
path: root/shared-module
diff options
context:
space:
mode:
authorRadomir Dopieralski <openstack@sheep.art.pl>2019-08-03 13:48:55 +0200
committerRadomir Dopieralski <openstack@sheep.art.pl>2019-08-03 14:15:19 +0200
commit9907e3fa288eb9c31d0152e56c4d9ba998cf8122 (patch)
tree96a89fd9da6fa2a8d159c802b8251759b9f69d77 /shared-module
parent347fbb652fa8ceba7ee640a690f0996204136443 (diff)
Allow to specify pre-allocated buffer in audicore.WaveFile
It lets us re-use the same buffer for playing multiple files. This also allows us to control the size of the buffer. Half of the buffer will be used for the fist, and half for the second internal buffer.
Diffstat (limited to 'shared-module')
-rw-r--r--shared-module/audiocore/WaveFile.c33
1 files changed, 22 insertions, 11 deletions
diff --git a/shared-module/audiocore/WaveFile.c b/shared-module/audiocore/WaveFile.c
index 810d9c33b..df5d4b61d 100644
--- a/shared-module/audiocore/WaveFile.c
+++ b/shared-module/audiocore/WaveFile.c
@@ -46,7 +46,9 @@ struct wave_format_chunk {
};
void common_hal_audioio_wavefile_construct(audioio_wavefile_obj_t* self,
- pyb_file_obj_t* file) {
+ pyb_file_obj_t* file,
+ uint8_t *buffer,
+ size_t buffer_size) {
// Load the wave
self->file = file;
uint8_t chunk_header[16];
@@ -84,7 +86,6 @@ void common_hal_audioio_wavefile_construct(audioio_wavefile_obj_t* self,
}
// Get the sample_rate
self->sample_rate = format.sample_rate;
- self->len = 256;
self->channel_count = format.num_channels;
self->bits_per_sample = format.bits_per_sample;
@@ -111,21 +112,31 @@ void common_hal_audioio_wavefile_construct(audioio_wavefile_obj_t* self,
// Try to allocate two buffers, one will be loaded from file and the other
// DMAed to DAC.
- self->buffer = m_malloc(self->len, false);
- if (self->buffer == NULL) {
- common_hal_audioio_wavefile_deinit(self);
- mp_raise_msg(&mp_type_MemoryError, translate("Couldn't allocate first buffer"));
- }
+ if (buffer_size) {
+ self->len = buffer_size / 2;
+ self->buffer = buffer;
+ self->second_buffer = buffer + self->len;
+ } else {
+ self->len = 256;
+ self->buffer = m_malloc(self->len, false);
+ if (self->buffer == NULL) {
+ common_hal_audioio_wavefile_deinit(self);
+ mp_raise_msg(&mp_type_MemoryError,
+ translate("Couldn't allocate first buffer"));
+ }
- self->second_buffer = m_malloc(self->len, false);
- if (self->second_buffer == NULL) {
- common_hal_audioio_wavefile_deinit(self);
- mp_raise_msg(&mp_type_MemoryError, translate("Couldn't allocate second buffer"));
+ self->second_buffer = m_malloc(self->len, false);
+ if (self->second_buffer == NULL) {
+ common_hal_audioio_wavefile_deinit(self);
+ mp_raise_msg(&mp_type_MemoryError,
+ translate("Couldn't allocate second buffer"));
+ }
}
}
void common_hal_audioio_wavefile_deinit(audioio_wavefile_obj_t* self) {
self->buffer = NULL;
+ self->second_buffer = NULL;
}
bool common_hal_audioio_wavefile_deinited(audioio_wavefile_obj_t* self) {