| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2017-09-01 21:07:55 +07:00
										 |  |  | /*  audio_driver_opensl.cpp                                              */ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*                       This file is part of:                           */ | 
					
						
							|  |  |  | /*                           GODOT ENGINE                                */ | 
					
						
							| 
									
										
										
										
											2017-08-27 14:16:55 +02:00
										 |  |  | /*                      https://godotengine.org                          */ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2022-01-03 21:27:34 +01:00
										 |  |  | /* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */ | 
					
						
							|  |  |  | /* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md).   */ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* Permission is hereby granted, free of charge, to any person obtaining */ | 
					
						
							|  |  |  | /* a copy of this software and associated documentation files (the       */ | 
					
						
							|  |  |  | /* "Software"), to deal in the Software without restriction, including   */ | 
					
						
							|  |  |  | /* without limitation the rights to use, copy, modify, merge, publish,   */ | 
					
						
							|  |  |  | /* distribute, sublicense, and/or sell copies of the Software, and to    */ | 
					
						
							|  |  |  | /* permit persons to whom the Software is furnished to do so, subject to */ | 
					
						
							|  |  |  | /* the following conditions:                                             */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* The above copyright notice and this permission notice shall be        */ | 
					
						
							|  |  |  | /* included in all copies or substantial portions of the Software.       */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */ | 
					
						
							|  |  |  | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */ | 
					
						
							|  |  |  | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ | 
					
						
							|  |  |  | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */ | 
					
						
							|  |  |  | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */ | 
					
						
							|  |  |  | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */ | 
					
						
							|  |  |  | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2018-01-05 00:50:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-13 22:57:24 -03:00
										 |  |  | #include "audio_driver_opensl.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-16 19:19:45 +01:00
										 |  |  | #include <string.h>
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define MAX_NUMBER_INTERFACES 3
 | 
					
						
							|  |  |  | #define MAX_NUMBER_OUTPUT_DEVICES 6
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Structure for passing information to callback function */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-13 22:57:24 -03:00
										 |  |  | void AudioDriverOpenSL::_buffer_callback( | 
					
						
							| 
									
										
										
										
											2018-10-03 15:14:54 +02:00
										 |  |  | 		SLAndroidSimpleBufferQueueItf queueItf) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	bool mix = true; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-13 22:57:24 -03:00
										 |  |  | 	if (pause) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		mix = false; | 
					
						
							| 
									
										
										
										
											2020-02-26 11:28:13 +01:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		mix = mutex.try_lock() == OK; | 
					
						
							| 
									
										
										
										
											2014-03-13 22:57:24 -03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-13 22:57:24 -03:00
										 |  |  | 	if (mix) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		audio_server_process(buffer_size, mixdown_buffer); | 
					
						
							| 
									
										
										
										
											2014-03-13 22:57:24 -03:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		int32_t *src_buff = mixdown_buffer; | 
					
						
							| 
									
										
										
										
											2019-02-27 10:07:30 +01:00
										 |  |  | 		for (unsigned int i = 0; i < buffer_size * 2; i++) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			src_buff[i] = 0; | 
					
						
							| 
									
										
										
										
											2014-03-13 22:57:24 -03:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-16 13:56:32 +01:00
										 |  |  | 	if (mix) { | 
					
						
							| 
									
										
										
										
											2020-02-26 11:28:13 +01:00
										 |  |  | 		mutex.unlock(); | 
					
						
							| 
									
										
										
										
											2022-02-16 13:56:32 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	const int32_t *src_buff = mixdown_buffer; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	int16_t *ptr = (int16_t *)buffers[last_free]; | 
					
						
							|  |  |  | 	last_free = (last_free + 1) % BUFFER_COUNT; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-27 10:07:30 +01:00
										 |  |  | 	for (unsigned int i = 0; i < buffer_size * 2; i++) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		ptr[i] = src_buff[i] >> 16; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	(*queueItf)->Enqueue(queueItf, ptr, 4 * buffer_size); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-13 22:57:24 -03:00
										 |  |  | void AudioDriverOpenSL::_buffer_callbacks( | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		SLAndroidSimpleBufferQueueItf queueItf, | 
					
						
							|  |  |  | 		void *pContext) { | 
					
						
							|  |  |  | 	AudioDriverOpenSL *ad = (AudioDriverOpenSL *)pContext; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	ad->_buffer_callback(queueItf); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-02 01:20:12 +02:00
										 |  |  | AudioDriverOpenSL *AudioDriverOpenSL::s_ad = nullptr; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | const char *AudioDriverOpenSL::get_name() const { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	return "Android"; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | Error AudioDriverOpenSL::init() { | 
					
						
							| 
									
										
										
										
											2018-10-03 15:14:54 +02:00
										 |  |  | 	SLresult res; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	SLEngineOption EngineOption[] = { | 
					
						
							| 
									
										
										
										
											2018-10-03 15:14:54 +02:00
										 |  |  | 		{ (SLuint32)SL_ENGINEOPTION_THREADSAFE, (SLuint32)SL_BOOLEAN_TRUE } | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2020-04-02 01:20:12 +02:00
										 |  |  | 	res = slCreateEngine(&sl, 1, EngineOption, 0, nullptr, nullptr); | 
					
						
							| 
									
										
										
										
											2019-08-09 06:49:33 +02:00
										 |  |  | 	ERR_FAIL_COND_V_MSG(res != SL_RESULT_SUCCESS, ERR_INVALID_PARAMETER, "Could not initialize OpenSL."); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	res = (*sl)->Realize(sl, SL_BOOLEAN_FALSE); | 
					
						
							| 
									
										
										
										
											2019-08-09 06:49:33 +02:00
										 |  |  | 	ERR_FAIL_COND_V_MSG(res != SL_RESULT_SUCCESS, ERR_INVALID_PARAMETER, "Could not realize OpenSL."); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return OK; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-07-21 12:07:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void AudioDriverOpenSL::start() { | 
					
						
							|  |  |  | 	active = false; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	SLresult res; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	buffer_size = 1024; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	for (int i = 0; i < BUFFER_COUNT; i++) { | 
					
						
							|  |  |  | 		buffers[i] = memnew_arr(int16_t, buffer_size * 2); | 
					
						
							|  |  |  | 		memset(buffers[i], 0, buffer_size * 4); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	mixdown_buffer = memnew_arr(int32_t, buffer_size * 2); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* Callback context for the buffer queue callback function */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Get the SL Engine Interface which is implicit */ | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	res = (*sl)->GetInterface(sl, SL_IID_ENGINE, (void *)&EngineItf); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ERR_FAIL_COND(res != SL_RESULT_SUCCESS); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		const SLInterfaceID ids[1] = { SL_IID_ENVIRONMENTALREVERB }; | 
					
						
							|  |  |  | 		const SLboolean req[1] = { SL_BOOLEAN_FALSE }; | 
					
						
							|  |  |  | 		res = (*EngineItf)->CreateOutputMix(EngineItf, &OutputMix, 0, ids, req); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ERR_FAIL_COND(res != SL_RESULT_SUCCESS); | 
					
						
							|  |  |  | 	// Realizing the Output Mix object in synchronous mode.
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	res = (*OutputMix)->Realize(OutputMix, SL_BOOLEAN_FALSE); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ERR_FAIL_COND(res != SL_RESULT_SUCCESS); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	SLDataLocator_AndroidSimpleBufferQueue loc_bufq = { SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, BUFFER_COUNT }; | 
					
						
							| 
									
										
										
										
											2017-01-14 12:26:56 +01:00
										 |  |  | 	//bufferQueue.locatorType = SL_DATALOCATOR_BUFFERQUEUE;
 | 
					
						
							|  |  |  | 	//bufferQueue.numBuffers = BUFFER_COUNT; /* Four buffers in our buffer queue */
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	/* Setup the format of the content in the buffer queue */ | 
					
						
							|  |  |  | 	pcm.formatType = SL_DATAFORMAT_PCM; | 
					
						
							|  |  |  | 	pcm.numChannels = 2; | 
					
						
							|  |  |  | 	pcm.samplesPerSec = SL_SAMPLINGRATE_44_1; | 
					
						
							|  |  |  | 	pcm.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16; | 
					
						
							|  |  |  | 	pcm.containerSize = SL_PCMSAMPLEFORMAT_FIXED_16; | 
					
						
							|  |  |  | 	pcm.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT; | 
					
						
							|  |  |  | #ifdef BIG_ENDIAN_ENABLED
 | 
					
						
							|  |  |  | 	pcm.endianness = SL_BYTEORDER_BIGENDIAN; | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | 	pcm.endianness = SL_BYTEORDER_LITTLEENDIAN; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 	audioSource.pFormat = (void *)&pcm; | 
					
						
							|  |  |  | 	audioSource.pLocator = (void *)&loc_bufq; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Setup the data sink structure */ | 
					
						
							|  |  |  | 	locator_outputmix.locatorType = SL_DATALOCATOR_OUTPUTMIX; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	locator_outputmix.outputMix = OutputMix; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	audioSink.pLocator = (void *)&locator_outputmix; | 
					
						
							| 
									
										
										
										
											2020-04-02 01:20:12 +02:00
										 |  |  | 	audioSink.pFormat = nullptr; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	/* Initialize the context for Buffer queue callbacks */ | 
					
						
							| 
									
										
										
										
											2017-01-14 12:26:56 +01:00
										 |  |  | 	//cntxt.pDataBase = (void*)&pcmData;
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	//cntxt.pData = cntxt.pDataBase;
 | 
					
						
							|  |  |  | 	//cntxt.size = sizeof(pcmData);
 | 
					
						
							| 
									
										
										
										
											2018-03-25 19:36:34 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	/* Create the music player */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		const SLInterfaceID ids[2] = { SL_IID_BUFFERQUEUE, SL_IID_EFFECTSEND }; | 
					
						
							|  |  |  | 		const SLboolean req[2] = { SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE }; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		res = (*EngineItf)->CreateAudioPlayer(EngineItf, &player, &audioSource, &audioSink, 1, ids, req); | 
					
						
							|  |  |  | 		ERR_FAIL_COND(res != SL_RESULT_SUCCESS); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	/* Realizing the player in synchronous mode. */ | 
					
						
							|  |  |  | 	res = (*player)->Realize(player, SL_BOOLEAN_FALSE); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ERR_FAIL_COND(res != SL_RESULT_SUCCESS); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	/* Get seek and play interfaces */ | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	res = (*player)->GetInterface(player, SL_IID_PLAY, (void *)&playItf); | 
					
						
							|  |  |  | 	ERR_FAIL_COND(res != SL_RESULT_SUCCESS); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	res = (*player)->GetInterface(player, SL_IID_BUFFERQUEUE, | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			(void *)&bufferQueueItf); | 
					
						
							|  |  |  | 	ERR_FAIL_COND(res != SL_RESULT_SUCCESS); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	/* Setup to receive buffer queue event callbacks */ | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	res = (*bufferQueueItf)->RegisterCallback(bufferQueueItf, _buffer_callbacks, this); | 
					
						
							|  |  |  | 	ERR_FAIL_COND(res != SL_RESULT_SUCCESS); | 
					
						
							| 
									
										
										
										
											2017-08-27 21:07:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	last_free = 0; | 
					
						
							| 
									
										
										
										
											2017-08-27 21:07:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	//fill up buffers
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	for (int i = 0; i < BUFFER_COUNT; i++) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		/* Enqueue a few buffers to get the ball rolling */ | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		res = (*bufferQueueItf)->Enqueue(bufferQueueItf, buffers[i], 4 * buffer_size); /* Size given in */ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	res = (*playItf)->SetPlayState(playItf, SL_PLAYSTATE_PLAYING); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ERR_FAIL_COND(res != SL_RESULT_SUCCESS); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	active = true; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-07-21 12:07:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-26 08:35:09 -03:00
										 |  |  | void AudioDriverOpenSL::_record_buffer_callback(SLAndroidSimpleBufferQueueItf queueItf) { | 
					
						
							|  |  |  | 	for (int i = 0; i < rec_buffer.size(); i++) { | 
					
						
							|  |  |  | 		int32_t sample = rec_buffer[i] << 16; | 
					
						
							| 
									
										
										
										
											2020-01-20 13:11:47 +01:00
										 |  |  | 		input_buffer_write(sample); | 
					
						
							|  |  |  | 		input_buffer_write(sample); // call twice to convert to Stereo
 | 
					
						
							| 
									
										
										
										
											2019-02-26 08:35:09 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	SLresult res = (*recordBufferQueueItf)->Enqueue(recordBufferQueueItf, rec_buffer.ptrw(), rec_buffer.size() * sizeof(int16_t)); | 
					
						
							|  |  |  | 	ERR_FAIL_COND(res != SL_RESULT_SUCCESS); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AudioDriverOpenSL::_record_buffer_callbacks(SLAndroidSimpleBufferQueueItf queueItf, void *pContext) { | 
					
						
							|  |  |  | 	AudioDriverOpenSL *ad = (AudioDriverOpenSL *)pContext; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ad->_record_buffer_callback(queueItf); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-04 23:06:37 -03:00
										 |  |  | Error AudioDriverOpenSL::capture_init_device() { | 
					
						
							| 
									
										
										
										
											2019-02-26 08:35:09 -03:00
										 |  |  | 	SLDataLocator_IODevice loc_dev = { | 
					
						
							|  |  |  | 		SL_DATALOCATOR_IODEVICE, | 
					
						
							|  |  |  | 		SL_IODEVICE_AUDIOINPUT, | 
					
						
							|  |  |  | 		SL_DEFAULTDEVICEID_AUDIOINPUT, | 
					
						
							| 
									
										
										
										
											2020-04-02 01:20:12 +02:00
										 |  |  | 		nullptr | 
					
						
							| 
									
										
										
										
											2019-02-26 08:35:09 -03:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2020-04-02 01:20:12 +02:00
										 |  |  | 	SLDataSource recSource = { &loc_dev, nullptr }; | 
					
						
							| 
									
										
										
										
											2019-02-26 08:35:09 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	SLDataLocator_AndroidSimpleBufferQueue loc_bq = { | 
					
						
							|  |  |  | 		SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, | 
					
						
							|  |  |  | 		2 | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 	SLDataFormat_PCM format_pcm = { | 
					
						
							|  |  |  | 		SL_DATAFORMAT_PCM, | 
					
						
							|  |  |  | 		1, | 
					
						
							|  |  |  | 		SL_SAMPLINGRATE_44_1, | 
					
						
							|  |  |  | 		SL_PCMSAMPLEFORMAT_FIXED_16, | 
					
						
							|  |  |  | 		SL_PCMSAMPLEFORMAT_FIXED_16, | 
					
						
							|  |  |  | 		SL_SPEAKER_FRONT_CENTER, | 
					
						
							|  |  |  | 		SL_BYTEORDER_LITTLEENDIAN | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 	SLDataSink recSnk = { &loc_bq, &format_pcm }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const SLInterfaceID ids[2] = { SL_IID_ANDROIDSIMPLEBUFFERQUEUE, SL_IID_ANDROIDCONFIGURATION }; | 
					
						
							|  |  |  | 	const SLboolean req[2] = { SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	SLresult res = (*EngineItf)->CreateAudioRecorder(EngineItf, &recorder, &recSource, &recSnk, 2, ids, req); | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(res != SL_RESULT_SUCCESS, ERR_CANT_OPEN); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	res = (*recorder)->Realize(recorder, SL_BOOLEAN_FALSE); | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(res != SL_RESULT_SUCCESS, ERR_CANT_OPEN); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	res = (*recorder)->GetInterface(recorder, SL_IID_RECORD, (void *)&recordItf); | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(res != SL_RESULT_SUCCESS, ERR_CANT_OPEN); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	res = (*recorder)->GetInterface(recorder, SL_IID_ANDROIDSIMPLEBUFFERQUEUE, (void *)&recordBufferQueueItf); | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(res != SL_RESULT_SUCCESS, ERR_CANT_OPEN); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	res = (*recordBufferQueueItf)->RegisterCallback(recordBufferQueueItf, _record_buffer_callbacks, this); | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(res != SL_RESULT_SUCCESS, ERR_CANT_OPEN); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	SLuint32 state; | 
					
						
							|  |  |  | 	res = (*recordItf)->GetRecordState(recordItf, &state); | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(res != SL_RESULT_SUCCESS, ERR_CANT_OPEN); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (state != SL_RECORDSTATE_STOPPED) { | 
					
						
							|  |  |  | 		res = (*recordItf)->SetRecordState(recordItf, SL_RECORDSTATE_STOPPED); | 
					
						
							|  |  |  | 		ERR_FAIL_COND_V(res != SL_RESULT_SUCCESS, ERR_CANT_OPEN); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		res = (*recordBufferQueueItf)->Clear(recordBufferQueueItf); | 
					
						
							|  |  |  | 		ERR_FAIL_COND_V(res != SL_RESULT_SUCCESS, ERR_CANT_OPEN); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const int rec_buffer_frames = 2048; | 
					
						
							|  |  |  | 	rec_buffer.resize(rec_buffer_frames); | 
					
						
							| 
									
										
										
										
											2020-01-20 13:11:47 +01:00
										 |  |  | 	input_buffer_init(rec_buffer_frames); | 
					
						
							| 
									
										
										
										
											2019-02-26 08:35:09 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	res = (*recordBufferQueueItf)->Enqueue(recordBufferQueueItf, rec_buffer.ptrw(), rec_buffer.size() * sizeof(int16_t)); | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(res != SL_RESULT_SUCCESS, ERR_CANT_OPEN); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	res = (*recordItf)->SetRecordState(recordItf, SL_RECORDSTATE_RECORDING); | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(res != SL_RESULT_SUCCESS, ERR_CANT_OPEN); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return OK; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-04 23:06:37 -03:00
										 |  |  | Error AudioDriverOpenSL::capture_start() { | 
					
						
							|  |  |  | 	if (OS::get_singleton()->request_permission("RECORD_AUDIO")) { | 
					
						
							|  |  |  | 		return capture_init_device(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return OK; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-26 08:35:09 -03:00
										 |  |  | Error AudioDriverOpenSL::capture_stop() { | 
					
						
							|  |  |  | 	SLuint32 state; | 
					
						
							|  |  |  | 	SLresult res = (*recordItf)->GetRecordState(recordItf, &state); | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(res != SL_RESULT_SUCCESS, ERR_CANT_OPEN); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (state != SL_RECORDSTATE_STOPPED) { | 
					
						
							|  |  |  | 		res = (*recordItf)->SetRecordState(recordItf, SL_RECORDSTATE_STOPPED); | 
					
						
							|  |  |  | 		ERR_FAIL_COND_V(res != SL_RESULT_SUCCESS, ERR_CANT_OPEN); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		res = (*recordBufferQueueItf)->Clear(recordBufferQueueItf); | 
					
						
							|  |  |  | 		ERR_FAIL_COND_V(res != SL_RESULT_SUCCESS, ERR_CANT_OPEN); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return OK; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-13 22:57:24 -03:00
										 |  |  | int AudioDriverOpenSL::get_mix_rate() const { | 
					
						
							| 
									
										
										
										
											2019-03-07 10:29:37 +01:00
										 |  |  | 	return 44100; // hardcoded for Android, as selected by SL_SAMPLINGRATE_44_1
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-07-21 12:07:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | AudioDriver::SpeakerMode AudioDriverOpenSL::get_speaker_mode() const { | 
					
						
							| 
									
										
										
										
											2017-01-16 19:19:45 +01:00
										 |  |  | 	return SPEAKER_MODE_STEREO; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-07-21 12:07:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void AudioDriverOpenSL::lock() { | 
					
						
							| 
									
										
										
										
											2022-02-16 13:56:32 +01:00
										 |  |  | 	if (active) { | 
					
						
							| 
									
										
										
										
											2020-02-26 11:28:13 +01:00
										 |  |  | 		mutex.lock(); | 
					
						
							| 
									
										
										
										
											2022-02-16 13:56:32 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-07-21 12:07:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-13 22:57:24 -03:00
										 |  |  | void AudioDriverOpenSL::unlock() { | 
					
						
							| 
									
										
										
										
											2022-02-16 13:56:32 +01:00
										 |  |  | 	if (active) { | 
					
						
							| 
									
										
										
										
											2020-02-26 11:28:13 +01:00
										 |  |  | 		mutex.unlock(); | 
					
						
							| 
									
										
										
										
											2022-02-16 13:56:32 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-07-21 12:07:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void AudioDriverOpenSL::finish() { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	(*sl)->Destroy(sl); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-13 22:57:24 -03:00
										 |  |  | void AudioDriverOpenSL::set_pause(bool p_pause) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	pause = p_pause; | 
					
						
							| 
									
										
										
										
											2015-03-02 00:54:10 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (active) { | 
					
						
							|  |  |  | 		if (pause) { | 
					
						
							|  |  |  | 			(*playItf)->SetPlayState(playItf, SL_PLAYSTATE_PAUSED); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			(*playItf)->SetPlayState(playItf, SL_PLAYSTATE_PLAYING); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-03-13 22:57:24 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | AudioDriverOpenSL::AudioDriverOpenSL() { | 
					
						
							|  |  |  | 	s_ad = this; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } |