|
36 | 36 | #include "shared-module/audiomixer/Mixer.h"
|
37 | 37 |
|
38 | 38 | uint32_t audiosample_sample_rate(mp_obj_t sample_obj) {
|
39 |
| - if (MP_OBJ_IS_TYPE(sample_obj, &audioio_rawsample_type)) { |
40 |
| - audioio_rawsample_obj_t* sample = MP_OBJ_TO_PTR(sample_obj); |
41 |
| - return sample->sample_rate; |
42 |
| - } else if (MP_OBJ_IS_TYPE(sample_obj, &audioio_wavefile_type)) { |
43 |
| - audioio_wavefile_obj_t* file = MP_OBJ_TO_PTR(sample_obj); |
44 |
| - return file->sample_rate; |
45 |
| - #if CIRCUITPY_AUDIOMIXER |
46 |
| - } else if (MP_OBJ_IS_TYPE(sample_obj, &audiomixer_mixer_type)) { |
47 |
| - audiomixer_mixer_obj_t* mixer = MP_OBJ_TO_PTR(sample_obj); |
48 |
| - return mixer->sample_rate; |
49 |
| - #endif |
50 |
| - } |
51 |
| - return 16000; |
| 39 | + const audiosample_p_t *proto = mp_proto_get_or_throw(MP_QSTR_protocol_audiosample, sample_obj); |
| 40 | + return proto->sample_rate(MP_OBJ_TO_PTR(sample_obj)); |
52 | 41 | }
|
53 | 42 |
|
54 | 43 | uint8_t audiosample_bits_per_sample(mp_obj_t sample_obj) {
|
55 |
| - if (MP_OBJ_IS_TYPE(sample_obj, &audioio_rawsample_type)) { |
56 |
| - audioio_rawsample_obj_t* sample = MP_OBJ_TO_PTR(sample_obj); |
57 |
| - return sample->bits_per_sample; |
58 |
| - } else if (MP_OBJ_IS_TYPE(sample_obj, &audioio_wavefile_type)) { |
59 |
| - audioio_wavefile_obj_t* file = MP_OBJ_TO_PTR(sample_obj); |
60 |
| - return file->bits_per_sample; |
61 |
| - #if CIRCUITPY_AUDIOMIXER |
62 |
| - } else if (MP_OBJ_IS_TYPE(sample_obj, &audiomixer_mixer_type)) { |
63 |
| - audiomixer_mixer_obj_t* mixer = MP_OBJ_TO_PTR(sample_obj); |
64 |
| - return mixer->bits_per_sample; |
65 |
| - #endif |
66 |
| - } |
67 |
| - return 8; |
| 44 | + const audiosample_p_t *proto = mp_proto_get_or_throw(MP_QSTR_protocol_audiosample, sample_obj); |
| 45 | + return proto->bits_per_sample(MP_OBJ_TO_PTR(sample_obj)); |
68 | 46 | }
|
69 | 47 |
|
70 | 48 | uint8_t audiosample_channel_count(mp_obj_t sample_obj) {
|
71 |
| - if (MP_OBJ_IS_TYPE(sample_obj, &audioio_rawsample_type)) { |
72 |
| - audioio_rawsample_obj_t* sample = MP_OBJ_TO_PTR(sample_obj); |
73 |
| - return sample->channel_count; |
74 |
| - } else if (MP_OBJ_IS_TYPE(sample_obj, &audioio_wavefile_type)) { |
75 |
| - audioio_wavefile_obj_t* file = MP_OBJ_TO_PTR(sample_obj); |
76 |
| - return file->channel_count; |
77 |
| - #if CIRCUITPY_AUDIOMIXER |
78 |
| - } else if (MP_OBJ_IS_TYPE(sample_obj, &audiomixer_mixer_type)) { |
79 |
| - audiomixer_mixer_obj_t* mixer = MP_OBJ_TO_PTR(sample_obj); |
80 |
| - return mixer->channel_count; |
81 |
| - #endif |
82 |
| - } |
83 |
| - return 1; |
| 49 | + const audiosample_p_t *proto = mp_proto_get_or_throw(MP_QSTR_protocol_audiosample, sample_obj); |
| 50 | + return proto->channel_count(MP_OBJ_TO_PTR(sample_obj)); |
84 | 51 | }
|
85 | 52 |
|
86 | 53 | void audiosample_reset_buffer(mp_obj_t sample_obj, bool single_channel, uint8_t audio_channel) {
|
87 |
| - if (MP_OBJ_IS_TYPE(sample_obj, &audioio_rawsample_type)) { |
88 |
| - audioio_rawsample_obj_t* sample = MP_OBJ_TO_PTR(sample_obj); |
89 |
| - audioio_rawsample_reset_buffer(sample, single_channel, audio_channel); |
90 |
| - } else if (MP_OBJ_IS_TYPE(sample_obj, &audioio_wavefile_type)) { |
91 |
| - audioio_wavefile_obj_t* file = MP_OBJ_TO_PTR(sample_obj); |
92 |
| - audioio_wavefile_reset_buffer(file, single_channel, audio_channel); |
93 |
| - #if CIRCUITPY_AUDIOMIXER |
94 |
| - } else if (MP_OBJ_IS_TYPE(sample_obj, &audiomixer_mixer_type)) { |
95 |
| - audiomixer_mixer_obj_t* file = MP_OBJ_TO_PTR(sample_obj); |
96 |
| - audiomixer_mixer_reset_buffer(file, single_channel, audio_channel); |
97 |
| - #endif |
98 |
| - } |
| 54 | + const audiosample_p_t *proto = mp_proto_get_or_throw(MP_QSTR_protocol_audiosample, sample_obj); |
| 55 | + proto->reset_buffer(MP_OBJ_TO_PTR(sample_obj)); |
99 | 56 | }
|
100 | 57 |
|
101 | 58 | audioio_get_buffer_result_t audiosample_get_buffer(mp_obj_t sample_obj,
|
102 | 59 | bool single_channel,
|
103 | 60 | uint8_t channel,
|
104 | 61 | uint8_t** buffer, uint32_t* buffer_length) {
|
105 |
| - if (MP_OBJ_IS_TYPE(sample_obj, &audioio_rawsample_type)) { |
106 |
| - audioio_rawsample_obj_t* sample = MP_OBJ_TO_PTR(sample_obj); |
107 |
| - return audioio_rawsample_get_buffer(sample, single_channel, channel, buffer, buffer_length); |
108 |
| - } else if (MP_OBJ_IS_TYPE(sample_obj, &audioio_wavefile_type)) { |
109 |
| - audioio_wavefile_obj_t* file = MP_OBJ_TO_PTR(sample_obj); |
110 |
| - return audioio_wavefile_get_buffer(file, single_channel, channel, buffer, buffer_length); |
111 |
| - #if CIRCUITPY_AUDIOMIXER |
112 |
| - } else if (MP_OBJ_IS_TYPE(sample_obj, &audiomixer_mixer_type)) { |
113 |
| - audiomixer_mixer_obj_t* file = MP_OBJ_TO_PTR(sample_obj); |
114 |
| - return audiomixer_mixer_get_buffer(file, single_channel, channel, buffer, buffer_length); |
115 |
| - #endif |
116 |
| - } |
117 |
| - return GET_BUFFER_DONE; |
| 62 | + const audiosample_p_t *proto = mp_proto_get_or_throw(MP_QSTR_protocol_audiosample, sample_obj); |
| 63 | + return proto->get_buffer(MP_OBJ_TO_PTR(sample_obj), single_channel, channel, buffer, buffer_length); |
118 | 64 | }
|
119 | 65 |
|
120 | 66 | void audiosample_get_buffer_structure(mp_obj_t sample_obj, bool single_channel,
|
121 | 67 | bool* single_buffer, bool* samples_signed,
|
122 | 68 | uint32_t* max_buffer_length, uint8_t* spacing) {
|
123 |
| - if (MP_OBJ_IS_TYPE(sample_obj, &audioio_rawsample_type)) { |
124 |
| - audioio_rawsample_obj_t* sample = MP_OBJ_TO_PTR(sample_obj); |
125 |
| - audioio_rawsample_get_buffer_structure(sample, single_channel, single_buffer, |
126 |
| - samples_signed, max_buffer_length, spacing); |
127 |
| - } else if (MP_OBJ_IS_TYPE(sample_obj, &audioio_wavefile_type)) { |
128 |
| - audioio_wavefile_obj_t* file = MP_OBJ_TO_PTR(sample_obj); |
129 |
| - audioio_wavefile_get_buffer_structure(file, single_channel, single_buffer, samples_signed, |
130 |
| - max_buffer_length, spacing); |
131 |
| - #if CIRCUITPY_AUDIOMIXER |
132 |
| - } else if (MP_OBJ_IS_TYPE(sample_obj, &audiomixer_mixer_type)) { |
133 |
| - audiomixer_mixer_obj_t* file = MP_OBJ_TO_PTR(sample_obj); |
134 |
| - audiomixer_mixer_get_buffer_structure(file, single_channel, single_buffer, samples_signed, |
135 |
| - max_buffer_length, spacing); |
136 |
| - #endif |
137 |
| - } |
| 69 | + const audiosample_p_t *proto = mp_proto_get_or_throw(MP_QSTR_protocol_audiosample, sample_obj); |
| 70 | + proto->get_buffer_structure(MP_OBJ_TO_PTR(sample_obj), single_channel, single_buffer, |
| 71 | + samples_signed, max_buffer_length, spacing); |
138 | 72 | }
|
0 commit comments