|
|
- 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
|