tonarino / acoustic_profiler

Collaboration project with Jen
MIT License
1 stars 0 forks source link

Drive audio directly using cpal, position sounds precisely within callbacks #36

Closed strohel closed 1 year ago

strohel commented 1 year ago

This is a form of alternative to #35 to resolve https://github.com/tonarino/acoustic_profiler/issues/19#issuecomment-1522348735

Note that this should resolve the specific problem, but we still may want to use fundsp (somehow) to synthetize and modify sound.

We still use rodio for audio file decoding and processing, but we drive the cpal audio callback directly (using code adapted from rodio itself).

That allows us to run custom code during the callback, which we use to offset samples tasked to play (giving all samples the same delay of one period, rather than variable delay based on how close next to the next callback they fire).

See example print of ns_since_last_callback when we play 1000 samples a second The period length is apparently ~42 ms. ``` ns_since_last_callback: 38695172. ns_since_last_callback: 39784768. ns_since_last_callback: 40887270. ns_since_last_callback: 41945052. ns_since_last_callback: 368139. ns_since_last_callback: 1477218. ns_since_last_callback: 2445557. ns_since_last_callback: 3573154. ns_since_last_callback: 4616437. ns_since_last_callback: 5675630. ns_since_last_callback: 6764239. ns_since_last_callback: 7835255. ns_since_last_callback: 8925809. ns_since_last_callback: 9995435. ns_since_last_callback: 11159180. ns_since_last_callback: 12234090. ns_since_last_callback: 13312871. ns_since_last_callback: 14392252. ns_since_last_callback: 15460542. ns_since_last_callback: 16545115. ns_since_last_callback: 17564547. ns_since_last_callback: 18582770. ns_since_last_callback: 19640031. ns_since_last_callback: 20683684. ns_since_last_callback: 21803771. ns_since_last_callback: 22879984. ns_since_last_callback: 23956644. ns_since_last_callback: 25022856. ns_since_last_callback: 26101435. ns_since_last_callback: 27179575. ns_since_last_callback: 28249203. ns_since_last_callback: 29342603. ns_since_last_callback: 30412447. ns_since_last_callback: 31495496. ns_since_last_callback: 32519447. ns_since_last_callback: 33580415. ns_since_last_callback: 34606142. ns_since_last_callback: 35697450. ns_since_last_callback: 36791844. ns_since_last_callback: 37869512. ns_since_last_callback: 38943775. ns_since_last_callback: 40022488. ns_since_last_callback: 41100993. ns_since_last_callback: 42180112. ns_since_last_callback: 481551. ns_since_last_callback: 1608677. ns_since_last_callback: 2667820. ns_since_last_callback: 3745600. ns_since_last_callback: 4785690. ```

With this I'm able to go from tick_probe 1 all the way to tick_probe 4000 (!) and still hear difference. [1]

[1] However, there seem to be inefficiencies somewhere that result in e.g. composer saying Received 860 events (3440 bytes) in last 1.00s. when we call tick_probe 1000. May be naive timing code in tick_probe itself (@PabloMansanet?).

PabloMansanet commented 1 year ago

[1] However, there seem to be inefficiencies somewhere that result in e.g. composer saying Received 860 events (3440 bytes) in last 1.00s. when we call tick_probe 1000. May be naive timing code in tick_probe itself (@PabloMansanet?).

I see that you guys pushed a change to try and fix this, did it work? :)

goodhoko commented 1 year ago

@PabloMansanet

I see that you guys pushed a change to try and fix this, did it work? :)

It did, now the test probe is almost perfectly accurate in maintaining the given frequency. .)

PabloMansanet commented 1 year ago

Awesome! I'll give this a more in-depth review after lunch then :)

strohel commented 1 year ago

@goodhoko addressed your comments in the last commit, please feel free to merge this while I'm babysitting.