diff options
author | jiabin <jiabin@google.com> | 2018-12-18 15:45:57 -0800 |
---|---|---|
committer | Eric Laurent <elaurent@google.com> | 2019-01-30 17:07:10 -0800 |
commit | 57303cc4312686e02e754ba99a81f0cf71144757 (patch) | |
tree | 5118a0c03e035d13c203118e1336e33803b1de08 /services/audioflinger/Tracks.cpp | |
parent | 77270b880570e07a5d80b23371f53638ec30fb5c (diff) | |
download | frameworks_av-57303cc4312686e02e754ba99a81f0cf71144757.tar.gz frameworks_av-57303cc4312686e02e754ba99a81f0cf71144757.tar.bz2 frameworks_av-57303cc4312686e02e754ba99a81f0cf71144757.zip |
Interface between audio server and vibrator service
The haptic playback should be controlled by vibrator service. Via the
interface, audio server could notify vibrator service about starting or
stopping haptic playback and get vibrator intensity from vibrator
service. Vibrator service could call mute/unmute to control the haptic
playback.
Test: Manually
Change-Id: Iad24813977e4dea0d67a91f8f8b390a016ce4ca2
Diffstat (limited to 'services/audioflinger/Tracks.cpp')
-rw-r--r-- | services/audioflinger/Tracks.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/services/audioflinger/Tracks.cpp b/services/audioflinger/Tracks.cpp index d23d19d813..22d34b26d4 100644 --- a/services/audioflinger/Tracks.cpp +++ b/services/audioflinger/Tracks.cpp @@ -451,6 +451,12 @@ AudioFlinger::PlaybackThread::Track::Track( mTee.setId(std::string("_") + std::to_string(mThreadIoHandle) + "_" + std::to_string(mId)); #endif + + if (channelMask & AUDIO_CHANNEL_HAPTIC_ALL) { + mAudioVibrationController = new AudioVibrationController(this); + mExternalVibration = new os::ExternalVibration( + mUid, "" /* pkg */, mAttr, mAudioVibrationController); + } } AudioFlinger::PlaybackThread::Track::~Track() @@ -1336,6 +1342,40 @@ void AudioFlinger::PlaybackThread::Track::updateTrackFrameInfo( mServerLatencyMs.store(latencyMs); } +binder::Status AudioFlinger::PlaybackThread::Track::AudioVibrationController::mute( + /*out*/ bool *ret) { + *ret = false; + sp<ThreadBase> thread = mTrack->mThread.promote(); + if (thread != 0) { + // Lock for updating mHapticPlaybackEnabled. + Mutex::Autolock _l(thread->mLock); + PlaybackThread *playbackThread = (PlaybackThread *)thread.get(); + if ((mTrack->channelMask() & AUDIO_CHANNEL_HAPTIC_ALL) != AUDIO_CHANNEL_NONE + && playbackThread->mHapticChannelCount > 0) { + mTrack->setHapticPlaybackEnabled(false); + *ret = true; + } + } + return binder::Status::ok(); +} + +binder::Status AudioFlinger::PlaybackThread::Track::AudioVibrationController::unmute( + /*out*/ bool *ret) { + *ret = false; + sp<ThreadBase> thread = mTrack->mThread.promote(); + if (thread != 0) { + // Lock for updating mHapticPlaybackEnabled. + Mutex::Autolock _l(thread->mLock); + PlaybackThread *playbackThread = (PlaybackThread *)thread.get(); + if ((mTrack->channelMask() & AUDIO_CHANNEL_HAPTIC_ALL) != AUDIO_CHANNEL_NONE + && playbackThread->mHapticChannelCount > 0) { + mTrack->setHapticPlaybackEnabled(true); + *ret = true; + } + } + return binder::Status::ok(); +} + // ---------------------------------------------------------------------------- #undef LOG_TAG #define LOG_TAG "AF::OutputTrack" |