@@ -44,16 +44,27 @@ int synthio_span_count_active_channels(synthio_midi_span_t *span) {
44
44
}
45
45
46
46
47
- void synthio_synth_synthesize (synthio_synth_t * synth , uint8_t * * buffer , uint32_t * buffer_length ) {
47
+ void synthio_synth_synthesize (synthio_synth_t * synth , uint8_t * * bufptr , uint32_t * buffer_length , uint8_t channel ) {
48
+
49
+ if (channel == synth -> other_channel ) {
50
+ * buffer_length = synth -> last_buffer_length ;
51
+ * bufptr = (uint8_t * )(synth -> buffers [synth -> other_buffer_index ] + channel );
52
+ return ;
53
+ }
54
+
55
+ synth -> buffer_index = !synth -> buffer_index ;
56
+ synth -> other_channel = 1 - channel ;
57
+ synth -> other_buffer_index = synth -> buffer_index ;
58
+ int16_t * out_buffer = (int16_t * )(void * )synth -> buffers [synth -> buffer_index ];
59
+
48
60
uint16_t dur = MIN (SYNTHIO_MAX_DUR , synth -> span .dur );
49
61
synth -> span .dur -= dur ;
50
- memset (synth -> buffer , 0 , synth -> buffer_length );
62
+ memset (out_buffer , 0 , synth -> buffer_length );
51
63
52
64
int32_t sample_rate = synth -> sample_rate ;
53
65
int active_channels = synthio_span_count_active_channels (& synth -> span );
54
66
const int16_t * waveform = synth -> waveform ;
55
67
uint32_t waveform_length = synth -> waveform_length ;
56
- int16_t * out_buffer = synth -> buffer ;
57
68
if (active_channels ) {
58
69
int16_t loudness = 0x3fff / (1 + active_channels );
59
70
for (int chan = 0 ; chan < CIRCUITPY_SYNTHIO_MAX_CHANNELS ; chan ++ ) {
@@ -84,27 +95,38 @@ void synthio_synth_synthesize(synthio_synth_t *synth, uint8_t **buffer, uint32_t
84
95
}
85
96
}
86
97
87
- * buffer_length = dur * SYNTHIO_BYTES_PER_SAMPLE ;
88
- * buffer = (uint8_t * )synth -> buffer ;
98
+ * buffer_length = synth -> last_buffer_length = dur * SYNTHIO_BYTES_PER_SAMPLE ;
99
+ * bufptr = (uint8_t * )out_buffer ;
100
+ }
101
+
102
+ void synthio_synth_reset_buffer (synthio_synth_t * synth , bool single_channel_output , uint8_t channel ) {
103
+ if (single_channel_output && channel == 1 ) {
104
+ return ;
105
+ }
106
+ synth -> other_channel = -1 ;
89
107
}
90
108
91
109
bool synthio_synth_deinited (synthio_synth_t * synth ) {
92
- return synth -> buffer == NULL ;
110
+ return synth -> buffers [ 0 ] == NULL ;
93
111
}
94
112
95
113
void synthio_synth_deinit (synthio_synth_t * synth ) {
96
- m_del (uint8_t , synth -> buffer , synth -> buffer_length );
97
- synth -> buffer = NULL ;
114
+ m_del (uint8_t , synth -> buffers [0 ], synth -> buffer_length );
115
+ m_del (uint8_t , synth -> buffers [1 ], synth -> buffer_length );
116
+ synth -> buffers [0 ] = NULL ;
117
+ synth -> buffers [1 ] = NULL ;
98
118
}
99
119
100
120
void synthio_synth_init (synthio_synth_t * synth , uint16_t max_dur ) {
101
121
synth -> buffer_length = MIN (SYNTHIO_MAX_DUR , max_dur ) * SYNTHIO_BYTES_PER_SAMPLE ;
102
- synth -> buffer = m_malloc (synth -> buffer_length , false);
122
+ synth -> buffers [0 ] = m_malloc (synth -> buffer_length , false);
123
+ synth -> buffers [1 ] = m_malloc (synth -> buffer_length , false);
124
+ synth -> other_channel = -1 ;
103
125
}
104
126
105
127
void synthio_synth_get_buffer_structure (synthio_synth_t * synth , bool single_channel_output ,
106
128
bool * single_buffer , bool * samples_signed , uint32_t * max_buffer_length , uint8_t * spacing ) {
107
- * single_buffer = true ;
129
+ * single_buffer = false ;
108
130
* samples_signed = true;
109
131
* max_buffer_length = synth -> buffer_length ;
110
132
* spacing = 1 ;
0 commit comments