|
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