Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Merged
merged 4 commits into from
Apr 28, 2023

Commits on Apr 27, 2023

  1. Drive audio directly using cpal, position sounds precisely within cal…

    …lbacks
    
    This is a form of alternative to #35 to resolve #19 (comment)
    
    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).
    
    <details><summary>See example print of ns_since_last_callback when we play 1000 samples a second</summary>
    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.
    ```
    
    </details>
    
    With this I'm able to got 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?).
    strohel committed Apr 27, 2023
    Configuration menu
    Copy the full SHA
    df9ea5b View commit details
    Browse the repository at this point in the history
  2. Refactor AudioOutput for race-free sound time-positioning

    This way is slightly more elaborate, but should be as precise as it gets - it uses playback timestamp from the audio system itself.
    strohel committed Apr 27, 2023
    Configuration menu
    Copy the full SHA
    807b896 View commit details
    Browse the repository at this point in the history

Commits on Apr 28, 2023

  1. Simplify timestamp logic

    Instead of caching the stream_start compute the offset for every
    callback invocation.
    goodhoko authored and strohel committed Apr 28, 2023
    Configuration menu
    Copy the full SHA
    396c117 View commit details
    Browse the repository at this point in the history
  2. Address Jen review comments

    strohel committed Apr 28, 2023
    Configuration menu
    Copy the full SHA
    cd65422 View commit details
    Browse the repository at this point in the history