Support bit-perfect PCM playback.
This is part of USB audio improvement. Bit-perfect PCM playback
indicates that the PCM data will be sent as is down to the audio HAL.
When the track is bit-perfect, there will not be volume control
applied in the audio mixer. Only effects without processing or hw
accelerated effects will be allowed to attach to bit-perfect tracks.
Bug: 239435816
Test: manually
Test: atest audiopolicy_tests
Change-Id: I0bad4d7d78d4eaf741754d01bc5422ba15374782
diff --git a/services/audioflinger/Threads.h b/services/audioflinger/Threads.h
index 8bf629b..f1b82e4 100644
--- a/services/audioflinger/Threads.h
+++ b/services/audioflinger/Threads.h
@@ -33,6 +33,7 @@
MMAP_PLAYBACK, // Thread class for MMAP playback stream
MMAP_CAPTURE, // Thread class for MMAP capture stream
SPATIALIZER, //
+ BIT_PERFECT, // Thread class for BitPerfectThread
// If you add any values here, also update ThreadBase::threadTypeToString()
};
@@ -430,8 +431,10 @@
// track
FAST_SESSION = 0x4, // the audio session corresponds to at least one
// fast track
- SPATIALIZED_SESSION = 0x8 // the audio session corresponds to at least one
- // spatialized track
+ SPATIALIZED_SESSION = 0x8, // the audio session corresponds to at least one
+ // spatialized track
+ BIT_PERFECT_SESSION = 0x10 // the audio session corresponds to at least one
+ // bit-perfect track
};
// get effect chain corresponding to session Id.
@@ -497,6 +500,9 @@
if (track->isSpatialized()) {
result |= SPATIALIZED_SESSION; // caution, only first track.
}
+ if (track->isBitPerfect()) {
+ result |= BIT_PERFECT_SESSION;
+ }
break;
}
}
@@ -982,7 +988,8 @@
status_t *status /*non-NULL*/,
audio_port_handle_t portId,
const sp<media::IAudioTrackCallback>& callback,
- bool isSpatialized);
+ bool isSpatialized,
+ bool isBitPerfect);
AudioStreamOut* getOutput() const;
AudioStreamOut* clearOutput();
@@ -1163,6 +1170,9 @@
// for any processing (including output processing).
bool mEffectBufferValid;
+ // Set to "true" to enable when data has already copied to sink
+ bool mHasDataCopiedToSinkBuffer = false;
+
// Frame size aligned buffer used as input and output to all post processing effects
// except the Spatializer in a SPATIALIZER thread. Non spatialized tracks are mixed into
// this buffer so that post processing effects can be applied.
@@ -2273,3 +2283,16 @@
AudioStreamIn* mInput;
};
+
+class BitPerfectThread : public MixerThread {
+public:
+ BitPerfectThread(const sp<AudioFlinger>& audioflinger, AudioStreamOut *output,
+ audio_io_handle_t id, bool systemReady);
+
+protected:
+ mixer_state prepareTracks_l(Vector<sp<Track>> *tracksToRemove) override;
+ void threadLoop_mix() override;
+
+private:
+ bool mIsBitPerfect;
+};