opensles.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800
  1. /*
  2. * Copyright (C) 2011 The Android Open Source Project
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. /* This is an OpenAL backend for Android using the native audio APIs based on OpenSL ES 1.0.1.
  17. * It is based on source code for the native-audio sample app bundled with NDK.
  18. */
  19. #include <stdlib.h>
  20. #include <time.h>
  21. #include <sys/types.h>
  22. #include <sys/stat.h>
  23. #include <unistd.h>
  24. #include <dlfcn.h>
  25. #include "alMain.h"
  26. #include "AL/al.h"
  27. #include "AL/alc.h"
  28. #include <pthread.h>
  29. #include <sched.h>
  30. #include <sys/prctl.h>
  31. #include <jni.h>
  32. #define LOG_NDEBUG 0
  33. #define LOG_TAG "OpenAL_SLES"
  34. #if 1
  35. #define LOGV(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
  36. #else
  37. #define LOGV(...)
  38. #endif
  39. // for native audio
  40. #include <SLES/OpenSLES.h>
  41. #include <SLES/OpenSLES_Android.h>
  42. #include "apportable_openal_funcs.h"
  43. #define MAKE_SYM_POINTER(sym) static typeof(sym) * p##sym = NULL
  44. MAKE_SYM_POINTER(SL_IID_ENGINE);
  45. MAKE_SYM_POINTER(SL_IID_ANDROIDSIMPLEBUFFERQUEUE);
  46. MAKE_SYM_POINTER(SL_IID_PLAY);
  47. MAKE_SYM_POINTER(SL_IID_BUFFERQUEUE);
  48. MAKE_SYM_POINTER(slCreateEngine);
  49. // engine interfaces
  50. static SLObjectItf engineObject = NULL;
  51. static SLEngineItf engineEngine;
  52. // output mix interfaces
  53. static SLObjectItf outputMixObject = NULL;
  54. // JNI stuff so we can get the runtime OS version number
  55. static JavaVM* javaVM = NULL;
  56. static int alc_opensles_get_android_api()
  57. {
  58. jclass androidVersionClass = NULL;
  59. jfieldID androidSdkIntField = NULL;
  60. int androidApiLevel = 0;
  61. JNIEnv* env = NULL;
  62. (*javaVM)->GetEnv(javaVM, (void**)&env, JNI_VERSION_1_4);
  63. androidVersionClass = (*env)->FindClass(env, "android/os/Build$VERSION");
  64. if (androidVersionClass)
  65. {
  66. androidSdkIntField = (*env)->GetStaticFieldID(env, androidVersionClass, "SDK_INT", "I");
  67. if (androidSdkIntField != NULL)
  68. {
  69. androidApiLevel = (int)((*env)->GetStaticIntField(env, androidVersionClass, androidSdkIntField));
  70. }
  71. (*env)->DeleteLocalRef(env, androidVersionClass);
  72. }
  73. LOGV("API:%d", androidApiLevel);
  74. return androidApiLevel;
  75. }
  76. static char *androidModel = NULL;
  77. static char *alc_opensles_get_android_model()
  78. {
  79. if (!androidModel) {
  80. jclass androidBuildClass = NULL;
  81. jfieldID androidModelField = NULL;
  82. jstring androidModelString = NULL;
  83. int androidApiLevel = 0;
  84. JNIEnv* env = NULL;
  85. (*javaVM)->GetEnv(javaVM, (void**)&env, JNI_VERSION_1_4);
  86. (*env)->PushLocalFrame(env, 5);
  87. androidBuildClass = (*env)->FindClass(env, "android/os/Build");
  88. if (androidBuildClass)
  89. {
  90. androidModelField = (*env)->GetStaticFieldID(env, androidBuildClass, "MODEL", "Ljava/lang/String;");
  91. androidModelString = (*env)->GetStaticObjectField(env, androidBuildClass, androidModelField);
  92. const char *unichars = (*env)->GetStringUTFChars(env, androidModelString, NULL);
  93. if (!(*env)->ExceptionOccurred(env))
  94. {
  95. jsize sz = (*env)->GetStringLength(env, androidModelString);
  96. androidModel = malloc(sz+1);
  97. if (androidModel) {
  98. strncpy(androidModel, unichars, sz);
  99. androidModel[sz] = '\0';
  100. }
  101. }
  102. (*env)->ReleaseStringUTFChars(env, androidModelString, unichars);
  103. }
  104. (*env)->PopLocalFrame(env, NULL);
  105. }
  106. LOGV("Model:%s", androidModel);
  107. return androidModel;
  108. }
  109. static long timespecdiff(struct timespec *starttime, struct timespec *finishtime)
  110. {
  111. long msec;
  112. msec=(finishtime->tv_sec-starttime->tv_sec)*1000;
  113. msec+=(finishtime->tv_nsec-starttime->tv_nsec)/1000000;
  114. return msec;
  115. }
  116. // Cannot be a constant because we need to tweak differently depending on OS version.
  117. static size_t bufferCount = 8;
  118. static size_t bufferSize = (1024*4);
  119. static size_t defaultBufferSize = (1024*4);
  120. static size_t premixCount = 3;
  121. #define bufferSizeMax (1024*4)
  122. typedef enum {
  123. OUTPUT_BUFFER_STATE_UNKNOWN,
  124. OUTPUT_BUFFER_STATE_FREE,
  125. OUTPUT_BUFFER_STATE_MIXED,
  126. OUTPUT_BUFFER_STATE_ENQUEUED,
  127. } outputBuffer_state_t;
  128. typedef struct outputBuffer_s {
  129. pthread_mutex_t mutex;
  130. pthread_cond_t cond;
  131. outputBuffer_state_t state;
  132. char buffer[bufferSizeMax];
  133. } outputBuffer_t;
  134. // Will dynamically create the number of buffers (array elements) based on OS version.
  135. typedef struct {
  136. pthread_t playbackThread;
  137. char threadShouldRun;
  138. char threadIsReady;
  139. char lastBufferEnqueued;
  140. char lastBufferMixed;
  141. outputBuffer_t *outputBuffers;
  142. // buffer queue player interfaces
  143. SLObjectItf bqPlayerObject;
  144. SLPlayItf bqPlayerPlay;
  145. SLAndroidSimpleBufferQueueItf bqPlayerBufferQueue;
  146. } opesles_data_t;
  147. #define MAX_DEVICES 3
  148. static ALCdevice *deviceList[MAX_DEVICES] = {NULL};
  149. static pthread_mutex_t deviceListMutex = PTHREAD_MUTEX_INITIALIZER;
  150. typedef void (*deviceListFn)(ALCdevice *);
  151. static void devlist_add(ALCdevice *pDevice) {
  152. int i;
  153. pthread_mutex_lock(&(deviceListMutex));
  154. for (i = 0; i < MAX_DEVICES; i++) {
  155. if (deviceList[i] == pDevice) {
  156. break;
  157. } else if (deviceList[i] == NULL) {
  158. deviceList[i] = pDevice;
  159. break;
  160. }
  161. }
  162. pthread_mutex_unlock(&(deviceListMutex));
  163. }
  164. static void devlist_remove(ALCdevice *pDevice) {
  165. int i;
  166. pthread_mutex_lock(&(deviceListMutex));
  167. for (i = 0; i < MAX_DEVICES; i++) {
  168. if (deviceList[i] == pDevice) {
  169. deviceList[i] = NULL;
  170. }
  171. }
  172. pthread_mutex_unlock(&(deviceListMutex));
  173. }
  174. static void devlist_process(deviceListFn mapFunction) {
  175. int i;
  176. pthread_mutex_lock(&(deviceListMutex));
  177. for (i = 0; i < MAX_DEVICES; i++) {
  178. if (deviceList[i]) {
  179. pthread_mutex_unlock(&(deviceListMutex));
  180. mapFunction(deviceList[i]);
  181. pthread_mutex_lock(&(deviceListMutex));
  182. }
  183. }
  184. pthread_mutex_unlock(&(deviceListMutex));
  185. }
  186. static void *playback_function(void * context) {
  187. LOGV("playback_function started");
  188. outputBuffer_t *buffer = NULL;
  189. SLresult result;
  190. struct timespec ts;
  191. assert(NULL != context);
  192. ALCdevice *pDevice = (ALCdevice *) context;
  193. opesles_data_t *devState = (opesles_data_t *) pDevice->ExtraData;
  194. unsigned int bufferIndex = devState->lastBufferMixed;
  195. ALint frameSize = FrameSizeFromDevFmt(pDevice->FmtChans, pDevice->FmtType);
  196. // Show a sensible name for the thread in debug tools
  197. prctl(PR_SET_NAME, (unsigned long)"OpenAL/sl/m", 0, 0, 0);
  198. while (1) {
  199. if (devState->threadShouldRun == 0) {
  200. return NULL;
  201. }
  202. bufferIndex = (++bufferIndex) % bufferCount;
  203. buffer = &(devState->outputBuffers[bufferIndex]);
  204. pthread_mutex_lock(&(buffer->mutex));
  205. while (1) {
  206. if (devState->threadShouldRun == 0) {
  207. pthread_mutex_unlock(&(buffer->mutex));
  208. return NULL;
  209. }
  210. // This is a little hacky, but here we avoid mixing too much data
  211. if (buffer->state == OUTPUT_BUFFER_STATE_FREE) {
  212. int i = (bufferIndex - premixCount) % bufferCount;
  213. outputBuffer_t *buffer1 = &(devState->outputBuffers[i]);
  214. if (buffer1->state == OUTPUT_BUFFER_STATE_ENQUEUED ||
  215. buffer1->state == OUTPUT_BUFFER_STATE_FREE) {
  216. break;
  217. }
  218. }
  219. // No buffer available, wait for a buffer to become available
  220. // or until playback is stopped/suspended
  221. clock_gettime(CLOCK_REALTIME, &ts);
  222. ts.tv_nsec += 5000000;
  223. pthread_cond_timedwait(&(buffer->cond), &(buffer->mutex), &ts);
  224. }
  225. devState->threadIsReady = 1;
  226. aluMixData(pDevice, buffer->buffer, bufferSize/frameSize);
  227. buffer->state = OUTPUT_BUFFER_STATE_MIXED;
  228. pthread_cond_signal(&(buffer->cond));
  229. pthread_mutex_unlock(&(buffer->mutex));
  230. devState->lastBufferMixed = bufferIndex;
  231. }
  232. }
  233. SLresult alc_opensles_init_extradata(ALCdevice *pDevice)
  234. {
  235. opesles_data_t *devState = NULL;
  236. int i;
  237. devState = malloc(sizeof(opesles_data_t));
  238. if (!devState) {
  239. return SL_RESULT_MEMORY_FAILURE;
  240. }
  241. bzero(devState, sizeof(opesles_data_t));
  242. devState->outputBuffers = (outputBuffer_t*) malloc(sizeof(outputBuffer_t)*bufferCount);
  243. if (!devState->outputBuffers) {
  244. free(devState);
  245. return SL_RESULT_MEMORY_FAILURE;
  246. }
  247. pDevice->ExtraData = devState;
  248. bzero(devState->outputBuffers, sizeof(outputBuffer_t)*bufferCount);
  249. devState->lastBufferEnqueued = -1;
  250. devState->lastBufferMixed = -1;
  251. for (i = 0; i < bufferCount; i++) {
  252. if (pthread_mutex_init(&(devState->outputBuffers[i].mutex), (pthread_mutexattr_t*) NULL) != 0) {
  253. LOGV("Error on init of mutex");
  254. free(devState->outputBuffers);
  255. free(devState);
  256. return SL_RESULT_UNKNOWN_ERROR;
  257. }
  258. if (pthread_cond_init(&(devState->outputBuffers[i].cond), (pthread_condattr_t*) NULL) != 0) {
  259. LOGV("Error on init of cond");
  260. free(devState->outputBuffers);
  261. free(devState);
  262. return SL_RESULT_UNKNOWN_ERROR;
  263. }
  264. devState->outputBuffers[i].state = OUTPUT_BUFFER_STATE_FREE;
  265. }
  266. // For the Android suspend/resume functionaly, keep track of all device contexts
  267. devlist_add(pDevice);
  268. return SL_RESULT_SUCCESS;
  269. }
  270. static void start_playback(ALCdevice *pDevice) {
  271. opesles_data_t *devState = NULL;
  272. int i;
  273. if (pDevice->ExtraData == NULL) {
  274. alc_opensles_init_extradata(pDevice);
  275. devState = pDevice->ExtraData;
  276. assert(devState != NULL);
  277. } else {
  278. devState = (opesles_data_t *) pDevice->ExtraData;
  279. }
  280. if (devState->threadShouldRun == 1) {
  281. // Gratuitous resume
  282. return;
  283. }
  284. // start/restart playback thread
  285. devState->threadShouldRun = 1;
  286. pthread_attr_t playbackThreadAttr;
  287. pthread_attr_init(&playbackThreadAttr);
  288. struct sched_param playbackThreadParam;
  289. playbackThreadParam.sched_priority = sched_get_priority_max(SCHED_RR);
  290. pthread_attr_setschedpolicy(&playbackThreadAttr, SCHED_RR);
  291. pthread_attr_setschedparam(&playbackThreadAttr, &playbackThreadParam);
  292. pthread_create(&(devState->playbackThread), &playbackThreadAttr, playback_function, (void *) pDevice);
  293. while (devState->threadShouldRun && (0 == devState->threadIsReady))
  294. {
  295. sched_yield();
  296. }
  297. }
  298. static void stop_playback(ALCdevice *pDevice) {
  299. opesles_data_t *devState = (opesles_data_t *) pDevice->ExtraData;
  300. devState->threadShouldRun = 0;
  301. pthread_join(devState->playbackThread, NULL);
  302. return;
  303. }
  304. // this callback handler is called every time a buffer finishes playing
  305. static void opensles_callback(SLAndroidSimpleBufferQueueItf bq, void *context)
  306. {
  307. ALCdevice *pDevice = (ALCdevice *) context;
  308. opesles_data_t *devState = (opesles_data_t *) pDevice->ExtraData;
  309. unsigned int bufferIndex = devState->lastBufferEnqueued;
  310. unsigned int i;
  311. struct timespec ts;
  312. int rc;
  313. SLresult result;
  314. outputBuffer_t *buffer = NULL;
  315. bufferIndex = (++bufferIndex) % bufferCount;
  316. buffer = &(devState->outputBuffers[bufferIndex]);
  317. pthread_mutex_lock(&(buffer->mutex));
  318. // We will block until 'next' buffer has mixed audio, but first flag oldest equeued buffer as free
  319. for (i = 1; i <= bufferCount; i++) {
  320. unsigned int j = (devState->lastBufferEnqueued+i) % bufferCount;
  321. outputBuffer_t *bufferFree = &(devState->outputBuffers[j]);
  322. if (bufferFree->state == OUTPUT_BUFFER_STATE_ENQUEUED) {
  323. bufferFree->state = OUTPUT_BUFFER_STATE_FREE;
  324. break;
  325. }
  326. }
  327. while (buffer->state != OUTPUT_BUFFER_STATE_MIXED) {
  328. clock_gettime(CLOCK_REALTIME, &ts);
  329. ts.tv_nsec += 100000;
  330. rc = pthread_cond_timedwait(&(buffer->cond), &(buffer->mutex), &ts);
  331. if (rc != 0) {
  332. if (devState->threadShouldRun == 0) {
  333. // we are probably suspended
  334. pthread_mutex_unlock(&(buffer->mutex));
  335. return;
  336. }
  337. }
  338. }
  339. if (devState->bqPlayerBufferQueue) {
  340. result = (*devState->bqPlayerBufferQueue)->Enqueue(devState->bqPlayerBufferQueue, buffer->buffer, bufferSize);
  341. if (SL_RESULT_SUCCESS == result) {
  342. buffer->state = OUTPUT_BUFFER_STATE_ENQUEUED;
  343. devState->lastBufferEnqueued = bufferIndex;
  344. pthread_cond_signal(&(buffer->cond));
  345. } else {
  346. bufferIndex--;
  347. }
  348. }
  349. pthread_mutex_unlock(&(buffer->mutex));
  350. }
  351. static const ALCchar opensles_device[] = "OpenSL ES";
  352. // Apportable extensions
  353. SLresult alc_opensles_create_native_audio_engine()
  354. {
  355. if (engineObject)
  356. return SL_RESULT_SUCCESS;
  357. SLresult result;
  358. // create engine
  359. result = pslCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL);
  360. assert(SL_RESULT_SUCCESS == result);
  361. // realize the engine
  362. result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE);
  363. assert(SL_RESULT_SUCCESS == result);
  364. // get the engine interface, which is needed in order to create other objects
  365. result = (*engineObject)->GetInterface(engineObject, *pSL_IID_ENGINE, &engineEngine);
  366. assert(SL_RESULT_SUCCESS == result);
  367. // create output mix
  368. result = (*engineEngine)->CreateOutputMix(engineEngine, &outputMixObject, 0, NULL, NULL);
  369. assert(SL_RESULT_SUCCESS == result);
  370. // realize the output mix
  371. result = (*outputMixObject)->Realize(outputMixObject, SL_BOOLEAN_FALSE);
  372. assert(SL_RESULT_SUCCESS == result);
  373. return result;
  374. }
  375. // Backend functions, in same order as type BackendFuncs
  376. static ALCboolean opensles_open_playback(ALCdevice *pDevice, const ALCchar *deviceName)
  377. {
  378. LOGV("opensles_open_playback pDevice=%p, deviceName=%s", pDevice, deviceName);
  379. // Check if probe has linked the opensl symbols
  380. if (pslCreateEngine == NULL) {
  381. alc_opensles_probe(DEVICE_PROBE);
  382. if (pslCreateEngine == NULL) {
  383. return ALC_FALSE;
  384. }
  385. }
  386. if (pDevice->ExtraData == NULL) {
  387. alc_opensles_init_extradata(pDevice);
  388. }
  389. // create the engine and output mix objects
  390. alc_opensles_create_native_audio_engine();
  391. return ALC_TRUE;
  392. }
  393. static void opensles_close_playback(ALCdevice *pDevice)
  394. {
  395. LOGV("opensles_close_playback pDevice=%p", pDevice);
  396. opesles_data_t *devState = (opesles_data_t *) pDevice->ExtraData;
  397. // shut down the native audio system
  398. // destroy buffer queue audio player object, and invalidate all associated interfaces
  399. if (devState->bqPlayerObject != NULL) {
  400. (*devState->bqPlayerObject)->Destroy(devState->bqPlayerObject);
  401. devState->bqPlayerObject = NULL;
  402. devState->bqPlayerPlay = NULL;
  403. devState->bqPlayerBufferQueue = NULL;
  404. }
  405. devlist_remove(pDevice);
  406. }
  407. static ALCboolean opensles_reset_playback(ALCdevice *pDevice)
  408. {
  409. if (pDevice == NULL) {
  410. LOGE("Received a NULL ALCdevice! Returning ALC_FALSE from opensles_reset_playback");
  411. return ALC_FALSE;
  412. }
  413. LOGV("opensles_reset_playback pDevice=%p", pDevice);
  414. opesles_data_t *devState;
  415. unsigned bits = BytesFromDevFmt(pDevice->FmtType) * 8;
  416. unsigned channels = ChannelsFromDevFmt(pDevice->FmtChans);
  417. unsigned samples = pDevice->UpdateSize;
  418. unsigned size = samples * channels * bits / 8;
  419. SLuint32 sampling_rate = pDevice->Frequency * 1000;
  420. SLresult result;
  421. LOGV("bits=%u, channels=%u, samples=%u, size=%u, freq=%u", bits, channels, samples, size, pDevice->Frequency);
  422. if (pDevice->Frequency <= 22050) {
  423. bufferSize = defaultBufferSize / 2;
  424. }
  425. devState = (opesles_data_t *) pDevice->ExtraData;
  426. // create buffer queue audio player
  427. // configure audio source
  428. SLDataLocator_AndroidSimpleBufferQueue loc_bufq = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2};
  429. // SLDataFormat_PCM format_pcm = {SL_DATAFORMAT_PCM, 2, SL_SAMPLINGRATE_44_1,
  430. SLDataFormat_PCM format_pcm = {SL_DATAFORMAT_PCM, 2, sampling_rate,
  431. SL_PCMSAMPLEFORMAT_FIXED_16, SL_PCMSAMPLEFORMAT_FIXED_16,
  432. SL_SPEAKER_FRONT_LEFT|SL_SPEAKER_FRONT_RIGHT, SL_BYTEORDER_LITTLEENDIAN};
  433. SLDataSource audioSrc = {&loc_bufq, &format_pcm};
  434. // configure audio sink
  435. SLDataLocator_OutputMix loc_outmix = {SL_DATALOCATOR_OUTPUTMIX, outputMixObject};
  436. SLDataSink audioSnk = {&loc_outmix, NULL};
  437. // create audio player
  438. LOGV("create audio player");
  439. const SLInterfaceID ids[1] = {*pSL_IID_ANDROIDSIMPLEBUFFERQUEUE};
  440. const SLboolean req[1] = {SL_BOOLEAN_TRUE};
  441. result = (*engineEngine)->CreateAudioPlayer(engineEngine, &devState->bqPlayerObject, &audioSrc, &audioSnk,
  442. 1, ids, req);
  443. if ((result != SL_RESULT_SUCCESS) || (devState->bqPlayerObject == NULL)) {
  444. //RELEASE_LOG("create audio player is null or errored: %lx", result);
  445. return ALC_FALSE;
  446. }
  447. // realize the player
  448. result = (*devState->bqPlayerObject)->Realize(devState->bqPlayerObject, SL_BOOLEAN_FALSE);
  449. assert(SL_RESULT_SUCCESS == result);
  450. // get the play interface
  451. result = (*devState->bqPlayerObject)->GetInterface(devState->bqPlayerObject, *pSL_IID_PLAY, &devState->bqPlayerPlay);
  452. assert(SL_RESULT_SUCCESS == result);
  453. // get the buffer queue interface
  454. result = (*devState->bqPlayerObject)->GetInterface(devState->bqPlayerObject, *pSL_IID_BUFFERQUEUE,
  455. &devState->bqPlayerBufferQueue);
  456. if ((result != SL_RESULT_SUCCESS) || (devState->bqPlayerBufferQueue == NULL)) {
  457. //RELEASE_LOG("get the buffer queue interface is null or errored: %lx", result);
  458. return ALC_FALSE;
  459. }
  460. // register callback on the buffer queue
  461. result = (*devState->bqPlayerBufferQueue)->RegisterCallback(devState->bqPlayerBufferQueue, opensles_callback, (void *) pDevice);
  462. assert(SL_RESULT_SUCCESS == result);
  463. // playback_lock = createThreadLock();
  464. start_playback(pDevice);
  465. // set the player's state to playing
  466. result = (*devState->bqPlayerPlay)->SetPlayState(devState->bqPlayerPlay, SL_PLAYSTATE_PLAYING);
  467. assert(SL_RESULT_SUCCESS == result);
  468. // enqueue the first buffer to kick off the callbacks
  469. result = (*devState->bqPlayerBufferQueue)->Enqueue(devState->bqPlayerBufferQueue, "\0", 1);
  470. assert(SL_RESULT_SUCCESS == result);
  471. SetDefaultWFXChannelOrder(pDevice);
  472. devlist_add(pDevice);
  473. return ALC_TRUE;
  474. }
  475. static void opensles_stop_playback(ALCdevice *pDevice)
  476. {
  477. LOGV("opensles_stop_playback device=%p", pDevice);
  478. stop_playback(pDevice);
  479. }
  480. static ALCboolean opensles_open_capture(ALCdevice *pDevice, const ALCchar *deviceName)
  481. {
  482. LOGV("opensles_open_capture device=%p, deviceName=%s", pDevice, deviceName);
  483. return ALC_FALSE;
  484. }
  485. static void opensles_close_capture(ALCdevice *pDevice)
  486. {
  487. LOGV("opensles_closed_capture device=%p", pDevice);
  488. }
  489. static void opensles_start_capture(ALCdevice *pDevice)
  490. {
  491. LOGV("opensles_start_capture device=%p", pDevice);
  492. }
  493. static void opensles_stop_capture(ALCdevice *pDevice)
  494. {
  495. LOGV("opensles_stop_capture device=%p", pDevice);
  496. }
  497. static void opensles_capture_samples(ALCdevice *pDevice, ALCvoid *pBuffer, ALCuint lSamples)
  498. {
  499. LOGV("opensles_capture_samples device=%p, pBuffer=%p, lSamples=%u", pDevice, pBuffer, lSamples);
  500. }
  501. static ALCuint opensles_available_samples(ALCdevice *pDevice)
  502. {
  503. LOGV("opensles_available_samples device=%p", pDevice);
  504. return 0;
  505. }
  506. // table of backend function pointers
  507. BackendFuncs opensles_funcs = {
  508. opensles_open_playback,
  509. opensles_close_playback,
  510. opensles_reset_playback,
  511. opensles_stop_playback,
  512. opensles_open_capture,
  513. opensles_close_capture,
  514. opensles_start_capture,
  515. opensles_stop_capture,
  516. opensles_capture_samples,
  517. opensles_available_samples
  518. };
  519. // global entry points called from XYZZY
  520. static void suspend_device(ALCdevice *pDevice) {
  521. SLresult result;
  522. if (pDevice) {
  523. opesles_data_t *devState = (opesles_data_t *) pDevice->ExtraData;
  524. if (devState->bqPlayerPlay) {
  525. result = (*devState->bqPlayerPlay)->SetPlayState(devState->bqPlayerPlay, SL_PLAYSTATE_PAUSED);
  526. if ((SL_RESULT_SUCCESS == result) && (devState->bqPlayerBufferQueue)) {
  527. result = (*devState->bqPlayerBufferQueue)->Clear(devState->bqPlayerBufferQueue);
  528. assert(SL_RESULT_SUCCESS == result);
  529. }
  530. }
  531. stop_playback(pDevice);
  532. }
  533. }
  534. static void resume_device(ALCdevice *pDevice) {
  535. SLresult result;
  536. if (pDevice) {
  537. opesles_data_t *devState = (opesles_data_t *) pDevice->ExtraData;
  538. if (devState->bqPlayerPlay) {
  539. result = (*devState->bqPlayerPlay)->SetPlayState(devState->bqPlayerPlay, SL_PLAYSTATE_PLAYING);
  540. // Pump some blank data into the buffer to stimulate the callback
  541. if ((SL_RESULT_SUCCESS == result) && (devState->bqPlayerBufferQueue)) {
  542. result = (*devState->bqPlayerBufferQueue)->Enqueue(devState->bqPlayerBufferQueue, "\0", 1);
  543. assert(SL_RESULT_SUCCESS == result);
  544. }
  545. }
  546. start_playback(pDevice);
  547. }
  548. }
  549. void alc_opensles_suspend()
  550. {
  551. devlist_process(&suspend_device);
  552. }
  553. void alc_opensles_resume()
  554. {
  555. devlist_process(&resume_device);
  556. }
  557. static void alc_opensles_set_java_vm(JavaVM *vm)
  558. {
  559. // Called once and only once from JNI_OnLoad
  560. javaVM = vm;
  561. int i;
  562. char *android_model;
  563. char *low_buffer_models[] = {
  564. "GT-I9300",
  565. "GT-I9305",
  566. "SHV-E210",
  567. "SGH-T999",
  568. "SGH-I747",
  569. "SGH-N064",
  570. "SC-06D",
  571. "SGH-N035",
  572. "SC-03E",
  573. "SCH-R530",
  574. "SCH-I535",
  575. "SPH-L710",
  576. "GT-I9308",
  577. "SCH-I939",
  578. "Kindle Fire",
  579. NULL};
  580. if(NULL != javaVM)
  581. {
  582. int android_os_version = alc_opensles_get_android_api();
  583. // If running on 4.1 (Jellybean) or later, use 8 buffers to avoid breakup/stuttering.
  584. if(android_os_version >= 16)
  585. {
  586. premixCount = 5;
  587. }
  588. // Else, use 4 buffers to reduce latency
  589. else
  590. {
  591. premixCount = 1;
  592. }
  593. android_model = alc_opensles_get_android_model();
  594. for (i = 0; low_buffer_models[i] != NULL; i++) {
  595. if (strncmp(android_model, low_buffer_models[i], strlen(low_buffer_models[i])) == 0) {
  596. LOGV("Using less buffering");
  597. defaultBufferSize = 1024;
  598. bufferSize = 1024;
  599. premixCount = 1;
  600. break;
  601. }
  602. }
  603. }
  604. }
  605. void alc_opensles_init(BackendFuncs *func_list)
  606. {
  607. LOGV("alc_opensles_init");
  608. struct stat statinfo;
  609. if (stat("/system/lib/libOpenSLES.so", &statinfo) != 0) {
  610. return;
  611. }
  612. *func_list = opensles_funcs;
  613. // We need the JavaVM for JNI so we can detect the OS version number at runtime.
  614. // This is because we need to use different bufferCount values for Android 4.1 vs. pre-4.1.
  615. // This must be set at constructor time before JNI_OnLoad is invoked.
  616. apportableOpenALFuncs.alc_android_set_java_vm = alc_opensles_set_java_vm;
  617. }
  618. void alc_opensles_deinit(void)
  619. {
  620. LOGV("alc_opensles_deinit");
  621. // destroy output mix object, and invalidate all associated interfaces
  622. if (outputMixObject != NULL) {
  623. (*outputMixObject)->Destroy(outputMixObject);
  624. outputMixObject = NULL;
  625. }
  626. // destroy engine object, and invalidate all associated interfaces
  627. if (engineObject != NULL) {
  628. (*engineObject)->Destroy(engineObject);
  629. engineObject = NULL;
  630. engineEngine = NULL;
  631. }
  632. }
  633. void alc_opensles_probe(int type)
  634. {
  635. char *error;
  636. struct stat statinfo;
  637. if (stat("/system/lib/libOpenSLES.so", &statinfo) != 0) {
  638. LOGV("alc_opensles_probe OpenSLES support not found.");
  639. return;
  640. }
  641. dlerror(); // Clear dl errors
  642. void *dlHandle = dlopen("/system/lib/libOpenSLES.so", RTLD_NOW | RTLD_GLOBAL);
  643. if (!dlHandle || (error = (typeof(error))dlerror()) != NULL) {
  644. LOGV("OpenSLES could not be loaded.");
  645. return;
  646. }
  647. #define LOAD_SYM_POINTER(sym) \
  648. do { \
  649. p##sym = dlsym(dlHandle, #sym); \
  650. if((error=(typeof(error))dlerror()) != NULL) { \
  651. LOGV("alc_opensles_probe could not load %s, error: %s", #sym, error); \
  652. dlclose(dlHandle); \
  653. return; \
  654. } \
  655. } while(0)
  656. LOAD_SYM_POINTER(slCreateEngine);
  657. LOAD_SYM_POINTER(SL_IID_ENGINE);
  658. LOAD_SYM_POINTER(SL_IID_ANDROIDSIMPLEBUFFERQUEUE);
  659. LOAD_SYM_POINTER(SL_IID_PLAY);
  660. LOAD_SYM_POINTER(SL_IID_BUFFERQUEUE);
  661. apportableOpenALFuncs.alc_android_suspend = alc_opensles_suspend;
  662. apportableOpenALFuncs.alc_android_resume = alc_opensles_resume;
  663. switch (type) {
  664. case DEVICE_PROBE:
  665. LOGV("alc_opensles_probe DEVICE_PROBE");
  666. AppendDeviceList(opensles_device);
  667. break;
  668. case ALL_DEVICE_PROBE:
  669. LOGV("alc_opensles_probe ALL_DEVICE_PROBE");
  670. AppendAllDeviceList(opensles_device);
  671. break;
  672. default:
  673. LOGV("alc_opensles_probe type=%d", type);
  674. break;
  675. }
  676. }