8000 audio: reduce code size · jepler/circuitpython@e15eba0 · GitHub
[go: up one dir, main page]

Skip to content

Commit e15eba0

Browse files
committed
audio: reduce code size
By placing certain fields in a fixed location in all sample types, code can be reduced & reused. For instance, the same property object can be used for every sample type's `sample_rate` property. The sample proto functions like `sample_rate` become superfluous since once an object is verified to support the audiosample protocol, direct access to the fields in the base object is possible.
1 parent 79797e4 commit e15eba0

File tree

50 files changed

+388
-831
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+388
-831
lines changed

ports/atmel-samd/audio_dma.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ audio_dma_result audio_dma_setup_playback(audio_dma_t *dma,
251251
}
252252

253253

254-
if (audiosample_bits_per_sample(sample) == 16) {
254+
if (audiosample_get_bits_per_sample(sample) == 16) {
255255
dma->beat_size = 2;
256256
dma->bytes_per_sample = 2;
257257
} else {
@@ -262,7 +262,7 @@ audio_dma_result audio_dma_setup_playback(audio_dma_t *dma,
262262
}
263263
}
264264
// Transfer both channels at once.
265-
if (!single_channel_output && audiosample_channel_count(sample) == 2) {
265+
if (!single_channel_output && audiosample_get_channel_count(sample) == 2) {
266266
dma->beat_size *= 2;
267267
}
268268

ports/atmel-samd/audio_dma.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "py/obj.h"
1111
#include "shared-module/audiocore/RawSample.h"
1212
#include "shared-module/audiocore/WaveFile.h"
13+
#include "shared-module/audiocore/__init__.h"
1314
#include "supervisor/background_callback.h"
1415

1516
typedef struct {
@@ -40,10 +41,6 @@ typedef enum {
4041
AUDIO_DMA_MEMORY_ERROR,
4142
} audio_dma_result;
4243

43-
uint32_t audiosample_sample_rate(mp_obj_t sample_obj);
44-
uint8_t audiosample_bits_per_sample(mp_obj_t sample_obj);
45-
uint8_t audiosample_channel_count(mp_obj_t sample_obj);
46-
4744
void audio_dma_init(audio_dma_t *dma);
4845
void audio_dma_reset(void);
4946

ports/atmel-samd/common-hal/audiobusio/I2SOut.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -216,10 +216,10 @@ void common_hal_audiobusio_i2sout_play(audiobusio_i2sout_obj_t *self,
216216
mp_raise_RuntimeError(MP_ERROR_TEXT("Clock unit in use"));
217217
}
218218
#endif
219-
uint8_t bits_per_sample = audiosample_bits_per_sample(sample);
219+
uint8_t bits_per_sample = audiosample_get_bits_per_sample(sample);
220220
// We always output stereo so output twice as many bits.
221221
uint16_t bits_per_sample_output = bits_per_sample * 2;
222-
uint16_t divisor = 48000000 / (bits_per_sample_output * audiosample_sample_rate(sample));
222+
uint16_t divisor = 48000000 / (bits_per_sample_output * audiosample_get_sample_rate(sample));
223223
// Find a free GCLK to generate the MCLK signal.
224224
uint8_t gclk = find_free_gclk(divisor);
225225
if (gclk > GCLK_GEN_NUM) {
@@ -235,7 +235,7 @@ void common_hal_audiobusio_i2sout_play(audiobusio_i2sout_obj_t *self,
235235
} else {
236236
clkctrl |= I2S_CLKCTRL_FSOUTINV | I2S_CLKCTRL_BITDELAY_I2S;
237237
}
238-
uint8_t channel_count = audiosample_channel_count(sample);
238+
uint8_t channel_count = audiosample_get_channel_count(sample);
239239
if (channel_count > 2) {
240240
mp_raise_ValueError(MP_ERROR_TEXT("Too many channels in sample"));
241241
}
@@ -245,7 +245,7 @@ void common_hal_audiobusio_i2sout_play(audiobusio_i2sout_obj_t *self,
245245
#ifdef SAM_D5X_E5X
246246
uint32_t serctrl = (self->clock_unit << I2S_RXCTRL_CLKSEL_Pos) | I2S_TXCTRL_TXSAME_SAME;
247247
#endif
248-
if (audiosample_channel_count(sample) == 1) {
248+
if (audiosample_get_channel_count(sample) == 1) {
249249
serctrl |= SERCTRL(MONO_MONO);
250250
} else {
251251
serctrl |= SERCTRL(MONO_STEREO);

ports/atmel-samd/common-hal/audioio/AudioOut.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ void common_hal_audioio_audioout_play(audioio_audioout_obj_t *self,
333333
common_hal_audioio_audioout_stop(self);
334334
}
335335
audio_dma_result result = AUDIO_DMA_OK;
336-
uint32_t sample_rate = audiosample_sample_rate(sample);
336+
uint32_t sample_rate = audiosample_get_sample_rate(sample);
337337
#ifdef SAMD21
338338
const uint32_t max_sample_rate = 350000;
339339
#endif
@@ -364,12 +364,12 @@ void common_hal_audioio_audioout_play(audioio_audioout_obj_t *self,
364364
right_channel_reg = (uint32_t)&DAC->DATABUF[0].reg;
365365
}
366366

367-
size_t num_channels = audiosample_channel_count(sample);
367+
size_t num_channels = audiosample_get_channel_count(sample);
368368

369369
if (num_channels == 2 &&
370370
// Are DAC channels sequential?
371371
left_channel_reg + 2 == right_channel_reg &&
372-
audiosample_bits_per_sample(sample) == 16) {
372+
audiosample_get_bits_per_sample(sample) == 16) {
373373
result = audio_dma_setup_playback(&self->left_dma, sample, loop, false, 0,
374374
false /* output unsigned */,
375375
left_channel_reg,
@@ -403,7 +403,7 @@ void common_hal_audioio_audioout_play(audioio_audioout_obj_t *self,
403403
}
404404
}
405405
Tc *timer = tc_insts[self->tc_index];
406-
set_timer_frequency(timer, audiosample_sample_rate(sample));
406+
set_timer_frequency(timer, audiosample_get_sample_rate(sample));
407407
timer->COUNT16.CTRLBSET.reg = TC_CTRLBSET_CMD_RETRIGGER;
408408
while (timer->COUNT16.STATUS.bit.STOP == 1) {
409409
}

ports/espressif/common-hal/audiobusio/__init__.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,8 @@ void port_i2s_play(i2s_t *self, mp_obj_t sample, bool loop) {
149149
port_i2s_pause(self);
150150
self->sample = sample;
151151
self->loop = loop;
152-
self->bytes_per_sample = audiosample_bits_per_sample(sample) / 8;
153-
self->channel_count = audiosample_channel_count(sample);
152+
self->bytes_per_sample = audiosample_get_bits_per_sample(sample) / 8;
153+
self->channel_count = audiosample_get_channel_count(sample);
154154
bool single_buffer;
155155
bool samples_signed;
156156
uint32_t max_buffer_length;
@@ -164,7 +164,7 @@ void port_i2s_play(i2s_t *self, mp_obj_t sample, bool loop) {
164164

165165
audiosample_reset_buffer(self->sample, false, 0);
166166

167-
uint32_t sample_rate = audiosample_sample_rate(sample);
167+
uint32_t sample_rate = audiosample_get_sample_rate(sample);
168168
i2s_std_clk_config_t clk_config = I2S_STD_CLK_DEFAULT_CONFIG(sample_rate);
169169
CHECK_ESP_RESULT(i2s_channel_reconfig_std_clock(self->handle, &clk_config));
170170

ports/espressif/common-hal/audioio/AudioOut.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -595,16 +595,16 @@ void common_hal_audioio_audioout_play(audioio_audioout_obj_t *self,
595595

596596
self->sample = sample;
597597
self->looping = loop;
598-
freq_hz = audiosample_sample_rate(self->sample);
598+
freq_hz = audiosample_get_sample_rate(self->sample);
599599

600600
if (freq_hz != self->freq_hz) {
601601
common_hal_audioio_audioout_deinit(self);
602602
self->freq_hz = freq_hz;
603603
audioout_init(self);
604604
}
605605

606-
samples_size = audiosample_bits_per_sample(self->sample);
607-
channel_count = audiosample_channel_count(self->sample);
606+
samples_size = audiosample_get_bits_per_sample(self->sample);
607+
channel_count = audiosample_get_channel_count(self->sample);
608608
audiosample_get_buffer_structure(self->sample, false,
609609
&_single_buffer, &samples_signed,
610610
&_max_buffer_length, &_spacing);

ports/mimxrt10xx/common-hal/audiobusio/__init__.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -374,11 +374,11 @@ static void set_sai_clocking_for_sample_rate(uint32_t sample_rate) {
374374
void port_i2s_play(i2s_t *self, mp_obj_t 10000 sample, bool loop) {
375375
self->sample = sample;
376376
self->loop = loop;
377-
self->bytes_per_sample = audiosample_bits_per_sample(sample) / 8;
378-
self->channel_count = audiosample_channel_count(sample);
377+
self->bytes_per_sample = audiosample_get_bits_per_sample(sample) / 8;
378+
self->channel_count = audiosample_get_channel_count(sample);
379379
int instance = SAI_GetInstance(self->peripheral);
380380
i2s_playing |= (1 << instance);
381-
uint32_t sample_rate = audiosample_sample_rate(sample);
381+
uint32_t sample_rate = audiosample_get_sample_rate(sample);
382382
if (sample_rate != self->sample_rate) {
383383
if (__builtin_popcount(i2s_playing) <= 1) {
384384
// as this is the first/only i2s instance playing audio, we can

ports/nordic/common-hal/audiobusio/I2SOut.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -240,8 +240,8 @@ void common_hal_audiobusio_i2sout_play(audiobusio_i2sout_obj_t *self,
240240

241241
self->sample = sample;
242242
self->loop = loop;
243-
uint32_t sample_rate = audiosample_sample_rate(sample);
244-
self->bytes_per_sample = audiosample_bits_per_sample(sample) / 8;
243+
uint32_t sample_rate = audiosample_get_sample_rate(sample);
244+
self->bytes_per_sample = audiosample_get_bits_per_sample(sample) / 8;
245245

246246
uint32_t max_buffer_length;
247247
bool single_buffer, samples_signed;

ports/nordic/common-hal/audiopwmio/PWMAudioOut.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -223,15 +223,15 @@ void common_hal_audiopwmio_pwmaudioout_play(audiopwmio_pwmaudioout_obj_t *self,
223223
self->sample = sample;
224224
self->loop = loop;
225225

226-
uint32_t sample_rate = audiosample_sample_rate(sample);
227-
self->bytes_per_sample = audiosample_bits_per_sample(sample) / 8;
226+
uint32_t sample_rate = audiosample_get_sample_rate(sample);
227+
self->bytes_per_sample = audiosample_get_bits_per_sample(sample) / 8;
228228

229229
uint32_t max_buffer_length;
230230
uint8_t spacing;
231231
audiosample_get_buffer_structure(sample, /* single channel */ false,
232232
&self->single_buffer, &self->signed_to_unsigned, &max_buffer_length,
233233
&spacing);
234-
self->sample_channel_count = audiosample_channel_count(sample);
234+
self->sample_channel_count = audiosample_get_channel_count(sample);
235235

236236
mp_arg_validate_length_max(max_buffer_length, UINT16_MAX, MP_QSTR_buffer);
237237

ports/raspberrypi/audio_dma.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ audio_dma_result audio_dma_setup_playback(
203203
dma->output_signed = output_signed;
204204
dma->sample_spacing = 1;
205205
dma->output_resolution = output_resolution;
206-
dma->sample_resolution = audiosample_bits_per_sample(sample);
206+
dma->sample_resolution = audiosample_get_bits_per_sample(sample);
207207
dma->output_register_address = output_register_address;
208208
dma->swap_channel = swap_channel;
209209

@@ -250,7 +250,7 @@ audio_dma_result audio_dma_setup_playback(
250250
dma->output_size = 1;
251251
}
252252
// Transfer both channels at once.
253-
if (!single_channel_output && audiosample_channel_count(sample) == 2) {
253+
if (!single_channel_output && audiosample_get_channel_count(sample) == 2) {
254254
dma->output_size *= 2;
255255
}
256256
enum dma_channel_transfer_size dma_size = DMA_SIZE_8;

ports/raspberrypi/common-hal/audiobusio/I2SOut.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ void common_hal_audiobusio_i2sout_play(audiobusio_i2sout_obj_t *self,
232232
common_hal_audiobusio_i2sout_stop(self);
233233
}
234234

235-
uint8_t bits_per_sample = audiosample_bits_per_sample(sample);
235+
uint8_t bits_per_sample = audiosample_get_bits_per_sample(sample);
236236
// Make sure we transmit a minimum of 16 bits.
237237
// TODO: Maybe we need an intermediate object to upsample instead. This is
238238
// only needed for some I2S devices that expect at least 8.
@@ -242,8 +242,8 @@ void common_hal_audiobusio_i2sout_play(audiobusio_i2sout_obj_t *self,
242242
// We always output stereo so output twice as many bits.
243243
uint16_t bits_per_sample_output = bits_per_sample * 2;
244244
size_t clocks_per_bit = 6;
245-
uint32_t frequency = bits_per_sample_output * audiosample_sample_rate(sample);
246-
uint8_t channel_count = audiosample_channel_count(sample);
245+
uint32_t frequency = bits_per_sample_output * audiosample_get_sample_rate(sample);
246+
uint8_t channel_count = audiosample_get_channel_count(sample);
247247
if (channel_count > 2) {
248248
mp_raise_ValueError(MP_ERROR_TEXT("Too many channels in sample."));
249249
}

ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ void common_hal_audiopwmio_pwmaudioout_play(audiopwmio_pwmaudioout_obj_t *self,
187187
// to trigger the DMA. Each has a 16 bit fractional divisor system clock * X / Y where X and Y
188188
// are 16-bit.
189189

190-
uint32_t sample_rate = audiosample_sample_rate(sample);
190+
uint32_t sample_rate = audiosample_get_sample_rate(sample);
191191

192192
uint32_t system_clock = common_hal_mcu_processor_get_frequency();
193193
uint32_t best_denominator;

ports/stm/common-hal/audiopwmio/PWMAudioOut.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -240,16 +240,16 @@ void common_hal_audiopwmio_pwmaudioout_play(audiopwmio_pwmaudioout_obj_t *self,
240240
self->sample = sample;
241241
self->loop = loop;
242242

243-
uint32_t sample_rate = audiosample_sample_rate(sample);
244-
self->bytes_per_sample = audiosample_bits_per_sample(sample) / 8;
243+
uint32_t sample_rate = audiosample_get_sample_rate(sample);
244+
self->bytes_per_sample = audiosample_get_bits_per_sample(sample) / 8;
245245

246246
uint32_t max_buffer_length;
247247
uint8_t spacing;
248248
bool single_buffer;
249249
bool samples_signed;
250250
audiosample_get_buffer_structure(sample, /* single channel */ false,
251251
&single_buffer, &samples_signed, &max_buffer_length, &spacing);
252-
self->sample_channel_count = audiosample_channel_count(sample);
252+
self->sample_channel_count = audiosample_get_channel_count(sample);
253253
self->sample_offset = (samples_signed ? 0x8000 : 0) - self->quiescent_value;
254254

255255
free_buffers(self);

shared-bindings/audiocore/RawSample.c

Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "py/runtime.h"
1313
#include "shared-bindings/util.h"
1414
#include "shared-bindings/audiocore/RawSample.h"
15+
#include "shared-bindings/audiocore/__init__.h"
1516

1617
//| class RawSample:
1718
//| """A raw audio sample buffer in memory"""
@@ -120,12 +121,6 @@ static mp_obj_t audioio_rawsample_deinit(mp_obj_t self_in) {
120121
}
121122
static MP_DEFINE_CONST_FUN_OBJ_1(audioio_rawsample_deinit_obj, audioio_rawsample_deinit);
122123

123-
static void check_for_deinit(audioio_rawsample_obj_t *self) {
124-
if (common_hal_audioio_rawsample_deinited(self)) {
125-
raise_deinited_error();
126-
}
127-
}
128-
129124
//| def __enter__(self) -> RawSample:
130125
//| """No-op used by Context Managers."""
131126
//| ...
@@ -151,24 +146,6 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(audioio_rawsample___exit___obj, 4, 4,
151146
//| change it."""
152147
//|
153148
//|
154-
static mp_obj_t audioio_rawsample_obj_get_sample_rate(mp_obj_t self_in) {
155-
audioio_rawsample_obj_t *self = MP_OBJ_TO_PTR(self_in);
156-
check_for_deinit(self);
157-
return MP_OBJ_NEW_SMALL_INT(common_hal_audioio_rawsample_get_sample_rate(self));
158-
}
159-
MP_DEFINE_CONST_FUN_OBJ_1(audioio_rawsample_get_sample_rate_obj, audioio_rawsample_obj_get_sample_rate);
160-
161-
static mp_obj_t audioio_rawsample_obj_set_sample_rate(mp_obj_t self_in, mp_obj_t sample_rate) {
162-
audioio_rawsample_obj_t *self = MP_OBJ_TO_PTR(self_in);
163-
check_for_deinit(self);
164-
common_hal_audioio_rawsample_set_sample_rate(self, mp_obj_get_int(sample_rate));
165-
return mp_const_none;
166-
}
167-
MP_DEFINE_CONST_FUN_OBJ_2(audioio_rawsample_set_sample_rate_obj, audioio_rawsample_obj_set_sample_rate);
168-
169-
MP_PROPERTY_GETSET(audioio_rawsample_sample_rate_obj,
170-
(mp_obj_t)&audioio_rawsample_get_sample_rate_obj,
171-
(mp_obj_t)&audioio_rawsample_set_sample_rate_obj);
172149

173150
static const mp_rom_map_elem_t audioio_rawsample_locals_dict_table[] = {
174151
// Methods
@@ -177,18 +154,14 @@ static const mp_rom_map_elem_t audioio_rawsample_locals_dict_table[] = {
177154
{ MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&audioio_rawsample___exit___obj) },
178155

179156
// Properties
180-
{ MP_ROM_QSTR(MP_QSTR_sample_rate), MP_ROM_PTR(&audioio_rawsample_sample_rate_obj) },
157+
AUDIOSAMPLE_FIELDS,
181158
};
182159
static MP_DEFINE_CONST_DICT(audioio_rawsample_locals_dict, audioio_rawsample_locals_dict_table);
183160

184161
static const audiosample_p_t audioio_rawsample_proto = {
185162
MP_PROTO_IMPLEMENT(MP_QSTR_protocol_audiosample)
186-
.sample_rate = (audiosample_sample_rate_fun)common_hal_audioio_rawsample_get_sample_rate,
187-
.bits_per_sample = (audiosample_bits_per_sample_fun)common_hal_audioio_rawsample_get_bits_per_sample,
188-
.channel_count = (audiosample_channel_count_fun)common_hal_audioio_rawsample_get_channel_count,
189163
.reset_buffer = (audiosample_reset_buffer_fun)audioio_rawsample_reset_buffer,
190164
.get_buffer = (audiosample_get_buffer_fun)audioio_rawsample_get_buffer,
191-
.get_buffer_structure = (audiosample_get_buffer_structure_fun)audioio_rawsample_get_buffer_structure,
192165
};
193166

194167
MP_DEFINE_CONST_OBJ_TYPE(

0 commit comments

Comments
 (0)
0