diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-08-13 19:50:56 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-08-13 19:50:56 +0000 |
commit | ac4a3e21bad2e6d14c13fb7fcae113b8ec27f5f0 (patch) | |
tree | dba96ccfe9e373b446ff5ec53f0b07dbdfcb4be3 | |
parent | f68d231a52d6b7b00c5b80cd68a04d6cb2a66816 (diff) | |
parent | 953bde8f0103629d9d6219ddfe0f67a532c98c9d (diff) | |
download | goldfish-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.mk | 5 | ||||
-rw-r--r-- | 64bitonly/product/vendor.mk | 2 | ||||
-rw-r--r-- | audio/device_port_sink.cpp | 31 | ||||
-rw-r--r-- | audio/device_port_sink.h | 1 | ||||
-rw-r--r-- | audio/entry.cpp | 3 | ||||
-rw-r--r-- | audio/stream_in.cpp | 2 | ||||
-rw-r--r-- | audio/stream_out.cpp | 23 | ||||
-rw-r--r-- | audio/talsa.cpp | 44 | ||||
-rw-r--r-- | audio/talsa.h | 12 | ||||
-rwxr-xr-x | emu64x/BoardConfig.mk | 6 | ||||
-rw-r--r-- | fvp.mk | 2 | ||||
-rw-r--r-- | init.ranchu.rc | 4 | ||||
-rw-r--r-- | vendor.mk | 4 |
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 @@ -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 @@ -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 \ |