static int opensl_get_min_latency(cubeb * ctx, cubeb_stream_params params, uint32_t * latency_ms) { /* https://android.googlesource.com/platform/ndk.git/+/master/docs/opensles/index.html * We don't want to deal with JNI here (and we don't have Java on b2g anyways), * so we just dlopen the library and get the two symbols we need. */ int rv; void * libmedia; size_t (*get_primary_output_frame_count)(void); int (*get_output_frame_count)(size_t * frameCount, int streamType); uint32_t primary_sampling_rate; size_t primary_buffer_size; rv = opensl_get_preferred_sample_rate(ctx, &primary_sampling_rate); if (rv) { return CUBEB_ERROR; } libmedia = dlopen("libmedia.so", RTLD_LAZY); if (!libmedia) { return CUBEB_ERROR; } /* JB variant */ /* size_t AudioSystem::getPrimaryOutputFrameCount(void) */ get_primary_output_frame_count = dlsym(libmedia, "_ZN7android11AudioSystem26getPrimaryOutputFrameCountEv"); if (!get_primary_output_frame_count) { /* ICS variant */ /* status_t AudioSystem::getOutputFrameCount(int* frameCount, int streamType) */ get_output_frame_count = dlsym(libmedia, "_ZN7android11AudioSystem19getOutputFrameCountEPii"); if (!get_output_frame_count) { dlclose(libmedia); return CUBEB_ERROR; } } if (get_primary_output_frame_count) { primary_buffer_size = get_primary_output_frame_count(); } else { if (get_output_frame_count(&primary_buffer_size, params.stream_type) != 0) { return CUBEB_ERROR; } } /* To get a fast track in Android's mixer, we need to be at the native * samplerate, which is device dependant. Some devices might be able to * resample when playing a fast track, but it's pretty rare. */ *latency_ms = NBUFS * primary_buffer_size / (primary_sampling_rate / 1000); dlclose(libmedia); return CUBEB_OK; }
static int opensl_get_min_latency(cubeb * ctx, cubeb_stream_params params, uint32_t * latency_ms) { /* https://android.googlesource.com/platform/ndk.git/+/master/docs/opensles/index.html * We don't want to deal with JNI here (and we don't have Java on b2g anyways), * so we just dlopen the library and get the two symbols we need. */ int rv; void * libmedia; uint32_t (*get_primary_output_samplingrate)(void); size_t (*get_primary_output_frame_count)(void); uint32_t primary_sampling_rate; size_t primary_buffer_size; libmedia = dlopen("libmedia.so", RTLD_LAZY); if (!libmedia) { return CUBEB_ERROR; } /* uint32_t AudioSystem::getPrimaryOutputSamplingRate(void) */ get_primary_output_samplingrate = dlsym(libmedia, "_ZN7android11AudioSystem28getPrimaryOutputSamplingRateEv"); if (!get_primary_output_samplingrate) { dlclose(libmedia); return CUBEB_ERROR; } /* size_t AudioSystem::getPrimaryOutputFrameCount(void) */ get_primary_output_frame_count = dlsym(libmedia, "_ZN7android11AudioSystem26getPrimaryOutputFrameCountEv"); if (!get_primary_output_frame_count) { dlclose(libmedia); return CUBEB_ERROR; } primary_sampling_rate = get_primary_output_samplingrate(); primary_buffer_size = get_primary_output_frame_count(); /* To get a fast track in Android's mixer, we need to be at the native * samplerate, which is device dependant. Some devices might be able to * resample when playing a fast track, but it's pretty rare. */ if (primary_sampling_rate != params.rate) { /* If we don't know what to use, let's say 4 * 20ms buffers will do. */ *latency_ms = NBUFS * 20; } else { *latency_ms = NBUFS * primary_buffer_size / (primary_sampling_rate / 1000); } dlclose(libmedia); return CUBEB_OK; }