From 6653c935d2518a713587b3887ca09aa09ebfa7fd Mon Sep 17 00:00:00 2001 From: Andy Hung Date: Mon, 8 Jun 2015 13:27:48 -0700 Subject: Return DEAD_OBJECT if getTimestamp cannot restore track Bug: 21699132 Change-Id: I90443f8674ed949e2546048b231be75cd6fe6615 --- include/media/AudioTrack.h | 6 ++++++ media/libmedia/AudioTrack.cpp | 7 ++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/include/media/AudioTrack.h b/include/media/AudioTrack.h index b897f2a..e02f1b7 100644 --- a/include/media/AudioTrack.h +++ b/include/media/AudioTrack.h @@ -690,6 +690,12 @@ public: * overall hardware latency to physical output. In WOULD_BLOCK cases, * one might poll again, or use getPosition(), or use 0 position and * current time for the timestamp. + * DEAD_OBJECT if AudioFlinger dies or the output device changes and + * the track cannot be automatically restored. + * The application needs to recreate the AudioTrack + * because the audio device changed or AudioFlinger died. + * This typically occurs for direct or offload tracks + * or if mDoNotReconnect is true. * INVALID_OPERATION if called on a FastTrack, wrong state, or some other error. * * The timestamp parameter is undefined on return, if status is not NO_ERROR. diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp index 949bc21..b5d7614 100644 --- a/media/libmedia/AudioTrack.cpp +++ b/media/libmedia/AudioTrack.cpp @@ -2207,7 +2207,12 @@ status_t AudioTrack::getTimestamp(AudioTimestamp& timestamp) } if (mCblk->mFlags & CBLK_INVALID) { - restoreTrack_l("getTimestamp"); + const status_t status = restoreTrack_l("getTimestamp"); + if (status != OK) { + // per getTimestamp() API doc in header, we return DEAD_OBJECT here, + // recommending that the track be recreated. + return DEAD_OBJECT; + } } // The presented frame count must always lag behind the consumed frame count. -- cgit v1.1