Revert "Audio V4: Send volume and duplicated track attr in update metadata"
This reverts commit c86a7f7de52f0ff0059e8c6c4fa4619aa7fae5c5.
Reason for revert: fast track volume broken
Test: none, it is a revert
Bug: 77892019
Change-Id: If00616afae5c069cf0b6bd7c2da2a6d4af72180e
diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h
index 3302868..0e2da4e 100644
--- a/services/audioflinger/AudioFlinger.h
+++ b/services/audioflinger/AudioFlinger.h
@@ -19,11 +19,8 @@
#define ANDROID_AUDIO_FLINGER_H
#include "Configuration.h"
-#include <atomic>
-#include <mutex>
#include <deque>
#include <map>
-#include <vector>
#include <stdint.h>
#include <sys/types.h>
#include <limits.h>
diff --git a/services/audioflinger/PlaybackTracks.h b/services/audioflinger/PlaybackTracks.h
index a78be99..ea01a25 100644
--- a/services/audioflinger/PlaybackTracks.h
+++ b/services/audioflinger/PlaybackTracks.h
@@ -93,23 +93,6 @@
const sp<media::VolumeShaper::Operation>& operation);
sp<media::VolumeShaper::State> getVolumeShaperState(int id);
sp<media::VolumeHandler> getVolumeHandler() { return mVolumeHandler; }
- /** Set the computed normalized final volume of the track.
- * !masterMute * masterVolume * streamVolume * averageLRVolume */
- void setFinalVolume(float volume);
- float getFinalVolume() const { return mFinalVolume; }
-
- /** @return true if the track has changed (metadata or volume) since
- * the last time this function was called,
- * true if this function was never called since the track creation,
- * false otherwise.
- * Thread safe.
- */
- bool readAndClearHasChanged() { return !mChangeNotified.test_and_set(); }
-
- using SourceMetadatas = std::vector<playback_track_metadata_t>;
- using MetadataInserter = std::back_insert_iterator<SourceMetadatas>;
- /** Copy the track metadata in the provided iterator. Thread safe. */
- virtual void copyMetadataTo(MetadataInserter& backInserter) const;
protected:
// for numerous
@@ -150,8 +133,6 @@
bool presentationComplete(int64_t framesWritten, size_t audioHalFrames);
void signalClientFlag(int32_t flag);
- /** Set that a metadata has changed and needs to be notified to backend. Thread safe. */
- void setMetadataHasChanged() { mChangeNotified.clear(); }
public:
void triggerEvents(AudioSystem::sync_event_t type);
virtual void invalidate();
@@ -201,13 +182,10 @@
volatile float mCachedVolume; // combined master volume and stream type volume;
// 'volatile' means accessed without lock or
// barrier, but is read/written atomically
- float mFinalVolume; // combine master volume, stream type volume and track volume
sp<AudioTrackServerProxy> mAudioTrackServerProxy;
bool mResumeToStopping; // track was paused in stopping state.
bool mFlushHwPending; // track requests for thread flush
audio_output_flags_t mFlags;
- // If the last track change was notified to the client with readAndClearHasChanged
- std::atomic_flag mChangeNotified = ATOMIC_FLAG_INIT;
}; // end of Track
@@ -238,11 +216,8 @@
bool isActive() const { return mActive; }
const wp<ThreadBase>& thread() const { return mThread; }
- void copyMetadataTo(MetadataInserter& backInserter) const override;
- /** Set the metadatas of the upstream tracks. Thread safe. */
- void setMetadatas(const SourceMetadatas& metadatas);
-
private:
+
status_t obtainBuffer(AudioBufferProvider::Buffer* buffer,
uint32_t waitTimeMs);
void clearBufferQueue();
@@ -257,20 +232,6 @@
bool mActive;
DuplicatingThread* const mSourceThread; // for waitTimeMs() in write()
sp<AudioTrackClientProxy> mClientProxy;
- /** Attributes of the source tracks.
- *
- * This member must be accessed with mTrackMetadatasMutex taken.
- * There is one writer (duplicating thread) and one reader (downstream mixer).
- *
- * That means that the duplicating thread can block the downstream mixer
- * thread and vice versa for the time of the copy.
- * If this becomes an issue, the metadata could be stored in an atomic raw pointer,
- * and a exchange with nullptr and delete can be used.
- * Alternatively a read-copy-update might be implemented.
- */
- SourceMetadatas mTrackMetadatas;
- /** Protects mTrackMetadatas against concurrent access. */
- mutable std::mutex mTrackMetadatasMutex;
}; // end of OutputTrack
// playback track, used by PatchPanel
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index 43a8b50..160aa45 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -2623,32 +2623,26 @@
void AudioFlinger::PlaybackThread::updateMetadata_l()
{
- if (mOutput == nullptr || mOutput->stream == nullptr ) {
- return; // That should not happen
- }
- bool hasChanged = mActiveTracks.readAndClearHasChanged();
- for (const sp<Track> &track : mActiveTracks) {
- // Do not short-circuit as all hasChanged states must be reset
- // as all the metadata are going to be sent
- hasChanged |= track->readAndClearHasChanged();
- }
- if (!hasChanged) {
- return; // nothing to do
+ // TODO: add volume support
+ if (mOutput == nullptr || mOutput->stream == nullptr ||
+ !mActiveTracks.readAndClearHasChanged()) {
+ return;
}
StreamOutHalInterface::SourceMetadata metadata;
- auto backInserter = std::back_inserter(metadata.tracks);
for (const sp<Track> &track : mActiveTracks) {
// No track is invalid as this is called after prepareTrack_l in the same critical section
- track->copyMetadataTo(backInserter);
+ if (track->isOutputTrack()) {
+ // TODO: OutputTrack (used for duplication) are currently not supported
+ continue;
+ }
+ metadata.tracks.push_back({
+ .usage = track->attributes().usage,
+ .content_type = track->attributes().content_type,
+ .gain = 1,
+ });
}
- sendMetadataToBackend_l(metadata);
-}
-
-void AudioFlinger::PlaybackThread::sendMetadataToBackend_l(
- const StreamOutHalInterface::SourceMetadata& metadata)
-{
mOutput->stream->updateSourceMetadata(metadata);
-};
+}
status_t AudioFlinger::PlaybackThread::getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames)
{
@@ -4387,19 +4381,13 @@
didModify = true;
// no acknowledgement required for newly active tracks
}
- sp<AudioTrackServerProxy> proxy = track->mAudioTrackServerProxy;
// cache the combined master volume and stream type volume for fast mixer; this
// lacks any synchronization or barrier so VolumeProvider may read a stale value
const float vh = track->getVolumeHandler()->getVolume(
- proxy->framesReleased()).first;
- float volume = masterVolume
+ track->mAudioTrackServerProxy->framesReleased()).first;
+ track->mCachedVolume = masterVolume
* mStreamTypes[track->streamType()].volume
* vh;
- track->mCachedVolume = masterVolume;
- gain_minifloat_packed_t vlr = proxy->getVolumeLR();
- float vlf = volume * float_from_gain(gain_minifloat_unpack_left(vlr));
- float vrf = volume * float_from_gain(gain_minifloat_unpack_right(vlr));
- track->setFinalVolume((vlf + vrf) / 2.f);
++fastTracks;
} else {
// was it previously active?
@@ -4576,8 +4564,6 @@
vaf = v * sendLevel * (1. / MAX_GAIN_INT);
}
- track->setFinalVolume((vrf + vlf) / 2.f);
-
// Delegate volume control to effect in track effect chain if needed
if (chain != 0 && chain->setVolume_l(&vl, &vr)) {
// Do not ramp volume if volume is controlled by effect
@@ -5110,7 +5096,6 @@
}
if (lastTrack) {
- track->setFinalVolume((left + right) / 2.f);
if (left != mLeftVolFloat || right != mRightVolFloat) {
mLeftVolFloat = left;
mRightVolFloat = right;
@@ -6168,12 +6153,14 @@
return true;
}
-void AudioFlinger::DuplicatingThread::sendMetadataToBackend_l(
- const StreamOutHalInterface::SourceMetadata& metadata)
+void AudioFlinger::DuplicatingThread::updateMetadata_l()
{
- for (auto& outputTrack : outputTracks) { // not mOutputTracks
- outputTrack->setMetadatas(metadata.tracks);
- }
+ // TODO: The duplicated track metadata needs to be pushed to downstream
+ // but this information can be read at any time by the downstream threads.
+ // Taking the lock of any downstream threads is no possible due to cross deadlock risks
+ // (eg: during effect move).
+ // A lock-free structure needs to be used to shared the metadata, probably an atomic
+ // pointer to a metadata vector in each output tracks.
}
uint32_t AudioFlinger::DuplicatingThread::activeSleepTimeUs() const
diff --git a/services/audioflinger/Threads.h b/services/audioflinger/Threads.h
index 5a5961a..bb81224 100644
--- a/services/audioflinger/Threads.h
+++ b/services/audioflinger/Threads.h
@@ -566,8 +566,8 @@
// periodically called in the threadLoop() to update power state uids.
void updatePowerState(sp<ThreadBase> thread, bool force = false);
- /** @return true if one or move active tracks was added or removed since the
- * last time this function was called or the vector was created. */
+ /** @return true if the active tracks have changed since the last time
+ * this function was called or the vector was created. */
bool readAndClearHasChanged();
private:
@@ -588,7 +588,7 @@
int mLastActiveTracksGeneration;
wp<T> mLatestActiveTrack; // latest track added to ActiveTracks
SimpleLog * const mLocalLog;
- // If the vector has changed since last call to readAndClearHasChanged
+ // If the active tracks have changed since last call to readAndClearHasChanged
bool mHasChanged = false;
};
@@ -927,8 +927,7 @@
void removeTrack_l(const sp<Track>& track);
void readOutputParameters_l();
- void updateMetadata_l() final;
- virtual void sendMetadataToBackend_l(const StreamOutHalInterface::SourceMetadata& metadata);
+ void updateMetadata_l() override;
virtual void dumpInternals(int fd, const Vector<String16>& args);
void dumpTracks(int fd, const Vector<String16>& args);
@@ -1288,8 +1287,7 @@
void removeOutputTrack(MixerThread* thread);
uint32_t waitTimeMs() const { return mWaitTimeMs; }
- void sendMetadataToBackend_l(
- const StreamOutHalInterface::SourceMetadata& metadata) override;
+ void updateMetadata_l() override;
protected:
virtual uint32_t activeSleepTimeUs() const;
diff --git a/services/audioflinger/Tracks.cpp b/services/audioflinger/Tracks.cpp
index ee9ce84..236412b 100644
--- a/services/audioflinger/Tracks.cpp
+++ b/services/audioflinger/Tracks.cpp
@@ -407,9 +407,6 @@
// mSinkTimestamp
mFastIndex(-1),
mCachedVolume(1.0),
- /* The track might not play immediately after being active, similarly as if its volume was 0.
- * When the track starts playing, its volume will be computed. */
- mFinalVolume(0.f),
mResumeToStopping(false),
mFlushHwPending(false),
mFlags(flags)
@@ -1000,23 +997,6 @@
return mVolumeHandler->getVolumeShaperState(id);
}
-void AudioFlinger::PlaybackThread::Track::setFinalVolume(float volume)
-{
- if (mFinalVolume != volume) { // Compare to an epsilon if too many meaningless updates
- mFinalVolume = volume;
- setMetadataHasChanged();
- }
-}
-
-void AudioFlinger::PlaybackThread::Track::copyMetadataTo(MetadataInserter& backInserter) const
-{
- *backInserter++ = {
- .usage = mAttr.usage,
- .content_type = mAttr.content_type,
- .gain = mFinalVolume,
- };
-}
-
status_t AudioFlinger::PlaybackThread::Track::getTimestamp(AudioTimestamp& timestamp)
{
if (!isOffloaded() && !isDirect()) {
@@ -1447,21 +1427,6 @@
return outputBufferFull;
}
-void AudioFlinger::PlaybackThread::OutputTrack::copyMetadataTo(MetadataInserter& backInserter) const
-{
- std::lock_guard<std::mutex> lock(mTrackMetadatasMutex);
- backInserter = std::copy(mTrackMetadatas.begin(), mTrackMetadatas.end(), backInserter);
-}
-
-void AudioFlinger::PlaybackThread::OutputTrack::setMetadatas(const SourceMetadatas& metadatas) {
- {
- std::lock_guard<std::mutex> lock(mTrackMetadatasMutex);
- mTrackMetadatas = metadatas;
- }
- // No need to adjust metadata track volumes as OutputTrack volumes are always 0dBFS.
- setMetadataHasChanged();
-}
-
status_t AudioFlinger::PlaybackThread::OutputTrack::obtainBuffer(
AudioBufferProvider::Buffer* buffer, uint32_t waitTimeMs)
{