Custom Anbox installation files & patches, including patched Android OS image file.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

68 lines
2.2 KiB

From c5b93022b4fdd15a56f238ad3b9928f2302f4d40 Mon Sep 17 00:00:00 2001
From: awakening <lucidsunlight@yandex.ru>
Date: Sun, 20 Jan 2019 22:20:27 +0700
Subject: [PATCH] Implement audio timing
---
android/audio/audio_hw.cpp | 8 ++++++++
src/anbox/platform/sdl/audio_sink.cpp | 17 ++++++++++++++++-
2 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/android/audio/audio_hw.cpp b/android/audio/audio_hw.cpp
index f44e73826..39b845669 100644
--- a/android/audio/audio_hw.cpp
+++ b/android/audio/audio_hw.cpp
@@ -180,6 +180,14 @@ static ssize_t out_write(struct audio_stream_out *stream, const void *buffer,
pthread_mutex_lock(&adev->lock);
if (out->fd >= 0)
bytes = write(out->fd, buffer, bytes);
+
+ // wait until session writes the data we sent,
+ // this will block if sink queue is full,
+ // acting as synchronization to time audio
+ int64_t arrived_us;
+ read(out->fd, &arrived_us, sizeof(arrived_us));
+ (void) arrived_us;
+
pthread_mutex_unlock(&adev->lock);
return bytes;
}
diff --git a/src/anbox/platform/sdl/audio_sink.cpp b/src/anbox/platform/sdl/audio_sink.cpp
index 118093de7..480fe1844 100644
--- a/src/anbox/platform/sdl/audio_sink.cpp
+++ b/src/anbox/platform/sdl/audio_sink.cpp
@@ -19,11 +19,12 @@
#include "anbox/logger.h"
#include <stdexcept>
+#include <time.h>
#include <boost/throw_exception.hpp>
namespace {
-const constexpr size_t max_queue_size{16};
+const constexpr size_t max_queue_size{1};
}
namespace anbox {
@@ -114,6 +115,20 @@ void AudioSink::write_data(const std::vector<std::uint8_t> &data) {
}
graphics::Buffer buffer{data.data(), data.data() + data.size()};
queue_.push_locked(std::move(buffer), l);
+
+ // Android side is waiting for "confirmation" that data arrived,
+ // if sink queue is full, Android audio thread will be blocked
+ // untill there's space available in the queue
+ //
+ // this acts as sychronization to time audio
+ //
+ // at the time of implementation,
+ // the data we send to Android is not actually used
+ timespec t;
+ clock_gettime(CLOCK_MONOTONIC, &t);
+ int64_t now_us = (t.tv_sec * 1000000000LL + t.tv_nsec) / 1000;
+
+ messenger_->send(reinterpret_cast<char*>(&now_us), sizeof(now_us));
}
} // namespace sdl
} // namespace platform