Skip to content

Commit 52e5e42

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 469e88d commit 52e5e42

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 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;

0 commit comments

Comments
 (0)