Loading hal/audio_hw.c +75 −20 Original line number Diff line number Diff line Loading @@ -63,6 +63,9 @@ #define USECASE_AUDIO_PLAYBACK_PRIMARY USECASE_AUDIO_PLAYBACK_DEEP_BUFFER static unsigned int configured_low_latency_capture_period_size = LOW_LATENCY_CAPTURE_PERIOD_SIZE; struct pcm_config pcm_config_deep_buffer = { .channels = 2, .rate = DEFAULT_OUTPUT_SAMPLING_RATE, Loading Loading @@ -288,6 +291,19 @@ static int enable_audio_route_for_voice_usecases(struct audio_device *adev, return 0; } int pcm_ioctl(struct pcm *pcm, int request, ...) { va_list ap; void * arg; int pcm_fd = *(int*)pcm; va_start(ap, request); arg = va_arg(ap, void *); va_end(ap); return ioctl(pcm_fd, request, arg); } int enable_audio_route(struct audio_device *adev, struct audio_usecase *usecase) { Loading Loading @@ -1439,7 +1455,8 @@ static int check_input_parameters(uint32_t sample_rate, static size_t get_input_buffer_size(uint32_t sample_rate, audio_format_t format, int channel_count) int channel_count, bool is_low_latency) { size_t size = 0; Loading @@ -1447,13 +1464,19 @@ static size_t get_input_buffer_size(uint32_t sample_rate, return 0; size = (sample_rate * AUDIO_CAPTURE_PERIOD_DURATION_MSEC) / 1000; if (is_low_latency) size = configured_low_latency_capture_period_size; /* ToDo: should use frame_size computed based on the format and channel_count here. */ size *= sizeof(short) * channel_count; /* make sure the size is multiple of 64 */ size += 0x3f; size &= ~0x3f; /* make sure the size is multiple of 32 bytes * At 48 kHz mono 16-bit PCM: * 5.000 ms = 240 frames = 15*16*1*2 = 480, a whole multiple of 32 (15) * 3.333 ms = 160 frames = 10*16*1*2 = 320, a whole multiple of 32 (10) */ size += 0x1f; size &= ~0x1f; return size; } Loading Loading @@ -2970,7 +2993,8 @@ static size_t adev_get_input_buffer_size(const struct audio_hw_device *dev __unu { int channel_count = audio_channel_count_from_in_mask(config->channel_mask); return get_input_buffer_size(config->sample_rate, config->format, channel_count); return get_input_buffer_size(config->sample_rate, config->format, channel_count, false /* is_low_latency: since we don't know, be conservative */); } static int adev_open_input_stream(struct audio_hw_device *dev, Loading @@ -2986,7 +3010,7 @@ static int adev_open_input_stream(struct audio_hw_device *dev, struct stream_in *in; int ret = 0, buffer_size, frame_size; int channel_count = audio_channel_count_from_in_mask(config->channel_mask); bool is_low_latency = false; *stream_in = NULL; if (check_input_parameters(config->sample_rate, config->format, channel_count) != 0) Loading Loading @@ -3030,6 +3054,13 @@ static int adev_open_input_stream(struct audio_hw_device *dev, /* Update config params with the requested sample rate and channels */ in->usecase = USECASE_AUDIO_RECORD; if (config->sample_rate == LOW_LATENCY_CAPTURE_SAMPLE_RATE && (flags & AUDIO_INPUT_FLAG_FAST) != 0) { is_low_latency = true; #if LOW_LATENCY_CAPTURE_USE_CASE in->usecase = USECASE_AUDIO_RECORD_LOW_LATENCY; #endif } in->config = pcm_config_audio_capture; in->config.rate = config->sample_rate; in->format = config->format; Loading @@ -3053,7 +3084,8 @@ static int adev_open_input_stream(struct audio_hw_device *dev, frame_size = audio_stream_in_frame_size(&in->stream); buffer_size = get_input_buffer_size(config->sample_rate, config->format, channel_count); channel_count, is_low_latency); in->config.period_size = buffer_size / frame_size; } Loading Loading @@ -3135,6 +3167,23 @@ static int adev_close(hw_device_t *device) return 0; } /* This returns 1 if the input parameter looks at all plausible as a low latency period size, * or 0 otherwise. A return value of 1 doesn't mean the value is guaranteed to work, * just that it _might_ work. */ static int period_size_is_plausible_for_low_latency(int period_size) { switch (period_size) { case 160: case 240: case 320: case 480: return 1; default: return 0; } } static int adev_open(const hw_module_t *module, const char *name, hw_device_t **device) { Loading Loading @@ -3258,23 +3307,29 @@ static int adev_open(const hw_module_t *module, const char *name, &adev->streams_output_cfg_list); audio_device_ref_count++; pthread_mutex_unlock(&adev_init_lock); ALOGV("%s: exit", __func__); return 0; char value[PROPERTY_VALUE_MAX]; int trial; if (property_get("audio_hal.period_size", value, NULL) > 0) { trial = atoi(value); if (period_size_is_plausible_for_low_latency(trial)) { pcm_config_low_latency.period_size = trial; pcm_config_low_latency.start_threshold = trial / 4; pcm_config_low_latency.avail_min = trial / 4; configured_low_latency_capture_period_size = trial; } } if (property_get("audio_hal.in_period_size", value, NULL) > 0) { trial = atoi(value); if (period_size_is_plausible_for_low_latency(trial)) { configured_low_latency_capture_period_size = trial; } } int pcm_ioctl(struct pcm *pcm, int request, ...) { va_list ap; void * arg; int pcm_fd = *(int*)pcm; va_start(ap, request); arg = va_arg(ap, void *); va_end(ap); pthread_mutex_unlock(&adev_init_lock); return ioctl(pcm_fd, request, arg); ALOGV("%s: exit", __func__); return 0; } static struct hw_module_methods_t hal_module_methods = { Loading hal/audio_hw.h +0 −3 Original line number Diff line number Diff line Loading @@ -32,9 +32,6 @@ #define VISUALIZER_LIBRARY_PATH "/system/lib/soundfx/libqcomvisualizer.so" #define OFFLOAD_EFFECTS_BUNDLE_LIBRARY_PATH "/system/lib/soundfx/libqcompostprocbundle.so" #define BT_SCO_SAMPLE_RATE "bt-sco-samplerate" #define BT_SCO_WB_SAMPLE_RATE "bt-sco-wb-samplerate" /* Flags used to initialize acdb_settings variable that goes to ACDB library */ #define NONE_FLAG 0x00000000 #define ANC_FLAG 0x00000001 Loading hal/msm8916/platform.h +4 −0 Original line number Diff line number Diff line Loading @@ -164,6 +164,10 @@ enum { #define LOW_LATENCY_OUTPUT_PERIOD_SIZE 240 #define LOW_LATENCY_OUTPUT_PERIOD_COUNT 2 #define LOW_LATENCY_CAPTURE_SAMPLE_RATE 48000 #define LOW_LATENCY_CAPTURE_PERIOD_SIZE 240 #define LOW_LATENCY_CAPTURE_USE_CASE 0 #define HDMI_MULTI_PERIOD_SIZE 336 #define HDMI_MULTI_PERIOD_COUNT 8 #define HDMI_MULTI_DEFAULT_CHANNEL_COUNT 6 Loading hal/msm8960/platform.h +4 −0 Original line number Diff line number Diff line Loading @@ -138,4 +138,8 @@ enum { /* Define macro for Internal FM volume mixer */ #define FM_RX_VOLUME "Internal FM RX Volume" #define LOW_LATENCY_CAPTURE_SAMPLE_RATE 48000 #define LOW_LATENCY_CAPTURE_PERIOD_SIZE 240 #define LOW_LATENCY_CAPTURE_USE_CASE 0 #endif // QCOM_AUDIO_PLATFORM_H hal/msm8974/platform.h +4 −0 Original line number Diff line number Diff line Loading @@ -178,6 +178,10 @@ enum { #define AUDIO_CAPTURE_PERIOD_DURATION_MSEC 20 #define AUDIO_CAPTURE_PERIOD_COUNT 2 #define LOW_LATENCY_CAPTURE_SAMPLE_RATE 48000 #define LOW_LATENCY_CAPTURE_PERIOD_SIZE 240 #define LOW_LATENCY_CAPTURE_USE_CASE 1 #define DEVICE_NAME_MAX_SIZE 128 #define HW_INFO_ARRAY_MAX_SIZE 32 Loading Loading
hal/audio_hw.c +75 −20 Original line number Diff line number Diff line Loading @@ -63,6 +63,9 @@ #define USECASE_AUDIO_PLAYBACK_PRIMARY USECASE_AUDIO_PLAYBACK_DEEP_BUFFER static unsigned int configured_low_latency_capture_period_size = LOW_LATENCY_CAPTURE_PERIOD_SIZE; struct pcm_config pcm_config_deep_buffer = { .channels = 2, .rate = DEFAULT_OUTPUT_SAMPLING_RATE, Loading Loading @@ -288,6 +291,19 @@ static int enable_audio_route_for_voice_usecases(struct audio_device *adev, return 0; } int pcm_ioctl(struct pcm *pcm, int request, ...) { va_list ap; void * arg; int pcm_fd = *(int*)pcm; va_start(ap, request); arg = va_arg(ap, void *); va_end(ap); return ioctl(pcm_fd, request, arg); } int enable_audio_route(struct audio_device *adev, struct audio_usecase *usecase) { Loading Loading @@ -1439,7 +1455,8 @@ static int check_input_parameters(uint32_t sample_rate, static size_t get_input_buffer_size(uint32_t sample_rate, audio_format_t format, int channel_count) int channel_count, bool is_low_latency) { size_t size = 0; Loading @@ -1447,13 +1464,19 @@ static size_t get_input_buffer_size(uint32_t sample_rate, return 0; size = (sample_rate * AUDIO_CAPTURE_PERIOD_DURATION_MSEC) / 1000; if (is_low_latency) size = configured_low_latency_capture_period_size; /* ToDo: should use frame_size computed based on the format and channel_count here. */ size *= sizeof(short) * channel_count; /* make sure the size is multiple of 64 */ size += 0x3f; size &= ~0x3f; /* make sure the size is multiple of 32 bytes * At 48 kHz mono 16-bit PCM: * 5.000 ms = 240 frames = 15*16*1*2 = 480, a whole multiple of 32 (15) * 3.333 ms = 160 frames = 10*16*1*2 = 320, a whole multiple of 32 (10) */ size += 0x1f; size &= ~0x1f; return size; } Loading Loading @@ -2970,7 +2993,8 @@ static size_t adev_get_input_buffer_size(const struct audio_hw_device *dev __unu { int channel_count = audio_channel_count_from_in_mask(config->channel_mask); return get_input_buffer_size(config->sample_rate, config->format, channel_count); return get_input_buffer_size(config->sample_rate, config->format, channel_count, false /* is_low_latency: since we don't know, be conservative */); } static int adev_open_input_stream(struct audio_hw_device *dev, Loading @@ -2986,7 +3010,7 @@ static int adev_open_input_stream(struct audio_hw_device *dev, struct stream_in *in; int ret = 0, buffer_size, frame_size; int channel_count = audio_channel_count_from_in_mask(config->channel_mask); bool is_low_latency = false; *stream_in = NULL; if (check_input_parameters(config->sample_rate, config->format, channel_count) != 0) Loading Loading @@ -3030,6 +3054,13 @@ static int adev_open_input_stream(struct audio_hw_device *dev, /* Update config params with the requested sample rate and channels */ in->usecase = USECASE_AUDIO_RECORD; if (config->sample_rate == LOW_LATENCY_CAPTURE_SAMPLE_RATE && (flags & AUDIO_INPUT_FLAG_FAST) != 0) { is_low_latency = true; #if LOW_LATENCY_CAPTURE_USE_CASE in->usecase = USECASE_AUDIO_RECORD_LOW_LATENCY; #endif } in->config = pcm_config_audio_capture; in->config.rate = config->sample_rate; in->format = config->format; Loading @@ -3053,7 +3084,8 @@ static int adev_open_input_stream(struct audio_hw_device *dev, frame_size = audio_stream_in_frame_size(&in->stream); buffer_size = get_input_buffer_size(config->sample_rate, config->format, channel_count); channel_count, is_low_latency); in->config.period_size = buffer_size / frame_size; } Loading Loading @@ -3135,6 +3167,23 @@ static int adev_close(hw_device_t *device) return 0; } /* This returns 1 if the input parameter looks at all plausible as a low latency period size, * or 0 otherwise. A return value of 1 doesn't mean the value is guaranteed to work, * just that it _might_ work. */ static int period_size_is_plausible_for_low_latency(int period_size) { switch (period_size) { case 160: case 240: case 320: case 480: return 1; default: return 0; } } static int adev_open(const hw_module_t *module, const char *name, hw_device_t **device) { Loading Loading @@ -3258,23 +3307,29 @@ static int adev_open(const hw_module_t *module, const char *name, &adev->streams_output_cfg_list); audio_device_ref_count++; pthread_mutex_unlock(&adev_init_lock); ALOGV("%s: exit", __func__); return 0; char value[PROPERTY_VALUE_MAX]; int trial; if (property_get("audio_hal.period_size", value, NULL) > 0) { trial = atoi(value); if (period_size_is_plausible_for_low_latency(trial)) { pcm_config_low_latency.period_size = trial; pcm_config_low_latency.start_threshold = trial / 4; pcm_config_low_latency.avail_min = trial / 4; configured_low_latency_capture_period_size = trial; } } if (property_get("audio_hal.in_period_size", value, NULL) > 0) { trial = atoi(value); if (period_size_is_plausible_for_low_latency(trial)) { configured_low_latency_capture_period_size = trial; } } int pcm_ioctl(struct pcm *pcm, int request, ...) { va_list ap; void * arg; int pcm_fd = *(int*)pcm; va_start(ap, request); arg = va_arg(ap, void *); va_end(ap); pthread_mutex_unlock(&adev_init_lock); return ioctl(pcm_fd, request, arg); ALOGV("%s: exit", __func__); return 0; } static struct hw_module_methods_t hal_module_methods = { Loading
hal/audio_hw.h +0 −3 Original line number Diff line number Diff line Loading @@ -32,9 +32,6 @@ #define VISUALIZER_LIBRARY_PATH "/system/lib/soundfx/libqcomvisualizer.so" #define OFFLOAD_EFFECTS_BUNDLE_LIBRARY_PATH "/system/lib/soundfx/libqcompostprocbundle.so" #define BT_SCO_SAMPLE_RATE "bt-sco-samplerate" #define BT_SCO_WB_SAMPLE_RATE "bt-sco-wb-samplerate" /* Flags used to initialize acdb_settings variable that goes to ACDB library */ #define NONE_FLAG 0x00000000 #define ANC_FLAG 0x00000001 Loading
hal/msm8916/platform.h +4 −0 Original line number Diff line number Diff line Loading @@ -164,6 +164,10 @@ enum { #define LOW_LATENCY_OUTPUT_PERIOD_SIZE 240 #define LOW_LATENCY_OUTPUT_PERIOD_COUNT 2 #define LOW_LATENCY_CAPTURE_SAMPLE_RATE 48000 #define LOW_LATENCY_CAPTURE_PERIOD_SIZE 240 #define LOW_LATENCY_CAPTURE_USE_CASE 0 #define HDMI_MULTI_PERIOD_SIZE 336 #define HDMI_MULTI_PERIOD_COUNT 8 #define HDMI_MULTI_DEFAULT_CHANNEL_COUNT 6 Loading
hal/msm8960/platform.h +4 −0 Original line number Diff line number Diff line Loading @@ -138,4 +138,8 @@ enum { /* Define macro for Internal FM volume mixer */ #define FM_RX_VOLUME "Internal FM RX Volume" #define LOW_LATENCY_CAPTURE_SAMPLE_RATE 48000 #define LOW_LATENCY_CAPTURE_PERIOD_SIZE 240 #define LOW_LATENCY_CAPTURE_USE_CASE 0 #endif // QCOM_AUDIO_PLATFORM_H
hal/msm8974/platform.h +4 −0 Original line number Diff line number Diff line Loading @@ -178,6 +178,10 @@ enum { #define AUDIO_CAPTURE_PERIOD_DURATION_MSEC 20 #define AUDIO_CAPTURE_PERIOD_COUNT 2 #define LOW_LATENCY_CAPTURE_SAMPLE_RATE 48000 #define LOW_LATENCY_CAPTURE_PERIOD_SIZE 240 #define LOW_LATENCY_CAPTURE_USE_CASE 1 #define DEVICE_NAME_MAX_SIZE 128 #define HW_INFO_ARRAY_MAX_SIZE 32 Loading