Implement server side playback timestamps with 64 bit accuracy
Provide server timestamps if the HAL doesn't provide it.
Provide monotonic - boottime translation.
Integrate record timestamps and playback timestamps together.
Bug: 17472992
Bug: 22871200
Bug: 26400089
Bug: 26682703
Change-Id: If1974f94232fcce7ba0bbcdf63d9e54ed51918ff
diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp
index 33dcc57..f0074b6 100644
--- a/media/libmedia/AudioTrack.cpp
+++ b/media/libmedia/AudioTrack.cpp
@@ -2202,7 +2202,7 @@
// To avoid a race, read the presented frames first. This ensures that presented <= consumed.
status_t status;
- if (!(mFlags & AUDIO_OUTPUT_FLAG_FAST)) {
+ if (isOffloadedOrDirect_l()) {
// use Binder to get timestamp
status = mAudioTrack->getTimestamp(timestamp);
} else {
diff --git a/media/libnbaio/AudioStreamInSource.cpp b/media/libnbaio/AudioStreamInSource.cpp
index 286e0eb..2dc3050 100644
--- a/media/libnbaio/AudioStreamInSource.cpp
+++ b/media/libnbaio/AudioStreamInSource.cpp
@@ -53,7 +53,7 @@
return NBAIO_Source::negotiate(offers, numOffers, counterOffers, numCounterOffers);
}
-size_t AudioStreamInSource::framesOverrun()
+int64_t AudioStreamInSource::framesOverrun()
{
uint32_t framesOverrun = mStream->get_input_frames_lost(mStream);
if (framesOverrun > 0) {
diff --git a/media/libnbaio/AudioStreamOutSink.cpp b/media/libnbaio/AudioStreamOutSink.cpp
index 3f4e0bb..ee44678 100644
--- a/media/libnbaio/AudioStreamOutSink.cpp
+++ b/media/libnbaio/AudioStreamOutSink.cpp
@@ -66,18 +66,20 @@
return ret;
}
-status_t AudioStreamOutSink::getTimestamp(AudioTimestamp& timestamp)
+status_t AudioStreamOutSink::getTimestamp(ExtendedTimestamp ×tamp)
{
if (mStream->get_presentation_position == NULL) {
return INVALID_OPERATION;
}
- // FIXME position64 won't be needed after AudioTimestamp.mPosition is changed to uint64_t
+
uint64_t position64;
- int ok = mStream->get_presentation_position(mStream, &position64, ×tamp.mTime);
- if (ok != 0) {
+ struct timespec time;
+ if (mStream->get_presentation_position(mStream, &position64, &time) != OK) {
return INVALID_OPERATION;
}
- timestamp.mPosition = position64;
+ timestamp.mPosition[ExtendedTimestamp::LOCATION_KERNEL] = position64;
+ timestamp.mTimeNs[ExtendedTimestamp::LOCATION_KERNEL] =
+ time.tv_sec * 1000000000LL + time.tv_nsec;
return OK;
}
diff --git a/media/libnbaio/MonoPipe.cpp b/media/libnbaio/MonoPipe.cpp
index aef9834..8d1cb0f 100644
--- a/media/libnbaio/MonoPipe.cpp
+++ b/media/libnbaio/MonoPipe.cpp
@@ -183,9 +183,14 @@
return mIsShutdown;
}
-status_t MonoPipe::getTimestamp(AudioTimestamp& timestamp)
+status_t MonoPipe::getTimestamp(ExtendedTimestamp ×tamp)
{
- if (mTimestampObserver.poll(timestamp)) {
+ ExtendedTimestamp ets;
+ if (mTimestampObserver.poll(ets)) {
+ timestamp.mPosition[ExtendedTimestamp::LOCATION_KERNEL] =
+ ets.mPosition[ExtendedTimestamp::LOCATION_KERNEL];
+ timestamp.mTimeNs[ExtendedTimestamp::LOCATION_KERNEL] =
+ ets.mTimeNs[ExtendedTimestamp::LOCATION_KERNEL];
return OK;
}
return INVALID_OPERATION;
diff --git a/media/libnbaio/MonoPipeReader.cpp b/media/libnbaio/MonoPipeReader.cpp
index 7e09544..01dc524 100644
--- a/media/libnbaio/MonoPipeReader.cpp
+++ b/media/libnbaio/MonoPipeReader.cpp
@@ -72,7 +72,7 @@
return red;
}
-void MonoPipeReader::onTimestamp(const AudioTimestamp& timestamp)
+void MonoPipeReader::onTimestamp(const ExtendedTimestamp ×tamp)
{
mPipe->mTimestampMutator.push(timestamp);
}
diff --git a/media/libnbaio/SourceAudioBufferProvider.cpp b/media/libnbaio/SourceAudioBufferProvider.cpp
index dc01c0e..d58619f 100644
--- a/media/libnbaio/SourceAudioBufferProvider.cpp
+++ b/media/libnbaio/SourceAudioBufferProvider.cpp
@@ -112,12 +112,12 @@
return avail < 0 ? 0 : (size_t) avail;
}
-size_t SourceAudioBufferProvider::framesReleased() const
+int64_t SourceAudioBufferProvider::framesReleased() const
{
return mFramesReleased;
}
-void SourceAudioBufferProvider::onTimestamp(const AudioTimestamp& timestamp)
+void SourceAudioBufferProvider::onTimestamp(const ExtendedTimestamp ×tamp)
{
mSource->onTimestamp(timestamp);
}