RtAudio Update Tracker

Needed Updates & Possible New Features:

#DescriptionStatus
1Check implementation of various stream options (RTAUDIO_HOG_DEVICE, ...) to verify proper implementation.UC
2Do API-specific implementations of stream time where possible.UC
3Better support for multichannel (>2) audio devices in Windows DirectSound API.UC
4Mixer support to set the input volume, output volume, and select the input source (e.g., "Mic" vs "Line In") via following new methods:
  • double getStreamOutputVolume(): // returns value between 0.0 and 1.0
  • void setStreamOutputVolume( double volume ): // volume should be value between 0.0 and 1.0
  • double getStreamInputVolume(): // returns value between 0.0 and 1.0
  • void setStreamInputVolume( double volume ): // volume should be value between 0.0 and 1.0
  • void getStreamInputSources( std::vector<std::string>& sources ): // returns a vector of strings with source names
  • void setStreamInputSource( unsigned int index ): // source index is value between 0 and sources.size()-1, as determined from function above
UC4
5Robust support for full-duplex with different devices. Provide well-defined behavior if the devices get out of sync, with input taking precedence, so no incoming samples are lost (if possible).UC
6More sophisticated querying of device capabilities - for example, it'd be nice to figure out that a device supports either 4 channels of 16-bit or 2 channels of 24-bit audio.UC
7A faster device querying capability in DirectSound API - the current approach can take an extremely long time, especially for devices with many channels (like an RME Fireface 800).UC
8A way to specify a desired device name, instead of a device index, when opening a stream?UC

Status Codes:

UCUnder Consideration
API?Approved but need to determine API change

Recently Added Features:

#DescriptionSolutionVersion
1Stream time support - ability to query the stream and find out the exact time since the stream was started, according to that device's clock. For APIs where this is not supported, this is estimated based on a count of the bytes that have been sent and the known latency.1New getStreamTime() function (DM)4.0
2Ability to determine whether stream is currently running.New bool isStreamRunning() function (DM)4.0
3NetBSD support added to Linux OSS API.__NetBSD__ must be defined (Emmanuel Dreyfus)4.0
4Added function to return available compiled APIsNew getCompiledApi() function (GS)4.0
5Changed isDefault member of RtAudioDeviceInfo structure to isDefaultOutput and isDefaultInput to be able to distinguish between default input and output devices.Modified RtAudioDeviceInfo structure (GS)4.0
6Added function to return current API for RtAudio instanceNew getCurrentApi() function (GS)4.0
7Added function to return current stream device(s) indexNew getStreamDevice() function (GS)4.0
8Dummy version that compiles without API compiler flag but does nothingNew RtApiDummy class (GS)4.0
9Ability to query device latency.2New getStreamLatency() function (GS)4.0
10Choice of opening a device in exclusive or non-exclusive mode. If opening in non-exclusive mode, try to use the device as-is without changing its sample rate, etc - this is good when users want to use two audio devices at once.3New RtAudio::StreamOptions structure and parameters4.0
11Previous CoreAudio support included only a single stream with multiple channels or multiple one-channel streams.Added support for arbitrary stream channel configurations (GS)4.0.5
12Added function to return actual sample rate used by a stream because sometimes it varies slightly from the specified one.New getStreamSampleRate() function (Theo Veenker)4.0.5
13Added way to specify realtime scheduling for unices.New StreamOptions flag "RTAUDIO_SCHEDULE_REALTIME" and attribute "priority" to StreamOptions (Theo Veenker)4.0.5

Details:

1Currently implemented by incrementing a counter every time the tickStream() or callback function is called. If the gettimeofday() function is available (right now it is enabled for all Unix-like systems but not Windows), it also records the time of each tickStream() call. Then, when you call getStreamTime(), it adds the elapsed time since the last tickStream also. This makes the playback counter pretty smooth, but accurate. The intent is that now we could implement something more accurate on platforms that support it - but this is a reasonable baseline. One thing to watch out for: asking OSS for the stream time is problematic; on some devices the counter is only 16-bit and wraps around frequently, and on some devices it will sometimes return bogus values.

2This function could not be implemented for all APIs. If the function returns a value of zero, it should be assumed to be invalid.

3This implementation does not attempt to leave a device as-is. However, the flag RTAUDIO_HOG_DEVICE is provided to attempt to grab exclusive use of a device.

4I actually coded this up for OS-X Core Audio. However, I found it bloated the code and presented a number of interface problems that did more harm than good. Thus, it is currently not being considered further (GS).