same fix for android: when there are 0 in/out audio channels, use ma anyways with a fake output channel

This commit is contained in:
Paolo Marrone 2024-02-02 17:47:50 +01:00
parent 16ed63107f
commit 2d3f850ca0

View File

@ -16,23 +16,21 @@
#if PARAMETERS_N > 0 #if PARAMETERS_N > 0
# include <algorithm> # include <algorithm>
#endif #endif
#if NUM_CHANNELS_IN + NUM_CHANNELS_OUT > 0
# define MINIAUDIO_IMPLEMENTATION # define MINIAUDIO_IMPLEMENTATION
# define MA_ENABLE_ONLY_SPECIFIC_BACKENDS # define MA_ENABLE_ONLY_SPECIFIC_BACKENDS
# define MA_ENABLE_AAUDIO # define MA_ENABLE_AAUDIO
# include <miniaudio.h> # include <miniaudio.h>
# define BLOCK_SIZE 32 # define BLOCK_SIZE 32
#endif
#if NUM_MIDI_INPUTS > 0 #if NUM_MIDI_INPUTS > 0
# include <vector> # include <vector>
# include <amidi/AMidi.h> # include <amidi/AMidi.h>
#endif #endif
#if NUM_CHANNELS_IN + NUM_CHANNELS_OUT > 0
static ma_device device; static ma_device device;
#endif
static plugin instance; static plugin instance;
static void * mem; static void * mem;
#if (NUM_NON_OPT_CHANNELS_IN > NUM_CHANNELS_IN) || (NUM_NON_OPT_CHANNELS_OUT > NUM_CHANNELS_OUT) #if (NUM_NON_OPT_CHANNELS_IN > NUM_CHANNELS_IN) || (NUM_NON_OPT_CHANNELS_OUT > NUM_CHANNELS_OUT)
@ -103,6 +101,7 @@ static void data_callback(ma_device* pDevice, void* pOutput, const void* pInput,
const float * in_buf = reinterpret_cast<const float *>(pInput); const float * in_buf = reinterpret_cast<const float *>(pInput);
float * out_buf = reinterpret_cast<float *>(pOutput); float * out_buf = reinterpret_cast<float *>(pOutput);
#if NUM_CHANNELS_IN + NUM_CHANNELS_OUT > 0
ma_uint32 i = 0; ma_uint32 i = 0;
#if NUM_CHANNELS_IN > 0 #if NUM_CHANNELS_IN > 0
size_t ix = 0; size_t ix = 0;
@ -133,6 +132,10 @@ static void data_callback(ma_device* pDevice, void* pOutput, const void* pInput,
i += n; i += n;
} }
#else
for (ma_uint32 i = 0; i < frameCount; i++)
out_buf[i] = 0.f; // Unique fake channel
#endif
} }
extern "C" extern "C"
@ -149,6 +152,10 @@ JNI_FUNC(nativeAudioStart)(JNIEnv* env, jobject thiz) {
# else # else
ma_device_config deviceConfig = ma_device_config_init(ma_device_type_duplex); ma_device_config deviceConfig = ma_device_config_init(ma_device_type_duplex);
# endif # endif
#else
ma_device_config deviceConfig = ma_device_config_init(ma_device_type_playback);
#endif
deviceConfig.periodSizeInFrames = BLOCK_SIZE; deviceConfig.periodSizeInFrames = BLOCK_SIZE;
deviceConfig.periods = 1; deviceConfig.periods = 1;
deviceConfig.performanceProfile = ma_performance_profile_low_latency; deviceConfig.performanceProfile = ma_performance_profile_low_latency;
@ -163,12 +170,15 @@ JNI_FUNC(nativeAudioStart)(JNIEnv* env, jobject thiz) {
deviceConfig.capture.shareMode = ma_share_mode_shared; deviceConfig.capture.shareMode = ma_share_mode_shared;
deviceConfig.playback.pDeviceID = NULL; deviceConfig.playback.pDeviceID = NULL;
deviceConfig.playback.format = ma_format_f32; deviceConfig.playback.format = ma_format_f32;
#if NUM_CHANNELS_IN + NUM_CHANNELS_OUT > 0
deviceConfig.playback.channels = NUM_CHANNELS_OUT; deviceConfig.playback.channels = NUM_CHANNELS_OUT;
#else
deviceConfig.playback.channels = 1; // Fake & muted
#endif
deviceConfig.playback.shareMode = ma_share_mode_shared; deviceConfig.playback.shareMode = ma_share_mode_shared;
if (ma_device_init(NULL, &deviceConfig, &device) != MA_SUCCESS) if (ma_device_init(NULL, &deviceConfig, &device) != MA_SUCCESS)
return false; return false;
#endif
plugin_init(&instance); plugin_init(&instance);
@ -186,9 +196,7 @@ JNI_FUNC(nativeAudioStart)(JNIEnv* env, jobject thiz) {
mem = malloc(req); mem = malloc(req);
if (mem == NULL) { if (mem == NULL) {
plugin_fini(&instance); plugin_fini(&instance);
#if NUM_CHANNELS_IN + NUM_CHANNELS_OUT > 0
ma_device_uninit(&device); ma_device_uninit(&device);
#endif
return false; return false;
} }
plugin_mem_set(&instance, mem); plugin_mem_set(&instance, mem);
@ -250,14 +258,12 @@ JNI_FUNC(nativeAudioStart)(JNIEnv* env, jobject thiz) {
y = NULL; y = NULL;
#endif #endif
#if NUM_CHANNELS_IN + NUM_CHANNELS_OUT > 0
if (ma_device_start(&device) != MA_SUCCESS) { if (ma_device_start(&device) != MA_SUCCESS) {
if (mem != NULL) if (mem != NULL)
free(mem); free(mem);
ma_device_uninit(&device); ma_device_uninit(&device);
return false; return false;
} }
#endif
return true; return true;
} }
@ -267,10 +273,8 @@ JNIEXPORT void JNICALL
JNI_FUNC(nativeAudioStop)(JNIEnv* env, jobject thiz) { JNI_FUNC(nativeAudioStop)(JNIEnv* env, jobject thiz) {
(void)env; (void)env;
(void)thiz; (void)thiz;
#if NUM_CHANNELS_IN + NUM_CHANNELS_OUT > 0
ma_device_stop(&device); ma_device_stop(&device);
ma_device_uninit(&device); ma_device_uninit(&device);
#endif
if (mem != NULL) if (mem != NULL)
free(mem); free(mem);
plugin_fini(&instance); plugin_fini(&instance);