summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-08-13 19:50:56 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-08-13 19:50:56 +0000
commitac4a3e21bad2e6d14c13fb7fcae113b8ec27f5f0 (patch)
treedba96ccfe9e373b446ff5ec53f0b07dbdfcb4be3
parentf68d231a52d6b7b00c5b80cd68a04d6cb2a66816 (diff)
parent953bde8f0103629d9d6219ddfe0f67a532c98c9d (diff)
downloadgoldfish-android13-mainline-adbd-release.tar.gz
Snap for 8944493 from 953bde8f0103629d9d6219ddfe0f67a532c98c9d to mainline-adbd-releaseaml_adb_331011050aml_adb_331011040android13-mainline-adbd-release
Change-Id: I87295ebb6d70e9e365b7f429169662e916394ded
-rw-r--r--64bitonly/product/emulator64_vendor.mk5
-rw-r--r--64bitonly/product/vendor.mk2
-rw-r--r--audio/device_port_sink.cpp31
-rw-r--r--audio/device_port_sink.h1
-rw-r--r--audio/entry.cpp3
-rw-r--r--audio/stream_in.cpp2
-rw-r--r--audio/stream_out.cpp23
-rw-r--r--audio/talsa.cpp44
-rw-r--r--audio/talsa.h12
-rwxr-xr-xemu64x/BoardConfig.mk6
-rw-r--r--fvp.mk2
-rw-r--r--init.ranchu.rc4
-rw-r--r--vendor.mk4
13 files changed, 122 insertions, 17 deletions
diff --git a/64bitonly/product/emulator64_vendor.mk b/64bitonly/product/emulator64_vendor.mk
index 27dc826e..37c2659e 100644
--- a/64bitonly/product/emulator64_vendor.mk
+++ b/64bitonly/product/emulator64_vendor.mk
@@ -44,6 +44,11 @@ $(call inherit-product-if-exists, device/generic/goldfish/64bitonly/product/vend
#PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \
#config.disable_location=true
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.has_wide_color_display=false
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.has_HDR_display=false
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.use_color_management=false
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.protected_contents=false
+
# enable Google-specific location features,
# like NetworkLocationProvider and LocationCollector
PRODUCT_SYSTEM_EXT_PROPERTIES += \
diff --git a/64bitonly/product/vendor.mk b/64bitonly/product/vendor.mk
index 3216be34..d240b5de 100644
--- a/64bitonly/product/vendor.mk
+++ b/64bitonly/product/vendor.mk
@@ -187,7 +187,7 @@ endif
ifneq ($(EMULATOR_VENDOR_NO_SOUND),true)
PRODUCT_PACKAGES += \
android.hardware.audio.service \
- android.hardware.audio@7.0-impl.ranchu \
+ android.hardware.audio@7.1-impl.ranchu \
android.hardware.soundtrigger@2.2-impl.ranchu \
android.hardware.audio.effect@7.0-impl \
diff --git a/audio/device_port_sink.cpp b/audio/device_port_sink.cpp
index 3936805d..e02c727d 100644
--- a/audio/device_port_sink.cpp
+++ b/audio/device_port_sink.cpp
@@ -75,6 +75,17 @@ struct TinyalsaSink : public DevicePortSink {
mConsumeThread.join();
}
+ static int getLatencyMs(const AudioConfig &cfg) {
+ constexpr size_t inMs = 1000;
+ const talsa::PcmPeriodSettings periodSettings =
+ talsa::pcmGetPcmPeriodSettings();
+ const size_t numerator = periodSettings.periodSizeMultiplier * cfg.frameCount;
+ const size_t denominator = periodSettings.periodCount * cfg.base.sampleRateHz / inMs;
+
+ // integer division with rounding
+ return (numerator + (denominator >> 1)) / denominator + talsa::pcmGetHostLatencyMs();
+ }
+
Result getPresentationPosition(uint64_t &frames, TimeSpec &ts) override {
const AutoMutex lock(mFrameCountersMutex);
@@ -244,6 +255,10 @@ struct NullSink : public DevicePortSink {
, mInitialFrames(frames)
, mFrames(frames) {}
+ static int getLatencyMs(const AudioConfig &) {
+ return 1;
+ }
+
Result getPresentationPosition(uint64_t &frames, TimeSpec &ts) override {
const AutoMutex lock(mFrameCountersMutex);
@@ -377,6 +392,22 @@ nullsink:
return NullSink::create(cfg, readerBufferSizeHint, frames);
}
+int DevicePortSink::getLatencyMs(const DeviceAddress &address, const AudioConfig &cfg) {
+ switch (xsd::stringToAudioDevice(address.deviceType)) {
+ default:
+ ALOGW("%s:%d unsupported device: '%s'", __func__, __LINE__, address.deviceType.c_str());
+ return FAILURE(-1);
+
+ case xsd::AudioDevice::AUDIO_DEVICE_OUT_DEFAULT:
+ case xsd::AudioDevice::AUDIO_DEVICE_OUT_SPEAKER:
+ return TinyalsaSink::getLatencyMs(cfg);
+
+ case xsd::AudioDevice::AUDIO_DEVICE_OUT_TELEPHONY_TX:
+ case xsd::AudioDevice::AUDIO_DEVICE_OUT_BUS:
+ return NullSink::getLatencyMs(cfg);
+ }
+}
+
bool DevicePortSink::validateDeviceAddress(const DeviceAddress& address) {
switch (xsd::stringToAudioDevice(address.deviceType)) {
default:
diff --git a/audio/device_port_sink.h b/audio/device_port_sink.h
index 0276b25a..9e9e3c5a 100644
--- a/audio/device_port_sink.h
+++ b/audio/device_port_sink.h
@@ -40,6 +40,7 @@ struct DevicePortSink {
const hidl_vec<AudioInOutFlag> &,
uint64_t &frames);
+ static int getLatencyMs(const DeviceAddress &, const AudioConfig &);
static bool validateDeviceAddress(const DeviceAddress &);
};
diff --git a/audio/entry.cpp b/audio/entry.cpp
index d11c620d..1f070448 100644
--- a/audio/entry.cpp
+++ b/audio/entry.cpp
@@ -15,11 +15,14 @@
*/
#include "device_factory.h"
+#include "talsa.h"
using android::hardware::audio::CPP_VERSION::IDevicesFactory;
using android::hardware::audio::CPP_VERSION::implementation::DevicesFactory;
+namespace talsa = android::hardware::audio::CPP_VERSION::implementation::talsa;
extern "C" IDevicesFactory* HIDL_FETCH_IDevicesFactory(const char* name) {
(void)name;
+ talsa::init();
return new DevicesFactory();
}
diff --git a/audio/stream_in.cpp b/audio/stream_in.cpp
index 7148e52f..50c89e82 100644
--- a/audio/stream_in.cpp
+++ b/audio/stream_in.cpp
@@ -294,7 +294,7 @@ Return<void> StreamIn::getParameters(const hidl_vec<ParameterValue>& context,
const hidl_vec<hidl_string>& keys,
getParameters_cb _hidl_cb) {
(void)context;
- _hidl_cb((keys.size() > 0) ? FAILURE(Result::NOT_SUPPORTED) : Result::OK, {});
+ _hidl_cb((keys.size() > 0) ? Result::NOT_SUPPORTED : Result::OK, {});
return Void();
}
diff --git a/audio/stream_out.cpp b/audio/stream_out.cpp
index 0c8e518f..ecf5f2e4 100644
--- a/audio/stream_out.cpp
+++ b/audio/stream_out.cpp
@@ -212,8 +212,16 @@ struct WriteThread : public IOThread {
IStreamOut::WriteStatus doGetLatency() {
IStreamOut::WriteStatus status;
- status.retval = Result::OK;
- status.reply.latencyMs = mStream->getLatency();
+ const int latencyMs =
+ DevicePortSink::getLatencyMs(mStream->getDeviceAddress(),
+ mStream->getAudioConfig());
+
+ if (latencyMs >= 0) {
+ status.retval = Result::OK;
+ status.reply.latencyMs = latencyMs;
+ } else {
+ status.retval = Result::INVALID_STATE;
+ }
return status;
}
@@ -302,7 +310,7 @@ Return<void> StreamOut::getParameters(const hidl_vec<ParameterValue>& context,
const hidl_vec<hidl_string>& keys,
getParameters_cb _hidl_cb) {
(void)context;
- _hidl_cb((keys.size() > 0) ? FAILURE(Result::NOT_SUPPORTED) : Result::OK, {});
+ _hidl_cb((keys.size() > 0) ? Result::NOT_SUPPORTED : Result::OK, {});
return Void();
}
@@ -358,7 +366,10 @@ Return<void> StreamOut::getMmapPosition(getMmapPosition_cb _hidl_cb) {
}
Return<uint32_t> StreamOut::getLatency() {
- return mCommon.getFrameCount() * 1000 / mCommon.getSampleRate();
+ const int latencyMs = DevicePortSink::getLatencyMs(getDeviceAddress(), getAudioConfig());
+
+ return (latencyMs >= 0) ? latencyMs :
+ (mCommon.getFrameCount() * 1000 / mCommon.getSampleRate());
}
Return<Result> StreamOut::setVolume(float left, float right) {
@@ -375,7 +386,7 @@ Return<Result> StreamOut::setVolume(float left, float right) {
Return<Result> StreamOut::updateSourceMetadata(const SourceMetadata& sourceMetadata) {
(void)sourceMetadata;
- return FAILURE(Result::NOT_SUPPORTED);
+ return Result::NOT_SUPPORTED;
}
Return<void> StreamOut::prepareForWriting(uint32_t frameSize,
@@ -429,7 +440,7 @@ Return<Result> StreamOut::clearCallback() {
Return<Result> StreamOut::setEventCallback(const sp<IStreamOutEventCallback>& callback) {
(void)callback;
- return FAILURE(Result::NOT_SUPPORTED);
+ return Result::NOT_SUPPORTED;
}
Return<void> StreamOut::supportsPauseAndResume(supportsPauseAndResume_cb _hidl_cb) {
diff --git a/audio/talsa.cpp b/audio/talsa.cpp
index 4bc0c4f6..b0f2e598 100644
--- a/audio/talsa.cpp
+++ b/audio/talsa.cpp
@@ -15,6 +15,7 @@
*/
#include <mutex>
+#include <cutils/properties.h>
#include <log/log.h>
#include "talsa.h"
#include "debug.h"
@@ -31,6 +32,8 @@ namespace {
struct mixer *gMixer0 = nullptr;
int gMixerRefcounter0 = 0;
std::mutex gMixerMutex;
+PcmPeriodSettings gPcmPeriodSettings;
+unsigned gPcmHostLatencyMs;
void mixerSetValueAll(struct mixer_ctl *ctl, int value) {
const unsigned int n = mixer_ctl_get_num_values(ctl);
@@ -95,8 +98,37 @@ bool mixerUnref(struct mixer *mixer) {
return mixerUnrefImpl(mixer, gMixer0, gMixerRefcounter0);
}
+unsigned readUnsignedProperty(const char *propName, const unsigned defaultValue) {
+ char propValue[PROPERTY_VALUE_MAX];
+
+ if (property_get(propName, propValue, nullptr) < 0) {
+ return defaultValue;
+ }
+
+ unsigned value;
+ return (sscanf(propValue, "%u", &value) == 1) ? value : defaultValue;
+}
} // namespace
+void init() {
+ gPcmPeriodSettings.periodCount =
+ readUnsignedProperty("ro.hardware.audio.tinyalsa.period_count", 4);
+
+ gPcmPeriodSettings.periodSizeMultiplier =
+ readUnsignedProperty("ro.hardware.audio.tinyalsa.period_size_multiplier", 1);
+
+ gPcmHostLatencyMs =
+ readUnsignedProperty("ro.hardware.audio.tinyalsa.host_latency_ms", 0);
+}
+
+PcmPeriodSettings pcmGetPcmPeriodSettings() {
+ return gPcmPeriodSettings;
+}
+
+unsigned pcmGetHostLatencyMs() {
+ return gPcmHostLatencyMs;
+}
+
void PcmDeleter::operator()(pcm_t *x) const {
LOG_ALWAYS_FATAL_IF(::pcm_close(x) != 0);
};
@@ -107,14 +139,18 @@ std::unique_ptr<pcm_t, PcmDeleter> pcmOpen(const unsigned int dev,
const size_t sampleRateHz,
const size_t frameCount,
const bool isOut) {
+ const PcmPeriodSettings periodSettings = pcmGetPcmPeriodSettings();
+
struct pcm_config pcm_config;
memset(&pcm_config, 0, sizeof(pcm_config));
pcm_config.channels = nChannels;
pcm_config.rate = sampleRateHz;
- pcm_config.period_count = 8; // Approx interrupts per buffer
+ // Approx interrupts per buffer
+ pcm_config.period_count = periodSettings.periodCount;
// Approx frames between interrupts
- pcm_config.period_size = 2 * frameCount / pcm_config.period_count;
+ pcm_config.period_size =
+ periodSettings.periodSizeMultiplier * frameCount / periodSettings.periodCount;
pcm_config.format = PCM_FORMAT_S16_LE;
PcmPtr pcm =
@@ -125,8 +161,8 @@ std::unique_ptr<pcm_t, PcmDeleter> pcmOpen(const unsigned int dev,
return pcm;
} else {
ALOGE("%s:%d pcm_open failed for nChannels=%u sampleRateHz=%zu "
- "frameCount=%zu isOut=%d with %s", __func__, __LINE__,
- nChannels, sampleRateHz, frameCount, isOut,
+ "period_count=%d period_size=%d isOut=%d with %s", __func__, __LINE__,
+ nChannels, sampleRateHz, pcm_config.period_count, pcm_config.period_size, isOut,
pcm_get_error(pcm.get()));
return FAILURE(nullptr);
}
diff --git a/audio/talsa.h b/audio/talsa.h
index c77b08f3..6f2883c3 100644
--- a/audio/talsa.h
+++ b/audio/talsa.h
@@ -28,10 +28,20 @@ namespace talsa {
constexpr unsigned int kPcmDevice = 0;
constexpr unsigned int kPcmCard = 0;
+struct PcmPeriodSettings {
+ unsigned periodCount;
+ unsigned periodSizeMultiplier;
+};
+
+void init();
+PcmPeriodSettings pcmGetPcmPeriodSettings();
+unsigned pcmGetHostLatencyMs();
+
typedef struct pcm pcm_t;
struct PcmDeleter { void operator()(pcm_t *x) const; };
typedef std::unique_ptr<pcm_t, PcmDeleter> PcmPtr;
-PcmPtr pcmOpen(unsigned int dev, unsigned int card, unsigned int nChannels, size_t sampleRateHz, size_t frameCount, bool isOut);
+PcmPtr pcmOpen(unsigned int dev, unsigned int card, unsigned int nChannels,
+ size_t sampleRateHz, size_t frameCount, bool isOut);
bool pcmPrepare(pcm_t *pcm);
bool pcmStart(pcm_t *pcm);
bool pcmStop(pcm_t *pcm);
diff --git a/emu64x/BoardConfig.mk b/emu64x/BoardConfig.mk
index c6afd7af..f4ab385f 100755
--- a/emu64x/BoardConfig.mk
+++ b/emu64x/BoardConfig.mk
@@ -19,12 +19,16 @@ TARGET_ARCH := x86_64
TARGET_ARCH_VARIANT := x86_64
TARGET_2ND_ARCH_VARIANT := x86_64
-BOARD_DO_NOT_STRIP_VENDOR_MODULES := true
+BUILD_BROKEN_DUP_RULES := true
TARGET_PRELINK_MODULE := false
+
include build/make/target/board/BoardConfigGsiCommon.mk
include build/make/target/board/BoardConfigEmuCommon.mk
+# the settings differ from BoardConfigMainlineCommon.mk
+BOARD_USES_SYSTEM_OTHER_ODEX :=
+
BOARD_USERDATAIMAGE_PARTITION_SIZE := 576716800
BOARD_SEPOLICY_DIRS += device/generic/goldfish/sepolicy/x86
diff --git a/fvp.mk b/fvp.mk
index 888d9f00..75ddabd8 100644
--- a/fvp.mk
+++ b/fvp.mk
@@ -113,7 +113,7 @@ PRODUCT_REQUIRES_INSECURE_EXECMEM_FOR_SWIFTSHADER := true
# It's almost always faster to dexopt on the host even in eng builds.
WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY := false
-DEVICE_MANIFEST_FILE := device/generic/goldfish/fvpbase/manifest.xml
+DEVICE_MANIFEST_FILE += device/generic/goldfish/fvpbase/manifest.xml
# Use a multilib setup (see fvpbase/BoardConfig.mk).
FVP_MULTILIB_BUILD := true
diff --git a/init.ranchu.rc b/init.ranchu.rc
index ffcebbaa..870947e8 100644
--- a/init.ranchu.rc
+++ b/init.ranchu.rc
@@ -57,6 +57,10 @@ on init
chmod 0664 /dev/cpuctl/top-app/tasks
chmod 0664 /dev/cpuctl/rt/tasks
+ setprop ro.hardware.audio.tinyalsa.period_count 4
+ setprop ro.hardware.audio.tinyalsa.period_size_multiplier 4
+ setprop ro.hardware.audio.tinyalsa.host_latency_ms 30
+
start qemu-props
on post-fs-data
diff --git a/vendor.mk b/vendor.mk
index b1bb3abe..d0ee91af 100644
--- a/vendor.mk
+++ b/vendor.mk
@@ -29,7 +29,7 @@ PRODUCT_SYSTEM_EXT_PROPERTIES += ro.lockscreen.disable.default=1
DISABLE_RILD_OEM_HOOK := true
-DEVICE_MANIFEST_FILE := device/generic/goldfish/manifest.xml
+DEVICE_MANIFEST_FILE += device/generic/goldfish/manifest.xml
PRODUCT_SOONG_NAMESPACES += hardware/google/camera
PRODUCT_SOONG_NAMESPACES += hardware/google/camera/devices/EmulatedCamera
@@ -185,7 +185,7 @@ endif
ifneq ($(EMULATOR_VENDOR_NO_SOUND),true)
PRODUCT_PACKAGES += \
android.hardware.audio.service \
- android.hardware.audio@7.0-impl.ranchu \
+ android.hardware.audio@7.1-impl.ranchu \
android.hardware.soundtrigger@2.2-impl.ranchu \
android.hardware.audio.effect@7.0-impl \