Add system properties to configure audio HAL Configure period and buffer period count by system properties Test: Build and play sounds on 8155 Bug: 184180639 Change-Id: I982ecc67d39844b9af62df76209e317755ef34f4
diff --git a/hal/audio/6.0/audio_hw.c b/hal/audio/6.0/audio_hw.c index 317d77e..bc5e43d 100644 --- a/hal/audio/6.0/audio_hw.c +++ b/hal/audio/6.0/audio_hw.c
@@ -45,11 +45,16 @@ #define PCM_CARD 0 #define PCM_DEVICE 0 -#define OUT_PERIOD_MS 40 -#define OUT_PERIOD_COUNT 4 +#define DEFAULT_OUT_PERIOD_MS 40 +#define DEFAULT_OUT_PERIOD_COUNT 4 -#define IN_PERIOD_MS 40 -#define IN_PERIOD_COUNT 4 +#define DEFAULT_IN_PERIOD_MS 40 +#define DEFAULT_IN_PERIOD_COUNT 4 + +static const char* PROP_KEY_OUT_PERIOD_MS = "ro.vendor.trout.audiohal.out_period_ms"; +static const char* PROP_KEY_OUT_PERIOD_COUNT = "ro.vendor.trout.audiohal.out_period_count"; +static const char* PROP_KEY_IN_PERIOD_MS = "ro.vendor.trout.audiohal.in_period_ms"; +static const char* PROP_KEY_IN_PERIOD_COUNT = "ro.vendor.trout.audiohal.in_period_count"; #define PI 3.14159265 #define TWO_PI (2*PI) @@ -82,11 +87,42 @@ static int adev_get_mic_mute(const struct audio_hw_device *dev, bool *state); +static int get_out_period_ms() { + static int out_period_ms = -1; + if (out_period_ms == -1) { + out_period_ms = property_get_int32(PROP_KEY_OUT_PERIOD_MS, DEFAULT_OUT_PERIOD_MS); + } + return out_period_ms; +} + +static int get_out_period_count() { + static int out_period_count = -1; + if (out_period_count == -1) { + out_period_count = property_get_int32(PROP_KEY_OUT_PERIOD_COUNT, DEFAULT_OUT_PERIOD_COUNT); + } + return out_period_count; +} + +static int get_in_period_ms() { + static int in_period_ms = -1; + if (in_period_ms == -1) { + in_period_ms = property_get_int32(PROP_KEY_IN_PERIOD_MS, DEFAULT_IN_PERIOD_MS); + } + return in_period_ms; +} + +static int get_in_period_count() { + static int in_period_count = -1; + if (in_period_count == -1) { + in_period_count = property_get_int32(PROP_KEY_IN_PERIOD_COUNT, DEFAULT_IN_PERIOD_COUNT); + } + return in_period_count; +} + static struct pcm_config pcm_config_out = { .channels = 2, .rate = 0, .period_size = 0, - .period_count = OUT_PERIOD_COUNT, .format = PCM_FORMAT_S16_LE, .start_threshold = 0, }; @@ -111,7 +147,6 @@ .channels = 2, .rate = 0, .period_size = 0, - .period_count = IN_PERIOD_COUNT, .format = PCM_FORMAT_S16_LE, .start_threshold = 0, .stop_threshold = INT_MAX, @@ -659,7 +694,7 @@ if (refine_input_parameters(&sample_rate, &format, &channel_mask) != 0) return 0; - size = sample_rate*IN_PERIOD_MS/1000; + size = sample_rate * get_in_period_ms() / 1000; // Audioflinger expects audio buffers to be multiple of 16 frames size = ((size + 15) / 16) * 16; size *= sizeof(short) * channel_count; @@ -1101,7 +1136,7 @@ memcpy(&out->req_config, config, sizeof(struct audio_config)); memcpy(&out->pcm_config, &pcm_config_out, sizeof(struct pcm_config)); out->pcm_config.rate = config->sample_rate; - out->pcm_config.period_size = out->pcm_config.rate*OUT_PERIOD_MS/1000; + out->pcm_config.period_size = out->pcm_config.rate * get_out_period_ms() / 1000; out->standby = true; out->underrun_position = 0; @@ -1350,7 +1385,7 @@ memcpy(&in->req_config, config, sizeof(struct audio_config)); memcpy(&in->pcm_config, &pcm_config_in, sizeof(struct pcm_config)); in->pcm_config.rate = config->sample_rate; - in->pcm_config.period_size = in->pcm_config.rate*IN_PERIOD_MS/1000; + in->pcm_config.period_size = in->pcm_config.rate * get_in_period_ms() / 1000; in->stereo_to_mono_buf = NULL; in->stereo_to_mono_buf_size = 0; @@ -1527,6 +1562,10 @@ ALOGV("%s: exit", __func__); goto unlock; } + + pcm_config_in.period_count = get_in_period_count(); + pcm_config_out.period_count = get_out_period_count(); + adev = calloc(1, sizeof(struct generic_audio_device)); pthread_mutex_init(&adev->lock, (const pthread_mutexattr_t *) NULL);