Tweaks from feedback:

* default_value is now quiescent_value
* Use step = -step format for sign switch
* Add note about analogout_reset being empty
This commit is contained in:
Scott Shawcroft 2018-10-17 11:31:08 -07:00
parent c209165d43
commit 4eb1fe18e5
No known key found for this signature in database
GPG Key ID: FD0EDC4B6C53CA59
4 changed files with 17 additions and 16 deletions

View File

@ -138,4 +138,5 @@ void common_hal_analogio_analogout_set_value(analogio_analogout_obj_t *self,
} }
void analogout_reset(void) { void analogout_reset(void) {
// AudioOut resets the DAC in case its been used for audio which requires special handling.
} }

View File

@ -60,8 +60,8 @@ static void ramp_value(uint16_t start, uint16_t end) {
int32_t step = 49; int32_t step = 49;
int32_t steps = diff / step; int32_t steps = diff / step;
if (diff < 0) { if (diff < 0) {
steps *= -1; steps = -steps;
step *= -1; step = -step;
} }
for (int32_t i = 0; i < steps; i++) { for (int32_t i = 0; i < steps; i++) {
uint32_t value = start + step * i; uint32_t value = start + step * i;
@ -81,8 +81,8 @@ static void ramp_value(uint16_t start, uint16_t end) {
int32_t step = 49; int32_t step = 49;
int32_t steps = diff / step; int32_t steps = diff / step;
if (diff < 0) { if (diff < 0) {
steps *= -1; steps = -steps;
step *= -1; step = -step;
} }
for (int32_t i = 0; i < steps; i++) { for (int32_t i = 0; i < steps; i++) {
@ -119,7 +119,7 @@ void audioout_reset(void) {
} }
void common_hal_audioio_audioout_construct(audioio_audioout_obj_t* self, void common_hal_audioio_audioout_construct(audioio_audioout_obj_t* self,
const mcu_pin_obj_t* left_channel, const mcu_pin_obj_t* right_channel, uint16_t default_value) { const mcu_pin_obj_t* left_channel, const mcu_pin_obj_t* right_channel, uint16_t quiescent_value) {
#ifdef SAMD51 #ifdef SAMD51
bool dac_clock_enabled = hri_mclk_get_APBDMASK_DAC_bit(MCLK); bool dac_clock_enabled = hri_mclk_get_APBDMASK_DAC_bit(MCLK);
#endif #endif
@ -299,8 +299,8 @@ void common_hal_audioio_audioout_construct(audioio_audioout_obj_t* self,
self->tc_to_dac_event_channel = channel; self->tc_to_dac_event_channel = channel;
// Ramp the DAC up. // Ramp the DAC up.
self->default_value = default_value; self->quiescent_value = quiescent_value;
ramp_value(0, default_value); ramp_value(0, quiescent_value);
// Leave the DMA setup to playback. // Leave the DMA setup to playback.
} }
@ -315,7 +315,7 @@ void common_hal_audioio_audioout_deinit(audioio_audioout_obj_t* self) {
} }
// Ramp the DAC down. // Ramp the DAC down.
ramp_value(self->default_value, 0); ramp_value(self->quiescent_value, 0);
DAC->CTRLA.bit.ENABLE = 0; DAC->CTRLA.bit.ENABLE = 0;
#ifdef SAMD21 #ifdef SAMD21
@ -461,7 +461,7 @@ void common_hal_audioio_audioout_stop(audioio_audioout_obj_t* self) {
#endif #endif
// Ramp the DAC to default. The start is ignored when the current value can be readback. // Ramp the DAC to default. The start is ignored when the current value can be readback.
// Otherwise, we just set it immediately. // Otherwise, we just set it immediately.
ramp_value(self->default_value, self->default_value); ramp_value(self->quiescent_value, self->quiescent_value);
} }
bool common_hal_audioio_audioout_get_playing(audioio_audioout_obj_t* self) { bool common_hal_audioio_audioout_get_playing(audioio_audioout_obj_t* self) {

View File

@ -44,7 +44,7 @@ typedef struct {
uint8_t tc_to_dac_event_channel; uint8_t tc_to_dac_event_channel;
bool playing; bool playing;
uint16_t default_value; uint16_t quiescent_value;
} audioio_audioout_obj_t; } audioio_audioout_obj_t;
void audioout_reset(void); void audioout_reset(void);

View File

@ -43,15 +43,15 @@
//| //|
//| AudioOut can be used to output an analog audio signal on a given pin. //| AudioOut can be used to output an analog audio signal on a given pin.
//| //|
//| .. class:: AudioOut(left_channel, *, right_channel=None, default_value=0x8000) //| .. class:: AudioOut(left_channel, *, right_channel=None, quiescent_value=0x8000)
//| //|
//| Create a AudioOut object associated with the given pin(s). This allows you to //| Create a AudioOut object associated with the given pin(s). This allows you to
//| play audio signals out on the given pin(s). //| play audio signals out on the given pin(s).
//| //|
//| :param ~microcontroller.Pin left_channel: The pin to output the left channel to //| :param ~microcontroller.Pin left_channel: The pin to output the left channel to
//| :param ~microcontroller.Pin right_channel: The pin to output the right channel to //| :param ~microcontroller.Pin right_channel: The pin to output the right channel to
//| :param int default_value: The default output value. Samples should start and end with this //| :param int quiescent_value: The output value when no signal is present. Samples should start
//| value to prevent popping. //| and end with this value to prevent audible popping.
//| //|
//| Simple 8ksps 440 Hz sin wave:: //| Simple 8ksps 440 Hz sin wave::
//| //|
@ -97,11 +97,11 @@ STATIC mp_obj_t audioio_audioout_make_new(const mp_obj_type_t *type, size_t n_ar
mp_arg_check_num(n_args, n_kw, 1, 2, true); mp_arg_check_num(n_args, n_kw, 1, 2, true);
mp_map_t kw_args; mp_map_t kw_args;
mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args);
enum { ARG_left_channel, ARG_right_channel, ARG_default_value }; enum { ARG_left_channel, ARG_right_channel, ARG_quiescent_value };
static const mp_arg_t allowed_args[] = { static const mp_arg_t allowed_args[] = {
{ MP_QSTR_left_channel, MP_ARG_OBJ | MP_ARG_REQUIRED }, { MP_QSTR_left_channel, MP_ARG_OBJ | MP_ARG_REQUIRED },
{ MP_QSTR_right_channel, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_rom_obj = mp_const_none} }, { MP_QSTR_right_channel, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_rom_obj = mp_const_none} },
{ MP_QSTR_default_value, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_int = 0x8000} }, { MP_QSTR_quiescent_value, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_int = 0x8000} },
}; };
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
@ -120,7 +120,7 @@ STATIC mp_obj_t audioio_audioout_make_new(const mp_obj_type_t *type, size_t n_ar
// create AudioOut object from the given pin // create AudioOut object from the given pin
audioio_audioout_obj_t *self = m_new_obj(audioio_audioout_obj_t); audioio_audioout_obj_t *self = m_new_obj(audioio_audioout_obj_t);
self->base.type = &audioio_audioout_type; self->base.type = &audioio_audioout_type;
common_hal_audioio_audioout_construct(self, left_channel_pin, right_channel_pin, args[ARG_default_value].u_int); common_hal_audioio_audioout_construct(self, left_channel_pin, right_channel_pin, args[ARG_quiescent_value].u_int);
return MP_OBJ_FROM_PTR(self); return MP_OBJ_FROM_PTR(self);
} }