Add getDeviceHandle() to expose client-specific structs.#251
Open
radarsat1 wants to merge 1 commit intothestk:masterfrom
Open
Add getDeviceHandle() to expose client-specific structs.#251radarsat1 wants to merge 1 commit intothestk:masterfrom
radarsat1 wants to merge 1 commit intothestk:masterfrom
Conversation
In cases where the caller really needs access to the API-specific
handle (e.g. jack_client_t*), then it can be returned in a derived
struct.
Since this means that API headers must be included before RtAudio.h,
it is not enabled by default; the caller must include them him/herself
and define RTAUDIO_API_SPECIFIC, or RTAUDIO_API_SPECIFIC_JACK, etc.,
before including RtAudio.h. Then, getDeviceHandle() returns a pointer
that can be safely dynamic_cast<> so that if there is an API mismatch,
nullptr is returned.
This commit implements it for Jack and Pulse Audio only!
Example:
#include <jack/jack.h>
#define RTAUDIO_API_SPECIFIC_JACK
#include <RtAudio.h>
...
RtAudio audio(RtAudio::UNIX_JACK);
.. after openStream
RtAudioClientHandle *h = audio.getClientHandle();
RtAudioClientHandleJack *h_jack =
dynamic_cast<RtAudioClientHandleJack*>(h);
if (h_jack) {
.. my_function_needing_jack_client_t(h_jack.client);
}
Note that the above code will not crash if RtAudio::LINUX_PULSE was
selected, and only call Jack-specific functions if indeed Jack is the
current API.
3035f22 to
4f7a17a
Compare
|
This PR completely slipped under my radar! Anyway, the proposed solution looks good to me. Any plans to merge it? |
Contributor
|
This is more complicated than I would have preferred, especially with the preprocessor definition changes. I guess one issue is that the necessary pointers needed by the user to actually do something useful in a given API is API-specific (thus the need to create API-specific handle structures)? |
a460921 to
ef64aa5
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This is proposed as a (hopefully) less hacky alternative to #232.
After some thought I elected to add a function instead of adding it as a member to StreamOptions. This allows to return a pointer to where we already kept this info in the first place (the internal API-specfic "handle" structs.) And also I feel that StreamOptions is an "input" to openStream() and shouldn't contain "output values".
In cases where the caller really needs access to the API-specific
handle (e.g. jack_client_t*), then it can be returned in a derived
struct.
Since this means that API headers must be included before RtAudio.h,
it is not enabled by default; the caller must include them him/herself
and define RTAUDIO_API_SPECIFIC, or RTAUDIO_API_SPECIFIC_JACK, etc.,
before including RtAudio.h. Then, getDeviceHandle() returns a pointer
that can be safely dynamic_cast<> so that if there is an API mismatch,
nullptr is returned.
This commit implements it for Jack and Pulse Audio only!
Example:
Note that the above code will not crash if RtAudio::LINUX_PULSE was
selected, and only call Jack-specific functions if indeed Jack is the
current API.