summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-07-30 01:00:53 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-07-30 01:00:53 +0000
commit3c151989f7233ba54431839e972ef8df78f8e821 (patch)
treee95b279d4f33873487bf0d9aa5b85b71db486159
parent05b7dcd60298fc287e1c30244113fbebac5b58b8 (diff)
parent6e55d92e22b5db66e43a604da1dd545a0454466e (diff)
downloadgoldfish-android13-d1-s2-release.tar.gz
Change-Id: Ib718a63902d83c78646d77e0b5c66d486bc1d485
-rw-r--r--audio/device_port_sink.cpp2
-rw-r--r--audio/entry.cpp3
-rw-r--r--audio/talsa.cpp46
-rw-r--r--audio/talsa.h2
-rw-r--r--init.ranchu.rc6
5 files changed, 32 insertions, 27 deletions
diff --git a/audio/device_port_sink.cpp b/audio/device_port_sink.cpp
index 668f2f07..e02c727d 100644
--- a/audio/device_port_sink.cpp
+++ b/audio/device_port_sink.cpp
@@ -83,7 +83,7 @@ struct TinyalsaSink : public DevicePortSink {
const size_t denominator = periodSettings.periodCount * cfg.base.sampleRateHz / inMs;
// integer division with rounding
- return (numerator + (denominator >> 1)) / denominator;
+ return (numerator + (denominator >> 1)) / denominator + talsa::pcmGetHostLatencyMs();
}
Result getPresentationPosition(uint64_t &frames, TimeSpec &ts) override {
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/talsa.cpp b/audio/talsa.cpp
index e538c4ed..b0f2e598 100644
--- a/audio/talsa.cpp
+++ b/audio/talsa.cpp
@@ -32,9 +32,8 @@ namespace {
struct mixer *gMixer0 = nullptr;
int gMixerRefcounter0 = 0;
std::mutex gMixerMutex;
-const PcmPeriodSettings kDefaultPcmPeriodSettings = { 4, 1 };
PcmPeriodSettings gPcmPeriodSettings;
-std::once_flag gPcmPeriodSettingsFlag;
+unsigned gPcmHostLatencyMs;
void mixerSetValueAll(struct mixer_ctl *ctl, int value) {
const unsigned int n = mixer_ctl_get_num_values(ctl);
@@ -99,38 +98,37 @@ bool mixerUnref(struct mixer *mixer) {
return mixerUnrefImpl(mixer, gMixer0, gMixerRefcounter0);
}
-bool initPcmPeriodSettings(PcmPeriodSettings *dst) {
- char prop_value[PROPERTY_VALUE_MAX];
+unsigned readUnsignedProperty(const char *propName, const unsigned defaultValue) {
+ char propValue[PROPERTY_VALUE_MAX];
- if (property_get("ro.hardware.audio.tinyalsa.period_count", prop_value, nullptr) < 0) {
- return false;
- }
- if (sscanf(prop_value, "%u", &dst->periodCount) != 1) {
- return false;
+ if (property_get(propName, propValue, nullptr) < 0) {
+ return defaultValue;
}
- if (property_get("ro.hardware.audio.tinyalsa.period_size_multiplier", prop_value, nullptr) < 0) {
- return false;
- }
- if (sscanf(prop_value, "%u", &dst->periodSizeMultiplier) != 1) {
- return false;
- }
-
- return true;
+ unsigned value;
+ return (sscanf(propValue, "%u", &value) == 1) ? value : defaultValue;
}
-
} // namespace
-PcmPeriodSettings pcmGetPcmPeriodSettings() {
- std::call_once(gPcmPeriodSettingsFlag, [](){
- if (!initPcmPeriodSettings(&gPcmPeriodSettings)) {
- gPcmPeriodSettings = kDefaultPcmPeriodSettings;
- }
- });
+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);
};
diff --git a/audio/talsa.h b/audio/talsa.h
index 1854f1e0..6f2883c3 100644
--- a/audio/talsa.h
+++ b/audio/talsa.h
@@ -33,7 +33,9 @@ struct PcmPeriodSettings {
unsigned periodSizeMultiplier;
};
+void init();
PcmPeriodSettings pcmGetPcmPeriodSettings();
+unsigned pcmGetHostLatencyMs();
typedef struct pcm pcm_t;
struct PcmDeleter { void operator()(pcm_t *x) const; };
diff --git a/init.ranchu.rc b/init.ranchu.rc
index 20b38a92..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
@@ -92,8 +96,6 @@ on boot
chown root system /sys/power/wake_lock
chown root system /sys/power/wake_unlock
setprop ro.hardware.audio.primary goldfish
- setprop ro.hardware.audio.tinyalsa.period_count 4
- setprop ro.hardware.audio.tinyalsa.period_size_multiplier 4
setprop wifi.interface wlan0
setprop wifi.direct.interface p2p-dev-wlan0