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

Add some infrastructure for loopback mode.

parent 3e825396
......@@ -1809,7 +1809,8 @@ typedef enum
{
ma_device_type_playback = 1,
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;
typedef enum
......@@ -5798,6 +5799,10 @@ ma_result ma_device_init__null(ma_context* pContext, const ma_device_config* pCo
ma_zero_object(&pDevice->null_device);
if (pConfig->deviceType == ma_device_type_loopback) {
return MA_DEVICE_TYPE_NOT_SUPPORTED;
}
bufferSizeInFrames = pConfig->bufferSizeInFrames;
if (bufferSizeInFrames == 0) {
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
ma_assert(pDevice != NULL);
ma_zero_object(&pDevice->dsound);
if (pConfig->deviceType == ma_device_type_loopback) {
return MA_DEVICE_TYPE_NOT_SUPPORTED;
}
bufferSizeInMilliseconds = pConfig->bufferSizeInMilliseconds;
if (bufferSizeInMilliseconds == 0) {
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
ma_assert(pDevice != NULL);
ma_zero_object(&pDevice->winmm);
if (pConfig->deviceType == ma_device_type_loopback) {
return MA_DEVICE_TYPE_NOT_SUPPORTED;
}
/* 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) ||
((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
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) {
ma_result result = ma_device_init_by_type__alsa(pContext, pConfig, ma_device_type_capture, pDevice);
if (result != MA_SUCCESS) {
......@@ -14964,6 +14981,10 @@ ma_result ma_device_init__pulse(ma_context* pContext, const ma_device_config* pC
ma_assert(pDevice != NULL);
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. */
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)) {
......@@ -16132,6 +16153,10 @@ ma_result ma_device_init__jack(ma_context* pContext, const ma_device_config* pCo
ma_assert(pConfig != NULL);
ma_assert(pDevice != NULL);
if (pConfig->deviceType == ma_device_type_loopback) {
return MA_DEVICE_TYPE_NOT_SUPPORTED;
}
/* 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) ||
((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
ma_assert(pConfig != 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. */
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)) {
......@@ -19738,6 +19767,10 @@ ma_result ma_device_init__sndio(ma_context* pContext, const ma_device_config* pC
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) {
ma_result result = ma_device_init_handle__sndio(pContext, pConfig, ma_device_type_capture, pDevice);
if (result != MA_SUCCESS) {
......@@ -20460,6 +20493,10 @@ ma_result ma_device_init__audio4(ma_context* pContext, const ma_device_config* p
ma_assert(pDevice != NULL);
ma_zero_object(&pDevice->audio4);
if (pConfig->deviceType == ma_device_type_loopback) {
return MA_DEVICE_TYPE_NOT_SUPPORTED;
}
pDevice->audio4.fdCapture = -1;
pDevice->audio4.fdPlayback = -1;
......@@ -21040,6 +21077,10 @@ ma_result ma_device_init__oss(ma_context* pContext, const ma_device_config* pCon
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) {
ma_result result = ma_device_init_fd__oss(pContext, pConfig, ma_device_type_capture, pDevice);
if (result != MA_SUCCESS) {
......@@ -21523,6 +21564,10 @@ ma_result ma_device_init__aaudio(ma_context* pContext, const ma_device_config* p
ma_assert(pDevice != NULL);
if (pConfig->deviceType == ma_device_type_loopback) {
return MA_DEVICE_TYPE_NOT_SUPPORTED;
}
/* 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) ||
((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
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
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*
{
ma_result result;
if (pConfig->deviceType == ma_device_type_loopback) {
return MA_DEVICE_TYPE_NOT_SUPPORTED;
}
/* 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) ||
((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