audioflinger: various offload playback fixes
Revert underrun sleep time optimization added for
offload by commit 51716185 which can cause music to pause for a few
seconds in some corner cases.
Allow underruns in STOPPING_1 state to avoid dropping last buffer
received by the AudioTrack callback after stop() is called by the
client.
Allow interruption of thread loop sleep if a command is pending to
speed up track start sequence.
Do not wait for a full AudioTrack buffer before writing to audio HAL
when resuming playback or transitioning to next track.
Also moved log level for underruns in AudioSink from I to D to reduce
spam on user builds.
Bug: 28545177
Bug: 27682362
Bug: 28347796
Change-Id: I05b651b7878a2d2eedcac43cd669e32add171d40
diff --git a/services/audioflinger/Threads.h b/services/audioflinger/Threads.h
index 0ddd279..1cceb6d 100644
--- a/services/audioflinger/Threads.h
+++ b/services/audioflinger/Threads.h
@@ -486,9 +486,16 @@
// suspend by audio policy manager is orthogonal to mixer state
};
+ // retry count before removing active track in case of underrun on offloaded thread:
+ // we need to make sure that AudioTrack client has enough time to send large buffers
+ //FIXME may be more appropriate if expressed in time units. Need to revise how underrun is
+ // handled for offloaded tracks
+ static const int8_t kMaxTrackRetriesOffload = 20;
+ static const int8_t kMaxTrackStartupRetriesOffload = 100;
+ static const int8_t kMaxTrackStopRetriesOffload = 2;
+
PlaybackThread(const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output,
- audio_io_handle_t id, audio_devices_t device, type_t type, bool systemReady,
- uint32_t bitRate = 0);
+ audio_io_handle_t id, audio_devices_t device, type_t type, bool systemReady);
virtual ~PlaybackThread();
void dump(int fd, const Vector<String16>& args);
@@ -843,8 +850,6 @@
bool mHwSupportsPause;
bool mHwPaused;
bool mFlushPending;
- uint32_t mBufferDurationUs; // estimated duration of an audio HAL buffer
- // based on initial bit rate (offload only)
};
class MixerThread : public PlaybackThread {
@@ -935,8 +940,7 @@
public:
DirectOutputThread(const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output,
- audio_io_handle_t id, audio_devices_t device, bool systemReady,
- uint32_t bitRate = 0);
+ audio_io_handle_t id, audio_devices_t device, bool systemReady);
virtual ~DirectOutputThread();
// Thread virtuals
@@ -969,7 +973,7 @@
DirectOutputThread(const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output,
audio_io_handle_t id, uint32_t device, ThreadBase::type_t type,
- bool systemReady, uint32_t bitRate = 0);
+ bool systemReady);
void processVolume_l(Track *track, bool lastTrack);
// prepareTracks_l() tells threadLoop_mix() the name of the single active track
@@ -985,8 +989,7 @@
public:
OffloadThread(const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output,
- audio_io_handle_t id, uint32_t device,
- bool systemReady, uint32_t bitRate);
+ audio_io_handle_t id, uint32_t device, bool systemReady);
virtual ~OffloadThread() {};
virtual void flushHw_l();
@@ -995,8 +998,6 @@
virtual mixer_state prepareTracks_l(Vector< sp<Track> > *tracksToRemove);
virtual void threadLoop_exit();
- virtual uint32_t activeSleepTimeUs() const;
-
virtual bool waitingAsyncCallback();
virtual bool waitingAsyncCallback_l();
virtual void invalidateTracks(audio_stream_type_t streamType);