• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 **
3 ** Copyright 2007, The Android Open Source Project
4 **
5 ** Licensed under the Apache License, Version 2.0 (the "License");
6 ** you may not use this file except in compliance with the License.
7 ** You may obtain a copy of the License at
8 **
9 **     http://www.apache.org/licenses/LICENSE-2.0
10 **
11 ** Unless required by applicable law or agreed to in writing, software
12 ** distributed under the License is distributed on an "AS IS" BASIS,
13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 ** See the License for the specific language governing permissions and
15 ** limitations under the License.
16 */
17 
18 //#define LOG_NDEBUG 0
19 #define LOG_TAG "AudioTrack"
20 
21 #include <inttypes.h>
22 #include <math.h>
23 #include <sys/resource.h>
24 #include <thread>
25 
26 #include <android/media/IAudioPolicyService.h>
27 #include <android-base/macros.h>
28 #include <android-base/stringprintf.h>
29 #include <audio_utils/clock.h>
30 #include <audio_utils/primitives.h>
31 #include <binder/IPCThreadState.h>
32 #include <media/AudioTrack.h>
33 #include <utils/Log.h>
34 #include <private/media/AudioTrackShared.h>
35 #include <processgroup/sched_policy.h>
36 #include <media/IAudioFlinger.h>
37 #include <media/AudioParameter.h>
38 #include <media/AudioResamplerPublic.h>
39 #include <media/AudioSystem.h>
40 #include <media/MediaMetricsItem.h>
41 #include <media/TypeConverter.h>
42 
43 #define WAIT_PERIOD_MS                  10
44 #define WAIT_STREAM_END_TIMEOUT_SEC     120
45 static const int kMaxLoopCountNotifications = 32;
46 
47 using ::android::aidl_utils::statusTFromBinderStatus;
48 using ::android::base::StringPrintf;
49 
50 namespace android {
51 // ---------------------------------------------------------------------------
52 
53 using media::VolumeShaper;
54 using android::content::AttributionSourceState;
55 
56 // TODO: Move to a separate .h
57 
58 template <typename T>
min(const T & x,const T & y)59 static inline const T &min(const T &x, const T &y) {
60     return x < y ? x : y;
61 }
62 
63 template <typename T>
max(const T & x,const T & y)64 static inline const T &max(const T &x, const T &y) {
65     return x > y ? x : y;
66 }
67 
framesToNanoseconds(ssize_t frames,uint32_t sampleRate,float speed)68 static inline nsecs_t framesToNanoseconds(ssize_t frames, uint32_t sampleRate, float speed)
69 {
70     return ((double)frames * 1000000000) / ((double)sampleRate * speed);
71 }
72 
convertTimespecToUs(const struct timespec & tv)73 static int64_t convertTimespecToUs(const struct timespec &tv)
74 {
75     return tv.tv_sec * 1000000LL + tv.tv_nsec / 1000;
76 }
77 
78 // TODO move to audio_utils.
convertNsToTimespec(int64_t ns)79 static inline struct timespec convertNsToTimespec(int64_t ns) {
80     struct timespec tv;
81     tv.tv_sec = static_cast<time_t>(ns / NANOS_PER_SECOND);
82     tv.tv_nsec = static_cast<int64_t>(ns % NANOS_PER_SECOND);
83     return tv;
84 }
85 
86 // current monotonic time in microseconds.
getNowUs()87 static int64_t getNowUs()
88 {
89     struct timespec tv;
90     (void) clock_gettime(CLOCK_MONOTONIC, &tv);
91     return convertTimespecToUs(tv);
92 }
93 
94 // FIXME: we don't use the pitch setting in the time stretcher (not working);
95 // instead we emulate it using our sample rate converter.
96 static const bool kFixPitch = true; // enable pitch fix
adjustSampleRate(uint32_t sampleRate,float pitch)97 static inline uint32_t adjustSampleRate(uint32_t sampleRate, float pitch)
98 {
99     return kFixPitch ? (sampleRate * pitch + 0.5) : sampleRate;
100 }
101 
adjustSpeed(float speed,float pitch)102 static inline float adjustSpeed(float speed, float pitch)
103 {
104     return kFixPitch ? speed / max(pitch, AUDIO_TIMESTRETCH_PITCH_MIN_DELTA) : speed;
105 }
106 
adjustPitch(float pitch)107 static inline float adjustPitch(float pitch)
108 {
109     return kFixPitch ? AUDIO_TIMESTRETCH_PITCH_NORMAL : pitch;
110 }
111 
112 // static
getMinFrameCount(size_t * frameCount,audio_stream_type_t streamType,uint32_t sampleRate)113 status_t AudioTrack::getMinFrameCount(
114         size_t* frameCount,
115         audio_stream_type_t streamType,
116         uint32_t sampleRate)
117 {
118     if (frameCount == NULL) {
119         return BAD_VALUE;
120     }
121 
122     // FIXME handle in server, like createTrack_l(), possible missing info:
123     //          audio_io_handle_t output
124     //          audio_format_t format
125     //          audio_channel_mask_t channelMask
126     //          audio_output_flags_t flags (FAST)
127     uint32_t afSampleRate;
128     status_t status;
129     status = AudioSystem::getOutputSamplingRate(&afSampleRate, streamType);
130     if (status != NO_ERROR) {
131         ALOGE("%s(): Unable to query output sample rate for stream type %d; status %d",
132                 __func__, streamType, status);
133         return status;
134     }
135     size_t afFrameCount;
136     status = AudioSystem::getOutputFrameCount(&afFrameCount, streamType);
137     if (status != NO_ERROR) {
138         ALOGE("%s(): Unable to query output frame count for stream type %d; status %d",
139                 __func__, streamType, status);
140         return status;
141     }
142     uint32_t afLatency;
143     status = AudioSystem::getOutputLatency(&afLatency, streamType);
144     if (status != NO_ERROR) {
145         ALOGE("%s(): Unable to query output latency for stream type %d; status %d",
146                 __func__, streamType, status);
147         return status;
148     }
149 
150     // When called from createTrack, speed is 1.0f (normal speed).
151     // This is rechecked again on setting playback rate (TODO: on setting sample rate, too).
152     *frameCount = AudioSystem::calculateMinFrameCount(afLatency, afFrameCount, afSampleRate,
153                                               sampleRate, 1.0f /*, 0 notificationsPerBufferReq*/);
154 
155     // The formula above should always produce a non-zero value under normal circumstances:
156     // AudioTrack.SAMPLE_RATE_HZ_MIN <= sampleRate <= AudioTrack.SAMPLE_RATE_HZ_MAX.
157     // Return error in the unlikely event that it does not, as that's part of the API contract.
158     if (*frameCount == 0) {
159         ALOGE("%s(): failed for streamType %d, sampleRate %u",
160                 __func__, streamType, sampleRate);
161         return BAD_VALUE;
162     }
163     ALOGV("%s(): getMinFrameCount=%zu: afFrameCount=%zu, afSampleRate=%u, afLatency=%u",
164             __func__, *frameCount, afFrameCount, afSampleRate, afLatency);
165     return NO_ERROR;
166 }
167 
168 // static
isDirectOutputSupported(const audio_config_base_t & config,const audio_attributes_t & attributes)169 bool AudioTrack::isDirectOutputSupported(const audio_config_base_t& config,
170                                          const audio_attributes_t& attributes) {
171     ALOGV("%s()", __FUNCTION__);
172     const sp<media::IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
173     if (aps == 0) return false;
174 
175     auto result = [&]() -> ConversionResult<bool> {
176         media::audio::common::AudioConfigBase configAidl = VALUE_OR_RETURN(
177                 legacy2aidl_audio_config_base_t_AudioConfigBase(config, false /*isInput*/));
178         media::AudioAttributesInternal attributesAidl = VALUE_OR_RETURN(
179                 legacy2aidl_audio_attributes_t_AudioAttributesInternal(attributes));
180         bool retAidl;
181         RETURN_IF_ERROR(aidl_utils::statusTFromBinderStatus(
182                 aps->isDirectOutputSupported(configAidl, attributesAidl, &retAidl)));
183         return retAidl;
184     }();
185     return result.value_or(false);
186 }
187 
188 // ---------------------------------------------------------------------------
189 
gather(const AudioTrack * track)190 void AudioTrack::MediaMetrics::gather(const AudioTrack *track)
191 {
192     // only if we're in a good state...
193     // XXX: shall we gather alternative info if failing?
194     const status_t lstatus = track->initCheck();
195     if (lstatus != NO_ERROR) {
196         ALOGD("%s(): no metrics gathered, track status=%d", __func__, (int) lstatus);
197         return;
198     }
199 
200 #define MM_PREFIX "android.media.audiotrack." // avoid cut-n-paste errors.
201 
202     // Do not change this without changing the MediaMetricsService side.
203     // Java API 28 entries, do not change.
204     mMetricsItem->setCString(MM_PREFIX "streamtype", toString(track->streamType()).c_str());
205     mMetricsItem->setCString(MM_PREFIX "type",
206             toString(track->mAttributes.content_type).c_str());
207     mMetricsItem->setCString(MM_PREFIX "usage", toString(track->mAttributes.usage).c_str());
208 
209     // Non-API entries, these can change due to a Java string mistake.
210     mMetricsItem->setInt32(MM_PREFIX "sampleRate", (int32_t)track->mSampleRate);
211     mMetricsItem->setInt64(MM_PREFIX "channelMask", (int64_t)track->mChannelMask);
212     // Non-API entries, these can change.
213     mMetricsItem->setInt32(MM_PREFIX "portId", (int32_t)track->mPortId);
214     mMetricsItem->setCString(MM_PREFIX "encoding", toString(track->mFormat).c_str());
215     mMetricsItem->setInt32(MM_PREFIX "frameCount", (int32_t)track->mFrameCount);
216     mMetricsItem->setCString(MM_PREFIX "attributes", toString(track->mAttributes).c_str());
217     mMetricsItem->setCString(MM_PREFIX "logSessionId", track->mLogSessionId.c_str());
218     mMetricsItem->setInt32(MM_PREFIX "underrunFrames", (int32_t)track->getUnderrunFrames());
219 }
220 
221 // hand the user a snapshot of the metrics.
getMetrics(mediametrics::Item * & item)222 status_t AudioTrack::getMetrics(mediametrics::Item * &item)
223 {
224     mMediaMetrics.gather(this);
225     mediametrics::Item *tmp = mMediaMetrics.dup();
226     if (tmp == nullptr) {
227         return BAD_VALUE;
228     }
229     item = tmp;
230     return NO_ERROR;
231 }
232 
AudioTrack()233 AudioTrack::AudioTrack() : AudioTrack(AttributionSourceState())
234 {
235 }
236 
AudioTrack(const AttributionSourceState & attributionSource)237 AudioTrack::AudioTrack(const AttributionSourceState& attributionSource)
238     : mStatus(NO_INIT),
239       mState(STATE_STOPPED),
240       mPreviousPriority(ANDROID_PRIORITY_NORMAL),
241       mPreviousSchedulingGroup(SP_DEFAULT),
242       mPausedPosition(0),
243       mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE),
244       mRoutedDeviceId(AUDIO_PORT_HANDLE_NONE),
245       mClientAttributionSource(attributionSource),
246       mAudioTrackCallback(new AudioTrackCallback())
247 {
248     mAttributes.content_type = AUDIO_CONTENT_TYPE_UNKNOWN;
249     mAttributes.usage = AUDIO_USAGE_UNKNOWN;
250     mAttributes.flags = AUDIO_FLAG_NONE;
251     strcpy(mAttributes.tags, "");
252 }
253 
AudioTrack(audio_stream_type_t streamType,uint32_t sampleRate,audio_format_t format,audio_channel_mask_t channelMask,size_t frameCount,audio_output_flags_t flags,const wp<IAudioTrackCallback> & callback,int32_t notificationFrames,audio_session_t sessionId,transfer_type transferType,const audio_offload_info_t * offloadInfo,const AttributionSourceState & attributionSource,const audio_attributes_t * pAttributes,bool doNotReconnect,float maxRequiredSpeed,audio_port_handle_t selectedDeviceId)254 AudioTrack::AudioTrack(
255         audio_stream_type_t streamType,
256         uint32_t sampleRate,
257         audio_format_t format,
258         audio_channel_mask_t channelMask,
259         size_t frameCount,
260         audio_output_flags_t flags,
261         const wp<IAudioTrackCallback> & callback,
262         int32_t notificationFrames,
263         audio_session_t sessionId,
264         transfer_type transferType,
265         const audio_offload_info_t *offloadInfo,
266         const AttributionSourceState& attributionSource,
267         const audio_attributes_t* pAttributes,
268         bool doNotReconnect,
269         float maxRequiredSpeed,
270         audio_port_handle_t selectedDeviceId)
271     : mStatus(NO_INIT),
272       mState(STATE_STOPPED),
273       mPreviousPriority(ANDROID_PRIORITY_NORMAL),
274       mPreviousSchedulingGroup(SP_DEFAULT),
275       mPausedPosition(0),
276       mAudioTrackCallback(new AudioTrackCallback())
277 {
278     mAttributes = AUDIO_ATTRIBUTES_INITIALIZER;
279 
280     // make_unique does not aggregate init until c++20
281     mSetParams = std::unique_ptr<SetParams>{
282             new SetParams{streamType, sampleRate, format, channelMask, frameCount, flags, callback,
283                           notificationFrames, 0 /*sharedBuffer*/, false /*threadCanCallJava*/,
284                           sessionId, transferType, offloadInfo, attributionSource, pAttributes,
285                           doNotReconnect, maxRequiredSpeed, selectedDeviceId}};
286 }
287 
288 namespace {
289     class LegacyCallbackWrapper : public AudioTrack::IAudioTrackCallback {
290       const AudioTrack::legacy_callback_t mCallback;
291       void * const mData;
292       public:
LegacyCallbackWrapper(AudioTrack::legacy_callback_t callback,void * user)293         LegacyCallbackWrapper(AudioTrack::legacy_callback_t callback, void* user)
294             : mCallback(callback), mData(user) {}
onMoreData(const AudioTrack::Buffer & buffer)295         size_t onMoreData(const AudioTrack::Buffer & buffer) override {
296           AudioTrack::Buffer copy = buffer;
297           mCallback(AudioTrack::EVENT_MORE_DATA, mData, static_cast<void*>(&copy));
298           return copy.size();
299         }
onUnderrun()300         void onUnderrun() override {
301             mCallback(AudioTrack::EVENT_UNDERRUN, mData, nullptr);
302         }
onLoopEnd(int32_t loopsRemaining)303         void onLoopEnd(int32_t loopsRemaining) override {
304             mCallback(AudioTrack::EVENT_LOOP_END, mData, &loopsRemaining);
305         }
onMarker(uint32_t markerPosition)306         void onMarker(uint32_t markerPosition) override {
307             mCallback(AudioTrack::EVENT_MARKER, mData, &markerPosition);
308         }
onNewPos(uint32_t newPos)309         void onNewPos(uint32_t newPos) override {
310             mCallback(AudioTrack::EVENT_NEW_POS, mData, &newPos);
311         }
onBufferEnd()312         void onBufferEnd() override {
313             mCallback(AudioTrack::EVENT_BUFFER_END, mData, nullptr);
314         }
onNewIAudioTrack()315         void onNewIAudioTrack() override {
316             mCallback(AudioTrack::EVENT_NEW_IAUDIOTRACK, mData, nullptr);
317         }
onStreamEnd()318         void onStreamEnd() override {
319             mCallback(AudioTrack::EVENT_STREAM_END, mData, nullptr);
320         }
onCanWriteMoreData(const AudioTrack::Buffer & buffer)321         size_t onCanWriteMoreData(const AudioTrack::Buffer & buffer) override {
322           AudioTrack::Buffer copy = buffer;
323           mCallback(AudioTrack::EVENT_CAN_WRITE_MORE_DATA, mData, static_cast<void*>(&copy));
324           return copy.size();
325         }
326     };
327 }
328 
AudioTrack(audio_stream_type_t streamType,uint32_t sampleRate,audio_format_t format,audio_channel_mask_t channelMask,size_t frameCount,audio_output_flags_t flags,legacy_callback_t callback,void * user,int32_t notificationFrames,audio_session_t sessionId,transfer_type transferType,const audio_offload_info_t * offloadInfo,const AttributionSourceState & attributionSource,const audio_attributes_t * pAttributes,bool doNotReconnect,float maxRequiredSpeed,audio_port_handle_t selectedDeviceId)329 AudioTrack::AudioTrack(
330         audio_stream_type_t streamType,
331         uint32_t sampleRate,
332         audio_format_t format,
333         audio_channel_mask_t channelMask,
334         size_t frameCount,
335         audio_output_flags_t flags,
336         legacy_callback_t callback,
337         void* user,
338         int32_t notificationFrames,
339         audio_session_t sessionId,
340         transfer_type transferType,
341         const audio_offload_info_t *offloadInfo,
342         const AttributionSourceState& attributionSource,
343         const audio_attributes_t* pAttributes,
344         bool doNotReconnect,
345         float maxRequiredSpeed,
346         audio_port_handle_t selectedDeviceId)
347     : mStatus(NO_INIT),
348       mState(STATE_STOPPED),
349       mPreviousPriority(ANDROID_PRIORITY_NORMAL),
350       mPreviousSchedulingGroup(SP_DEFAULT),
351       mPausedPosition(0),
352       mAudioTrackCallback(new AudioTrackCallback())
353 {
354     mAttributes = AUDIO_ATTRIBUTES_INITIALIZER;
355     if (callback != nullptr) {
356         mLegacyCallbackWrapper = sp<LegacyCallbackWrapper>::make(callback, user);
357     } else if (user) {
358         LOG_ALWAYS_FATAL("Callback data provided without callback pointer!");
359     }
360     mSetParams = std::unique_ptr<SetParams>{new SetParams{
361             streamType, sampleRate, format, channelMask, frameCount, flags, mLegacyCallbackWrapper,
362             notificationFrames, 0 /*sharedBuffer*/, false /*threadCanCallJava*/, sessionId,
363             transferType, offloadInfo, attributionSource, pAttributes, doNotReconnect,
364             maxRequiredSpeed, selectedDeviceId}};
365 }
366 
AudioTrack(audio_stream_type_t streamType,uint32_t sampleRate,audio_format_t format,audio_channel_mask_t channelMask,const sp<IMemory> & sharedBuffer,audio_output_flags_t flags,const wp<IAudioTrackCallback> & callback,int32_t notificationFrames,audio_session_t sessionId,transfer_type transferType,const audio_offload_info_t * offloadInfo,const AttributionSourceState & attributionSource,const audio_attributes_t * pAttributes,bool doNotReconnect,float maxRequiredSpeed)367 AudioTrack::AudioTrack(
368         audio_stream_type_t streamType,
369         uint32_t sampleRate,
370         audio_format_t format,
371         audio_channel_mask_t channelMask,
372         const sp<IMemory>& sharedBuffer,
373         audio_output_flags_t flags,
374         const wp<IAudioTrackCallback>& callback,
375         int32_t notificationFrames,
376         audio_session_t sessionId,
377         transfer_type transferType,
378         const audio_offload_info_t *offloadInfo,
379         const AttributionSourceState& attributionSource,
380         const audio_attributes_t* pAttributes,
381         bool doNotReconnect,
382         float maxRequiredSpeed)
383     : mStatus(NO_INIT),
384       mState(STATE_STOPPED),
385       mPreviousPriority(ANDROID_PRIORITY_NORMAL),
386       mPreviousSchedulingGroup(SP_DEFAULT),
387       mPausedPosition(0),
388       mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE),
389       mAudioTrackCallback(new AudioTrackCallback())
390 {
391     mAttributes = AUDIO_ATTRIBUTES_INITIALIZER;
392 
393     mSetParams = std::unique_ptr<SetParams>{
394             new SetParams{streamType, sampleRate, format, channelMask, 0 /*frameCount*/, flags,
395                           callback, notificationFrames, sharedBuffer, false /*threadCanCallJava*/,
396                           sessionId, transferType, offloadInfo, attributionSource, pAttributes,
397                           doNotReconnect, maxRequiredSpeed, AUDIO_PORT_HANDLE_NONE}};
398 }
399 
AudioTrack(audio_stream_type_t streamType,uint32_t sampleRate,audio_format_t format,audio_channel_mask_t channelMask,const sp<IMemory> & sharedBuffer,audio_output_flags_t flags,legacy_callback_t callback,void * user,int32_t notificationFrames,audio_session_t sessionId,transfer_type transferType,const audio_offload_info_t * offloadInfo,const AttributionSourceState & attributionSource,const audio_attributes_t * pAttributes,bool doNotReconnect,float maxRequiredSpeed)400 AudioTrack::AudioTrack(
401         audio_stream_type_t streamType,
402         uint32_t sampleRate,
403         audio_format_t format,
404         audio_channel_mask_t channelMask,
405         const sp<IMemory>& sharedBuffer,
406         audio_output_flags_t flags,
407         legacy_callback_t callback,
408         void* user,
409         int32_t notificationFrames,
410         audio_session_t sessionId,
411         transfer_type transferType,
412         const audio_offload_info_t *offloadInfo,
413         const AttributionSourceState& attributionSource,
414         const audio_attributes_t* pAttributes,
415         bool doNotReconnect,
416         float maxRequiredSpeed)
417     : mStatus(NO_INIT),
418       mState(STATE_STOPPED),
419       mPreviousPriority(ANDROID_PRIORITY_NORMAL),
420       mPreviousSchedulingGroup(SP_DEFAULT),
421       mPausedPosition(0),
422       mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE),
423       mAudioTrackCallback(new AudioTrackCallback())
424 {
425     mAttributes = AUDIO_ATTRIBUTES_INITIALIZER;
426     if (callback) {
427         mLegacyCallbackWrapper = sp<LegacyCallbackWrapper>::make(callback, user);
428     } else if (user) {
429         LOG_ALWAYS_FATAL("Callback data provided without callback pointer!");
430     }
431     mSetParams = std::unique_ptr<SetParams>{new SetParams{
432             streamType, sampleRate, format, channelMask, 0 /*frameCount*/, flags,
433             mLegacyCallbackWrapper, notificationFrames, sharedBuffer, false /*threadCanCallJava*/,
434             sessionId, transferType, offloadInfo, attributionSource, pAttributes, doNotReconnect,
435             maxRequiredSpeed, AUDIO_PORT_HANDLE_NONE}};
436 }
437 
onFirstRef()438 void AudioTrack::onFirstRef() {
439     if (mSetParams) {
440         set(*mSetParams);
441         mSetParams.reset();
442     }
443 }
444 
~AudioTrack()445 AudioTrack::~AudioTrack()
446 {
447     // pull together the numbers, before we clean up our structures
448     mMediaMetrics.gather(this);
449 
450     mediametrics::LogItem(mMetricsId)
451         .set(AMEDIAMETRICS_PROP_EVENT, AMEDIAMETRICS_PROP_EVENT_VALUE_DTOR)
452         .set(AMEDIAMETRICS_PROP_CALLERNAME,
453                 mCallerName.empty()
454                 ? AMEDIAMETRICS_PROP_CALLERNAME_VALUE_UNKNOWN
455                 : mCallerName.c_str())
456         .set(AMEDIAMETRICS_PROP_STATE, stateToString(mState))
457         .set(AMEDIAMETRICS_PROP_STATUS, (int32_t)mStatus)
458         .record();
459 
460     stopAndJoinCallbacks(); // checks mStatus
461 
462     if (mStatus == NO_ERROR) {
463         IInterface::asBinder(mAudioTrack)->unlinkToDeath(mDeathNotifier, this);
464         mAudioTrack.clear();
465         mCblkMemory.clear();
466         mSharedBuffer.clear();
467         IPCThreadState::self()->flushCommands();
468         pid_t clientPid = VALUE_OR_FATAL(aidl2legacy_int32_t_pid_t(mClientAttributionSource.pid));
469         ALOGV("%s(%d), releasing session id %d from %d on behalf of %d",
470                 __func__, mPortId,
471                 mSessionId, IPCThreadState::self()->getCallingPid(), clientPid);
472         AudioSystem::releaseAudioSessionId(mSessionId, clientPid);
473     }
474 }
475 
stopAndJoinCallbacks()476 void AudioTrack::stopAndJoinCallbacks() {
477     // Prevent nullptr crash if it did not open properly.
478     if (mStatus != NO_ERROR) return;
479 
480     // Make sure that callback function exits in the case where
481     // it is looping on buffer full condition in obtainBuffer().
482     // Otherwise the callback thread will never exit.
483     stop();
484     if (mAudioTrackThread != 0) { // not thread safe
485         mAudioTrackThread->requestExit();   // see comment in AudioTrack.h
486         mProxy->interrupt();
487         mAudioTrackThread->requestExitAndWait();
488         mAudioTrackThread.clear();
489     }
490 
491     AutoMutex lock(mLock);
492     if (mDeviceCallback != 0 && mOutput != AUDIO_IO_HANDLE_NONE) {
493         // This may not stop all of these device callbacks!
494         // TODO: Add some sort of protection.
495         AudioSystem::removeAudioDeviceCallback(this, mOutput, mPortId);
496         mDeviceCallback.clear();
497     }
498 }
499 
set(audio_stream_type_t streamType,uint32_t sampleRate,audio_format_t format,audio_channel_mask_t channelMask,size_t frameCount,audio_output_flags_t flags,legacy_callback_t callback,void * user,int32_t notificationFrames,const sp<IMemory> & sharedBuffer,bool threadCanCallJava,audio_session_t sessionId,transfer_type transferType,const audio_offload_info_t * offloadInfo,const AttributionSourceState & attributionSource,const audio_attributes_t * pAttributes,bool doNotReconnect,float maxRequiredSpeed,audio_port_handle_t selectedDeviceId)500 status_t AudioTrack::set(
501         audio_stream_type_t streamType,
502         uint32_t sampleRate,
503         audio_format_t format,
504         audio_channel_mask_t channelMask,
505         size_t frameCount,
506         audio_output_flags_t flags,
507         legacy_callback_t callback,
508         void * user,
509         int32_t notificationFrames,
510         const sp<IMemory>& sharedBuffer,
511         bool threadCanCallJava,
512         audio_session_t sessionId,
513         transfer_type transferType,
514         const audio_offload_info_t *offloadInfo,
515         const AttributionSourceState& attributionSource,
516         const audio_attributes_t* pAttributes,
517         bool doNotReconnect,
518         float maxRequiredSpeed,
519         audio_port_handle_t selectedDeviceId)
520 {
521     if (callback) {
522         mLegacyCallbackWrapper = sp<LegacyCallbackWrapper>::make(callback, user);
523     } else if (user) {
524         LOG_ALWAYS_FATAL("Callback data provided without callback pointer!");
525     }
526     return set(streamType, sampleRate,format, channelMask, frameCount, flags,
527                mLegacyCallbackWrapper, notificationFrames, sharedBuffer, threadCanCallJava,
528                sessionId, transferType, offloadInfo, attributionSource, pAttributes,
529                doNotReconnect, maxRequiredSpeed, selectedDeviceId);
530 }
set(audio_stream_type_t streamType,uint32_t sampleRate,audio_format_t format,audio_channel_mask_t channelMask,size_t frameCount,audio_output_flags_t flags,const wp<IAudioTrackCallback> & callback,int32_t notificationFrames,const sp<IMemory> & sharedBuffer,bool threadCanCallJava,audio_session_t sessionId,transfer_type transferType,const audio_offload_info_t * offloadInfo,const AttributionSourceState & attributionSource,const audio_attributes_t * pAttributes,bool doNotReconnect,float maxRequiredSpeed,audio_port_handle_t selectedDeviceId)531 status_t AudioTrack::set(
532         audio_stream_type_t streamType,
533         uint32_t sampleRate,
534         audio_format_t format,
535         audio_channel_mask_t channelMask,
536         size_t frameCount,
537         audio_output_flags_t flags,
538         const wp<IAudioTrackCallback>& callback,
539         int32_t notificationFrames,
540         const sp<IMemory>& sharedBuffer,
541         bool threadCanCallJava,
542         audio_session_t sessionId,
543         transfer_type transferType,
544         const audio_offload_info_t *offloadInfo,
545         const AttributionSourceState& attributionSource,
546         const audio_attributes_t* pAttributes,
547         bool doNotReconnect,
548         float maxRequiredSpeed,
549         audio_port_handle_t selectedDeviceId)
550 {
551     LOG_ALWAYS_FATAL_IF(mInitialized, "%s: should not be called twice", __func__);
552     mInitialized = true;
553     status_t status;
554     uint32_t channelCount;
555     pid_t callingPid;
556     pid_t myPid;
557     uid_t uid = VALUE_OR_FATAL(aidl2legacy_int32_t_uid_t(attributionSource.uid));
558     pid_t pid = VALUE_OR_FATAL(aidl2legacy_int32_t_pid_t(attributionSource.pid));
559     std::string errorMessage;
560     // Note mPortId is not valid until the track is created, so omit mPortId in ALOG for set.
561     ALOGV("%s(): streamType %d, sampleRate %u, format %#x, channelMask %#x, frameCount %zu, "
562           "flags #%x, notificationFrames %d, sessionId %d, transferType %d, uid %d, pid %d",
563           __func__,
564           streamType, sampleRate, format, channelMask, frameCount, flags, notificationFrames,
565           sessionId, transferType, attributionSource.uid, attributionSource.pid);
566 
567     mThreadCanCallJava = threadCanCallJava;
568 
569     // These variables are pulled in an error report, so we initialize them early.
570     mSelectedDeviceId = selectedDeviceId;
571     mSessionId = sessionId;
572     mChannelMask = channelMask;
573     mReqFrameCount = mFrameCount = frameCount;
574     mSampleRate = sampleRate;
575     mOriginalSampleRate = sampleRate;
576     mAttributes = pAttributes != nullptr ? *pAttributes : AUDIO_ATTRIBUTES_INITIALIZER;
577     mPlaybackRate = AUDIO_PLAYBACK_RATE_DEFAULT;
578 
579     // update format and flags before storing them in mFormat, mOrigFlags and mFlags
580     if (pAttributes != NULL) {
581         // stream type shouldn't be looked at, this track has audio attributes
582         ALOGV("%s(): Building AudioTrack with attributes:"
583                 " usage=%d content=%d flags=0x%x tags=[%s]",
584                 __func__,
585                  mAttributes.usage, mAttributes.content_type, mAttributes.flags, mAttributes.tags);
586         audio_flags_to_audio_output_flags(mAttributes.flags, &flags);
587     }
588 
589     // these below should probably come from the audioFlinger too...
590     if (format == AUDIO_FORMAT_DEFAULT) {
591         format = AUDIO_FORMAT_PCM_16_BIT;
592     } else if (format == AUDIO_FORMAT_IEC61937) { // HDMI pass-through?
593         flags = static_cast<audio_output_flags_t>(flags | AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO);
594     }
595 
596     // force direct flag if format is not linear PCM
597     // or offload was requested
598     if ((flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD)
599             || !audio_is_linear_pcm(format)) {
600         ALOGV( (flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD)
601                     ? "%s(): Offload request, forcing to Direct Output"
602                     : "%s(): Not linear PCM, forcing to Direct Output",
603                     __func__);
604         flags = (audio_output_flags_t)
605                 // FIXME why can't we allow direct AND fast?
606                 ((flags | AUDIO_OUTPUT_FLAG_DIRECT) & ~AUDIO_OUTPUT_FLAG_FAST);
607     }
608 
609     // force direct flag if HW A/V sync requested
610     if ((flags & AUDIO_OUTPUT_FLAG_HW_AV_SYNC) != 0) {
611         flags = (audio_output_flags_t)(flags | AUDIO_OUTPUT_FLAG_DIRECT);
612     }
613 
614     mFormat = format;
615     mOrigFlags = mFlags = flags;
616 
617     switch (transferType) {
618     case TRANSFER_DEFAULT:
619         if (sharedBuffer != 0) {
620             transferType = TRANSFER_SHARED;
621         } else if (callback == nullptr|| threadCanCallJava) {
622             transferType = TRANSFER_SYNC;
623         } else {
624             transferType = TRANSFER_CALLBACK;
625         }
626         break;
627     case TRANSFER_CALLBACK:
628     case TRANSFER_SYNC_NOTIF_CALLBACK:
629         if (callback == nullptr || sharedBuffer != 0) {
630             errorMessage = StringPrintf(
631                     "%s: Transfer type %s but callback == nullptr || sharedBuffer != 0",
632                     convertTransferToText(transferType), __func__);
633             status = BAD_VALUE;
634             goto error;
635         }
636         break;
637     case TRANSFER_OBTAIN:
638     case TRANSFER_SYNC:
639         if (sharedBuffer != 0) {
640             errorMessage = StringPrintf(
641                     "%s: Transfer type TRANSFER_OBTAIN but sharedBuffer != 0", __func__);
642             status = BAD_VALUE;
643             goto error;
644         }
645         break;
646     case TRANSFER_SHARED:
647         if (sharedBuffer == 0) {
648             errorMessage = StringPrintf(
649                     "%s: Transfer type TRANSFER_SHARED but sharedBuffer == 0", __func__);
650             status = BAD_VALUE;
651             goto error;
652         }
653         break;
654     default:
655         errorMessage = StringPrintf("%s: Invalid transfer type %d", __func__, transferType);
656         status = BAD_VALUE;
657         goto error;
658     }
659     mSharedBuffer = sharedBuffer;
660     mTransfer = transferType;
661     mDoNotReconnect = doNotReconnect;
662 
663     ALOGV_IF(sharedBuffer != 0, "%s(): sharedBuffer: %p, size: %zu",
664             __func__, sharedBuffer->unsecurePointer(), sharedBuffer->size());
665 
666     // invariant that mAudioTrack != 0 is true only after set() returns successfully
667     if (mAudioTrack != 0) {
668         errorMessage = StringPrintf("%s: Track already in use", __func__);
669         status = INVALID_OPERATION;
670         goto error;
671     }
672 
673     // handle default values first.
674     if (streamType == AUDIO_STREAM_DEFAULT) {
675         streamType = AUDIO_STREAM_MUSIC;
676     }
677     if (pAttributes == NULL) {
678         if (uint32_t(streamType) >= AUDIO_STREAM_PUBLIC_CNT) {
679             errorMessage = StringPrintf("%s: Invalid stream type %d", __func__, streamType);
680             status = BAD_VALUE;
681             goto error;
682         }
683         mOriginalStreamType = streamType;
684     } else {
685         mOriginalStreamType = AUDIO_STREAM_DEFAULT;
686     }
687 
688     // validate parameters
689     if (!audio_is_valid_format(format)) {
690         errorMessage = StringPrintf("%s: Invalid format %#x", __func__, format);
691         status = BAD_VALUE;
692         goto error;
693     }
694 
695     if (!audio_is_output_channel(channelMask)) {
696         errorMessage = StringPrintf("%s: Invalid channel mask %#x",  __func__, channelMask);
697         status = BAD_VALUE;
698         goto error;
699     }
700     channelCount = audio_channel_count_from_out_mask(channelMask);
701     mChannelCount = channelCount;
702 
703     if (mFlags & AUDIO_OUTPUT_FLAG_DIRECT) {
704         if (audio_has_proportional_frames(format)) {
705             mFrameSize = channelCount * audio_bytes_per_sample(format);
706         } else {
707             mFrameSize = sizeof(uint8_t);
708         }
709     } else {
710         ALOG_ASSERT(audio_has_proportional_frames(format));
711         mFrameSize = channelCount * audio_bytes_per_sample(format);
712         // createTrack will return an error if PCM format is not supported by server,
713         // so no need to check for specific PCM formats here
714     }
715 
716     // sampling rate must be specified for direct outputs
717     if (sampleRate == 0 && (mFlags & AUDIO_OUTPUT_FLAG_DIRECT) != 0) {
718         errorMessage = StringPrintf(
719                 "%s: sample rate must be specified for direct outputs", __func__);
720         status = BAD_VALUE;
721         goto error;
722     }
723     // 1.0 <= mMaxRequiredSpeed <= AUDIO_TIMESTRETCH_SPEED_MAX
724     mMaxRequiredSpeed = min(max(maxRequiredSpeed, 1.0f), AUDIO_TIMESTRETCH_SPEED_MAX);
725 
726     // Make copy of input parameter offloadInfo so that in the future:
727     //  (a) createTrack_l doesn't need it as an input parameter
728     //  (b) we can support re-creation of offloaded tracks
729     if (offloadInfo != NULL) {
730         mOffloadInfoCopy = *offloadInfo;
731     } else {
732         memset(&mOffloadInfoCopy, 0, sizeof(audio_offload_info_t));
733         mOffloadInfoCopy = AUDIO_INFO_INITIALIZER;
734         mOffloadInfoCopy.format = format;
735         mOffloadInfoCopy.sample_rate = sampleRate;
736         mOffloadInfoCopy.channel_mask = channelMask;
737         mOffloadInfoCopy.stream_type = streamType;
738     }
739 
740     mVolume[AUDIO_INTERLEAVE_LEFT] = 1.0f;
741     mVolume[AUDIO_INTERLEAVE_RIGHT] = 1.0f;
742     mSendLevel = 0.0f;
743     // mFrameCount is initialized in createTrack_l
744     if (notificationFrames >= 0) {
745         mNotificationFramesReq = notificationFrames;
746         mNotificationsPerBufferReq = 0;
747     } else {
748         if (!(mFlags & AUDIO_OUTPUT_FLAG_FAST)) {
749             errorMessage = StringPrintf(
750                     "%s: notificationFrames=%d not permitted for non-fast track",
751                     __func__, notificationFrames);
752             status = BAD_VALUE;
753             goto error;
754         }
755         if (frameCount > 0) {
756             ALOGE("%s(): notificationFrames=%d not permitted with non-zero frameCount=%zu",
757                     __func__, notificationFrames, frameCount);
758             status = BAD_VALUE;
759             goto error;
760         }
761         mNotificationFramesReq = 0;
762         const uint32_t minNotificationsPerBuffer = 1;
763         const uint32_t maxNotificationsPerBuffer = 8;
764         mNotificationsPerBufferReq = min(maxNotificationsPerBuffer,
765                 max((uint32_t) -notificationFrames, minNotificationsPerBuffer));
766         ALOGW_IF(mNotificationsPerBufferReq != (uint32_t) -notificationFrames,
767                 "%s(): notificationFrames=%d clamped to the range -%u to -%u",
768                 __func__,
769                 notificationFrames, minNotificationsPerBuffer, maxNotificationsPerBuffer);
770     }
771     mNotificationFramesAct = 0;
772     // TODO b/182392553: refactor or remove
773     mClientAttributionSource = AttributionSourceState(attributionSource);
774     callingPid = IPCThreadState::self()->getCallingPid();
775     myPid = getpid();
776     if (uid == -1 || (callingPid != myPid)) {
777         mClientAttributionSource.uid = VALUE_OR_FATAL(legacy2aidl_uid_t_int32_t(
778             IPCThreadState::self()->getCallingUid()));
779     }
780     if (pid == (pid_t)-1 || (callingPid != myPid)) {
781         mClientAttributionSource.pid = VALUE_OR_FATAL(legacy2aidl_uid_t_int32_t(callingPid));
782     }
783     mAuxEffectId = 0;
784     mCallback = callback;
785 
786     if (callback != nullptr) {
787         mAudioTrackThread = sp<AudioTrackThread>::make(*this);
788         mAudioTrackThread->run("AudioTrack", ANDROID_PRIORITY_AUDIO, 0 /*stack*/);
789         // thread begins in paused state, and will not reference us until start()
790     }
791 
792     // create the IAudioTrack
793     {
794         AutoMutex lock(mLock);
795         status = createTrack_l();
796     }
797     if (status != NO_ERROR) {
798         if (mAudioTrackThread != 0) {
799             mAudioTrackThread->requestExit();   // see comment in AudioTrack.h
800             mAudioTrackThread->requestExitAndWait();
801             mAudioTrackThread.clear();
802         }
803         // We do not goto error to prevent double-logging errors.
804         goto exit;
805     }
806 
807     mLoopCount = 0;
808     mLoopStart = 0;
809     mLoopEnd = 0;
810     mLoopCountNotified = 0;
811     mMarkerPosition = 0;
812     mMarkerReached = false;
813     mNewPosition = 0;
814     mUpdatePeriod = 0;
815     mPosition = 0;
816     mReleased = 0;
817     mStartNs = 0;
818     mStartFromZeroUs = 0;
819     AudioSystem::acquireAudioSessionId(mSessionId, pid, uid);
820     mSequence = 1;
821     mObservedSequence = mSequence;
822     mInUnderrun = false;
823     mPreviousTimestampValid = false;
824     mTimestampStartupGlitchReported = false;
825     mTimestampRetrogradePositionReported = false;
826     mTimestampRetrogradeTimeReported = false;
827     mTimestampStallReported = false;
828     mTimestampStaleTimeReported = false;
829     mPreviousLocation = ExtendedTimestamp::LOCATION_INVALID;
830     mStartTs.mPosition = 0;
831     mUnderrunCountOffset = 0;
832     mFramesWritten = 0;
833     mFramesWrittenServerOffset = 0;
834     mFramesWrittenAtRestore = -1; // -1 is a unique initializer.
835     mVolumeHandler = new media::VolumeHandler();
836 
837 error:
838     if (status != NO_ERROR) {
839         ALOGE_IF(!errorMessage.empty(), "%s", errorMessage.c_str());
840         reportError(status, AMEDIAMETRICS_PROP_EVENT_VALUE_CREATE, errorMessage.c_str());
841     }
842     // fall through
843 exit:
844     mStatus = status;
845     return status;
846 }
847 
848 
set(audio_stream_type_t streamType,uint32_t sampleRate,audio_format_t format,uint32_t channelMask,size_t frameCount,audio_output_flags_t flags,legacy_callback_t callback,void * user,int32_t notificationFrames,const sp<IMemory> & sharedBuffer,bool threadCanCallJava,audio_session_t sessionId,transfer_type transferType,const audio_offload_info_t * offloadInfo,uid_t uid,pid_t pid,const audio_attributes_t * pAttributes,bool doNotReconnect,float maxRequiredSpeed,audio_port_handle_t selectedDeviceId)849 status_t AudioTrack::set(
850         audio_stream_type_t streamType,
851         uint32_t sampleRate,
852         audio_format_t format,
853         uint32_t channelMask,
854         size_t frameCount,
855         audio_output_flags_t flags,
856         legacy_callback_t callback,
857         void* user,
858         int32_t notificationFrames,
859         const sp<IMemory>& sharedBuffer,
860         bool threadCanCallJava,
861         audio_session_t sessionId,
862         transfer_type transferType,
863         const audio_offload_info_t *offloadInfo,
864         uid_t uid,
865         pid_t pid,
866         const audio_attributes_t* pAttributes,
867         bool doNotReconnect,
868         float maxRequiredSpeed,
869         audio_port_handle_t selectedDeviceId)
870 {
871     AttributionSourceState attributionSource;
872     attributionSource.uid = VALUE_OR_FATAL(legacy2aidl_uid_t_int32_t(uid));
873     attributionSource.pid = VALUE_OR_FATAL(legacy2aidl_pid_t_int32_t(pid));
874     attributionSource.token = sp<BBinder>::make();
875     if (callback) {
876         mLegacyCallbackWrapper = sp<LegacyCallbackWrapper>::make(callback, user);
877     } else if (user) {
878         LOG_ALWAYS_FATAL("Callback data provided without callback pointer!");
879     }
880     return set(streamType, sampleRate, format, static_cast<audio_channel_mask_t>(channelMask),
881                frameCount, flags, mLegacyCallbackWrapper, notificationFrames, sharedBuffer,
882                threadCanCallJava, sessionId, transferType, offloadInfo, attributionSource,
883                pAttributes, doNotReconnect, maxRequiredSpeed, selectedDeviceId);
884 }
885 
886 // -------------------------------------------------------------------------
887 
start()888 status_t AudioTrack::start()
889 {
890     AutoMutex lock(mLock);
891 
892     if (mState == STATE_ACTIVE) {
893         return INVALID_OPERATION;
894     }
895 
896     ALOGV("%s(%d): prior state:%s", __func__, mPortId, stateToString(mState));
897 
898     // Defer logging here due to OpenSL ES repeated start calls.
899     // TODO(b/154868033) after fix, restore this logging back to the beginning of start().
900     const int64_t beginNs = systemTime();
901     status_t status = NO_ERROR; // logged: make sure to set this before returning.
902     mediametrics::Defer defer([&] {
903         mediametrics::LogItem(mMetricsId)
904             .set(AMEDIAMETRICS_PROP_CALLERNAME,
905                     mCallerName.empty()
906                     ? AMEDIAMETRICS_PROP_CALLERNAME_VALUE_UNKNOWN
907                     : mCallerName.c_str())
908             .set(AMEDIAMETRICS_PROP_EVENT, AMEDIAMETRICS_PROP_EVENT_VALUE_START)
909             .set(AMEDIAMETRICS_PROP_EXECUTIONTIMENS, (int64_t)(systemTime() - beginNs))
910             .set(AMEDIAMETRICS_PROP_STATE, stateToString(mState))
911             .set(AMEDIAMETRICS_PROP_STATUS, (int32_t)status)
912             .record(); });
913 
914 
915     mInUnderrun = true;
916 
917     State previousState = mState;
918     if (previousState == STATE_PAUSED_STOPPING) {
919         mState = STATE_STOPPING;
920     } else {
921         mState = STATE_ACTIVE;
922     }
923     (void) updateAndGetPosition_l();
924 
925     // save start timestamp
926     if (isOffloadedOrDirect_l()) {
927         if (getTimestamp_l(mStartTs) != OK) {
928             mStartTs.mPosition = 0;
929         }
930     } else {
931         if (getTimestamp_l(&mStartEts) != OK) {
932             mStartEts.clear();
933         }
934     }
935     mStartNs = systemTime(); // save this for timestamp adjustment after starting.
936     if (previousState == STATE_STOPPED || previousState == STATE_FLUSHED) {
937         // reset current position as seen by client to 0
938         mPosition = 0;
939         mPreviousTimestampValid = false;
940         mTimestampStartupGlitchReported = false;
941         mTimestampRetrogradePositionReported = false;
942         mTimestampRetrogradeTimeReported = false;
943         mTimestampStallReported = false;
944         mTimestampStaleTimeReported = false;
945         mPreviousLocation = ExtendedTimestamp::LOCATION_INVALID;
946 
947         if (!isOffloadedOrDirect_l()
948                 && mStartEts.mTimeNs[ExtendedTimestamp::LOCATION_SERVER] > 0) {
949             // Server side has consumed something, but is it finished consuming?
950             // It is possible since flush and stop are asynchronous that the server
951             // is still active at this point.
952             ALOGV("%s(%d): server read:%lld  cumulative flushed:%lld  client written:%lld",
953                     __func__, mPortId,
954                     (long long)(mFramesWrittenServerOffset
955                             + mStartEts.mPosition[ExtendedTimestamp::LOCATION_SERVER]),
956                     (long long)mStartEts.mFlushed,
957                     (long long)mFramesWritten);
958             // mStartEts is already adjusted by mFramesWrittenServerOffset, so we delta adjust.
959             mFramesWrittenServerOffset -= mStartEts.mPosition[ExtendedTimestamp::LOCATION_SERVER];
960         }
961         mFramesWritten = 0;
962         mProxy->clearTimestamp(); // need new server push for valid timestamp
963         mMarkerReached = false;
964 
965         // For offloaded tracks, we don't know if the hardware counters are really zero here,
966         // since the flush is asynchronous and stop may not fully drain.
967         // We save the time when the track is started to later verify whether
968         // the counters are realistic (i.e. start from zero after this time).
969         mStartFromZeroUs = mStartNs / 1000;
970 
971         // force refresh of remaining frames by processAudioBuffer() as last
972         // write before stop could be partial.
973         mRefreshRemaining = true;
974 
975         // for static track, clear the old flags when starting from stopped state
976         if (mSharedBuffer != 0) {
977             android_atomic_and(
978             ~(CBLK_LOOP_CYCLE | CBLK_LOOP_FINAL | CBLK_BUFFER_END),
979             &mCblk->mFlags);
980         }
981     }
982     mNewPosition = mPosition + mUpdatePeriod;
983     int32_t flags = android_atomic_and(~(CBLK_STREAM_END_DONE | CBLK_DISABLED), &mCblk->mFlags);
984 
985     if (!(flags & CBLK_INVALID)) {
986         mAudioTrack->start(&status);
987         if (status == DEAD_OBJECT) {
988             flags |= CBLK_INVALID;
989         }
990     }
991     if (flags & CBLK_INVALID) {
992         status = restoreTrack_l("start");
993     }
994 
995     // resume or pause the callback thread as needed.
996     sp<AudioTrackThread> t = mAudioTrackThread;
997     if (status == NO_ERROR) {
998         if (t != 0) {
999             if (previousState == STATE_STOPPING) {
1000                 mProxy->interrupt();
1001             } else {
1002                 t->resume();
1003             }
1004         } else {
1005             mPreviousPriority = getpriority(PRIO_PROCESS, 0);
1006             get_sched_policy(0, &mPreviousSchedulingGroup);
1007             androidSetThreadPriority(0, ANDROID_PRIORITY_AUDIO);
1008         }
1009 
1010         // Start our local VolumeHandler for restoration purposes.
1011         mVolumeHandler->setStarted();
1012     } else {
1013         ALOGE("%s(%d): status %d", __func__, mPortId, status);
1014         mState = previousState;
1015         if (t != 0) {
1016             if (previousState != STATE_STOPPING) {
1017                 t->pause();
1018             }
1019         } else {
1020             setpriority(PRIO_PROCESS, 0, mPreviousPriority);
1021             set_sched_policy(0, mPreviousSchedulingGroup);
1022         }
1023     }
1024 
1025     return status;
1026 }
1027 
stop()1028 void AudioTrack::stop()
1029 {
1030     const int64_t beginNs = systemTime();
1031 
1032     AutoMutex lock(mLock);
1033     mediametrics::Defer defer([&]() {
1034         mediametrics::LogItem(mMetricsId)
1035             .set(AMEDIAMETRICS_PROP_EVENT, AMEDIAMETRICS_PROP_EVENT_VALUE_STOP)
1036             .set(AMEDIAMETRICS_PROP_EXECUTIONTIMENS, (int64_t)(systemTime() - beginNs))
1037             .set(AMEDIAMETRICS_PROP_STATE, stateToString(mState))
1038             .set(AMEDIAMETRICS_PROP_BUFFERSIZEFRAMES, (int32_t)mProxy->getBufferSizeInFrames())
1039             .set(AMEDIAMETRICS_PROP_UNDERRUN, (int32_t) getUnderrunCount_l())
1040             .record();
1041     });
1042 
1043     ALOGV("%s(%d): prior state:%s", __func__, mPortId, stateToString(mState));
1044 
1045     if (mState != STATE_ACTIVE && mState != STATE_PAUSED) {
1046         return;
1047     }
1048 
1049     if (isOffloaded_l()) {
1050         mState = STATE_STOPPING;
1051     } else {
1052         mState = STATE_STOPPED;
1053         ALOGD_IF(mSharedBuffer == nullptr,
1054                 "%s(%d): called with %u frames delivered", __func__, mPortId, mReleased.value());
1055         mReleased = 0;
1056     }
1057 
1058     mProxy->stop(); // notify server not to read beyond current client position until start().
1059     mProxy->interrupt();
1060     mAudioTrack->stop();
1061 
1062     // Note: legacy handling - stop does not clear playback marker
1063     // and periodic update counter, but flush does for streaming tracks.
1064 
1065     if (mSharedBuffer != 0) {
1066         // clear buffer position and loop count.
1067         mStaticProxy->setBufferPositionAndLoop(0 /* position */,
1068                 0 /* loopStart */, 0 /* loopEnd */, 0 /* loopCount */);
1069     }
1070 
1071     sp<AudioTrackThread> t = mAudioTrackThread;
1072     if (t != 0) {
1073         if (!isOffloaded_l()) {
1074             t->pause();
1075         } else if (mTransfer == TRANSFER_SYNC_NOTIF_CALLBACK) {
1076             // causes wake up of the playback thread, that will callback the client for
1077             // EVENT_STREAM_END in processAudioBuffer()
1078             t->wake();
1079         }
1080     } else {
1081         setpriority(PRIO_PROCESS, 0, mPreviousPriority);
1082         set_sched_policy(0, mPreviousSchedulingGroup);
1083     }
1084 }
1085 
stopped() const1086 bool AudioTrack::stopped() const
1087 {
1088     AutoMutex lock(mLock);
1089     return mState != STATE_ACTIVE;
1090 }
1091 
flush()1092 void AudioTrack::flush()
1093 {
1094     const int64_t beginNs = systemTime();
1095     AutoMutex lock(mLock);
1096     mediametrics::Defer defer([&]() {
1097         mediametrics::LogItem(mMetricsId)
1098             .set(AMEDIAMETRICS_PROP_EVENT, AMEDIAMETRICS_PROP_EVENT_VALUE_FLUSH)
1099             .set(AMEDIAMETRICS_PROP_EXECUTIONTIMENS, (int64_t)(systemTime() - beginNs))
1100             .set(AMEDIAMETRICS_PROP_STATE, stateToString(mState))
1101             .record(); });
1102 
1103     ALOGV("%s(%d): prior state:%s", __func__, mPortId, stateToString(mState));
1104 
1105     if (mSharedBuffer != 0) {
1106         return;
1107     }
1108     if (mState == STATE_ACTIVE) {
1109         return;
1110     }
1111     flush_l();
1112 }
1113 
flush_l()1114 void AudioTrack::flush_l()
1115 {
1116     ALOG_ASSERT(mState != STATE_ACTIVE);
1117 
1118     // clear playback marker and periodic update counter
1119     mMarkerPosition = 0;
1120     mMarkerReached = false;
1121     mUpdatePeriod = 0;
1122     mRefreshRemaining = true;
1123 
1124     mState = STATE_FLUSHED;
1125     mReleased = 0;
1126     if (isOffloaded_l()) {
1127         mProxy->interrupt();
1128     }
1129     mProxy->flush();
1130     mAudioTrack->flush();
1131 }
1132 
pauseAndWait(const std::chrono::milliseconds & timeout)1133 bool AudioTrack::pauseAndWait(const std::chrono::milliseconds& timeout)
1134 {
1135     using namespace std::chrono_literals;
1136 
1137     // We use atomic access here for state variables - these are used as hints
1138     // to ensure we have ramped down audio.
1139     const int priorState = mProxy->getState();
1140     const uint32_t priorPosition = mProxy->getPosition().unsignedValue();
1141 
1142     pause();
1143 
1144     // Only if we were previously active, do we wait to ramp down the audio.
1145     if (priorState != CBLK_STATE_ACTIVE) return true;
1146 
1147     AutoMutex lock(mLock);
1148     // offload and direct tracks do not wait because pause volume ramp is handled by hardware.
1149     if (isOffloadedOrDirect_l()) return true;
1150 
1151     // Wait for the track state to be anything besides pausing.
1152     // This ensures that the volume has ramped down.
1153     constexpr auto SLEEP_INTERVAL_MS = 10ms;
1154     constexpr auto POSITION_TIMEOUT_MS = 40ms; // don't wait longer than this for position change.
1155     auto begin = std::chrono::steady_clock::now();
1156     while (true) {
1157         // Wait for state and position to change.
1158         // After pause() the server state should be PAUSING, but that may immediately
1159         // convert to PAUSED by prepareTracks before data is read into the mixer.
1160         // Hence we check that the state is not PAUSING and that the server position
1161         // has advanced to be a more reliable estimate that the volume ramp has completed.
1162         const int state = mProxy->getState();
1163         const uint32_t position = mProxy->getPosition().unsignedValue();
1164 
1165         mLock.unlock(); // only local variables accessed until lock.
1166         auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(
1167                 std::chrono::steady_clock::now() - begin);
1168         if (state != CBLK_STATE_PAUSING &&
1169                 (elapsed >= POSITION_TIMEOUT_MS || position != priorPosition)) {
1170             ALOGV("%s: success state:%d, position:%u after %lld ms"
1171                     " (prior state:%d  prior position:%u)",
1172                     __func__, state, position, elapsed.count(), priorState, priorPosition);
1173             return true;
1174         }
1175         std::chrono::milliseconds remaining = timeout - elapsed;
1176         if (remaining.count() <= 0) {
1177             ALOGW("%s: timeout expired state:%d still pausing:%d after %lld ms",
1178                     __func__, state, CBLK_STATE_PAUSING, elapsed.count());
1179             return false;
1180         }
1181         // It is conceivable that the track is restored while sleeping;
1182         // as this logic is advisory, we allow that.
1183         std::this_thread::sleep_for(std::min(remaining, SLEEP_INTERVAL_MS));
1184         mLock.lock();
1185     }
1186 }
1187 
pause()1188 void AudioTrack::pause()
1189 {
1190     const int64_t beginNs = systemTime();
1191     AutoMutex lock(mLock);
1192     mediametrics::Defer defer([&]() {
1193         mediametrics::LogItem(mMetricsId)
1194             .set(AMEDIAMETRICS_PROP_EVENT, AMEDIAMETRICS_PROP_EVENT_VALUE_PAUSE)
1195             .set(AMEDIAMETRICS_PROP_EXECUTIONTIMENS, (int64_t)(systemTime() - beginNs))
1196             .set(AMEDIAMETRICS_PROP_STATE, stateToString(mState))
1197             .record(); });
1198 
1199     ALOGV("%s(%d): prior state:%s", __func__, mPortId, stateToString(mState));
1200 
1201     if (mState == STATE_ACTIVE) {
1202         mState = STATE_PAUSED;
1203     } else if (mState == STATE_STOPPING) {
1204         mState = STATE_PAUSED_STOPPING;
1205     } else {
1206         return;
1207     }
1208     mProxy->interrupt();
1209     mAudioTrack->pause();
1210 
1211     if (isOffloaded_l()) {
1212         if (mOutput != AUDIO_IO_HANDLE_NONE) {
1213             // An offload output can be re-used between two audio tracks having
1214             // the same configuration. A timestamp query for a paused track
1215             // while the other is running would return an incorrect time.
1216             // To fix this, cache the playback position on a pause() and return
1217             // this time when requested until the track is resumed.
1218 
1219             // OffloadThread sends HAL pause in its threadLoop. Time saved
1220             // here can be slightly off.
1221 
1222             // TODO: check return code for getRenderPosition.
1223 
1224             uint32_t halFrames;
1225             AudioSystem::getRenderPosition(mOutput, &halFrames, &mPausedPosition);
1226             ALOGV("%s(%d): for offload, cache current position %u",
1227                     __func__, mPortId, mPausedPosition);
1228         }
1229     }
1230 }
1231 
setVolume(float left,float right)1232 status_t AudioTrack::setVolume(float left, float right)
1233 {
1234     // This duplicates a test by AudioTrack JNI, but that is not the only caller
1235     if (isnanf(left) || left < GAIN_FLOAT_ZERO || left > GAIN_FLOAT_UNITY ||
1236             isnanf(right) || right < GAIN_FLOAT_ZERO || right > GAIN_FLOAT_UNITY) {
1237         return BAD_VALUE;
1238     }
1239 
1240     mediametrics::LogItem(mMetricsId)
1241         .set(AMEDIAMETRICS_PROP_EVENT, AMEDIAMETRICS_PROP_EVENT_VALUE_SETVOLUME)
1242         .set(AMEDIAMETRICS_PROP_VOLUME_LEFT, (double)left)
1243         .set(AMEDIAMETRICS_PROP_VOLUME_RIGHT, (double)right)
1244         .record();
1245 
1246     AutoMutex lock(mLock);
1247     mVolume[AUDIO_INTERLEAVE_LEFT] = left;
1248     mVolume[AUDIO_INTERLEAVE_RIGHT] = right;
1249 
1250     mProxy->setVolumeLR(gain_minifloat_pack(gain_from_float(left), gain_from_float(right)));
1251 
1252     if (isOffloaded_l()) {
1253         mAudioTrack->signal();
1254     }
1255     return NO_ERROR;
1256 }
1257 
setVolume(float volume)1258 status_t AudioTrack::setVolume(float volume)
1259 {
1260     return setVolume(volume, volume);
1261 }
1262 
setAuxEffectSendLevel(float level)1263 status_t AudioTrack::setAuxEffectSendLevel(float level)
1264 {
1265     // This duplicates a test by AudioTrack JNI, but that is not the only caller
1266     if (isnanf(level) || level < GAIN_FLOAT_ZERO || level > GAIN_FLOAT_UNITY) {
1267         return BAD_VALUE;
1268     }
1269 
1270     AutoMutex lock(mLock);
1271     mSendLevel = level;
1272     mProxy->setSendLevel(level);
1273 
1274     return NO_ERROR;
1275 }
1276 
getAuxEffectSendLevel(float * level) const1277 void AudioTrack::getAuxEffectSendLevel(float* level) const
1278 {
1279     if (level != NULL) {
1280         *level = mSendLevel;
1281     }
1282 }
1283 
setSampleRate(uint32_t rate)1284 status_t AudioTrack::setSampleRate(uint32_t rate)
1285 {
1286     AutoMutex lock(mLock);
1287     ALOGV("%s(%d): prior state:%s rate:%u", __func__, mPortId, stateToString(mState), rate);
1288 
1289     if (rate == mSampleRate) {
1290         return NO_ERROR;
1291     }
1292     if (isOffloadedOrDirect_l() || (mFlags & AUDIO_OUTPUT_FLAG_FAST)
1293             || (mChannelMask & AUDIO_CHANNEL_HAPTIC_ALL)) {
1294         return INVALID_OPERATION;
1295     }
1296     if (mOutput == AUDIO_IO_HANDLE_NONE) {
1297         return NO_INIT;
1298     }
1299     // NOTE: it is theoretically possible, but highly unlikely, that a device change
1300     // could mean a previously allowed sampling rate is no longer allowed.
1301     uint32_t afSamplingRate;
1302     if (AudioSystem::getSamplingRate(mOutput, &afSamplingRate) != NO_ERROR) {
1303         return NO_INIT;
1304     }
1305     // pitch is emulated by adjusting speed and sampleRate
1306     const uint32_t effectiveSampleRate = adjustSampleRate(rate, mPlaybackRate.mPitch);
1307     if (rate == 0 || effectiveSampleRate > afSamplingRate * AUDIO_RESAMPLER_DOWN_RATIO_MAX) {
1308         return BAD_VALUE;
1309     }
1310     // TODO: Should we also check if the buffer size is compatible?
1311 
1312     mSampleRate = rate;
1313     mProxy->setSampleRate(effectiveSampleRate);
1314 
1315     return NO_ERROR;
1316 }
1317 
getSampleRate() const1318 uint32_t AudioTrack::getSampleRate() const
1319 {
1320     AutoMutex lock(mLock);
1321 
1322     // sample rate can be updated during playback by the offloaded decoder so we need to
1323     // query the HAL and update if needed.
1324 // FIXME use Proxy return channel to update the rate from server and avoid polling here
1325     if (isOffloadedOrDirect_l()) {
1326         if (mOutput != AUDIO_IO_HANDLE_NONE) {
1327             uint32_t sampleRate = 0;
1328             status_t status = AudioSystem::getSamplingRate(mOutput, &sampleRate);
1329             if (status == NO_ERROR) {
1330                 mSampleRate = sampleRate;
1331             }
1332         }
1333     }
1334     return mSampleRate;
1335 }
1336 
getOriginalSampleRate() const1337 uint32_t AudioTrack::getOriginalSampleRate() const
1338 {
1339     return mOriginalSampleRate;
1340 }
1341 
setDualMonoMode(audio_dual_mono_mode_t mode)1342 status_t AudioTrack::setDualMonoMode(audio_dual_mono_mode_t mode)
1343 {
1344     AutoMutex lock(mLock);
1345     return setDualMonoMode_l(mode);
1346 }
1347 
setDualMonoMode_l(audio_dual_mono_mode_t mode)1348 status_t AudioTrack::setDualMonoMode_l(audio_dual_mono_mode_t mode)
1349 {
1350     const status_t status = statusTFromBinderStatus(
1351         mAudioTrack->setDualMonoMode(VALUE_OR_RETURN_STATUS(
1352             legacy2aidl_audio_dual_mono_mode_t_AudioDualMonoMode(mode))));
1353     if (status == NO_ERROR) mDualMonoMode = mode;
1354     return status;
1355 }
1356 
getDualMonoMode(audio_dual_mono_mode_t * mode) const1357 status_t AudioTrack::getDualMonoMode(audio_dual_mono_mode_t* mode) const
1358 {
1359     AutoMutex lock(mLock);
1360     media::AudioDualMonoMode mediaMode;
1361     const status_t status = statusTFromBinderStatus(mAudioTrack->getDualMonoMode(&mediaMode));
1362     if (status == NO_ERROR) {
1363         *mode = VALUE_OR_RETURN_STATUS(
1364                 aidl2legacy_AudioDualMonoMode_audio_dual_mono_mode_t(mediaMode));
1365     }
1366     return status;
1367 }
1368 
setAudioDescriptionMixLevel(float leveldB)1369 status_t AudioTrack::setAudioDescriptionMixLevel(float leveldB)
1370 {
1371     AutoMutex lock(mLock);
1372     return setAudioDescriptionMixLevel_l(leveldB);
1373 }
1374 
setAudioDescriptionMixLevel_l(float leveldB)1375 status_t AudioTrack::setAudioDescriptionMixLevel_l(float leveldB)
1376 {
1377     const status_t status = statusTFromBinderStatus(
1378              mAudioTrack->setAudioDescriptionMixLevel(leveldB));
1379     if (status == NO_ERROR) mAudioDescriptionMixLeveldB = leveldB;
1380     return status;
1381 }
1382 
getAudioDescriptionMixLevel(float * leveldB) const1383 status_t AudioTrack::getAudioDescriptionMixLevel(float* leveldB) const
1384 {
1385     AutoMutex lock(mLock);
1386     return statusTFromBinderStatus(mAudioTrack->getAudioDescriptionMixLevel(leveldB));
1387 }
1388 
setPlaybackRate(const AudioPlaybackRate & playbackRate)1389 status_t AudioTrack::setPlaybackRate(const AudioPlaybackRate &playbackRate)
1390 {
1391     AutoMutex lock(mLock);
1392     if (isAudioPlaybackRateEqual(playbackRate, mPlaybackRate)) {
1393         return NO_ERROR;
1394     }
1395     if (isOffloadedOrDirect_l()) {
1396         const status_t status = statusTFromBinderStatus(mAudioTrack->setPlaybackRateParameters(
1397                 VALUE_OR_RETURN_STATUS(
1398                         legacy2aidl_audio_playback_rate_t_AudioPlaybackRate(playbackRate))));
1399         if (status == NO_ERROR) {
1400             mPlaybackRate = playbackRate;
1401         }
1402         return status;
1403     }
1404     if (mFlags & AUDIO_OUTPUT_FLAG_FAST) {
1405         return INVALID_OPERATION;
1406     }
1407 
1408     ALOGV("%s(%d): mSampleRate:%u  mSpeed:%f  mPitch:%f",
1409             __func__, mPortId, mSampleRate, playbackRate.mSpeed, playbackRate.mPitch);
1410     // pitch is emulated by adjusting speed and sampleRate
1411     const uint32_t effectiveRate = adjustSampleRate(mSampleRate, playbackRate.mPitch);
1412     const float effectiveSpeed = adjustSpeed(playbackRate.mSpeed, playbackRate.mPitch);
1413     const float effectivePitch = adjustPitch(playbackRate.mPitch);
1414     AudioPlaybackRate playbackRateTemp = playbackRate;
1415     playbackRateTemp.mSpeed = effectiveSpeed;
1416     playbackRateTemp.mPitch = effectivePitch;
1417 
1418     ALOGV("%s(%d) (effective) mSampleRate:%u  mSpeed:%f  mPitch:%f",
1419             __func__, mPortId, effectiveRate, effectiveSpeed, effectivePitch);
1420 
1421     if (!isAudioPlaybackRateValid(playbackRateTemp)) {
1422         ALOGW("%s(%d) (%f, %f) failed (effective rate out of bounds)",
1423                 __func__, mPortId, playbackRate.mSpeed, playbackRate.mPitch);
1424         return BAD_VALUE;
1425     }
1426     // Check if the buffer size is compatible.
1427     if (!isSampleRateSpeedAllowed_l(effectiveRate, effectiveSpeed)) {
1428         ALOGW("%s(%d) (%f, %f) failed (buffer size)",
1429                 __func__, mPortId, playbackRate.mSpeed, playbackRate.mPitch);
1430         return BAD_VALUE;
1431     }
1432 
1433     // Check resampler ratios are within bounds
1434     if ((uint64_t)effectiveRate > (uint64_t)mSampleRate *
1435             (uint64_t)AUDIO_RESAMPLER_DOWN_RATIO_MAX) {
1436         ALOGW("%s(%d) (%f, %f) failed. Resample rate exceeds max accepted value",
1437                 __func__, mPortId, playbackRate.mSpeed, playbackRate.mPitch);
1438         return BAD_VALUE;
1439     }
1440 
1441     if ((uint64_t)effectiveRate * (uint64_t)AUDIO_RESAMPLER_UP_RATIO_MAX < (uint64_t)mSampleRate) {
1442         ALOGW("%s(%d) (%f, %f) failed. Resample rate below min accepted value",
1443                 __func__, mPortId, playbackRate.mSpeed, playbackRate.mPitch);
1444         return BAD_VALUE;
1445     }
1446     mPlaybackRate = playbackRate;
1447     //set effective rates
1448     mProxy->setPlaybackRate(playbackRateTemp);
1449     mProxy->setSampleRate(effectiveRate); // FIXME: not quite "atomic" with setPlaybackRate
1450 
1451     mediametrics::LogItem(mMetricsId)
1452         .set(AMEDIAMETRICS_PROP_EVENT, AMEDIAMETRICS_PROP_EVENT_VALUE_SETPLAYBACKPARAM)
1453         .set(AMEDIAMETRICS_PROP_SAMPLERATE, (int32_t)mSampleRate)
1454         .set(AMEDIAMETRICS_PROP_PLAYBACK_SPEED, (double)mPlaybackRate.mSpeed)
1455         .set(AMEDIAMETRICS_PROP_PLAYBACK_PITCH, (double)mPlaybackRate.mPitch)
1456         .set(AMEDIAMETRICS_PROP_PREFIX_EFFECTIVE
1457                 AMEDIAMETRICS_PROP_SAMPLERATE, (int32_t)effectiveRate)
1458         .set(AMEDIAMETRICS_PROP_PREFIX_EFFECTIVE
1459                 AMEDIAMETRICS_PROP_PLAYBACK_SPEED, (double)playbackRateTemp.mSpeed)
1460         .set(AMEDIAMETRICS_PROP_PREFIX_EFFECTIVE
1461                 AMEDIAMETRICS_PROP_PLAYBACK_PITCH, (double)playbackRateTemp.mPitch)
1462         .record();
1463 
1464     return NO_ERROR;
1465 }
1466 
getPlaybackRate()1467 const AudioPlaybackRate& AudioTrack::getPlaybackRate()
1468 {
1469     AutoMutex lock(mLock);
1470     if (isOffloadedOrDirect_l()) {
1471         media::AudioPlaybackRate playbackRateTemp;
1472         const status_t status = statusTFromBinderStatus(
1473                 mAudioTrack->getPlaybackRateParameters(&playbackRateTemp));
1474         if (status == NO_ERROR) { // update local version if changed.
1475             mPlaybackRate =
1476                     aidl2legacy_AudioPlaybackRate_audio_playback_rate_t(playbackRateTemp).value();
1477         }
1478     }
1479     return mPlaybackRate;
1480 }
1481 
getBufferSizeInFrames()1482 ssize_t AudioTrack::getBufferSizeInFrames()
1483 {
1484     AutoMutex lock(mLock);
1485     if (mOutput == AUDIO_IO_HANDLE_NONE || mProxy.get() == 0) {
1486         return NO_INIT;
1487     }
1488 
1489     return (ssize_t) mProxy->getBufferSizeInFrames();
1490 }
1491 
getBufferDurationInUs(int64_t * duration)1492 status_t AudioTrack::getBufferDurationInUs(int64_t *duration)
1493 {
1494     if (duration == nullptr) {
1495         return BAD_VALUE;
1496     }
1497     AutoMutex lock(mLock);
1498     if (mOutput == AUDIO_IO_HANDLE_NONE || mProxy.get() == 0) {
1499         return NO_INIT;
1500     }
1501     ssize_t bufferSizeInFrames = (ssize_t) mProxy->getBufferSizeInFrames();
1502     if (bufferSizeInFrames < 0) {
1503         return (status_t)bufferSizeInFrames;
1504     }
1505     *duration = (int64_t)((double)bufferSizeInFrames * 1000000
1506             / ((double)mSampleRate * mPlaybackRate.mSpeed));
1507     return NO_ERROR;
1508 }
1509 
setBufferSizeInFrames(size_t bufferSizeInFrames)1510 ssize_t AudioTrack::setBufferSizeInFrames(size_t bufferSizeInFrames)
1511 {
1512     AutoMutex lock(mLock);
1513     if (mOutput == AUDIO_IO_HANDLE_NONE || mProxy.get() == 0) {
1514         return NO_INIT;
1515     }
1516 
1517     ssize_t originalBufferSize = mProxy->getBufferSizeInFrames();
1518     ssize_t finalBufferSize  = mProxy->setBufferSizeInFrames((uint32_t) bufferSizeInFrames);
1519     if (originalBufferSize != finalBufferSize) {
1520         android::mediametrics::LogItem(mMetricsId)
1521                 .set(AMEDIAMETRICS_PROP_EVENT, AMEDIAMETRICS_PROP_EVENT_VALUE_SETBUFFERSIZE)
1522                 .set(AMEDIAMETRICS_PROP_BUFFERSIZEFRAMES, (int32_t)mProxy->getBufferSizeInFrames())
1523                 .set(AMEDIAMETRICS_PROP_UNDERRUN, (int32_t)getUnderrunCount_l())
1524                 .record();
1525     }
1526     return finalBufferSize;
1527 }
1528 
getStartThresholdInFrames() const1529 ssize_t AudioTrack::getStartThresholdInFrames() const
1530 {
1531     AutoMutex lock(mLock);
1532     if (mOutput == AUDIO_IO_HANDLE_NONE || mProxy.get() == 0) {
1533         return NO_INIT;
1534     }
1535     return (ssize_t) mProxy->getStartThresholdInFrames();
1536 }
1537 
setStartThresholdInFrames(size_t startThresholdInFrames)1538 ssize_t AudioTrack::setStartThresholdInFrames(size_t startThresholdInFrames)
1539 {
1540     if (startThresholdInFrames > INT32_MAX || startThresholdInFrames == 0) {
1541         // contractually we could simply return the current threshold in frames
1542         // to indicate the request was ignored, but we return an error here.
1543         return BAD_VALUE;
1544     }
1545     AutoMutex lock(mLock);
1546     // We do not permit calling setStartThresholdInFrames() between the AudioTrack
1547     // default ctor AudioTrack() and set(...) but rather fail such an attempt.
1548     // (To do so would require a cached mOrigStartThresholdInFrames and we may
1549     // not have proper validation for the actual set value).
1550     if (mOutput == AUDIO_IO_HANDLE_NONE || mProxy.get() == 0) {
1551         return NO_INIT;
1552     }
1553     const uint32_t original = mProxy->getStartThresholdInFrames();
1554     const uint32_t final = mProxy->setStartThresholdInFrames(startThresholdInFrames);
1555     if (original != final) {
1556         android::mediametrics::LogItem(mMetricsId)
1557                 .set(AMEDIAMETRICS_PROP_EVENT, AMEDIAMETRICS_PROP_EVENT_VALUE_SETSTARTTHRESHOLD)
1558                 .set(AMEDIAMETRICS_PROP_STARTTHRESHOLDFRAMES, (int32_t)final)
1559                 .record();
1560         if (original > final) {
1561             // restart track if it was disabled by audioflinger due to previous underrun
1562             // and we reduced the number of frames for the threshold.
1563             restartIfDisabled();
1564         }
1565     }
1566     return final;
1567 }
1568 
setLoop(uint32_t loopStart,uint32_t loopEnd,int loopCount)1569 status_t AudioTrack::setLoop(uint32_t loopStart, uint32_t loopEnd, int loopCount)
1570 {
1571     if (mSharedBuffer == 0 || isOffloadedOrDirect()) {
1572         return INVALID_OPERATION;
1573     }
1574 
1575     if (loopCount == 0) {
1576         ;
1577     } else if (loopCount >= -1 && loopStart < loopEnd && loopEnd <= mFrameCount &&
1578             loopEnd - loopStart >= MIN_LOOP) {
1579         ;
1580     } else {
1581         return BAD_VALUE;
1582     }
1583 
1584     AutoMutex lock(mLock);
1585     // See setPosition() regarding setting parameters such as loop points or position while active
1586     if (mState == STATE_ACTIVE) {
1587         return INVALID_OPERATION;
1588     }
1589     setLoop_l(loopStart, loopEnd, loopCount);
1590     return NO_ERROR;
1591 }
1592 
setLoop_l(uint32_t loopStart,uint32_t loopEnd,int loopCount)1593 void AudioTrack::setLoop_l(uint32_t loopStart, uint32_t loopEnd, int loopCount)
1594 {
1595     // We do not update the periodic notification point.
1596     // mNewPosition = updateAndGetPosition_l() + mUpdatePeriod;
1597     mLoopCount = loopCount;
1598     mLoopEnd = loopEnd;
1599     mLoopStart = loopStart;
1600     mLoopCountNotified = loopCount;
1601     mStaticProxy->setLoop(loopStart, loopEnd, loopCount);
1602 
1603     // Waking the AudioTrackThread is not needed as this cannot be called when active.
1604 }
1605 
setMarkerPosition(uint32_t marker)1606 status_t AudioTrack::setMarkerPosition(uint32_t marker)
1607 {
1608     AutoMutex lock(mLock);
1609     // The only purpose of setting marker position is to get a callback
1610     if (!mCallback.promote() || isOffloadedOrDirect_l()) {
1611         return INVALID_OPERATION;
1612     }
1613 
1614     mMarkerPosition = marker;
1615     mMarkerReached = false;
1616 
1617     sp<AudioTrackThread> t = mAudioTrackThread;
1618     if (t != 0) {
1619         t->wake();
1620     }
1621     return NO_ERROR;
1622 }
1623 
getMarkerPosition(uint32_t * marker) const1624 status_t AudioTrack::getMarkerPosition(uint32_t *marker) const
1625 {
1626     if (isOffloadedOrDirect()) {
1627         return INVALID_OPERATION;
1628     }
1629     if (marker == NULL) {
1630         return BAD_VALUE;
1631     }
1632 
1633     AutoMutex lock(mLock);
1634     mMarkerPosition.getValue(marker);
1635 
1636     return NO_ERROR;
1637 }
1638 
setPositionUpdatePeriod(uint32_t updatePeriod)1639 status_t AudioTrack::setPositionUpdatePeriod(uint32_t updatePeriod)
1640 {
1641     AutoMutex lock(mLock);
1642     // The only purpose of setting position update period is to get a callback
1643     if (!mCallback.promote() || isOffloadedOrDirect_l()) {
1644         return INVALID_OPERATION;
1645     }
1646 
1647     mNewPosition = updateAndGetPosition_l() + updatePeriod;
1648     mUpdatePeriod = updatePeriod;
1649 
1650     sp<AudioTrackThread> t = mAudioTrackThread;
1651     if (t != 0) {
1652         t->wake();
1653     }
1654     return NO_ERROR;
1655 }
1656 
getPositionUpdatePeriod(uint32_t * updatePeriod) const1657 status_t AudioTrack::getPositionUpdatePeriod(uint32_t *updatePeriod) const
1658 {
1659     if (isOffloadedOrDirect()) {
1660         return INVALID_OPERATION;
1661     }
1662     if (updatePeriod == NULL) {
1663         return BAD_VALUE;
1664     }
1665 
1666     AutoMutex lock(mLock);
1667     *updatePeriod = mUpdatePeriod;
1668 
1669     return NO_ERROR;
1670 }
1671 
setPosition(uint32_t position)1672 status_t AudioTrack::setPosition(uint32_t position)
1673 {
1674     if (mSharedBuffer == 0 || isOffloadedOrDirect()) {
1675         return INVALID_OPERATION;
1676     }
1677     if (position > mFrameCount) {
1678         return BAD_VALUE;
1679     }
1680 
1681     AutoMutex lock(mLock);
1682     // Currently we require that the player is inactive before setting parameters such as position
1683     // or loop points.  Otherwise, there could be a race condition: the application could read the
1684     // current position, compute a new position or loop parameters, and then set that position or
1685     // loop parameters but it would do the "wrong" thing since the position has continued to advance
1686     // in the mean time.  If we ever provide a sequencer in server, we could allow a way for the app
1687     // to specify how it wants to handle such scenarios.
1688     if (mState == STATE_ACTIVE) {
1689         return INVALID_OPERATION;
1690     }
1691     // After setting the position, use full update period before notification.
1692     mNewPosition = updateAndGetPosition_l() + mUpdatePeriod;
1693     mStaticProxy->setBufferPosition(position);
1694 
1695     // Waking the AudioTrackThread is not needed as this cannot be called when active.
1696     return NO_ERROR;
1697 }
1698 
getPosition(uint32_t * position)1699 status_t AudioTrack::getPosition(uint32_t *position)
1700 {
1701     if (position == NULL) {
1702         return BAD_VALUE;
1703     }
1704 
1705     AutoMutex lock(mLock);
1706     // FIXME: offloaded and direct tracks call into the HAL for render positions
1707     // for compressed/synced data; however, we use proxy position for pure linear pcm data
1708     // as we do not know the capability of the HAL for pcm position support and standby.
1709     // There may be some latency differences between the HAL position and the proxy position.
1710     if (isOffloadedOrDirect_l() && !isPurePcmData_l()) {
1711         uint32_t dspFrames = 0;
1712 
1713         if (isOffloaded_l() && ((mState == STATE_PAUSED) || (mState == STATE_PAUSED_STOPPING))) {
1714             ALOGV("%s(%d): called in paused state, return cached position %u",
1715                 __func__, mPortId, mPausedPosition);
1716             *position = mPausedPosition;
1717             return NO_ERROR;
1718         }
1719 
1720         if (mOutput != AUDIO_IO_HANDLE_NONE) {
1721             uint32_t halFrames; // actually unused
1722             (void) AudioSystem::getRenderPosition(mOutput, &halFrames, &dspFrames);
1723             // FIXME: on getRenderPosition() error, we return OK with frame position 0.
1724         }
1725         // FIXME: dspFrames may not be zero in (mState == STATE_STOPPED || mState == STATE_FLUSHED)
1726         // due to hardware latency. We leave this behavior for now.
1727         *position = dspFrames;
1728     } else {
1729         if (mCblk->mFlags & CBLK_INVALID) {
1730             (void) restoreTrack_l("getPosition");
1731             // FIXME: for compatibility with the Java API we ignore the restoreTrack_l()
1732             // error here (e.g. DEAD_OBJECT) and return OK with the last recorded server position.
1733         }
1734 
1735         // IAudioTrack::stop() isn't synchronous; we don't know when presentation completes
1736         *position = (mState == STATE_STOPPED || mState == STATE_FLUSHED) ?
1737                 0 : updateAndGetPosition_l().value();
1738     }
1739     return NO_ERROR;
1740 }
1741 
getBufferPosition(uint32_t * position)1742 status_t AudioTrack::getBufferPosition(uint32_t *position)
1743 {
1744     if (mSharedBuffer == 0) {
1745         return INVALID_OPERATION;
1746     }
1747     if (position == NULL) {
1748         return BAD_VALUE;
1749     }
1750 
1751     AutoMutex lock(mLock);
1752     *position = mStaticProxy->getBufferPosition();
1753     return NO_ERROR;
1754 }
1755 
reload()1756 status_t AudioTrack::reload()
1757 {
1758     if (mSharedBuffer == 0 || isOffloadedOrDirect()) {
1759         return INVALID_OPERATION;
1760     }
1761 
1762     AutoMutex lock(mLock);
1763     // See setPosition() regarding setting parameters such as loop points or position while active
1764     if (mState == STATE_ACTIVE) {
1765         return INVALID_OPERATION;
1766     }
1767     mNewPosition = mUpdatePeriod;
1768     (void) updateAndGetPosition_l();
1769     mPosition = 0;
1770     mPreviousTimestampValid = false;
1771 #if 0
1772     // The documentation is not clear on the behavior of reload() and the restoration
1773     // of loop count. Historically we have not restored loop count, start, end,
1774     // but it makes sense if one desires to repeat playing a particular sound.
1775     if (mLoopCount != 0) {
1776         mLoopCountNotified = mLoopCount;
1777         mStaticProxy->setLoop(mLoopStart, mLoopEnd, mLoopCount);
1778     }
1779 #endif
1780     mStaticProxy->setBufferPosition(0);
1781     return NO_ERROR;
1782 }
1783 
getOutput() const1784 audio_io_handle_t AudioTrack::getOutput() const
1785 {
1786     AutoMutex lock(mLock);
1787     return mOutput;
1788 }
1789 
setOutputDevice(audio_port_handle_t deviceId)1790 status_t AudioTrack::setOutputDevice(audio_port_handle_t deviceId) {
1791     AutoMutex lock(mLock);
1792     ALOGV("%s(%d): deviceId=%d mSelectedDeviceId=%d mRoutedDeviceId %d",
1793             __func__, mPortId, deviceId, mSelectedDeviceId, mRoutedDeviceId);
1794     if (mSelectedDeviceId != deviceId) {
1795         mSelectedDeviceId = deviceId;
1796         if (mStatus == NO_ERROR && mSelectedDeviceId != mRoutedDeviceId) {
1797             if (isPlaying_l()) {
1798                 android_atomic_or(CBLK_INVALID, &mCblk->mFlags);
1799                 mProxy->interrupt();
1800             } else {
1801                 // if the track is idle, try to restore now and
1802                 // defer to next start if not possible
1803                 if (restoreTrack_l("setOutputDevice") != OK) {
1804                     android_atomic_or(CBLK_INVALID, &mCblk->mFlags);
1805                 }
1806             }
1807         }
1808     }
1809     return NO_ERROR;
1810 }
1811 
getOutputDevice()1812 audio_port_handle_t AudioTrack::getOutputDevice() {
1813     AutoMutex lock(mLock);
1814     return mSelectedDeviceId;
1815 }
1816 
1817 // must be called with mLock held
updateRoutedDeviceId_l()1818 void AudioTrack::updateRoutedDeviceId_l()
1819 {
1820     // if the track is inactive, do not update actual device as the output stream maybe routed
1821     // to a device not relevant to this client because of other active use cases.
1822     if (mState != STATE_ACTIVE) {
1823         return;
1824     }
1825     if (mOutput != AUDIO_IO_HANDLE_NONE) {
1826         audio_port_handle_t deviceId = AudioSystem::getDeviceIdForIo(mOutput);
1827         if (deviceId != AUDIO_PORT_HANDLE_NONE) {
1828             mRoutedDeviceId = deviceId;
1829         }
1830     }
1831 }
1832 
getRoutedDeviceId()1833 audio_port_handle_t AudioTrack::getRoutedDeviceId() {
1834     AutoMutex lock(mLock);
1835     updateRoutedDeviceId_l();
1836     return mRoutedDeviceId;
1837 }
1838 
attachAuxEffect(int effectId)1839 status_t AudioTrack::attachAuxEffect(int effectId)
1840 {
1841     AutoMutex lock(mLock);
1842     status_t status;
1843     mAudioTrack->attachAuxEffect(effectId, &status);
1844     if (status == NO_ERROR) {
1845         mAuxEffectId = effectId;
1846     }
1847     return status;
1848 }
1849 
streamType() const1850 audio_stream_type_t AudioTrack::streamType() const
1851 {
1852     return mStreamType;
1853 }
1854 
latency()1855 uint32_t AudioTrack::latency()
1856 {
1857     AutoMutex lock(mLock);
1858     updateLatency_l();
1859     return mLatency;
1860 }
1861 
1862 // -------------------------------------------------------------------------
1863 
1864 // must be called with mLock held
updateLatency_l()1865 void AudioTrack::updateLatency_l()
1866 {
1867     status_t status = AudioSystem::getLatency(mOutput, &mAfLatency);
1868     if (status != NO_ERROR) {
1869         ALOGW("%s(%d): getLatency(%d) failed status %d", __func__, mPortId, mOutput, status);
1870     } else {
1871         // FIXME don't believe this lie
1872         mLatency = mAfLatency + (1000LL * mFrameCount) / mSampleRate;
1873     }
1874 }
1875 
1876 // TODO Move this macro to a common header file for enum to string conversion in audio framework.
1877 #define MEDIA_CASE_ENUM(name) case name: return #name
convertTransferToText(transfer_type transferType)1878 const char * AudioTrack::convertTransferToText(transfer_type transferType) {
1879     switch (transferType) {
1880         MEDIA_CASE_ENUM(TRANSFER_DEFAULT);
1881         MEDIA_CASE_ENUM(TRANSFER_CALLBACK);
1882         MEDIA_CASE_ENUM(TRANSFER_OBTAIN);
1883         MEDIA_CASE_ENUM(TRANSFER_SYNC);
1884         MEDIA_CASE_ENUM(TRANSFER_SHARED);
1885         MEDIA_CASE_ENUM(TRANSFER_SYNC_NOTIF_CALLBACK);
1886         default:
1887             return "UNRECOGNIZED";
1888     }
1889 }
1890 
createTrack_l()1891 status_t AudioTrack::createTrack_l()
1892 {
1893     status_t status;
1894     bool callbackAdded = false;
1895     std::string errorMessage;
1896 
1897     const sp<IAudioFlinger>& audioFlinger = AudioSystem::get_audio_flinger();
1898     if (audioFlinger == 0) {
1899         errorMessage = StringPrintf("%s(%d): Could not get audioflinger",
1900                 __func__, mPortId);
1901         status = DEAD_OBJECT;
1902         goto exit;
1903     }
1904 
1905     {
1906     // mFlags (not mOrigFlags) is modified depending on whether fast request is accepted.
1907     // After fast request is denied, we will request again if IAudioTrack is re-created.
1908     // Client can only express a preference for FAST.  Server will perform additional tests.
1909     if (mFlags & AUDIO_OUTPUT_FLAG_FAST) {
1910         // either of these use cases:
1911         // use case 1: shared buffer
1912         bool sharedBuffer = mSharedBuffer != 0;
1913         bool transferAllowed =
1914             // use case 2: callback transfer mode
1915             (mTransfer == TRANSFER_CALLBACK) ||
1916             // use case 3: obtain/release mode
1917             (mTransfer == TRANSFER_OBTAIN) ||
1918             // use case 4: synchronous write
1919             ((mTransfer == TRANSFER_SYNC || mTransfer == TRANSFER_SYNC_NOTIF_CALLBACK)
1920                     && mThreadCanCallJava);
1921 
1922         bool fastAllowed = sharedBuffer || transferAllowed;
1923         if (!fastAllowed) {
1924             ALOGW("%s(%d): AUDIO_OUTPUT_FLAG_FAST denied by client,"
1925                   " not shared buffer and transfer = %s",
1926                   __func__, mPortId,
1927                   convertTransferToText(mTransfer));
1928             mFlags = (audio_output_flags_t) (mFlags & ~AUDIO_OUTPUT_FLAG_FAST);
1929         }
1930     }
1931 
1932     IAudioFlinger::CreateTrackInput input;
1933     if (mOriginalStreamType != AUDIO_STREAM_DEFAULT) {
1934         // Legacy: This is based on original parameters even if the track is recreated.
1935         input.attr = AudioSystem::streamTypeToAttributes(mOriginalStreamType);
1936     } else {
1937         input.attr = mAttributes;
1938     }
1939     input.config = AUDIO_CONFIG_INITIALIZER;
1940     input.config.sample_rate = mSampleRate;
1941     input.config.channel_mask = mChannelMask;
1942     input.config.format = mFormat;
1943     input.config.offload_info = mOffloadInfoCopy;
1944     input.clientInfo.attributionSource = mClientAttributionSource;
1945     input.clientInfo.clientTid = -1;
1946     if (mFlags & AUDIO_OUTPUT_FLAG_FAST) {
1947         // It is currently meaningless to request SCHED_FIFO for a Java thread.  Even if the
1948         // application-level code follows all non-blocking design rules, the language runtime
1949         // doesn't also follow those rules, so the thread will not benefit overall.
1950         if (mAudioTrackThread != 0 && !mThreadCanCallJava) {
1951             input.clientInfo.clientTid = mAudioTrackThread->getTid();
1952         }
1953     }
1954     input.sharedBuffer = mSharedBuffer;
1955     input.notificationsPerBuffer = mNotificationsPerBufferReq;
1956     input.speed = 1.0;
1957     if (audio_has_proportional_frames(mFormat) && mSharedBuffer == 0 &&
1958             (mFlags & AUDIO_OUTPUT_FLAG_FAST) == 0) {
1959         input.speed  = !isPurePcmData_l() || isOffloadedOrDirect_l() ? 1.0f :
1960                         max(mMaxRequiredSpeed, mPlaybackRate.mSpeed);
1961     }
1962     input.flags = mFlags;
1963     input.frameCount = mReqFrameCount;
1964     input.notificationFrameCount = mNotificationFramesReq;
1965     input.selectedDeviceId = mSelectedDeviceId;
1966     input.sessionId = mSessionId;
1967     input.audioTrackCallback = mAudioTrackCallback;
1968 
1969     media::CreateTrackResponse response;
1970     status = audioFlinger->createTrack(VALUE_OR_FATAL(input.toAidl()), response);
1971 
1972     IAudioFlinger::CreateTrackOutput output{};
1973     if (status == NO_ERROR) {
1974         output = VALUE_OR_FATAL(IAudioFlinger::CreateTrackOutput::fromAidl(response));
1975     }
1976 
1977     if (status != NO_ERROR || output.outputId == AUDIO_IO_HANDLE_NONE) {
1978         errorMessage = StringPrintf(
1979                 "%s(%d): AudioFlinger could not create track, status: %d output %d",
1980                 __func__, mPortId, status, output.outputId);
1981         if (status == NO_ERROR) {
1982             status = INVALID_OPERATION; // device not ready
1983         }
1984         goto exit;
1985     }
1986     ALOG_ASSERT(output.audioTrack != 0);
1987 
1988     mFrameCount = output.frameCount;
1989     mNotificationFramesAct = (uint32_t)output.notificationFrameCount;
1990     mRoutedDeviceId = output.selectedDeviceId;
1991     mSessionId = output.sessionId;
1992     mStreamType = output.streamType;
1993 
1994     mSampleRate = output.sampleRate;
1995     if (mOriginalSampleRate == 0) {
1996         mOriginalSampleRate = mSampleRate;
1997     }
1998 
1999     mAfFrameCount = output.afFrameCount;
2000     mAfSampleRate = output.afSampleRate;
2001     mAfLatency = output.afLatencyMs;
2002 
2003     mLatency = mAfLatency + (1000LL * mFrameCount) / mSampleRate;
2004 
2005     // AudioFlinger now owns the reference to the I/O handle,
2006     // so we are no longer responsible for releasing it.
2007 
2008     // FIXME compare to AudioRecord
2009     std::optional<media::SharedFileRegion> sfr;
2010     output.audioTrack->getCblk(&sfr);
2011     sp<IMemory> iMem = VALUE_OR_FATAL(aidl2legacy_NullableSharedFileRegion_IMemory(sfr));
2012     if (iMem == 0) {
2013         errorMessage = StringPrintf("%s(%d): Could not get control block", __func__, mPortId);
2014         status = FAILED_TRANSACTION;
2015         goto exit;
2016     }
2017     // TODO: Using unsecurePointer() has some associated security pitfalls
2018     //       (see declaration for details).
2019     //       Either document why it is safe in this case or address the
2020     //       issue (e.g. by copying).
2021     void *iMemPointer = iMem->unsecurePointer();
2022     if (iMemPointer == NULL) {
2023         errorMessage = StringPrintf(
2024                 "%s(%d): Could not get control block pointer", __func__, mPortId);
2025         status = FAILED_TRANSACTION;
2026         goto exit;
2027     }
2028     // invariant that mAudioTrack != 0 is true only after set() returns successfully
2029     if (mAudioTrack != 0) {
2030         IInterface::asBinder(mAudioTrack)->unlinkToDeath(mDeathNotifier, this);
2031         mDeathNotifier.clear();
2032     }
2033     mAudioTrack = output.audioTrack;
2034     mCblkMemory = iMem;
2035     IPCThreadState::self()->flushCommands();
2036 
2037     audio_track_cblk_t* cblk = static_cast<audio_track_cblk_t*>(iMemPointer);
2038     mCblk = cblk;
2039 
2040     mAwaitBoost = false;
2041     if (mFlags & AUDIO_OUTPUT_FLAG_FAST) {
2042         if (output.flags & AUDIO_OUTPUT_FLAG_FAST) {
2043             ALOGI("%s(%d): AUDIO_OUTPUT_FLAG_FAST successful; frameCount %zu -> %zu",
2044                   __func__, mPortId, mReqFrameCount, mFrameCount);
2045             if (!mThreadCanCallJava) {
2046                 mAwaitBoost = true;
2047             }
2048         } else {
2049             ALOGV("%s(%d): AUDIO_OUTPUT_FLAG_FAST denied by server; frameCount %zu -> %zu",
2050                   __func__, mPortId, mReqFrameCount, mFrameCount);
2051         }
2052     }
2053     mFlags = output.flags;
2054 
2055     //mOutput != output includes the case where mOutput == AUDIO_IO_HANDLE_NONE for first creation
2056     if (mDeviceCallback != 0) {
2057         if (mOutput != AUDIO_IO_HANDLE_NONE) {
2058             AudioSystem::removeAudioDeviceCallback(this, mOutput, mPortId);
2059         }
2060         AudioSystem::addAudioDeviceCallback(this, output.outputId, output.portId);
2061         callbackAdded = true;
2062     }
2063 
2064     mPortId = output.portId;
2065     // We retain a copy of the I/O handle, but don't own the reference
2066     mOutput = output.outputId;
2067     mRefreshRemaining = true;
2068 
2069     // Starting address of buffers in shared memory.  If there is a shared buffer, buffers
2070     // is the value of pointer() for the shared buffer, otherwise buffers points
2071     // immediately after the control block.  This address is for the mapping within client
2072     // address space.  AudioFlinger::TrackBase::mBuffer is for the server address space.
2073     void* buffers;
2074     if (mSharedBuffer == 0) {
2075         buffers = cblk + 1;
2076     } else {
2077         // TODO: Using unsecurePointer() has some associated security pitfalls
2078         //       (see declaration for details).
2079         //       Either document why it is safe in this case or address the
2080         //       issue (e.g. by copying).
2081         buffers = mSharedBuffer->unsecurePointer();
2082         if (buffers == NULL) {
2083             errorMessage = StringPrintf(
2084                     "%s(%d): Could not get buffer pointer", __func__, mPortId);
2085             ALOGE("%s", errorMessage.c_str());
2086             status = FAILED_TRANSACTION;
2087             goto exit;
2088         }
2089     }
2090 
2091     mAudioTrack->attachAuxEffect(mAuxEffectId, &status);
2092 
2093     // If IAudioTrack is re-created, don't let the requested frameCount
2094     // decrease.  This can confuse clients that cache frameCount().
2095     if (mFrameCount > mReqFrameCount) {
2096         mReqFrameCount = mFrameCount;
2097     }
2098 
2099     // reset server position to 0 as we have new cblk.
2100     mServer = 0;
2101 
2102     // update proxy
2103     if (mSharedBuffer == 0) {
2104         mStaticProxy.clear();
2105         mProxy = new AudioTrackClientProxy(cblk, buffers, mFrameCount, mFrameSize);
2106     } else {
2107         mStaticProxy = new StaticAudioTrackClientProxy(cblk, buffers, mFrameCount, mFrameSize);
2108         mProxy = mStaticProxy;
2109     }
2110 
2111     mProxy->setVolumeLR(gain_minifloat_pack(
2112             gain_from_float(mVolume[AUDIO_INTERLEAVE_LEFT]),
2113             gain_from_float(mVolume[AUDIO_INTERLEAVE_RIGHT])));
2114 
2115     mProxy->setSendLevel(mSendLevel);
2116     const uint32_t effectiveSampleRate = adjustSampleRate(mSampleRate, mPlaybackRate.mPitch);
2117     const float effectiveSpeed = adjustSpeed(mPlaybackRate.mSpeed, mPlaybackRate.mPitch);
2118     const float effectivePitch = adjustPitch(mPlaybackRate.mPitch);
2119     mProxy->setSampleRate(effectiveSampleRate);
2120 
2121     AudioPlaybackRate playbackRateTemp = mPlaybackRate;
2122     playbackRateTemp.mSpeed = effectiveSpeed;
2123     playbackRateTemp.mPitch = effectivePitch;
2124     mProxy->setPlaybackRate(playbackRateTemp);
2125     mProxy->setMinimum(mNotificationFramesAct);
2126 
2127     if (mDualMonoMode != AUDIO_DUAL_MONO_MODE_OFF) {
2128         setDualMonoMode_l(mDualMonoMode);
2129     }
2130     if (mAudioDescriptionMixLeveldB != -std::numeric_limits<float>::infinity()) {
2131         setAudioDescriptionMixLevel_l(mAudioDescriptionMixLeveldB);
2132     }
2133 
2134     mDeathNotifier = new DeathNotifier(this);
2135     IInterface::asBinder(mAudioTrack)->linkToDeath(mDeathNotifier, this);
2136 
2137     // This is the first log sent from the AudioTrack client.
2138     // The creation of the audio track by AudioFlinger (in the code above)
2139     // is the first log of the AudioTrack and must be present before
2140     // any AudioTrack client logs will be accepted.
2141 
2142     mMetricsId = std::string(AMEDIAMETRICS_KEY_PREFIX_AUDIO_TRACK) + std::to_string(mPortId);
2143     mediametrics::LogItem(mMetricsId)
2144         .set(AMEDIAMETRICS_PROP_EVENT, AMEDIAMETRICS_PROP_EVENT_VALUE_CREATE)
2145         // the following are immutable
2146         .set(AMEDIAMETRICS_PROP_FLAGS, toString(mFlags).c_str())
2147         .set(AMEDIAMETRICS_PROP_ORIGINALFLAGS, toString(mOrigFlags).c_str())
2148         .set(AMEDIAMETRICS_PROP_SESSIONID, (int32_t)mSessionId)
2149         .set(AMEDIAMETRICS_PROP_LOGSESSIONID, mLogSessionId)
2150         .set(AMEDIAMETRICS_PROP_PLAYERIID, mPlayerIId)
2151         .set(AMEDIAMETRICS_PROP_TRACKID, mPortId) // dup from key
2152         .set(AMEDIAMETRICS_PROP_CONTENTTYPE, toString(mAttributes.content_type).c_str())
2153         .set(AMEDIAMETRICS_PROP_USAGE, toString(mAttributes.usage).c_str())
2154         .set(AMEDIAMETRICS_PROP_THREADID, (int32_t)output.outputId)
2155         .set(AMEDIAMETRICS_PROP_SELECTEDDEVICEID, (int32_t)mSelectedDeviceId)
2156         .set(AMEDIAMETRICS_PROP_ROUTEDDEVICEID, (int32_t)mRoutedDeviceId)
2157         .set(AMEDIAMETRICS_PROP_ENCODING, toString(mFormat).c_str())
2158         .set(AMEDIAMETRICS_PROP_CHANNELMASK, (int32_t)mChannelMask)
2159         .set(AMEDIAMETRICS_PROP_FRAMECOUNT, (int32_t)mFrameCount)
2160         // the following are NOT immutable
2161         .set(AMEDIAMETRICS_PROP_VOLUME_LEFT, (double)mVolume[AUDIO_INTERLEAVE_LEFT])
2162         .set(AMEDIAMETRICS_PROP_VOLUME_RIGHT, (double)mVolume[AUDIO_INTERLEAVE_RIGHT])
2163         .set(AMEDIAMETRICS_PROP_STATE, stateToString(mState))
2164         .set(AMEDIAMETRICS_PROP_STATUS, (int32_t)NO_ERROR)
2165         .set(AMEDIAMETRICS_PROP_AUXEFFECTID, (int32_t)mAuxEffectId)
2166         .set(AMEDIAMETRICS_PROP_SAMPLERATE, (int32_t)mSampleRate)
2167         .set(AMEDIAMETRICS_PROP_PLAYBACK_SPEED, (double)mPlaybackRate.mSpeed)
2168         .set(AMEDIAMETRICS_PROP_PLAYBACK_PITCH, (double)mPlaybackRate.mPitch)
2169         .set(AMEDIAMETRICS_PROP_PREFIX_EFFECTIVE
2170                 AMEDIAMETRICS_PROP_SAMPLERATE, (int32_t)effectiveSampleRate)
2171         .set(AMEDIAMETRICS_PROP_PREFIX_EFFECTIVE
2172                 AMEDIAMETRICS_PROP_PLAYBACK_SPEED, (double)effectiveSpeed)
2173         .set(AMEDIAMETRICS_PROP_PREFIX_EFFECTIVE
2174                 AMEDIAMETRICS_PROP_PLAYBACK_PITCH, (double)effectivePitch)
2175         .record();
2176 
2177     // mSendLevel
2178     // mReqFrameCount?
2179     // mNotificationFramesAct, mNotificationFramesReq, mNotificationsPerBufferReq
2180     // mLatency, mAfLatency, mAfFrameCount, mAfSampleRate
2181 
2182     }
2183 
2184 exit:
2185     if (status != NO_ERROR) {
2186         if (callbackAdded) {
2187             // note: mOutput is always valid is callbackAdded is true
2188             AudioSystem::removeAudioDeviceCallback(this, mOutput, mPortId);
2189         }
2190         ALOGE_IF(!errorMessage.empty(), "%s", errorMessage.c_str());
2191         reportError(status, AMEDIAMETRICS_PROP_EVENT_VALUE_CREATE, errorMessage.c_str());
2192     }
2193     mStatus = status;
2194 
2195     // sp<IAudioTrack> track destructor will cause releaseOutput() to be called by AudioFlinger
2196     return status;
2197 }
2198 
reportError(status_t status,const char * event,const char * message) const2199 void AudioTrack::reportError(status_t status, const char *event, const char *message) const
2200 {
2201     if (status == NO_ERROR) return;
2202     // We report error on the native side because some callers do not come
2203     // from Java.
2204     // Ensure these variables are initialized in set().
2205     mediametrics::LogItem(AMEDIAMETRICS_KEY_AUDIO_TRACK_ERROR)
2206         .set(AMEDIAMETRICS_PROP_EVENT, event)
2207         .set(AMEDIAMETRICS_PROP_STATUS, (int32_t)status)
2208         .set(AMEDIAMETRICS_PROP_STATUSMESSAGE, message)
2209         .set(AMEDIAMETRICS_PROP_ORIGINALFLAGS, toString(mOrigFlags).c_str())
2210         .set(AMEDIAMETRICS_PROP_SESSIONID, (int32_t)mSessionId)
2211         .set(AMEDIAMETRICS_PROP_CONTENTTYPE, toString(mAttributes.content_type).c_str())
2212         .set(AMEDIAMETRICS_PROP_USAGE, toString(mAttributes.usage).c_str())
2213         .set(AMEDIAMETRICS_PROP_SELECTEDDEVICEID, (int32_t)mSelectedDeviceId)
2214         .set(AMEDIAMETRICS_PROP_ENCODING, toString(mFormat).c_str())
2215         .set(AMEDIAMETRICS_PROP_CHANNELMASK, (int32_t)mChannelMask)
2216         // the following are NOT immutable
2217         // frame count is initially the requested frame count, but may be adjusted
2218         // by AudioFlinger after creation.
2219         .set(AMEDIAMETRICS_PROP_FRAMECOUNT, (int32_t)mFrameCount)
2220         .set(AMEDIAMETRICS_PROP_SAMPLERATE, (int32_t)mSampleRate)
2221         .set(AMEDIAMETRICS_PROP_PLAYBACK_SPEED, (double)mPlaybackRate.mSpeed)
2222         .set(AMEDIAMETRICS_PROP_PLAYBACK_PITCH, (double)mPlaybackRate.mPitch)
2223         .record();
2224 }
2225 
obtainBuffer(Buffer * audioBuffer,int32_t waitCount,size_t * nonContig)2226 status_t AudioTrack::obtainBuffer(Buffer* audioBuffer, int32_t waitCount, size_t *nonContig)
2227 {
2228     if (audioBuffer == NULL) {
2229         if (nonContig != NULL) {
2230             *nonContig = 0;
2231         }
2232         return BAD_VALUE;
2233     }
2234     if (mTransfer != TRANSFER_OBTAIN) {
2235         audioBuffer->frameCount = 0;
2236         audioBuffer->mSize = 0;
2237         audioBuffer->raw = NULL;
2238         if (nonContig != NULL) {
2239             *nonContig = 0;
2240         }
2241         return INVALID_OPERATION;
2242     }
2243 
2244     const struct timespec *requested;
2245     struct timespec timeout;
2246     if (waitCount == -1) {
2247         requested = &ClientProxy::kForever;
2248     } else if (waitCount == 0) {
2249         requested = &ClientProxy::kNonBlocking;
2250     } else if (waitCount > 0) {
2251         time_t ms = WAIT_PERIOD_MS * (time_t) waitCount;
2252         timeout.tv_sec = ms / 1000;
2253         timeout.tv_nsec = (ms % 1000) * 1000000;
2254         requested = &timeout;
2255     } else {
2256         ALOGE("%s(%d): invalid waitCount %d", __func__, mPortId, waitCount);
2257         requested = NULL;
2258     }
2259     return obtainBuffer(audioBuffer, requested, NULL /*elapsed*/, nonContig);
2260 }
2261 
obtainBuffer(Buffer * audioBuffer,const struct timespec * requested,struct timespec * elapsed,size_t * nonContig)2262 status_t AudioTrack::obtainBuffer(Buffer* audioBuffer, const struct timespec *requested,
2263         struct timespec *elapsed, size_t *nonContig)
2264 {
2265     // previous and new IAudioTrack sequence numbers are used to detect track re-creation
2266     uint32_t oldSequence = 0;
2267 
2268     Proxy::Buffer buffer;
2269     status_t status = NO_ERROR;
2270 
2271     static const int32_t kMaxTries = 5;
2272     int32_t tryCounter = kMaxTries;
2273 
2274     do {
2275         // obtainBuffer() is called with mutex unlocked, so keep extra references to these fields to
2276         // keep them from going away if another thread re-creates the track during obtainBuffer()
2277         sp<AudioTrackClientProxy> proxy;
2278         sp<IMemory> iMem;
2279 
2280         {   // start of lock scope
2281             AutoMutex lock(mLock);
2282 
2283             uint32_t newSequence = mSequence;
2284             // did previous obtainBuffer() fail due to media server death or voluntary invalidation?
2285             if (status == DEAD_OBJECT) {
2286                 // re-create track, unless someone else has already done so
2287                 if (newSequence == oldSequence) {
2288                     status = restoreTrack_l("obtainBuffer");
2289                     if (status != NO_ERROR) {
2290                         buffer.mFrameCount = 0;
2291                         buffer.mRaw = NULL;
2292                         buffer.mNonContig = 0;
2293                         break;
2294                     }
2295                 }
2296             }
2297             oldSequence = newSequence;
2298 
2299             if (status == NOT_ENOUGH_DATA) {
2300                 restartIfDisabled();
2301             }
2302 
2303             // Keep the extra references
2304             proxy = mProxy;
2305             iMem = mCblkMemory;
2306 
2307             if (mState == STATE_STOPPING) {
2308                 status = -EINTR;
2309                 buffer.mFrameCount = 0;
2310                 buffer.mRaw = NULL;
2311                 buffer.mNonContig = 0;
2312                 break;
2313             }
2314 
2315             // Non-blocking if track is stopped or paused
2316             if (mState != STATE_ACTIVE) {
2317                 requested = &ClientProxy::kNonBlocking;
2318             }
2319 
2320         }   // end of lock scope
2321 
2322         buffer.mFrameCount = audioBuffer->frameCount;
2323         // FIXME starts the requested timeout and elapsed over from scratch
2324         status = proxy->obtainBuffer(&buffer, requested, elapsed);
2325     } while (((status == DEAD_OBJECT) || (status == NOT_ENOUGH_DATA)) && (tryCounter-- > 0));
2326 
2327     audioBuffer->frameCount = buffer.mFrameCount;
2328     audioBuffer->mSize = buffer.mFrameCount * mFrameSize;
2329     audioBuffer->raw = buffer.mRaw;
2330     audioBuffer->sequence = oldSequence;
2331     if (nonContig != NULL) {
2332         *nonContig = buffer.mNonContig;
2333     }
2334     return status;
2335 }
2336 
releaseBuffer(const Buffer * audioBuffer)2337 void AudioTrack::releaseBuffer(const Buffer* audioBuffer)
2338 {
2339     // FIXME add error checking on mode, by adding an internal version
2340     if (mTransfer == TRANSFER_SHARED) {
2341         return;
2342     }
2343 
2344     size_t stepCount = audioBuffer->mSize / mFrameSize;
2345     if (stepCount == 0) {
2346         return;
2347     }
2348 
2349     Proxy::Buffer buffer;
2350     buffer.mFrameCount = stepCount;
2351     buffer.mRaw = audioBuffer->raw;
2352 
2353     AutoMutex lock(mLock);
2354     if (audioBuffer->sequence != mSequence) {
2355         // This Buffer came from a different IAudioTrack instance, so ignore the releaseBuffer
2356         ALOGD("%s is no-op due to IAudioTrack sequence mismatch %u != %u",
2357                 __func__, audioBuffer->sequence, mSequence);
2358         return;
2359     }
2360     mReleased += stepCount;
2361     mInUnderrun = false;
2362     mProxy->releaseBuffer(&buffer);
2363 
2364     // restart track if it was disabled by audioflinger due to previous underrun
2365     restartIfDisabled();
2366 }
2367 
restartIfDisabled()2368 void AudioTrack::restartIfDisabled()
2369 {
2370     int32_t flags = android_atomic_and(~CBLK_DISABLED, &mCblk->mFlags);
2371     if ((mState == STATE_ACTIVE) && (flags & CBLK_DISABLED)) {
2372         ALOGW("%s(%d): releaseBuffer() track %p disabled due to previous underrun, restarting",
2373                 __func__, mPortId, this);
2374         // FIXME ignoring status
2375         status_t status;
2376         mAudioTrack->start(&status);
2377     }
2378 }
2379 
2380 // -------------------------------------------------------------------------
2381 
write(const void * buffer,size_t userSize,bool blocking)2382 ssize_t AudioTrack::write(const void* buffer, size_t userSize, bool blocking)
2383 {
2384     if (mTransfer != TRANSFER_SYNC && mTransfer != TRANSFER_SYNC_NOTIF_CALLBACK) {
2385         return INVALID_OPERATION;
2386     }
2387 
2388     if (isDirect()) {
2389         AutoMutex lock(mLock);
2390         int32_t flags = android_atomic_and(
2391                             ~(CBLK_UNDERRUN | CBLK_LOOP_CYCLE | CBLK_LOOP_FINAL | CBLK_BUFFER_END),
2392                             &mCblk->mFlags);
2393         if (flags & CBLK_INVALID) {
2394             return DEAD_OBJECT;
2395         }
2396     }
2397 
2398     if (ssize_t(userSize) < 0 || (buffer == NULL && userSize != 0)) {
2399         // Validation: user is most-likely passing an error code, and it would
2400         // make the return value ambiguous (actualSize vs error).
2401         ALOGE("%s(%d): AudioTrack::write(buffer=%p, size=%zu (%zd)",
2402                 __func__, mPortId, buffer, userSize, userSize);
2403         return BAD_VALUE;
2404     }
2405 
2406     size_t written = 0;
2407     Buffer audioBuffer;
2408 
2409     while (userSize >= mFrameSize) {
2410         audioBuffer.frameCount = userSize / mFrameSize;
2411 
2412         status_t err = obtainBuffer(&audioBuffer,
2413                 blocking ? &ClientProxy::kForever : &ClientProxy::kNonBlocking);
2414         if (err < 0) {
2415             if (written > 0) {
2416                 break;
2417             }
2418             if (err == TIMED_OUT || err == -EINTR) {
2419                 err = WOULD_BLOCK;
2420             }
2421             return ssize_t(err);
2422         }
2423 
2424         size_t toWrite = audioBuffer.size();
2425         memcpy(audioBuffer.raw, buffer, toWrite);
2426         buffer = ((const char *) buffer) + toWrite;
2427         userSize -= toWrite;
2428         written += toWrite;
2429 
2430         releaseBuffer(&audioBuffer);
2431     }
2432 
2433     if (written > 0) {
2434         mFramesWritten += written / mFrameSize;
2435 
2436         if (mTransfer == TRANSFER_SYNC_NOTIF_CALLBACK) {
2437             const sp<AudioTrackThread> t = mAudioTrackThread;
2438             if (t != 0) {
2439                 // causes wake up of the playback thread, that will callback the client for
2440                 // more data (with EVENT_CAN_WRITE_MORE_DATA) in processAudioBuffer()
2441                 t->wake();
2442             }
2443         }
2444     }
2445 
2446     return written;
2447 }
2448 
2449 // -------------------------------------------------------------------------
2450 
processAudioBuffer()2451 nsecs_t AudioTrack::processAudioBuffer()
2452 {
2453     // Currently the AudioTrack thread is not created if there are no callbacks.
2454     // Would it ever make sense to run the thread, even without callbacks?
2455     // If so, then replace this by checks at each use for mCallback != NULL.
2456     LOG_ALWAYS_FATAL_IF(mCblk == NULL);
2457     mLock.lock();
2458     sp<IAudioTrackCallback> callback = mCallback.promote();
2459     if (!callback) {
2460         mCallback = nullptr;
2461         mLock.unlock();
2462         return NS_NEVER;
2463     }
2464     if (mAwaitBoost) {
2465         mAwaitBoost = false;
2466         mLock.unlock();
2467         static const int32_t kMaxTries = 5;
2468         int32_t tryCounter = kMaxTries;
2469         uint32_t pollUs = 10000;
2470         do {
2471             int policy = sched_getscheduler(0) & ~SCHED_RESET_ON_FORK;
2472             if (policy == SCHED_FIFO || policy == SCHED_RR) {
2473                 break;
2474             }
2475             usleep(pollUs);
2476             pollUs <<= 1;
2477         } while (tryCounter-- > 0);
2478         if (tryCounter < 0) {
2479             ALOGE("%s(%d): did not receive expected priority boost on time",
2480                     __func__, mPortId);
2481         }
2482         // Run again immediately
2483         return 0;
2484     }
2485 
2486     // Can only reference mCblk while locked
2487     int32_t flags = android_atomic_and(
2488         ~(CBLK_UNDERRUN | CBLK_LOOP_CYCLE | CBLK_LOOP_FINAL | CBLK_BUFFER_END), &mCblk->mFlags);
2489 
2490     // Check for track invalidation
2491     if (flags & CBLK_INVALID) {
2492         // for offloaded tracks restoreTrack_l() will just update the sequence and clear
2493         // AudioSystem cache. We should not exit here but after calling the callback so
2494         // that the upper layers can recreate the track
2495         if (!isOffloadedOrDirect_l() || (mSequence == mObservedSequence)) {
2496             status_t status __unused = restoreTrack_l("processAudioBuffer");
2497             // FIXME unused status
2498             // after restoration, continue below to make sure that the loop and buffer events
2499             // are notified because they have been cleared from mCblk->mFlags above.
2500         }
2501     }
2502 
2503     bool waitStreamEnd = mState == STATE_STOPPING;
2504     bool active = mState == STATE_ACTIVE;
2505 
2506     // Manage underrun callback, must be done under lock to avoid race with releaseBuffer()
2507     bool newUnderrun = false;
2508     if (flags & CBLK_UNDERRUN) {
2509 #if 0
2510         // Currently in shared buffer mode, when the server reaches the end of buffer,
2511         // the track stays active in continuous underrun state.  It's up to the application
2512         // to pause or stop the track, or set the position to a new offset within buffer.
2513         // This was some experimental code to auto-pause on underrun.   Keeping it here
2514         // in "if 0" so we can re-visit this if we add a real sequencer for shared memory content.
2515         if (mTransfer == TRANSFER_SHARED) {
2516             mState = STATE_PAUSED;
2517             active = false;
2518         }
2519 #endif
2520         if (!mInUnderrun) {
2521             mInUnderrun = true;
2522             newUnderrun = true;
2523         }
2524     }
2525 
2526     // Get current position of server
2527     Modulo<uint32_t> position(updateAndGetPosition_l());
2528 
2529     // Manage marker callback
2530     bool markerReached = false;
2531     Modulo<uint32_t> markerPosition(mMarkerPosition);
2532     // uses 32 bit wraparound for comparison with position.
2533     if (!mMarkerReached && markerPosition.value() > 0 && position >= markerPosition) {
2534         mMarkerReached = markerReached = true;
2535     }
2536 
2537     // Determine number of new position callback(s) that will be needed, while locked
2538     size_t newPosCount = 0;
2539     Modulo<uint32_t> newPosition(mNewPosition);
2540     uint32_t updatePeriod = mUpdatePeriod;
2541     // FIXME fails for wraparound, need 64 bits
2542     if (updatePeriod > 0 && position >= newPosition) {
2543         newPosCount = ((position - newPosition).value() / updatePeriod) + 1;
2544         mNewPosition += updatePeriod * newPosCount;
2545     }
2546 
2547     // Cache other fields that will be needed soon
2548     uint32_t sampleRate = mSampleRate;
2549     float speed = mPlaybackRate.mSpeed;
2550     const uint32_t notificationFrames = mNotificationFramesAct;
2551     if (mRefreshRemaining) {
2552         mRefreshRemaining = false;
2553         mRemainingFrames = notificationFrames;
2554         mRetryOnPartialBuffer = false;
2555     }
2556     size_t misalignment = mProxy->getMisalignment();
2557     uint32_t sequence = mSequence;
2558     sp<AudioTrackClientProxy> proxy = mProxy;
2559 
2560     // Determine the number of new loop callback(s) that will be needed, while locked.
2561     uint32_t loopCountNotifications = 0;
2562     uint32_t loopPeriod = 0; // time in frames for next EVENT_LOOP_END or EVENT_BUFFER_END
2563 
2564     if (mLoopCount > 0) {
2565         int loopCount;
2566         size_t bufferPosition;
2567         mStaticProxy->getBufferPositionAndLoopCount(&bufferPosition, &loopCount);
2568         loopPeriod = ((loopCount > 0) ? mLoopEnd : mFrameCount) - bufferPosition;
2569         loopCountNotifications = min(mLoopCountNotified - loopCount, kMaxLoopCountNotifications);
2570         mLoopCountNotified = loopCount; // discard any excess notifications
2571     } else if (mLoopCount < 0) {
2572         // FIXME: We're not accurate with notification count and position with infinite looping
2573         // since loopCount from server side will always return -1 (we could decrement it).
2574         size_t bufferPosition = mStaticProxy->getBufferPosition();
2575         loopCountNotifications = int((flags & (CBLK_LOOP_CYCLE | CBLK_LOOP_FINAL)) != 0);
2576         loopPeriod = mLoopEnd - bufferPosition;
2577     } else if (/* mLoopCount == 0 && */ mSharedBuffer != 0) {
2578         size_t bufferPosition = mStaticProxy->getBufferPosition();
2579         loopPeriod = mFrameCount - bufferPosition;
2580     }
2581 
2582     // These fields don't need to be cached, because they are assigned only by set():
2583     // mTransfer, mCallback, mUserData, mFormat, mFrameSize, mFlags
2584     // mFlags is also assigned by createTrack_l(), but not the bit we care about.
2585 
2586     mLock.unlock();
2587 
2588     // get anchor time to account for callbacks.
2589     const nsecs_t timeBeforeCallbacks = systemTime();
2590 
2591     if (waitStreamEnd) {
2592         // FIXME:  Instead of blocking in proxy->waitStreamEndDone(), Callback thread
2593         // should wait on proxy futex and handle CBLK_STREAM_END_DONE within this function
2594         // (and make sure we don't callback for more data while we're stopping).
2595         // This helps with position, marker notifications, and track invalidation.
2596         struct timespec timeout;
2597         timeout.tv_sec = WAIT_STREAM_END_TIMEOUT_SEC;
2598         timeout.tv_nsec = 0;
2599 
2600         status_t status = proxy->waitStreamEndDone(&timeout);
2601         switch (status) {
2602         case NO_ERROR:
2603         case DEAD_OBJECT:
2604         case TIMED_OUT:
2605             if (status != DEAD_OBJECT) {
2606                 // for DEAD_OBJECT, we do not send a EVENT_STREAM_END after stop();
2607                 // instead, the application should handle the EVENT_NEW_IAUDIOTRACK.
2608                 callback->onStreamEnd();
2609             }
2610             {
2611                 AutoMutex lock(mLock);
2612                 // The previously assigned value of waitStreamEnd is no longer valid,
2613                 // since the mutex has been unlocked and either the callback handler
2614                 // or another thread could have re-started the AudioTrack during that time.
2615                 waitStreamEnd = mState == STATE_STOPPING;
2616                 if (waitStreamEnd) {
2617                     mState = STATE_STOPPED;
2618                     mReleased = 0;
2619                 }
2620             }
2621             if (waitStreamEnd && status != DEAD_OBJECT) {
2622                return NS_INACTIVE;
2623             }
2624             break;
2625         }
2626         return 0;
2627     }
2628 
2629     // perform callbacks while unlocked
2630     if (newUnderrun) {
2631         callback->onUnderrun();
2632     }
2633     while (loopCountNotifications > 0) {
2634         --loopCountNotifications;
2635         callback->onLoopEnd(mLoopCount > 0 ? loopCountNotifications + mLoopCountNotified : -1);
2636     }
2637     if (flags & CBLK_BUFFER_END) {
2638         callback->onBufferEnd();
2639     }
2640     if (markerReached) {
2641         callback->onMarker(markerPosition.value());
2642     }
2643     while (newPosCount > 0) {
2644         callback->onNewPos(newPosition.value());
2645         newPosition += updatePeriod;
2646         newPosCount--;
2647     }
2648 
2649     if (mObservedSequence != sequence) {
2650         mObservedSequence = sequence;
2651         callback->onNewIAudioTrack();
2652         // for offloaded tracks, just wait for the upper layers to recreate the track
2653         if (isOffloadedOrDirect()) {
2654             return NS_INACTIVE;
2655         }
2656     }
2657 
2658     // if inactive, then don't run me again until re-started
2659     if (!active) {
2660         return NS_INACTIVE;
2661     }
2662 
2663     // Compute the estimated time until the next timed event (position, markers, loops)
2664     // FIXME only for non-compressed audio
2665     uint32_t minFrames = ~0;
2666     if (!markerReached && position < markerPosition) {
2667         minFrames = (markerPosition - position).value();
2668     }
2669     if (loopPeriod > 0 && loopPeriod < minFrames) {
2670         // loopPeriod is already adjusted for actual position.
2671         minFrames = loopPeriod;
2672     }
2673     if (updatePeriod > 0) {
2674         minFrames = min(minFrames, (newPosition - position).value());
2675     }
2676 
2677     // If > 0, poll periodically to recover from a stuck server.  A good value is 2.
2678     static const uint32_t kPoll = 0;
2679     if (kPoll > 0 && mTransfer == TRANSFER_CALLBACK && kPoll * notificationFrames < minFrames) {
2680         minFrames = kPoll * notificationFrames;
2681     }
2682 
2683     // This "fudge factor" avoids soaking CPU, and compensates for late progress by server
2684     static const nsecs_t kWaitPeriodNs = WAIT_PERIOD_MS * 1000000LL;
2685     const nsecs_t timeAfterCallbacks = systemTime();
2686 
2687     // Convert frame units to time units
2688     nsecs_t ns = NS_WHENEVER;
2689     if (minFrames != (uint32_t) ~0) {
2690         // AudioFlinger consumption of client data may be irregular when coming out of device
2691         // standby since the kernel buffers require filling. This is throttled to no more than 2x
2692         // the expected rate in the MixerThread. Hence, we reduce the estimated time to wait by one
2693         // half (but no more than half a second) to improve callback accuracy during these temporary
2694         // data surges.
2695         const nsecs_t estimatedNs = framesToNanoseconds(minFrames, sampleRate, speed);
2696         constexpr nsecs_t maxThrottleCompensationNs = 500000000LL;
2697         ns = estimatedNs - min(estimatedNs / 2, maxThrottleCompensationNs) + kWaitPeriodNs;
2698         ns -= (timeAfterCallbacks - timeBeforeCallbacks);  // account for callback time
2699         // TODO: Should we warn if the callback time is too long?
2700         if (ns < 0) ns = 0;
2701     }
2702 
2703     // If not supplying data by EVENT_MORE_DATA or EVENT_CAN_WRITE_MORE_DATA, then we're done
2704     if (mTransfer != TRANSFER_CALLBACK && mTransfer != TRANSFER_SYNC_NOTIF_CALLBACK) {
2705         return ns;
2706     }
2707 
2708     // EVENT_MORE_DATA callback handling.
2709     // Timing for linear pcm audio data formats can be derived directly from the
2710     // buffer fill level.
2711     // Timing for compressed data is not directly available from the buffer fill level,
2712     // rather indirectly from waiting for blocking mode callbacks or waiting for obtain()
2713     // to return a certain fill level.
2714 
2715     struct timespec timeout;
2716     const struct timespec *requested = &ClientProxy::kForever;
2717     if (ns != NS_WHENEVER) {
2718         timeout.tv_sec = ns / 1000000000LL;
2719         timeout.tv_nsec = ns % 1000000000LL;
2720         ALOGV("%s(%d): timeout %ld.%03d",
2721                 __func__, mPortId, timeout.tv_sec, (int) timeout.tv_nsec / 1000000);
2722         requested = &timeout;
2723     }
2724 
2725     size_t writtenFrames = 0;
2726     while (mRemainingFrames > 0) {
2727 
2728         Buffer audioBuffer;
2729         audioBuffer.frameCount = mRemainingFrames;
2730         size_t nonContig;
2731         status_t err = obtainBuffer(&audioBuffer, requested, NULL, &nonContig);
2732         LOG_ALWAYS_FATAL_IF((err != NO_ERROR) != (audioBuffer.frameCount == 0),
2733                 "%s(%d): obtainBuffer() err=%d frameCount=%zu",
2734                  __func__, mPortId, err, audioBuffer.frameCount);
2735         requested = &ClientProxy::kNonBlocking;
2736         size_t avail = audioBuffer.frameCount + nonContig;
2737         ALOGV("%s(%d): obtainBuffer(%u) returned %zu = %zu + %zu err %d",
2738                 __func__, mPortId, mRemainingFrames, avail, audioBuffer.frameCount, nonContig, err);
2739         if (err != NO_ERROR) {
2740             if (err == TIMED_OUT || err == WOULD_BLOCK || err == -EINTR ||
2741                     (isOffloaded() && (err == DEAD_OBJECT))) {
2742                 // FIXME bug 25195759
2743                 return 1000000;
2744             }
2745             ALOGE("%s(%d): Error %d obtaining an audio buffer, giving up.",
2746                     __func__, mPortId, err);
2747             return NS_NEVER;
2748         }
2749 
2750         if (mRetryOnPartialBuffer && audio_has_proportional_frames(mFormat)) {
2751             mRetryOnPartialBuffer = false;
2752             if (avail < mRemainingFrames) {
2753                 if (ns > 0) { // account for obtain time
2754                     const nsecs_t timeNow = systemTime();
2755                     ns = max((nsecs_t)0, ns - (timeNow - timeAfterCallbacks));
2756                 }
2757 
2758                 // delayNs is first computed by the additional frames required in the buffer.
2759                 nsecs_t delayNs = framesToNanoseconds(
2760                         mRemainingFrames - avail, sampleRate, speed);
2761 
2762                 // afNs is the AudioFlinger mixer period in ns.
2763                 const nsecs_t afNs = framesToNanoseconds(mAfFrameCount, mAfSampleRate, speed);
2764 
2765                 // If the AudioTrack is double buffered based on the AudioFlinger mixer period,
2766                 // we may have a race if we wait based on the number of frames desired.
2767                 // This is a possible issue with resampling and AAudio.
2768                 //
2769                 // The granularity of audioflinger processing is one mixer period; if
2770                 // our wait time is less than one mixer period, wait at most half the period.
2771                 if (delayNs < afNs) {
2772                     delayNs = std::min(delayNs, afNs / 2);
2773                 }
2774 
2775                 // adjust our ns wait by delayNs.
2776                 if (ns < 0 /* NS_WHENEVER */ || delayNs < ns) {
2777                     ns = delayNs;
2778                 }
2779                 return ns;
2780             }
2781         }
2782 
2783         size_t reqSize = audioBuffer.size();
2784         if (mTransfer == TRANSFER_SYNC_NOTIF_CALLBACK) {
2785             // when notifying client it can write more data, pass the total size that can be
2786             // written in the next write() call, since it's not passed through the callback
2787             audioBuffer.mSize += nonContig;
2788         }
2789         const size_t writtenSize = (mTransfer == TRANSFER_CALLBACK)
2790                                       ? callback->onMoreData(audioBuffer)
2791                                       : callback->onCanWriteMoreData(audioBuffer);
2792         // Validate on returned size
2793         if (ssize_t(writtenSize) < 0 || writtenSize > reqSize) {
2794             ALOGE("%s(%d): EVENT_MORE_DATA requested %zu bytes but callback returned %zd bytes",
2795                     __func__, mPortId, reqSize, ssize_t(writtenSize));
2796             return NS_NEVER;
2797         }
2798 
2799         if (writtenSize == 0) {
2800             if (mTransfer == TRANSFER_SYNC_NOTIF_CALLBACK) {
2801                 // The callback EVENT_CAN_WRITE_MORE_DATA was processed in the JNI of
2802                 // android.media.AudioTrack. The JNI is not using the callback to provide data,
2803                 // it only signals to the Java client that it can provide more data, which
2804                 // this track is read to accept now.
2805                 // The playback thread will be awaken at the next ::write()
2806                 return NS_WHENEVER;
2807             }
2808             // The callback is done filling buffers
2809             // Keep this thread going to handle timed events and
2810             // still try to get more data in intervals of WAIT_PERIOD_MS
2811             // but don't just loop and block the CPU, so wait
2812 
2813             // mCbf(EVENT_MORE_DATA, ...) might either
2814             // (1) Block until it can fill the buffer, returning 0 size on EOS.
2815             // (2) Block until it can fill the buffer, returning 0 data (silence) on EOS.
2816             // (3) Return 0 size when no data is available, does not wait for more data.
2817             //
2818             // (1) and (2) occurs with AudioPlayer/AwesomePlayer; (3) occurs with NuPlayer.
2819             // We try to compute the wait time to avoid a tight sleep-wait cycle,
2820             // especially for case (3).
2821             //
2822             // The decision to support (1) and (2) affect the sizing of mRemainingFrames
2823             // and this loop; whereas for case (3) we could simply check once with the full
2824             // buffer size and skip the loop entirely.
2825 
2826             nsecs_t myns;
2827             if (audio_has_proportional_frames(mFormat)) {
2828                 // time to wait based on buffer occupancy
2829                 const nsecs_t datans = mRemainingFrames <= avail ? 0 :
2830                         framesToNanoseconds(mRemainingFrames - avail, sampleRate, speed);
2831                 // audio flinger thread buffer size (TODO: adjust for fast tracks)
2832                 // FIXME: use mAfFrameCountHAL instead of mAfFrameCount below for fast tracks.
2833                 const nsecs_t afns = framesToNanoseconds(mAfFrameCount, mAfSampleRate, speed);
2834                 // add a half the AudioFlinger buffer time to avoid soaking CPU if datans is 0.
2835                 myns = datans + (afns / 2);
2836             } else {
2837                 // FIXME: This could ping quite a bit if the buffer isn't full.
2838                 // Note that when mState is stopping we waitStreamEnd, so it never gets here.
2839                 myns = kWaitPeriodNs;
2840             }
2841             if (ns > 0) { // account for obtain and callback time
2842                 const nsecs_t timeNow = systemTime();
2843                 ns = max((nsecs_t)0, ns - (timeNow - timeAfterCallbacks));
2844             }
2845             if (ns < 0 /* NS_WHENEVER */ || myns < ns) {
2846                 ns = myns;
2847             }
2848             return ns;
2849         }
2850 
2851         // releaseBuffer reads from audioBuffer.size
2852         audioBuffer.mSize = writtenSize;
2853 
2854         size_t releasedFrames = writtenSize / mFrameSize;
2855         audioBuffer.frameCount = releasedFrames;
2856         mRemainingFrames -= releasedFrames;
2857         if (misalignment >= releasedFrames) {
2858             misalignment -= releasedFrames;
2859         } else {
2860             misalignment = 0;
2861         }
2862 
2863         releaseBuffer(&audioBuffer);
2864         writtenFrames += releasedFrames;
2865 
2866         // FIXME here is where we would repeat EVENT_MORE_DATA again on same advanced buffer
2867         // if callback doesn't like to accept the full chunk
2868         if (writtenSize < reqSize) {
2869             continue;
2870         }
2871 
2872         // There could be enough non-contiguous frames available to satisfy the remaining request
2873         if (mRemainingFrames <= nonContig) {
2874             continue;
2875         }
2876 
2877 #if 0
2878         // This heuristic tries to collapse a series of EVENT_MORE_DATA that would total to a
2879         // sum <= notificationFrames.  It replaces that series by at most two EVENT_MORE_DATA
2880         // that total to a sum == notificationFrames.
2881         if (0 < misalignment && misalignment <= mRemainingFrames) {
2882             mRemainingFrames = misalignment;
2883             return ((double)mRemainingFrames * 1100000000) / ((double)sampleRate * speed);
2884         }
2885 #endif
2886 
2887     }
2888     if (writtenFrames > 0) {
2889         AutoMutex lock(mLock);
2890         mFramesWritten += writtenFrames;
2891     }
2892     mRemainingFrames = notificationFrames;
2893     mRetryOnPartialBuffer = true;
2894 
2895     // A lot has transpired since ns was calculated, so run again immediately and re-calculate
2896     return 0;
2897 }
2898 
restoreTrack_l(const char * from)2899 status_t AudioTrack::restoreTrack_l(const char *from)
2900 {
2901     status_t result = NO_ERROR;  // logged: make sure to set this before returning.
2902     const int64_t beginNs = systemTime();
2903     mediametrics::Defer defer([&] {
2904         mediametrics::LogItem(mMetricsId)
2905             .set(AMEDIAMETRICS_PROP_EVENT, AMEDIAMETRICS_PROP_EVENT_VALUE_RESTORE)
2906             .set(AMEDIAMETRICS_PROP_EXECUTIONTIMENS, (int64_t)(systemTime() - beginNs))
2907             .set(AMEDIAMETRICS_PROP_STATE, stateToString(mState))
2908             .set(AMEDIAMETRICS_PROP_STATUS, (int32_t)result)
2909             .set(AMEDIAMETRICS_PROP_WHERE, from)
2910             .record(); });
2911 
2912     ALOGW("%s(%d): dead IAudioTrack, %s, creating a new one from %s()",
2913             __func__, mPortId, isOffloadedOrDirect_l() ? "Offloaded or Direct" : "PCM", from);
2914     ++mSequence;
2915 
2916     // refresh the audio configuration cache in this process to make sure we get new
2917     // output parameters and new IAudioFlinger in createTrack_l()
2918     AudioSystem::clearAudioConfigCache();
2919 
2920     if (isOffloadedOrDirect_l() || mDoNotReconnect) {
2921         // FIXME re-creation of offloaded and direct tracks is not yet implemented;
2922         // reconsider enabling for linear PCM encodings when position can be preserved.
2923         result = DEAD_OBJECT;
2924         return result;
2925     }
2926 
2927     // Save so we can return count since creation.
2928     mUnderrunCountOffset = getUnderrunCount_l();
2929 
2930     // save the old static buffer position
2931     uint32_t staticPosition = 0;
2932     size_t bufferPosition = 0;
2933     int loopCount = 0;
2934     if (mStaticProxy != 0) {
2935         mStaticProxy->getBufferPositionAndLoopCount(&bufferPosition, &loopCount);
2936         staticPosition = mStaticProxy->getPosition().unsignedValue();
2937     }
2938 
2939     // save the old startThreshold and framecount
2940     const uint32_t originalStartThresholdInFrames = mProxy->getStartThresholdInFrames();
2941     const uint32_t originalFrameCount = mProxy->frameCount();
2942 
2943     // See b/74409267. Connecting to a BT A2DP device supporting multiple codecs
2944     // causes a lot of churn on the service side, and it can reject starting
2945     // playback of a previously created track. May also apply to other cases.
2946     const int INITIAL_RETRIES = 3;
2947     int retries = INITIAL_RETRIES;
2948 retry:
2949     if (retries < INITIAL_RETRIES) {
2950         // See the comment for clearAudioConfigCache at the start of the function.
2951         AudioSystem::clearAudioConfigCache();
2952     }
2953     mFlags = mOrigFlags;
2954 
2955     // If a new IAudioTrack is successfully created, createTrack_l() will modify the
2956     // following member variables: mAudioTrack, mCblkMemory and mCblk.
2957     // It will also delete the strong references on previous IAudioTrack and IMemory.
2958     // If a new IAudioTrack cannot be created, the previous (dead) instance will be left intact.
2959     result = createTrack_l();
2960 
2961     if (result == NO_ERROR) {
2962         // take the frames that will be lost by track recreation into account in saved position
2963         // For streaming tracks, this is the amount we obtained from the user/client
2964         // (not the number actually consumed at the server - those are already lost).
2965         if (mStaticProxy == 0) {
2966             mPosition = mReleased;
2967         }
2968         // Continue playback from last known position and restore loop.
2969         if (mStaticProxy != 0) {
2970             if (loopCount != 0) {
2971                 mStaticProxy->setBufferPositionAndLoop(bufferPosition,
2972                         mLoopStart, mLoopEnd, loopCount);
2973             } else {
2974                 mStaticProxy->setBufferPosition(bufferPosition);
2975                 if (bufferPosition == mFrameCount) {
2976                     ALOGD("%s(%d): restoring track at end of static buffer", __func__, mPortId);
2977                 }
2978             }
2979         }
2980         // restore volume handler
2981         mVolumeHandler->forall([this](const VolumeShaper &shaper) -> VolumeShaper::Status {
2982             sp<VolumeShaper::Operation> operationToEnd =
2983                     new VolumeShaper::Operation(shaper.mOperation);
2984             // TODO: Ideally we would restore to the exact xOffset position
2985             // as returned by getVolumeShaperState(), but we don't have that
2986             // information when restoring at the client unless we periodically poll
2987             // the server or create shared memory state.
2988             //
2989             // For now, we simply advance to the end of the VolumeShaper effect
2990             // if it has been started.
2991             if (shaper.isStarted()) {
2992                 operationToEnd->setNormalizedTime(1.f);
2993             }
2994             media::VolumeShaperConfiguration config;
2995             shaper.mConfiguration->writeToParcelable(&config);
2996             media::VolumeShaperOperation operation;
2997             operationToEnd->writeToParcelable(&operation);
2998             status_t status;
2999             mAudioTrack->applyVolumeShaper(config, operation, &status);
3000             return status;
3001         });
3002 
3003         // restore the original start threshold if different than frameCount.
3004         if (originalStartThresholdInFrames != originalFrameCount) {
3005             // Note: mProxy->setStartThresholdInFrames() call is in the Proxy
3006             // and does not trigger a restart.
3007             // (Also CBLK_DISABLED is not set, buffers are empty after track recreation).
3008             // Any start would be triggered on the mState == ACTIVE check below.
3009             const uint32_t currentThreshold =
3010                     mProxy->setStartThresholdInFrames(originalStartThresholdInFrames);
3011             ALOGD_IF(originalStartThresholdInFrames != currentThreshold,
3012                     "%s(%d) startThresholdInFrames changing from %u to %u",
3013                     __func__, mPortId, originalStartThresholdInFrames, currentThreshold);
3014         }
3015         if (mState == STATE_ACTIVE) {
3016             mAudioTrack->start(&result);
3017         }
3018         // server resets to zero so we offset
3019         mFramesWrittenServerOffset =
3020                 mStaticProxy.get() != nullptr ? staticPosition : mFramesWritten;
3021         mFramesWrittenAtRestore = mFramesWrittenServerOffset;
3022     }
3023     if (result != NO_ERROR) {
3024         ALOGW("%s(%d): failed status %d, retries %d", __func__, mPortId, result, retries);
3025         if (--retries > 0) {
3026             // leave time for an eventual race condition to clear before retrying
3027             usleep(500000);
3028             goto retry;
3029         }
3030         // if no retries left, set invalid bit to force restoring at next occasion
3031         // and avoid inconsistent active state on client and server sides
3032         if (mCblk != nullptr) {
3033             android_atomic_or(CBLK_INVALID, &mCblk->mFlags);
3034         }
3035     }
3036     return result;
3037 }
3038 
updateAndGetPosition_l()3039 Modulo<uint32_t> AudioTrack::updateAndGetPosition_l()
3040 {
3041     // This is the sole place to read server consumed frames
3042     Modulo<uint32_t> newServer(mProxy->getPosition());
3043     const int32_t delta = (newServer - mServer).signedValue();
3044     // TODO There is controversy about whether there can be "negative jitter" in server position.
3045     //      This should be investigated further, and if possible, it should be addressed.
3046     //      A more definite failure mode is infrequent polling by client.
3047     //      One could call (void)getPosition_l() in releaseBuffer(),
3048     //      so mReleased and mPosition are always lock-step as best possible.
3049     //      That should ensure delta never goes negative for infrequent polling
3050     //      unless the server has more than 2^31 frames in its buffer,
3051     //      in which case the use of uint32_t for these counters has bigger issues.
3052     ALOGE_IF(delta < 0,
3053             "%s(%d): detected illegal retrograde motion by the server: mServer advanced by %d",
3054             __func__, mPortId, delta);
3055     mServer = newServer;
3056     if (delta > 0) { // avoid retrograde
3057         mPosition += delta;
3058     }
3059     return mPosition;
3060 }
3061 
isSampleRateSpeedAllowed_l(uint32_t sampleRate,float speed)3062 bool AudioTrack::isSampleRateSpeedAllowed_l(uint32_t sampleRate, float speed)
3063 {
3064     updateLatency_l();
3065     // applicable for mixing tracks only (not offloaded or direct)
3066     if (mStaticProxy != 0) {
3067         return true; // static tracks do not have issues with buffer sizing.
3068     }
3069     const size_t minFrameCount =
3070             AudioSystem::calculateMinFrameCount(mAfLatency, mAfFrameCount, mAfSampleRate,
3071                                             sampleRate, speed /*, 0 mNotificationsPerBufferReq*/);
3072     const bool allowed = mFrameCount >= minFrameCount;
3073     ALOGD_IF(!allowed,
3074             "%s(%d): denied "
3075             "mAfLatency:%u  mAfFrameCount:%zu  mAfSampleRate:%u  sampleRate:%u  speed:%f "
3076             "mFrameCount:%zu < minFrameCount:%zu",
3077             __func__, mPortId,
3078             mAfLatency, mAfFrameCount, mAfSampleRate, sampleRate, speed,
3079             mFrameCount, minFrameCount);
3080     return allowed;
3081 }
3082 
setParameters(const String8 & keyValuePairs)3083 status_t AudioTrack::setParameters(const String8& keyValuePairs)
3084 {
3085     AutoMutex lock(mLock);
3086     status_t status;
3087     mAudioTrack->setParameters(keyValuePairs.c_str(), &status);
3088     return status;
3089 }
3090 
selectPresentation(int presentationId,int programId)3091 status_t AudioTrack::selectPresentation(int presentationId, int programId)
3092 {
3093     AutoMutex lock(mLock);
3094     AudioParameter param = AudioParameter();
3095     param.addInt(String8(AudioParameter::keyPresentationId), presentationId);
3096     param.addInt(String8(AudioParameter::keyProgramId), programId);
3097     ALOGV("%s(%d): PresentationId/ProgramId[%s]",
3098             __func__, mPortId, param.toString().string());
3099 
3100     status_t status;
3101     mAudioTrack->setParameters(param.toString().c_str(), &status);
3102     return status;
3103 }
3104 
applyVolumeShaper(const sp<VolumeShaper::Configuration> & configuration,const sp<VolumeShaper::Operation> & operation)3105 VolumeShaper::Status AudioTrack::applyVolumeShaper(
3106         const sp<VolumeShaper::Configuration>& configuration,
3107         const sp<VolumeShaper::Operation>& operation)
3108 {
3109     AutoMutex lock(mLock);
3110     mVolumeHandler->setIdIfNecessary(configuration);
3111     media::VolumeShaperConfiguration config;
3112     configuration->writeToParcelable(&config);
3113     media::VolumeShaperOperation op;
3114     operation->writeToParcelable(&op);
3115     VolumeShaper::Status status;
3116     mAudioTrack->applyVolumeShaper(config, op, &status);
3117 
3118     if (status == DEAD_OBJECT) {
3119         if (restoreTrack_l("applyVolumeShaper") == OK) {
3120             mAudioTrack->applyVolumeShaper(config, op, &status);
3121         }
3122     }
3123     if (status >= 0) {
3124         // save VolumeShaper for restore
3125         mVolumeHandler->applyVolumeShaper(configuration, operation);
3126         if (mState == STATE_ACTIVE || mState == STATE_STOPPING) {
3127             mVolumeHandler->setStarted();
3128         }
3129     } else {
3130         // warn only if not an expected restore failure.
3131         ALOGW_IF(!((isOffloadedOrDirect_l() || mDoNotReconnect) && status == DEAD_OBJECT),
3132                 "%s(%d): applyVolumeShaper failed: %d", __func__, mPortId, status);
3133     }
3134     return status;
3135 }
3136 
getVolumeShaperState(int id)3137 sp<VolumeShaper::State> AudioTrack::getVolumeShaperState(int id)
3138 {
3139     AutoMutex lock(mLock);
3140     std::optional<media::VolumeShaperState> vss;
3141     mAudioTrack->getVolumeShaperState(id, &vss);
3142     sp<VolumeShaper::State> state;
3143     if (vss.has_value()) {
3144         state = new VolumeShaper::State();
3145         state->readFromParcelable(vss.value());
3146     }
3147     if (state.get() == nullptr && (mCblk->mFlags & CBLK_INVALID) != 0) {
3148         if (restoreTrack_l("getVolumeShaperState") == OK) {
3149             mAudioTrack->getVolumeShaperState(id, &vss);
3150             if (vss.has_value()) {
3151                 state = new VolumeShaper::State();
3152                 state->readFromParcelable(vss.value());
3153             }
3154         }
3155     }
3156     return state;
3157 }
3158 
getTimestamp(ExtendedTimestamp * timestamp)3159 status_t AudioTrack::getTimestamp(ExtendedTimestamp *timestamp)
3160 {
3161     if (timestamp == nullptr) {
3162         return BAD_VALUE;
3163     }
3164     AutoMutex lock(mLock);
3165     return getTimestamp_l(timestamp);
3166 }
3167 
getTimestamp_l(ExtendedTimestamp * timestamp)3168 status_t AudioTrack::getTimestamp_l(ExtendedTimestamp *timestamp)
3169 {
3170     if (mCblk->mFlags & CBLK_INVALID) {
3171         const status_t status = restoreTrack_l("getTimestampExtended");
3172         if (status != OK) {
3173             // per getTimestamp() API doc in header, we return DEAD_OBJECT here,
3174             // recommending that the track be recreated.
3175             return DEAD_OBJECT;
3176         }
3177     }
3178     // check for offloaded/direct here in case restoring somehow changed those flags.
3179     if (isOffloadedOrDirect_l()) {
3180         return INVALID_OPERATION; // not supported
3181     }
3182     status_t status = mProxy->getTimestamp(timestamp);
3183     LOG_ALWAYS_FATAL_IF(status != OK, "%s(%d): status %d not allowed from proxy getTimestamp",
3184             __func__, mPortId, status);
3185     bool found = false;
3186     timestamp->mPosition[ExtendedTimestamp::LOCATION_CLIENT] = mFramesWritten;
3187     timestamp->mTimeNs[ExtendedTimestamp::LOCATION_CLIENT] = 0;
3188     // server side frame offset in case AudioTrack has been restored.
3189     for (int i = ExtendedTimestamp::LOCATION_SERVER;
3190             i < ExtendedTimestamp::LOCATION_MAX; ++i) {
3191         if (timestamp->mTimeNs[i] >= 0) {
3192             // apply server offset (frames flushed is ignored
3193             // so we don't report the jump when the flush occurs).
3194             timestamp->mPosition[i] += mFramesWrittenServerOffset;
3195             found = true;
3196         }
3197     }
3198     return found ? OK : WOULD_BLOCK;
3199 }
3200 
getTimestamp(AudioTimestamp & timestamp)3201 status_t AudioTrack::getTimestamp(AudioTimestamp& timestamp)
3202 {
3203     AutoMutex lock(mLock);
3204     return getTimestamp_l(timestamp);
3205 }
3206 
getTimestamp_l(AudioTimestamp & timestamp)3207 status_t AudioTrack::getTimestamp_l(AudioTimestamp& timestamp)
3208 {
3209     bool previousTimestampValid = mPreviousTimestampValid;
3210     // Set false here to cover all the error return cases.
3211     mPreviousTimestampValid = false;
3212 
3213     switch (mState) {
3214     case STATE_ACTIVE:
3215     case STATE_PAUSED:
3216         break; // handle below
3217     case STATE_FLUSHED:
3218     case STATE_STOPPED:
3219         return WOULD_BLOCK;
3220     case STATE_STOPPING:
3221     case STATE_PAUSED_STOPPING:
3222         if (!isOffloaded_l()) {
3223             return INVALID_OPERATION;
3224         }
3225         break; // offloaded tracks handled below
3226     default:
3227         LOG_ALWAYS_FATAL("%s(%d): Invalid mState in getTimestamp(): %d",
3228                __func__, mPortId, mState);
3229         break;
3230     }
3231 
3232     if (mCblk->mFlags & CBLK_INVALID) {
3233         const status_t status = restoreTrack_l("getTimestamp");
3234         if (status != OK) {
3235             // per getTimestamp() API doc in header, we return DEAD_OBJECT here,
3236             // recommending that the track be recreated.
3237             return DEAD_OBJECT;
3238         }
3239     }
3240 
3241     // The presented frame count must always lag behind the consumed frame count.
3242     // To avoid a race, read the presented frames first.  This ensures that presented <= consumed.
3243 
3244     status_t status;
3245     if (isOffloadedOrDirect_l()) {
3246         // use Binder to get timestamp
3247         media::AudioTimestampInternal ts;
3248         mAudioTrack->getTimestamp(&ts, &status);
3249         if (status == OK) {
3250             timestamp = VALUE_OR_FATAL(aidl2legacy_AudioTimestampInternal_AudioTimestamp(ts));
3251         }
3252     } else {
3253         // read timestamp from shared memory
3254         ExtendedTimestamp ets;
3255         status = mProxy->getTimestamp(&ets);
3256         if (status == OK) {
3257             ExtendedTimestamp::Location location;
3258             status = ets.getBestTimestamp(&timestamp, &location);
3259 
3260             if (status == OK) {
3261                 updateLatency_l();
3262                 // It is possible that the best location has moved from the kernel to the server.
3263                 // In this case we adjust the position from the previous computed latency.
3264                 if (location == ExtendedTimestamp::LOCATION_SERVER) {
3265                     ALOGW_IF(mPreviousLocation == ExtendedTimestamp::LOCATION_KERNEL,
3266                             "%s(%d): location moved from kernel to server",
3267                             __func__, mPortId);
3268                     // check that the last kernel OK time info exists and the positions
3269                     // are valid (if they predate the current track, the positions may
3270                     // be zero or negative).
3271                     const int64_t frames =
3272                             (ets.mTimeNs[ExtendedTimestamp::LOCATION_SERVER_LASTKERNELOK] < 0 ||
3273                             ets.mTimeNs[ExtendedTimestamp::LOCATION_KERNEL_LASTKERNELOK] < 0 ||
3274                             ets.mPosition[ExtendedTimestamp::LOCATION_SERVER_LASTKERNELOK] <= 0 ||
3275                             ets.mPosition[ExtendedTimestamp::LOCATION_KERNEL_LASTKERNELOK] <= 0)
3276                             ?
3277                             int64_t((double)mAfLatency * mSampleRate * mPlaybackRate.mSpeed
3278                                     / 1000)
3279                             :
3280                             (ets.mPosition[ExtendedTimestamp::LOCATION_SERVER_LASTKERNELOK]
3281                             - ets.mPosition[ExtendedTimestamp::LOCATION_KERNEL_LASTKERNELOK]);
3282                     ALOGV("%s(%d): frame adjustment:%lld  timestamp:%s",
3283                             __func__, mPortId, (long long)frames, ets.toString().c_str());
3284                     if (frames >= ets.mPosition[location]) {
3285                         timestamp.mPosition = 0;
3286                     } else {
3287                         timestamp.mPosition = (uint32_t)(ets.mPosition[location] - frames);
3288                     }
3289                 } else if (location == ExtendedTimestamp::LOCATION_KERNEL) {
3290                     ALOGV_IF(mPreviousLocation == ExtendedTimestamp::LOCATION_SERVER,
3291                             "%s(%d): location moved from server to kernel",
3292                             __func__, mPortId);
3293 
3294                     if (ets.mPosition[ExtendedTimestamp::LOCATION_SERVER] ==
3295                             ets.mPosition[ExtendedTimestamp::LOCATION_KERNEL]) {
3296                         // In Q, we don't return errors as an invalid time
3297                         // but instead we leave the last kernel good timestamp alone.
3298                         //
3299                         // If server is identical to kernel, the device data pipeline is idle.
3300                         // A better start time is now.  The retrograde check ensures
3301                         // timestamp monotonicity.
3302                         const int64_t nowNs = systemTime();
3303                         if (!mTimestampStallReported) {
3304                             ALOGD("%s(%d): device stall time corrected using current time %lld",
3305                                     __func__, mPortId, (long long)nowNs);
3306                             mTimestampStallReported = true;
3307                         }
3308                         timestamp.mTime = convertNsToTimespec(nowNs);
3309                     }  else {
3310                         mTimestampStallReported = false;
3311                     }
3312                 }
3313 
3314                 // We update the timestamp time even when paused.
3315                 if (mState == STATE_PAUSED /* not needed: STATE_PAUSED_STOPPING */) {
3316                     const int64_t now = systemTime();
3317                     const int64_t at = audio_utils_ns_from_timespec(&timestamp.mTime);
3318                     const int64_t lag =
3319                             (ets.mTimeNs[ExtendedTimestamp::LOCATION_SERVER_LASTKERNELOK] < 0 ||
3320                                 ets.mTimeNs[ExtendedTimestamp::LOCATION_KERNEL_LASTKERNELOK] < 0)
3321                             ? int64_t(mAfLatency * 1000000LL)
3322                             : (ets.mPosition[ExtendedTimestamp::LOCATION_SERVER_LASTKERNELOK]
3323                              - ets.mPosition[ExtendedTimestamp::LOCATION_KERNEL_LASTKERNELOK])
3324                              * NANOS_PER_SECOND / mSampleRate;
3325                     const int64_t limit = now - lag; // no earlier than this limit
3326                     if (at < limit) {
3327                         ALOGV("timestamp pause lag:%lld adjusting from %lld to %lld",
3328                                 (long long)lag, (long long)at, (long long)limit);
3329                         timestamp.mTime = convertNsToTimespec(limit);
3330                     }
3331                 }
3332                 mPreviousLocation = location;
3333             } else {
3334                 // right after AudioTrack is started, one may not find a timestamp
3335                 ALOGV("%s(%d): getBestTimestamp did not find timestamp", __func__, mPortId);
3336             }
3337         }
3338         if (status == INVALID_OPERATION) {
3339             // INVALID_OPERATION occurs when no timestamp has been issued by the server;
3340             // other failures are signaled by a negative time.
3341             // If we come out of FLUSHED or STOPPED where the position is known
3342             // to be zero we convert this to WOULD_BLOCK (with the implicit meaning of
3343             // "zero" for NuPlayer).  We don't convert for track restoration as position
3344             // does not reset.
3345             ALOGV("%s(%d): timestamp server offset:%lld restore frames:%lld",
3346                     __func__, mPortId,
3347                     (long long)mFramesWrittenServerOffset, (long long)mFramesWrittenAtRestore);
3348             if (mFramesWrittenServerOffset != mFramesWrittenAtRestore) {
3349                 status = WOULD_BLOCK;
3350             }
3351         }
3352     }
3353     if (status != NO_ERROR) {
3354         ALOGV_IF(status != WOULD_BLOCK, "%s(%d): getTimestamp error:%#x", __func__, mPortId, status);
3355         return status;
3356     }
3357     if (isOffloadedOrDirect_l()) {
3358         if (isOffloaded_l() && (mState == STATE_PAUSED || mState == STATE_PAUSED_STOPPING)) {
3359             // use cached paused position in case another offloaded track is running.
3360             timestamp.mPosition = mPausedPosition;
3361             clock_gettime(CLOCK_MONOTONIC, &timestamp.mTime);
3362             // TODO: adjust for delay
3363             return NO_ERROR;
3364         }
3365 
3366         // Check whether a pending flush or stop has completed, as those commands may
3367         // be asynchronous or return near finish or exhibit glitchy behavior.
3368         //
3369         // Originally this showed up as the first timestamp being a continuation of
3370         // the previous song under gapless playback.
3371         // However, we sometimes see zero timestamps, then a glitch of
3372         // the previous song's position, and then correct timestamps afterwards.
3373         if (mStartFromZeroUs != 0 && mSampleRate != 0) {
3374             static const int kTimeJitterUs = 100000; // 100 ms
3375             static const int k1SecUs = 1000000;
3376 
3377             const int64_t timeNow = getNowUs();
3378 
3379             if (timeNow < mStartFromZeroUs + k1SecUs) { // within first second of starting
3380                 const int64_t timestampTimeUs = convertTimespecToUs(timestamp.mTime);
3381                 if (timestampTimeUs < mStartFromZeroUs) {
3382                     return WOULD_BLOCK;  // stale timestamp time, occurs before start.
3383                 }
3384                 const int64_t deltaTimeUs = timestampTimeUs - mStartFromZeroUs;
3385                 const int64_t deltaPositionByUs = (double)timestamp.mPosition * 1000000
3386                         / ((double)mSampleRate * mPlaybackRate.mSpeed);
3387 
3388                 if (deltaPositionByUs > deltaTimeUs + kTimeJitterUs) {
3389                     // Verify that the counter can't count faster than the sample rate
3390                     // since the start time.  If greater, then that means we may have failed
3391                     // to completely flush or stop the previous playing track.
3392                     ALOGW_IF(!mTimestampStartupGlitchReported,
3393                             "%s(%d): startup glitch detected"
3394                             " deltaTimeUs(%lld) deltaPositionUs(%lld) tsmPosition(%u)",
3395                             __func__, mPortId,
3396                             (long long)deltaTimeUs, (long long)deltaPositionByUs,
3397                             timestamp.mPosition);
3398                     mTimestampStartupGlitchReported = true;
3399                     if (previousTimestampValid
3400                             && mPreviousTimestamp.mPosition == 0 /* should be true if valid */) {
3401                         timestamp = mPreviousTimestamp;
3402                         mPreviousTimestampValid = true;
3403                         return NO_ERROR;
3404                     }
3405                     return WOULD_BLOCK;
3406                 }
3407                 if (deltaPositionByUs != 0) {
3408                     mStartFromZeroUs = 0; // don't check again, we got valid nonzero position.
3409                 }
3410             } else {
3411                 mStartFromZeroUs = 0; // don't check again, start time expired.
3412             }
3413             mTimestampStartupGlitchReported = false;
3414         }
3415     } else {
3416         // Update the mapping between local consumed (mPosition) and server consumed (mServer)
3417         (void) updateAndGetPosition_l();
3418         // Server consumed (mServer) and presented both use the same server time base,
3419         // and server consumed is always >= presented.
3420         // The delta between these represents the number of frames in the buffer pipeline.
3421         // If this delta between these is greater than the client position, it means that
3422         // actually presented is still stuck at the starting line (figuratively speaking),
3423         // waiting for the first frame to go by.  So we can't report a valid timestamp yet.
3424         // Note: We explicitly use non-Modulo comparison here - potential wrap issue when
3425         // mPosition exceeds 32 bits.
3426         // TODO Remove when timestamp is updated to contain pipeline status info.
3427         const int32_t pipelineDepthInFrames = (mServer - timestamp.mPosition).signedValue();
3428         if (pipelineDepthInFrames > 0 /* should be true, but we check anyways */
3429                 && (uint32_t)pipelineDepthInFrames > mPosition.value()) {
3430             return INVALID_OPERATION;
3431         }
3432         // Convert timestamp position from server time base to client time base.
3433         // TODO The following code should work OK now because timestamp.mPosition is 32-bit.
3434         // But if we change it to 64-bit then this could fail.
3435         // Use Modulo computation here.
3436         timestamp.mPosition = (mPosition - mServer + timestamp.mPosition).value();
3437         // Immediately after a call to getPosition_l(), mPosition and
3438         // mServer both represent the same frame position.  mPosition is
3439         // in client's point of view, and mServer is in server's point of
3440         // view.  So the difference between them is the "fudge factor"
3441         // between client and server views due to stop() and/or new
3442         // IAudioTrack.  And timestamp.mPosition is initially in server's
3443         // point of view, so we need to apply the same fudge factor to it.
3444     }
3445 
3446     // Prevent retrograde motion in timestamp.
3447     // This is sometimes caused by erratic reports of the available space in the ALSA drivers.
3448     if (status == NO_ERROR) {
3449         // Fix stale time when checking timestamp right after start().
3450         // The position is at the last reported location but the time can be stale
3451         // due to pause or standby or cold start latency.
3452         //
3453         // We keep advancing the time (but not the position) to ensure that the
3454         // stale value does not confuse the application.
3455         //
3456         // For offload compatibility, use a default lag value here.
3457         // Any time discrepancy between this update and the pause timestamp is handled
3458         // by the retrograde check afterwards.
3459         int64_t currentTimeNanos = audio_utils_ns_from_timespec(&timestamp.mTime);
3460         const int64_t lagNs = int64_t(mAfLatency * 1000000LL);
3461         const int64_t limitNs = mStartNs - lagNs;
3462         if (currentTimeNanos < limitNs) {
3463             if (!mTimestampStaleTimeReported) {
3464                 ALOGD("%s(%d): stale timestamp time corrected, "
3465                         "currentTimeNanos: %lld < limitNs: %lld < mStartNs: %lld",
3466                         __func__, mPortId,
3467                         (long long)currentTimeNanos, (long long)limitNs, (long long)mStartNs);
3468                 mTimestampStaleTimeReported = true;
3469             }
3470             timestamp.mTime = convertNsToTimespec(limitNs);
3471             currentTimeNanos = limitNs;
3472         } else {
3473             mTimestampStaleTimeReported = false;
3474         }
3475 
3476         // previousTimestampValid is set to false when starting after a stop or flush.
3477         if (previousTimestampValid) {
3478             const int64_t previousTimeNanos =
3479                     audio_utils_ns_from_timespec(&mPreviousTimestamp.mTime);
3480 
3481             // retrograde check
3482             if (currentTimeNanos < previousTimeNanos) {
3483                 if (!mTimestampRetrogradeTimeReported) {
3484                     ALOGW("%s(%d): retrograde timestamp time corrected, %lld < %lld",
3485                             __func__, mPortId,
3486                             (long long)currentTimeNanos, (long long)previousTimeNanos);
3487                     mTimestampRetrogradeTimeReported = true;
3488                 }
3489                 timestamp.mTime = mPreviousTimestamp.mTime;
3490             } else {
3491                 mTimestampRetrogradeTimeReported = false;
3492             }
3493 
3494             // Looking at signed delta will work even when the timestamps
3495             // are wrapping around.
3496             int32_t deltaPosition = (Modulo<uint32_t>(timestamp.mPosition)
3497                     - mPreviousTimestamp.mPosition).signedValue();
3498             if (deltaPosition < 0) {
3499                 // Only report once per position instead of spamming the log.
3500                 if (!mTimestampRetrogradePositionReported) {
3501                     ALOGW("%s(%d): retrograde timestamp position corrected, %d = %u - %u",
3502                             __func__, mPortId,
3503                             deltaPosition,
3504                             timestamp.mPosition,
3505                             mPreviousTimestamp.mPosition);
3506                     mTimestampRetrogradePositionReported = true;
3507                 }
3508             } else {
3509                 mTimestampRetrogradePositionReported = false;
3510             }
3511             if (deltaPosition < 0) {
3512                 timestamp.mPosition = mPreviousTimestamp.mPosition;
3513                 deltaPosition = 0;
3514             }
3515 #if 0
3516             // Uncomment this to verify audio timestamp rate.
3517             const int64_t deltaTime =
3518                     audio_utils_ns_from_timespec(&timestamp.mTime) - previousTimeNanos;
3519             if (deltaTime != 0) {
3520                 const int64_t computedSampleRate =
3521                         deltaPosition * (long long)NANOS_PER_SECOND / deltaTime;
3522                 ALOGD("%s(%d): computedSampleRate:%u  sampleRate:%u",
3523                         __func__, mPortId,
3524                         (unsigned)computedSampleRate, mSampleRate);
3525             }
3526 #endif
3527         }
3528         mPreviousTimestamp = timestamp;
3529         mPreviousTimestampValid = true;
3530     }
3531 
3532     return status;
3533 }
3534 
getParameters(const String8 & keys)3535 String8 AudioTrack::getParameters(const String8& keys)
3536 {
3537     audio_io_handle_t output = getOutput();
3538     if (output != AUDIO_IO_HANDLE_NONE) {
3539         return AudioSystem::getParameters(output, keys);
3540     } else {
3541         return String8::empty();
3542     }
3543 }
3544 
isOffloaded() const3545 bool AudioTrack::isOffloaded() const
3546 {
3547     AutoMutex lock(mLock);
3548     return isOffloaded_l();
3549 }
3550 
isDirect() const3551 bool AudioTrack::isDirect() const
3552 {
3553     AutoMutex lock(mLock);
3554     return isDirect_l();
3555 }
3556 
isOffloadedOrDirect() const3557 bool AudioTrack::isOffloadedOrDirect() const
3558 {
3559     AutoMutex lock(mLock);
3560     return isOffloadedOrDirect_l();
3561 }
3562 
3563 
dump(int fd,const Vector<String16> & args __unused) const3564 status_t AudioTrack::dump(int fd, const Vector<String16>& args __unused) const
3565 {
3566     String8 result;
3567 
3568     result.append(" AudioTrack::dump\n");
3569     result.appendFormat("  id(%d) status(%d), state(%d), session Id(%d), flags(%#x)\n",
3570                         mPortId, mStatus, mState, mSessionId, mFlags);
3571     result.appendFormat("  stream type(%d), left - right volume(%f, %f)\n",
3572                             mStreamType,
3573                         mVolume[AUDIO_INTERLEAVE_LEFT], mVolume[AUDIO_INTERLEAVE_RIGHT]);
3574     result.appendFormat("  format(%#x), channel mask(%#x), channel count(%u)\n",
3575                   mFormat, mChannelMask, mChannelCount);
3576     result.appendFormat("  sample rate(%u), original sample rate(%u), speed(%f)\n",
3577                   mSampleRate, mOriginalSampleRate, mPlaybackRate.mSpeed);
3578     result.appendFormat("  frame count(%zu), req. frame count(%zu)\n",
3579                   mFrameCount, mReqFrameCount);
3580     result.appendFormat("  notif. frame count(%u), req. notif. frame count(%u),"
3581             " req. notif. per buff(%u)\n",
3582              mNotificationFramesAct, mNotificationFramesReq, mNotificationsPerBufferReq);
3583     result.appendFormat("  latency (%d), selected device Id(%d), routed device Id(%d)\n",
3584                         mLatency, mSelectedDeviceId, mRoutedDeviceId);
3585     result.appendFormat("  output(%d) AF latency (%u) AF frame count(%zu) AF SampleRate(%u)\n",
3586                         mOutput, mAfLatency, mAfFrameCount, mAfSampleRate);
3587     ::write(fd, result.string(), result.size());
3588     return NO_ERROR;
3589 }
3590 
getUnderrunCount() const3591 uint32_t AudioTrack::getUnderrunCount() const
3592 {
3593     AutoMutex lock(mLock);
3594     return getUnderrunCount_l();
3595 }
3596 
getUnderrunCount_l() const3597 uint32_t AudioTrack::getUnderrunCount_l() const
3598 {
3599     return mProxy->getUnderrunCount() + mUnderrunCountOffset;
3600 }
3601 
getUnderrunFrames() const3602 uint32_t AudioTrack::getUnderrunFrames() const
3603 {
3604     AutoMutex lock(mLock);
3605     return mProxy->getUnderrunFrames();
3606 }
3607 
setLogSessionId(const char * logSessionId)3608 void AudioTrack::setLogSessionId(const char *logSessionId)
3609 {
3610      AutoMutex lock(mLock);
3611     if (logSessionId == nullptr) logSessionId = "";  // an empty string is an unset session id.
3612     if (mLogSessionId == logSessionId) return;
3613 
3614      mLogSessionId = logSessionId;
3615      mediametrics::LogItem(mMetricsId)
3616          .set(AMEDIAMETRICS_PROP_EVENT, AMEDIAMETRICS_PROP_EVENT_VALUE_SETLOGSESSIONID)
3617          .set(AMEDIAMETRICS_PROP_LOGSESSIONID, logSessionId)
3618          .record();
3619 }
3620 
setPlayerIId(int playerIId)3621 void AudioTrack::setPlayerIId(int playerIId)
3622 {
3623     AutoMutex lock(mLock);
3624     if (mPlayerIId == playerIId) return;
3625 
3626     mPlayerIId = playerIId;
3627     mediametrics::LogItem(mMetricsId)
3628         .set(AMEDIAMETRICS_PROP_EVENT, AMEDIAMETRICS_PROP_EVENT_VALUE_SETPLAYERIID)
3629         .set(AMEDIAMETRICS_PROP_PLAYERIID, playerIId)
3630         .record();
3631 }
3632 
addAudioDeviceCallback(const sp<AudioSystem::AudioDeviceCallback> & callback)3633 status_t AudioTrack::addAudioDeviceCallback(const sp<AudioSystem::AudioDeviceCallback>& callback)
3634 {
3635 
3636     if (callback == 0) {
3637         ALOGW("%s(%d): adding NULL callback!", __func__, mPortId);
3638         return BAD_VALUE;
3639     }
3640     AutoMutex lock(mLock);
3641     if (mDeviceCallback.unsafe_get() == callback.get()) {
3642         ALOGW("%s(%d): adding same callback!", __func__, mPortId);
3643         return INVALID_OPERATION;
3644     }
3645     status_t status = NO_ERROR;
3646     if (mOutput != AUDIO_IO_HANDLE_NONE) {
3647         if (mDeviceCallback != 0) {
3648             ALOGW("%s(%d): callback already present!", __func__, mPortId);
3649             AudioSystem::removeAudioDeviceCallback(this, mOutput, mPortId);
3650         }
3651         status = AudioSystem::addAudioDeviceCallback(this, mOutput, mPortId);
3652     }
3653     mDeviceCallback = callback;
3654     return status;
3655 }
3656 
removeAudioDeviceCallback(const sp<AudioSystem::AudioDeviceCallback> & callback)3657 status_t AudioTrack::removeAudioDeviceCallback(
3658         const sp<AudioSystem::AudioDeviceCallback>& callback)
3659 {
3660     if (callback == 0) {
3661         ALOGW("%s(%d): removing NULL callback!", __func__, mPortId);
3662         return BAD_VALUE;
3663     }
3664     AutoMutex lock(mLock);
3665     if (mDeviceCallback.unsafe_get() != callback.get()) {
3666         ALOGW("%s removing different callback!", __FUNCTION__);
3667         return INVALID_OPERATION;
3668     }
3669     mDeviceCallback.clear();
3670     if (mOutput != AUDIO_IO_HANDLE_NONE) {
3671         AudioSystem::removeAudioDeviceCallback(this, mOutput, mPortId);
3672     }
3673     return NO_ERROR;
3674 }
3675 
3676 
onAudioDeviceUpdate(audio_io_handle_t audioIo,audio_port_handle_t deviceId)3677 void AudioTrack::onAudioDeviceUpdate(audio_io_handle_t audioIo,
3678                                  audio_port_handle_t deviceId)
3679 {
3680     sp<AudioSystem::AudioDeviceCallback> callback;
3681     {
3682         AutoMutex lock(mLock);
3683         if (audioIo != mOutput) {
3684             return;
3685         }
3686         callback = mDeviceCallback.promote();
3687         // only update device if the track is active as route changes due to other use cases are
3688         // irrelevant for this client
3689         if (mState == STATE_ACTIVE) {
3690             mRoutedDeviceId = deviceId;
3691         }
3692     }
3693 
3694     if (callback.get() != nullptr) {
3695         callback->onAudioDeviceUpdate(mOutput, mRoutedDeviceId);
3696     }
3697 }
3698 
pendingDuration(int32_t * msec,ExtendedTimestamp::Location location)3699 status_t AudioTrack::pendingDuration(int32_t *msec, ExtendedTimestamp::Location location)
3700 {
3701     if (msec == nullptr ||
3702             (location != ExtendedTimestamp::LOCATION_SERVER
3703                     && location != ExtendedTimestamp::LOCATION_KERNEL)) {
3704         return BAD_VALUE;
3705     }
3706     AutoMutex lock(mLock);
3707     // inclusive of offloaded and direct tracks.
3708     //
3709     // It is possible, but not enabled, to allow duration computation for non-pcm
3710     // audio_has_proportional_frames() formats because currently they have
3711     // the drain rate equivalent to the pcm sample rate * framesize.
3712     if (!isPurePcmData_l()) {
3713         return INVALID_OPERATION;
3714     }
3715     ExtendedTimestamp ets;
3716     if (getTimestamp_l(&ets) == OK
3717             && ets.mTimeNs[location] > 0) {
3718         int64_t diff = ets.mPosition[ExtendedTimestamp::LOCATION_CLIENT]
3719                 - ets.mPosition[location];
3720         if (diff < 0) {
3721             *msec = 0;
3722         } else {
3723             // ms is the playback time by frames
3724             int64_t ms = (int64_t)((double)diff * 1000 /
3725                     ((double)mSampleRate * mPlaybackRate.mSpeed));
3726             // clockdiff is the timestamp age (negative)
3727             int64_t clockdiff = (mState != STATE_ACTIVE) ? 0 :
3728                     ets.mTimeNs[location]
3729                     + ets.mTimebaseOffset[ExtendedTimestamp::TIMEBASE_MONOTONIC]
3730                     - systemTime(SYSTEM_TIME_MONOTONIC);
3731 
3732             //ALOGV("ms: %lld  clockdiff: %lld", (long long)ms, (long long)clockdiff);
3733             static const int NANOS_PER_MILLIS = 1000000;
3734             *msec = (int32_t)(ms + clockdiff / NANOS_PER_MILLIS);
3735         }
3736         return NO_ERROR;
3737     }
3738     if (location != ExtendedTimestamp::LOCATION_SERVER) {
3739         return INVALID_OPERATION; // LOCATION_KERNEL is not available
3740     }
3741     // use server position directly (offloaded and direct arrive here)
3742     updateAndGetPosition_l();
3743     int32_t diff = (Modulo<uint32_t>(mFramesWritten) - mPosition).signedValue();
3744     *msec = (diff <= 0) ? 0
3745             : (int32_t)((double)diff * 1000 / ((double)mSampleRate * mPlaybackRate.mSpeed));
3746     return NO_ERROR;
3747 }
3748 
hasStarted()3749 bool AudioTrack::hasStarted()
3750 {
3751     AutoMutex lock(mLock);
3752     switch (mState) {
3753     case STATE_STOPPED:
3754         if (isOffloadedOrDirect_l()) {
3755             // check if we have started in the past to return true.
3756             return mStartFromZeroUs > 0;
3757         }
3758         // A normal audio track may still be draining, so
3759         // check if stream has ended.  This covers fasttrack position
3760         // instability and start/stop without any data written.
3761         if (mProxy->getStreamEndDone()) {
3762             return true;
3763         }
3764         FALLTHROUGH_INTENDED;
3765     case STATE_ACTIVE:
3766     case STATE_STOPPING:
3767         break;
3768     case STATE_PAUSED:
3769     case STATE_PAUSED_STOPPING:
3770     case STATE_FLUSHED:
3771         return false;  // we're not active
3772     default:
3773         LOG_ALWAYS_FATAL("%s(%d): Invalid mState in hasStarted(): %d", __func__, mPortId, mState);
3774         break;
3775     }
3776 
3777     // wait indicates whether we need to wait for a timestamp.
3778     // This is conservatively figured - if we encounter an unexpected error
3779     // then we will not wait.
3780     bool wait = false;
3781     if (isOffloadedOrDirect_l()) {
3782         AudioTimestamp ts;
3783         status_t status = getTimestamp_l(ts);
3784         if (status == WOULD_BLOCK) {
3785             wait = true;
3786         } else if (status == OK) {
3787             wait = (ts.mPosition == 0 || ts.mPosition == mStartTs.mPosition);
3788         }
3789         ALOGV("%s(%d): hasStarted wait:%d  ts:%u  start position:%lld",
3790                 __func__, mPortId,
3791                 (int)wait,
3792                 ts.mPosition,
3793                 (long long)mStartTs.mPosition);
3794     } else {
3795         int location = ExtendedTimestamp::LOCATION_SERVER; // for ALOG
3796         ExtendedTimestamp ets;
3797         status_t status = getTimestamp_l(&ets);
3798         if (status == WOULD_BLOCK) {  // no SERVER or KERNEL frame info in ets
3799             wait = true;
3800         } else if (status == OK) {
3801             for (location = ExtendedTimestamp::LOCATION_KERNEL;
3802                     location >= ExtendedTimestamp::LOCATION_SERVER; --location) {
3803                 if (ets.mTimeNs[location] < 0 || mStartEts.mTimeNs[location] < 0) {
3804                     continue;
3805                 }
3806                 wait = ets.mPosition[location] == 0
3807                         || ets.mPosition[location] == mStartEts.mPosition[location];
3808                 break;
3809             }
3810         }
3811         ALOGV("%s(%d): hasStarted wait:%d  ets:%lld  start position:%lld",
3812                 __func__, mPortId,
3813                 (int)wait,
3814                 (long long)ets.mPosition[location],
3815                 (long long)mStartEts.mPosition[location]);
3816     }
3817     return !wait;
3818 }
3819 
3820 // =========================================================================
3821 
binderDied(const wp<IBinder> & who __unused)3822 void AudioTrack::DeathNotifier::binderDied(const wp<IBinder>& who __unused)
3823 {
3824     sp<AudioTrack> audioTrack = mAudioTrack.promote();
3825     if (audioTrack != 0) {
3826         AutoMutex lock(audioTrack->mLock);
3827         audioTrack->mProxy->binderDied();
3828     }
3829 }
3830 
3831 // =========================================================================
3832 
AudioTrackThread(AudioTrack & receiver)3833 AudioTrack::AudioTrackThread::AudioTrackThread(AudioTrack& receiver)
3834     : Thread(true /* bCanCallJava */)  // binder recursion on restoreTrack_l() may call Java.
3835     , mReceiver(receiver), mPaused(true), mPausedInt(false), mPausedNs(0LL),
3836       mIgnoreNextPausedInt(false)
3837 {
3838 }
3839 
~AudioTrackThread()3840 AudioTrack::AudioTrackThread::~AudioTrackThread()
3841 {
3842 }
3843 
threadLoop()3844 bool AudioTrack::AudioTrackThread::threadLoop()
3845 {
3846     {
3847         AutoMutex _l(mMyLock);
3848         if (mPaused) {
3849             // TODO check return value and handle or log
3850             mMyCond.wait(mMyLock);
3851             // caller will check for exitPending()
3852             return true;
3853         }
3854         if (mIgnoreNextPausedInt) {
3855             mIgnoreNextPausedInt = false;
3856             mPausedInt = false;
3857         }
3858         if (mPausedInt) {
3859             // TODO use futex instead of condition, for event flag "or"
3860             if (mPausedNs > 0) {
3861                 // TODO check return value and handle or log
3862                 (void) mMyCond.waitRelative(mMyLock, mPausedNs);
3863             } else {
3864                 // TODO check return value and handle or log
3865                 mMyCond.wait(mMyLock);
3866             }
3867             mPausedInt = false;
3868             return true;
3869         }
3870     }
3871     if (exitPending()) {
3872         return false;
3873     }
3874     nsecs_t ns = mReceiver.processAudioBuffer();
3875     switch (ns) {
3876     case 0:
3877         return true;
3878     case NS_INACTIVE:
3879         pauseInternal();
3880         return true;
3881     case NS_NEVER:
3882         return false;
3883     case NS_WHENEVER:
3884         // Event driven: call wake() when callback notifications conditions change.
3885         ns = INT64_MAX;
3886         FALLTHROUGH_INTENDED;
3887     default:
3888         LOG_ALWAYS_FATAL_IF(ns < 0, "%s(%d): processAudioBuffer() returned %lld",
3889                 __func__, mReceiver.mPortId, (long long)ns);
3890         pauseInternal(ns);
3891         return true;
3892     }
3893 }
3894 
requestExit()3895 void AudioTrack::AudioTrackThread::requestExit()
3896 {
3897     // must be in this order to avoid a race condition
3898     Thread::requestExit();
3899     resume();
3900 }
3901 
pause()3902 void AudioTrack::AudioTrackThread::pause()
3903 {
3904     AutoMutex _l(mMyLock);
3905     mPaused = true;
3906 }
3907 
resume()3908 void AudioTrack::AudioTrackThread::resume()
3909 {
3910     AutoMutex _l(mMyLock);
3911     mIgnoreNextPausedInt = true;
3912     if (mPaused || mPausedInt) {
3913         mPaused = false;
3914         mPausedInt = false;
3915         mMyCond.signal();
3916     }
3917 }
3918 
wake()3919 void AudioTrack::AudioTrackThread::wake()
3920 {
3921     AutoMutex _l(mMyLock);
3922     if (!mPaused) {
3923         // wake() might be called while servicing a callback - ignore the next
3924         // pause time and call processAudioBuffer.
3925         mIgnoreNextPausedInt = true;
3926         if (mPausedInt && mPausedNs > 0) {
3927             // audio track is active and internally paused with timeout.
3928             mPausedInt = false;
3929             mMyCond.signal();
3930         }
3931     }
3932 }
3933 
pauseInternal(nsecs_t ns)3934 void AudioTrack::AudioTrackThread::pauseInternal(nsecs_t ns)
3935 {
3936     AutoMutex _l(mMyLock);
3937     mPausedInt = true;
3938     mPausedNs = ns;
3939 }
3940 
onCodecFormatChanged(const std::vector<uint8_t> & audioMetadata)3941 binder::Status AudioTrack::AudioTrackCallback::onCodecFormatChanged(
3942         const std::vector<uint8_t>& audioMetadata)
3943 {
3944     AutoMutex _l(mAudioTrackCbLock);
3945     sp<media::IAudioTrackCallback> callback = mCallback.promote();
3946     if (callback.get() != nullptr) {
3947         callback->onCodecFormatChanged(audioMetadata);
3948     } else {
3949         mCallback.clear();
3950     }
3951     return binder::Status::ok();
3952 }
3953 
setAudioTrackCallback(const sp<media::IAudioTrackCallback> & callback)3954 void AudioTrack::AudioTrackCallback::setAudioTrackCallback(
3955         const sp<media::IAudioTrackCallback> &callback) {
3956     AutoMutex lock(mAudioTrackCbLock);
3957     mCallback = callback;
3958 }
3959 
3960 } // namespace android
3961