Commit 6a8ff78b authored by David Reid's avatar David Reid

Add some infrastructure for loopback mode.

parent 3e825396
...@@ -1809,7 +1809,8 @@ typedef enum ...@@ -1809,7 +1809,8 @@ typedef enum
{ {
ma_device_type_playback = 1, ma_device_type_playback = 1,
ma_device_type_capture = 2, ma_device_type_capture = 2,
ma_device_type_duplex = ma_device_type_playback | ma_device_type_capture, ma_device_type_duplex = ma_device_type_playback | ma_device_type_capture, /* 3 */
ma_device_type_loopback = 4
} ma_device_type; } ma_device_type;
typedef enum typedef enum
...@@ -5798,6 +5799,10 @@ ma_result ma_device_init__null(ma_context* pContext, const ma_device_config* pCo ...@@ -5798,6 +5799,10 @@ ma_result ma_device_init__null(ma_context* pContext, const ma_device_config* pCo
ma_zero_object(&pDevice->null_device); ma_zero_object(&pDevice->null_device);
if (pConfig->deviceType == ma_device_type_loopback) {
return MA_DEVICE_TYPE_NOT_SUPPORTED;
}
bufferSizeInFrames = pConfig->bufferSizeInFrames; bufferSizeInFrames = pConfig->bufferSizeInFrames;
if (bufferSizeInFrames == 0) { if (bufferSizeInFrames == 0) {
bufferSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(pConfig->bufferSizeInMilliseconds, pConfig->sampleRate); bufferSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(pConfig->bufferSizeInMilliseconds, pConfig->sampleRate);
...@@ -9773,6 +9778,10 @@ ma_result ma_device_init__dsound(ma_context* pContext, const ma_device_config* p ...@@ -9773,6 +9778,10 @@ ma_result ma_device_init__dsound(ma_context* pContext, const ma_device_config* p
ma_assert(pDevice != NULL); ma_assert(pDevice != NULL);
ma_zero_object(&pDevice->dsound); ma_zero_object(&pDevice->dsound);
if (pConfig->deviceType == ma_device_type_loopback) {
return MA_DEVICE_TYPE_NOT_SUPPORTED;
}
bufferSizeInMilliseconds = pConfig->bufferSizeInMilliseconds; bufferSizeInMilliseconds = pConfig->bufferSizeInMilliseconds;
if (bufferSizeInMilliseconds == 0) { if (bufferSizeInMilliseconds == 0) {
bufferSizeInMilliseconds = ma_calculate_buffer_size_in_milliseconds_from_frames(pConfig->bufferSizeInFrames, pConfig->sampleRate); bufferSizeInMilliseconds = ma_calculate_buffer_size_in_milliseconds_from_frames(pConfig->bufferSizeInFrames, pConfig->sampleRate);
...@@ -11087,6 +11096,10 @@ ma_result ma_device_init__winmm(ma_context* pContext, const ma_device_config* pC ...@@ -11087,6 +11096,10 @@ ma_result ma_device_init__winmm(ma_context* pContext, const ma_device_config* pC
ma_assert(pDevice != NULL); ma_assert(pDevice != NULL);
ma_zero_object(&pDevice->winmm); ma_zero_object(&pDevice->winmm);
if (pConfig->deviceType == ma_device_type_loopback) {
return MA_DEVICE_TYPE_NOT_SUPPORTED;
}
/* No exlusive mode with WinMM. */ /* No exlusive mode with WinMM. */
if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pConfig->playback.shareMode == ma_share_mode_exclusive) || if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pConfig->playback.shareMode == ma_share_mode_exclusive) ||
((pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) && pConfig->capture.shareMode == ma_share_mode_exclusive)) { ((pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) && pConfig->capture.shareMode == ma_share_mode_exclusive)) {
...@@ -13278,6 +13291,10 @@ ma_result ma_device_init__alsa(ma_context* pContext, const ma_device_config* pCo ...@@ -13278,6 +13291,10 @@ ma_result ma_device_init__alsa(ma_context* pContext, const ma_device_config* pCo
ma_zero_object(&pDevice->alsa); ma_zero_object(&pDevice->alsa);
if (pConfig->deviceType == ma_device_type_loopback) {
return MA_DEVICE_TYPE_NOT_SUPPORTED;
}
if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) { if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {
ma_result result = ma_device_init_by_type__alsa(pContext, pConfig, ma_device_type_capture, pDevice); ma_result result = ma_device_init_by_type__alsa(pContext, pConfig, ma_device_type_capture, pDevice);
if (result != MA_SUCCESS) { if (result != MA_SUCCESS) {
...@@ -14964,6 +14981,10 @@ ma_result ma_device_init__pulse(ma_context* pContext, const ma_device_config* pC ...@@ -14964,6 +14981,10 @@ ma_result ma_device_init__pulse(ma_context* pContext, const ma_device_config* pC
ma_assert(pDevice != NULL); ma_assert(pDevice != NULL);
ma_zero_object(&pDevice->pulse); ma_zero_object(&pDevice->pulse);
if (pConfig->deviceType == ma_device_type_loopback) {
return MA_DEVICE_TYPE_NOT_SUPPORTED;
}
/* No exclusive mode with the PulseAudio backend. */ /* No exclusive mode with the PulseAudio backend. */
if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pConfig->playback.shareMode == ma_share_mode_exclusive) || if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pConfig->playback.shareMode == ma_share_mode_exclusive) ||
((pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) && pConfig->capture.shareMode == ma_share_mode_exclusive)) { ((pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) && pConfig->capture.shareMode == ma_share_mode_exclusive)) {
...@@ -16132,6 +16153,10 @@ ma_result ma_device_init__jack(ma_context* pContext, const ma_device_config* pCo ...@@ -16132,6 +16153,10 @@ ma_result ma_device_init__jack(ma_context* pContext, const ma_device_config* pCo
ma_assert(pConfig != NULL); ma_assert(pConfig != NULL);
ma_assert(pDevice != NULL); ma_assert(pDevice != NULL);
if (pConfig->deviceType == ma_device_type_loopback) {
return MA_DEVICE_TYPE_NOT_SUPPORTED;
}
/* Only supporting default devices with JACK. */ /* Only supporting default devices with JACK. */
if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pConfig->playback.pDeviceID != NULL && pConfig->playback.pDeviceID->jack != 0) || if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pConfig->playback.pDeviceID != NULL && pConfig->playback.pDeviceID->jack != 0) ||
((pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) && pConfig->capture.pDeviceID != NULL && pConfig->capture.pDeviceID->jack != 0)) { ((pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) && pConfig->capture.pDeviceID != NULL && pConfig->capture.pDeviceID->jack != 0)) {
...@@ -18684,6 +18709,10 @@ ma_result ma_device_init__coreaudio(ma_context* pContext, const ma_device_config ...@@ -18684,6 +18709,10 @@ ma_result ma_device_init__coreaudio(ma_context* pContext, const ma_device_config
ma_assert(pConfig != NULL); ma_assert(pConfig != NULL);
ma_assert(pDevice != NULL); ma_assert(pDevice != NULL);
if (pConfig->deviceType == ma_device_type_loopback) {
return MA_DEVICE_TYPE_NOT_SUPPORTED;
}
/* No exclusive mode with the Core Audio backend for now. */ /* No exclusive mode with the Core Audio backend for now. */
if (((pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) && pConfig->capture.shareMode == ma_share_mode_exclusive) || if (((pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) && pConfig->capture.shareMode == ma_share_mode_exclusive) ||
((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pConfig->playback.shareMode == ma_share_mode_exclusive)) { ((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pConfig->playback.shareMode == ma_share_mode_exclusive)) {
...@@ -19738,6 +19767,10 @@ ma_result ma_device_init__sndio(ma_context* pContext, const ma_device_config* pC ...@@ -19738,6 +19767,10 @@ ma_result ma_device_init__sndio(ma_context* pContext, const ma_device_config* pC
ma_zero_object(&pDevice->sndio); ma_zero_object(&pDevice->sndio);
if (pConfig->deviceType == ma_device_type_loopback) {
return MA_DEVICE_TYPE_NOT_SUPPORTED;
}
if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) { if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {
ma_result result = ma_device_init_handle__sndio(pContext, pConfig, ma_device_type_capture, pDevice); ma_result result = ma_device_init_handle__sndio(pContext, pConfig, ma_device_type_capture, pDevice);
if (result != MA_SUCCESS) { if (result != MA_SUCCESS) {
...@@ -20460,6 +20493,10 @@ ma_result ma_device_init__audio4(ma_context* pContext, const ma_device_config* p ...@@ -20460,6 +20493,10 @@ ma_result ma_device_init__audio4(ma_context* pContext, const ma_device_config* p
ma_assert(pDevice != NULL); ma_assert(pDevice != NULL);
ma_zero_object(&pDevice->audio4); ma_zero_object(&pDevice->audio4);
if (pConfig->deviceType == ma_device_type_loopback) {
return MA_DEVICE_TYPE_NOT_SUPPORTED;
}
pDevice->audio4.fdCapture = -1; pDevice->audio4.fdCapture = -1;
pDevice->audio4.fdPlayback = -1; pDevice->audio4.fdPlayback = -1;
...@@ -21040,6 +21077,10 @@ ma_result ma_device_init__oss(ma_context* pContext, const ma_device_config* pCon ...@@ -21040,6 +21077,10 @@ ma_result ma_device_init__oss(ma_context* pContext, const ma_device_config* pCon
ma_zero_object(&pDevice->oss); ma_zero_object(&pDevice->oss);
if (pConfig->deviceType == ma_device_type_loopback) {
return MA_DEVICE_TYPE_NOT_SUPPORTED;
}
if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) { if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {
ma_result result = ma_device_init_fd__oss(pContext, pConfig, ma_device_type_capture, pDevice); ma_result result = ma_device_init_fd__oss(pContext, pConfig, ma_device_type_capture, pDevice);
if (result != MA_SUCCESS) { if (result != MA_SUCCESS) {
...@@ -21523,6 +21564,10 @@ ma_result ma_device_init__aaudio(ma_context* pContext, const ma_device_config* p ...@@ -21523,6 +21564,10 @@ ma_result ma_device_init__aaudio(ma_context* pContext, const ma_device_config* p
ma_assert(pDevice != NULL); ma_assert(pDevice != NULL);
if (pConfig->deviceType == ma_device_type_loopback) {
return MA_DEVICE_TYPE_NOT_SUPPORTED;
}
/* No exclusive mode with AAudio. */ /* No exclusive mode with AAudio. */
if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pConfig->playback.shareMode == ma_share_mode_exclusive) || if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pConfig->playback.shareMode == ma_share_mode_exclusive) ||
((pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) && pConfig->capture.shareMode == ma_share_mode_exclusive)) { ((pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) && pConfig->capture.shareMode == ma_share_mode_exclusive)) {
...@@ -22382,6 +22427,10 @@ ma_result ma_device_init__opensl(ma_context* pContext, const ma_device_config* p ...@@ -22382,6 +22427,10 @@ ma_result ma_device_init__opensl(ma_context* pContext, const ma_device_config* p
return MA_INVALID_OPERATION; return MA_INVALID_OPERATION;
} }
if (pConfig->deviceType == ma_device_type_loopback) {
return MA_DEVICE_TYPE_NOT_SUPPORTED;
}
/* /*
For now, only supporting Android implementations of OpenSL|ES since that's the only one I've For now, only supporting Android implementations of OpenSL|ES since that's the only one I've
been able to test with and I currently depend on Android-specific extensions (simple buffer been able to test with and I currently depend on Android-specific extensions (simple buffer
...@@ -23144,6 +23193,10 @@ ma_result ma_device_init__webaudio(ma_context* pContext, const ma_device_config* ...@@ -23144,6 +23193,10 @@ ma_result ma_device_init__webaudio(ma_context* pContext, const ma_device_config*
{ {
ma_result result; ma_result result;
if (pConfig->deviceType == ma_device_type_loopback) {
return MA_DEVICE_TYPE_NOT_SUPPORTED;
}
/* No exclusive mode with Web Audio. */ /* No exclusive mode with Web Audio. */
if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pConfig->playback.shareMode == ma_share_mode_exclusive) || if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pConfig->playback.shareMode == ma_share_mode_exclusive) ||
((pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) && pConfig->capture.shareMode == ma_share_mode_exclusive)) { ((pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) && pConfig->capture.shareMode == ma_share_mode_exclusive)) {
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment