@@ -44,16 +44,27 @@ int synthio_span_count_active_channels(synthio_midi_span_t *span) {
4444}
4545
4646
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+
4860 uint16_t dur = MIN (SYNTHIO_MAX_DUR , synth -> span .dur );
4961 synth -> span .dur -= dur ;
50- memset (synth -> buffer , 0 , synth -> buffer_length );
62+ memset (out_buffer , 0 , synth -> buffer_length );
5163
5264 int32_t sample_rate = synth -> sample_rate ;
5365 int active_channels = synthio_span_count_active_channels (& synth -> span );
5466 const int16_t * waveform = synth -> waveform ;
5567 uint32_t waveform_length = synth -> waveform_length ;
56- int16_t * out_buffer = synth -> buffer ;
5768 if (active_channels ) {
5869 int16_t loudness = 0x3fff / (1 + active_channels );
5970 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
8495 }
8596 }
8697
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 ;
89107}
90108
91109bool synthio_synth_deinited (synthio_synth_t * synth ) {
92- return synth -> buffer == NULL ;
110+ return synth -> buffers [ 0 ] == NULL ;
93111}
94112
95113void 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 ;
98118}
99119
100120void synthio_synth_init (synthio_synth_t * synth , uint16_t max_dur ) {
101121 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 ;
103125}
104126
105127void synthio_synth_get_buffer_structure (synthio_synth_t * synth , bool single_channel_output ,
106128 bool * single_buffer , bool * samples_signed , uint32_t * max_buffer_length , uint8_t * spacing ) {
107- * single_buffer = true ;
129+ * single_buffer = false ;
108130 * samples_signed = true;
109131 * max_buffer_length = synth -> buffer_length ;
110132 * spacing = 1 ;
0 commit comments