diff options
author | Glenn Kasten <gkasten@google.com> | 2013-07-19 16:33:58 -0700 |
---|---|---|
committer | Glenn Kasten <gkasten@google.com> | 2013-08-28 17:24:58 -0700 |
commit | ce70374bf105f8a6160bf5dd70affea012b2a464 (patch) | |
tree | 60d2673b83bff3622e7e299974104e572656b5a6 | |
parent | e07f53720bcf543bcfe90c228a49c2a85a3fdb4c (diff) | |
download | frameworks_av-ce70374bf105f8a6160bf5dd70affea012b2a464.zip frameworks_av-ce70374bf105f8a6160bf5dd70affea012b2a464.tar.gz frameworks_av-ce70374bf105f8a6160bf5dd70affea012b2a464.tar.bz2 |
New AudioTrack C++ API for audio timestamps
This new API is intended to replace latency(), especially for A/V sync.
The application will receive periodic timestamp notifications. The period
is unspecified, but will likely be more frequent after a pause or stop,
set position, underrun, display on/off change, route change, or when audio
framework notices drift. It will be up to the higher level application
(e.g. Stagefright) to reconstruct a clock that updates more frequently.
The current latency() method doesn't indicate when latency changes
due to screen on/off state, route changes, etc.
Includes squahsed change-Id: I2082f8752040be0c234b1a6f1be2e269abf2ce7c
Dummy implementation of AudioTrack:getTimestamp()
Rename AudioTrack::Timestamp to AudioTimestamp.
Renaming and pulling up to a higher level allows more modules to use it.
Change-Id: Ibf7f6a207c3f8d8697f25ede2cd5200697fadb86
(cherry picked from commit dd69eb893867634fd169c03204a6ad7c74b351e7)
-rw-r--r-- | include/media/AudioTimestamp.h | 33 | ||||
-rw-r--r-- | include/media/AudioTrack.h | 16 | ||||
-rw-r--r-- | media/libmedia/AudioTrack.cpp | 5 |
3 files changed, 54 insertions, 0 deletions
diff --git a/include/media/AudioTimestamp.h b/include/media/AudioTimestamp.h new file mode 100644 index 0000000..c29c7e5 --- /dev/null +++ b/include/media/AudioTimestamp.h @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ANDROID_AUDIO_TIMESTAMP_H +#define ANDROID_AUDIO_TIMESTAMP_H + +#include <time.h> + +class AudioTimestamp { +public: + AudioTimestamp() : mPosition(0) { + mTime.tv_sec = 0; + mTime.tv_nsec = 0; + } + // FIXME change type to match android.media.AudioTrack + uint32_t mPosition; // a frame position in AudioTrack::getPosition() units + struct timespec mTime; // corresponding CLOCK_MONOTONIC when frame is expected to present +}; + +#endif // ANDROID_AUDIO_TIMESTAMP_H diff --git a/include/media/AudioTrack.h b/include/media/AudioTrack.h index ae92cdd..ebb7ef3 100644 --- a/include/media/AudioTrack.h +++ b/include/media/AudioTrack.h @@ -19,6 +19,7 @@ #include <cutils/sched_policy.h> #include <media/AudioSystem.h> +#include <media/AudioTimestamp.h> #include <media/IAudioTrack.h> #include <utils/threads.h> @@ -62,6 +63,9 @@ public: // voluntary invalidation by mediaserver, or mediaserver crash. EVENT_STREAM_END = 7, // Sent after all the buffers queued in AF and HW are played // back (after stop is called) + EVENT_NEW_TIMESTAMP = 8, // Delivered periodically and when there's a significant change + // in the mapping from frame position to presentation time. + // See AudioTimestamp for the information included with event. }; /* Client should declare Buffer on the stack and pass address to obtainBuffer() @@ -107,6 +111,8 @@ public: * - EVENT_NEW_POS: pointer to const uint32_t containing the new position in frames. * - EVENT_BUFFER_END: unused. * - EVENT_NEW_IAUDIOTRACK: unused. + * - EVENT_STREAM_END: unused. + * - EVENT_NEW_TIMESTAMP: pointer to const AudioTimestamp. */ typedef void (*callback_t)(int event, void* user, void *info); @@ -564,6 +570,16 @@ public: /* Get parameters */ String8 getParameters(const String8& keys); + /* Poll for a timestamp on demand. + * Use if EVENT_NEW_TIMESTAMP is not delivered often enough for your needs, + * or if you need to get the most recent timestamp outside of the event callback handler. + * Caution: calling this method too often may be inefficient; + * if you need a high resolution mapping between frame position and presentation time, + * consider implementing that at application level, based on the low resolution timestamps. + * Returns NO_ERROR if timestamp is valid. + */ + status_t getTimestamp(AudioTimestamp& timestamp); + protected: /* copying audio tracks is not allowed */ AudioTrack(const AudioTrack& other); diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp index dd0ec73..d90e733 100644 --- a/media/libmedia/AudioTrack.cpp +++ b/media/libmedia/AudioTrack.cpp @@ -1712,6 +1712,11 @@ status_t AudioTrack::setParameters(const String8& keyValuePairs) } } +status_t AudioTrack::getTimestamp(AudioTimestamp& timestamp) +{ + return INVALID_OPERATION; +} + String8 AudioTrack::getParameters(const String8& keys) { if (mOutput) { |