aboutsummaryrefslogtreecommitdiff
path: root/atmel-samd
diff options
context:
space:
mode:
authorScott Shawcroft <scott.shawcroft@gmail.com>2017-06-20 11:18:46 -0700
committerScott Shawcroft <scott.shawcroft@gmail.com>2017-06-20 11:18:46 -0700
commit9eadda68b878e6c40bd5b20c623885150b63b3b0 (patch)
treea22cc336ca180f1e6298f4bc908ba11dedb27194 /atmel-samd
parent97fcdfbd08c922efd7470d6482d7c7c703ffc0ae (diff)
atmel-samd: Fix AudioOut buffer playback by supporting bytes_per_sample.1.0.0-rc.2
Thanks to @ntoll for finding this bug!
Diffstat (limited to 'atmel-samd')
-rw-r--r--atmel-samd/common-hal/audioio/AudioOut.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/atmel-samd/common-hal/audioio/AudioOut.c b/atmel-samd/common-hal/audioio/AudioOut.c
index 9fb1a6ebe..c0ccd547e 100644
--- a/atmel-samd/common-hal/audioio/AudioOut.c
+++ b/atmel-samd/common-hal/audioio/AudioOut.c
@@ -103,6 +103,7 @@ void audioout_reset(void) {
void audioout_background(void) {
if (MP_STATE_VM(audioout_block_counter) != NULL &&
active_audioout != NULL &&
+ active_audioout->second_buffer != NULL &&
active_audioout->last_loaded_block < tc_get_count_value(MP_STATE_VM(audioout_block_counter))) {
uint8_t* buffer;
if (tc_get_count_value(MP_STATE_VM(audioout_block_counter)) % 2 == 1) {
@@ -132,6 +133,7 @@ void audioout_background(void) {
descriptor = active_audioout->second_descriptor;
}
descriptor->BTCNT.reg = length_read / active_audioout->bytes_per_sample;
+ descriptor->SRCADDR.reg = ((uint32_t) buffer) + length_read;
descriptor->DESCADDR.reg = 0;
}
}
@@ -348,7 +350,8 @@ static void shared_construct(audioio_audioout_obj_t* self, const mcu_pin_obj_t*
void common_hal_audioio_audioout_construct_from_buffer(audioio_audioout_obj_t* self,
const mcu_pin_obj_t* pin,
uint16_t* buffer,
- uint32_t len) {
+ uint32_t len,
+ uint8_t bytes_per_sample) {
self->pin = pin;
if (pin != &pin_PA02) {
mp_raise_ValueError("Invalid pin");
@@ -360,8 +363,8 @@ void common_hal_audioio_audioout_construct_from_buffer(audioio_audioout_obj_t* s
self->buffer = (uint8_t*) buffer;
self->second_buffer = NULL;
- // Input len is a count. Internal len is in bytes.
- self->len = 2 * len;
+ self->bytes_per_sample = bytes_per_sample;
+ self->len = len;
self->frequency = 8000;
}