diff options
author | Hongwei Wang <hwwang@google.com> | 2019-04-18 00:49:05 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2019-04-18 00:49:05 +0000 |
commit | d0d84e40116bee8d56f176f61e7e0195ab3eb818 (patch) | |
tree | 68423744d83909803e9bc6f2be9dea46aa8ec417 | |
parent | 55b400f9bd03193fc7661d879b2e332a688c1cb5 (diff) | |
parent | 4c3cea85a7862b8dfe882cd685aa542ae6539ee5 (diff) | |
download | device_generic_car-d0d84e40116bee8d56f176f61e7e0195ab3eb818.tar.gz device_generic_car-d0d84e40116bee8d56f176f61e7e0195ab3eb818.tar.bz2 device_generic_car-d0d84e40116bee8d56f176f61e7e0195ab3eb818.zip |
Merge "Separates zone audio to different channels in car emulator" into qt-dev
-rw-r--r-- | emulator/audio/driver/audio_hw.c | 30 | ||||
-rw-r--r-- | emulator/audio/driver/audio_hw.h | 7 |
2 files changed, 31 insertions, 6 deletions
diff --git a/emulator/audio/driver/audio_hw.c b/emulator/audio/driver/audio_hw.c index d992971..13cb72b 100644 --- a/emulator/audio/driver/audio_hw.c +++ b/emulator/audio/driver/audio_hw.c @@ -33,6 +33,7 @@ #include <unistd.h> #include <log/log.h> +#include <cutils/properties.h> #include <cutils/str_parms.h> #include <hardware/hardware.h> @@ -52,6 +53,8 @@ #define _bool_str(x) ((x)?"true":"false") +#define PROP_KEY_SIMULATE_MULTI_ZONE_AUDIO "ro.aae.simulateMultiZoneAudio" + static int adev_get_mic_mute(const struct audio_hw_device *dev, bool *state); static struct pcm_config pcm_config_out = { @@ -118,6 +121,7 @@ static int out_dump(const struct audio_stream *stream, int fd) { "\t\tformat: %d\n" "\t\tdevice: %08x\n" "\t\tamplitude ratio: %f\n" + "\t\tenabled channels: %d\n" "\t\taudio dev: %p\n\n", out->bus_address, out_get_sample_rate(stream), @@ -126,6 +130,7 @@ static int out_dump(const struct audio_stream *stream, int fd) { out_get_format(stream), out->device, out->amplitude_ratio, + out->enabled_channels, out->dev); pthread_mutex_unlock(&out->lock); return 0; @@ -314,15 +319,21 @@ static void get_current_output_position(struct generic_stream_out *out, } } -// Applies gain naively, assume AUDIO_FORMAT_PCM_16_BIT +// Applies gain naively, assumes AUDIO_FORMAT_PCM_16_BIT and stereo output static void out_apply_gain(struct generic_stream_out *out, const void *buffer, size_t bytes) { int16_t *int16_buffer = (int16_t *)buffer; size_t int16_size = bytes / sizeof(int16_t); for (int i = 0; i < int16_size; i++) { - float multiplied = int16_buffer[i] * out->amplitude_ratio; - if (multiplied > INT16_MAX) int16_buffer[i] = INT16_MAX; - else if (multiplied < INT16_MIN) int16_buffer[i] = INT16_MIN; - else int16_buffer[i] = (int16_t)multiplied; + if ((i % 2) && !(out->enabled_channels & RIGHT_CHANNEL)) { + int16_buffer[i] = 0; + } else if (!(i % 2) && !(out->enabled_channels & LEFT_CHANNEL)) { + int16_buffer[i] = 0; + } else { + float multiplied = int16_buffer[i] * out->amplitude_ratio; + if (multiplied > INT16_MAX) int16_buffer[i] = INT16_MAX; + else if (multiplied < INT16_MIN) int16_buffer[i] = INT16_MIN; + else int16_buffer[i] = (int16_t)multiplied; + } } } @@ -526,7 +537,9 @@ static int refine_output_parameters(uint32_t *sample_rate, audio_format_t *forma static int refine_input_parameters(uint32_t *sample_rate, audio_format_t *format, audio_channel_mask_t *channel_mask) { - static const uint32_t sample_rates [] = {8000, 11025, 16000, 22050, 44100, 48000}; + static const uint32_t sample_rates [] = { + 8000, 11025, 16000, 22050, 44100, 48000 + }; static const int sample_rates_count = sizeof(sample_rates)/sizeof(uint32_t); bool inval = false; // Only PCM_16_bit is supported. If this is changed, stereo to mono drop @@ -1006,6 +1019,7 @@ static int adev_open_output_stream(struct audio_hw_device *dev, pthread_create(&out->worker_thread, NULL, out_write_worker, out); } + out->enabled_channels = BOTH_CHANNELS; if (address) { out->bus_address = calloc(strlen(address) + 1, sizeof(char)); strncpy(out->bus_address, address, strlen(address)); @@ -1017,6 +1031,10 @@ static int adev_open_output_stream(struct audio_hw_device *dev, .step_value = 100, }; out->amplitude_ratio = 1.0; + if (property_get_bool(PROP_KEY_SIMULATE_MULTI_ZONE_AUDIO, false)) { + out->enabled_channels = strstr(out->bus_address, "rear") + ? RIGHT_CHANNEL: LEFT_CHANNEL; + } } *stream_out = &out->stream; ALOGD("%s bus:%s", __func__, out->bus_address); diff --git a/emulator/audio/driver/audio_hw.h b/emulator/audio/driver/audio_hw.h index 21eda66..903a9b8 100644 --- a/emulator/audio/driver/audio_hw.h +++ b/emulator/audio/driver/audio_hw.h @@ -35,6 +35,12 @@ struct generic_audio_device { Hashmap *out_bus_stream_map; // Extended field. Constant after init }; +enum output_channel_enable { + LEFT_CHANNEL = 1, + RIGHT_CHANNEL = 1 << 1, + BOTH_CHANNELS = LEFT_CHANNEL | RIGHT_CHANNEL +}; + struct generic_stream_out { struct audio_stream_out stream; // Constant after init pthread_mutex_t lock; @@ -46,6 +52,7 @@ struct generic_stream_out { const char *bus_address; // Extended field. Constant after init struct audio_gain gain_stage; // Constant after init float amplitude_ratio; // Protected by this->lock + enum output_channel_enable enabled_channels; // Constant after init // Time & Position Keeping bool standby; // Protected by this->lock |