proteaaudio icon indicating copy to clipboard operation
proteaaudio copied to clipboard

Get current position of audio engine

Open huantianad opened this issue 1 year ago • 4 comments

Hello, I'm looking to use this library for a simple terminal based rhythm game. Not looking for too much functionality, so this library seems great. However, one thing that would be very helpful is a way to query the current position of the audio engine as it plays a specific sound, potentially based off of the current number of samples played, something similar to Unity's AudioSettings.dspTime. This would allow the game to be synced to a more accurate audio position.

huantianad avatar Nov 12 '23 05:11 huantianad

Hi, Do you need to query the global mixer sample count/time or you also would like to get the sample count/time for each sound?

mixerTime :: IO Double
soundTime :: Sound -> IO Double

or the same with sample position:

mixerSamplePosition :: IO Int
soundSamplePosition :: Sound -> IO Int

IMO a more generic approach would be to add info query functions like:

mixerInfo :: IO MixerInfo
sampleInfo :: Sample -> IO SampleInfo
soundInfo :: Sound -> IO SoundInfo

and include the necessary data in these Info types, like: time, sample rate, volume, sample count, channel count, etc.

What do you think?

csabahruska avatar Nov 12 '23 17:11 csabahruska

I think the last option is probably the best and most flexible, would also help with #15 as well.

For my use case, I think the most useful stat is the current position of a specific Sound (which would be the currently playing music; the position would be used to sync to the music), but having the other info exposed is probably useful for others.

I don't need the raw sample count itself, but I mention it as it seems to be what other tools use to calculate audio position in seconds.

huantianad avatar Nov 12 '23 20:11 huantianad

Hey just wanted to ask how much work this would be for you and how long it would take. I would like to use a feature like this, but might work with a separate timer for now.

I know this project isn't your main priority or anything, so I don't want you to feel like I'm pressuring you or anything. Perhaps I could take a try at doing something myself, though I'm very unfamiliar with this library's internals haha

Thanks again for working on this great library!

huantianad avatar Dec 01 '23 00:12 huantianad

Hi, I'm quite busy at work currently. Probably I can work on this during the Christmas holidays. But IMO if you have some C experience then you could start developing this feature also. It's not that complicated and I can give support by answering your questions or giving feedback.

The proteaaudio and proteaaudio-sdl libraries share as much code as possible and the code structure is the following:

  • shared code between proteaaudio and proteaaudio-sdl:
    • minimp3.h, minimp3_ex.h - mp3 decoder
    • stb_vorbis.c - ogg vorbis decoder
    • proAudio.h, proAudio.cpp - wav reader, AudioSample class
    • chs/Binding.chs - Haskell API it is the only Haskell module in the source code it uses the cbits/proteaaudio_binding.h C API
    • cbits/proteaaudio_binding.cpp - C implementation for the Haskell API
  • proAudioRt.h, proAudioRt.cpp - proteaaudio backend which uses RtAudio.h and RtAudio.cpp
  • proAudioSdl.h, proAudioSdl.cpp - proteaaudio-sdl backend which uses the installed SDL library

IMO the files that needs to be changed are:

  • chs/Binding.chs
  • cbits/proteaaudio_binding.cpp
  • proAudioRt.cpp
  • proAudioSdl.cpp

csabahruska avatar Dec 01 '23 11:12 csabahruska