Commit Graph

9 Commits

Author SHA1 Message Date
Jean-Michel Trivi
76e124bcd3 PlayerBase: fix deadlock
Source of deadlock between PlayerBase.mLock and
  PlaybackActivityMonitor.mPlayerLock:

android.media.MediaPlayer.release()
> android.media.PlayerBase.baseRelease()
  > synchronized (mLock)
    > com.android.server.audio.PlaybackActivityMonitor.releasePlayer()
       > synchronized(mPlayerLock)
and:

com.android.server.audio.PlaybackActivityMonitor.unmutePlayersForCall()
> synchronized (mPlayerLock)
  > android.media.PlayerProxy.setVolume()
    > android.media.PlayerBase$IPlayerWrapper.setVolume()
      > android.media.PlayerBase.baseSetVolume()
        > synchronized (mLock)
          playerSetVolume()

Since system_server can have its own players, the calls to
 AudioService from PlayerBase can be synchronous, hence the
 deadlock.
The fix consists in never holding the lock in PlayerBase
 while calling into AudioService.
Refactor the playstate update into a method used for
 start / stop / pause.

Bug: 72294559
Test: see bug

Change-Id: I6451aa3bf19a0365472ba007b116a9e6151ab33e
2018-04-11 17:22:59 -07:00
Jean-Michel Trivi
776a399314 AudioPlaybackConfiguration: prevent race condition on mIPlayerShell
Synchronize changes to mIPlayerShell after release of corresponding
  player.
Flush binder commands when a player is released, in AudioService
  and in the clients that have an AudioPlaybackCallback implementation.
  Do the same in MediaSessionService, which directly implements
  the IPlaybackConfigDispatcher interface, without going through
  the AudioPlaybackCallback registration and notification
  mechanisms.

Test: adb shell /system/bin/write_sine_callback -m2 -pl
Bug: 65450109
Change-Id: I2f0697e0e164283284ce30d2cc736c4f8df270c4
2017-09-14 10:00:28 -07:00
Jean-Michel Trivi
0b7649a26b Playback activity monitoring: add player types
Add player types for playback activity monitoring:
 - AAudio
 - hardware sources
 - proxy for external players
Fix some declarations that do not follow coding guidelines

Test: n/a
Bug: 62027849
Change-Id: I14088a071a296fa8d342b36b550f1dc4e3388653
2017-05-25 19:53:35 -07:00
Jean-Michel Trivi
0f49f82e97 VideoView: option for audio focus, support for AudioAttributes
Add API for VideoView to select whether it uses audio focus during
  playback, and how.
Add support for AudioAttributes

Test: cts-tradefed run cts -m CtsWidgetTestCases -t android.widget.cts.VideoViewTest
Bug 30955183
Bug 30258418

Change-Id: I581d32c79c78b8197ded2319e0d5bfdc35b93c5e
2017-02-22 12:04:24 -08:00
Jean-Michel Trivi
70efb52691 System API for a proxy for registered players
PlayerProxy is a wrapper on IPlayer for system components
  to control players.

Test: use vendor/google_toolbox/team/audio/cmds/ClPlaybackActivity
Bug 30258418

Change-Id: I6a40290c7f711fc0242597a5c016fc71cb4baa10
2017-01-17 15:42:42 -08:00
Jean-Michel Trivi
9dc22c227c AudioPlaybackConfiguration has a player control interface
An AudioPlaybackConfiguration contains an IPlayer
  interface for system control of a player. It is not
  exposed to non-system signature components.
AudioService, through PlaybackActivityMonitor, is monitoring
  the death of the IPlayer so the matching player can get
  unregistered  in case it meets its maker.

Test: use vendor/google_toolbox/team/audio/cmds/ClPlaybackActivity
Bug: 30258418

Change-Id: Ibf3bceba91882ff16bffbf1219c55a1f89ccb13f
2017-01-13 23:49:29 +00:00
Jean-Michel Trivi
44a8f53f94 Player activity notification: move some intialization server-side
Make beginning of player tracking synchronous, init uid/pid/piid
  on the server side, and return the piid.
Anonymize configurations in the getter of active configurations
  when the client isn't privileged.

Test: run cts -m CtsMediaTestCases -t android.media.cts.AudioPlaybackConfigurationTest
Bug: 30955183

Change-Id: I1610ae0067fd26d297057663352e679c8963a2d7
2017-01-03 14:45:26 -08:00
Jean-Michel Trivi
807313917f New player type values for Open SL ES
Define new player types to describe the two types of AudioPlayer
  in OpenSL ES: those with a buffer queue source, those that
  play from a given URI or FD.
Add a warning in the interface description of AudioService
  that changes should be reflected in the native interface too.

Test: make, NDK tests to follow
Bug: 30955183
Change-Id: I7b530ea6e3b13f238f662ce8b9612e7df574a9c5
2016-12-26 16:03:22 -08:00
Jean-Michel Trivi
292a6a4e99 Notification of playback activity
AudioService keeps track of status of implementations of PlayerBase.
AudioService's PlaybackActivityMonitor maintains a list of
  playback configurations for each PlayerBase, and a list
  of clients that want to receive updates about the playback.
Playback activity clients can query the playback configuration
  of the system through AudioManager, or register a callback
  for updates. For clients with MODIFY_AUDIO_ROUTING permission
  (system), the playback configurations contain more information
  about each player (player type, uid, pid, state), and can see
  all players, not just the "active" ones. The act of stripping
  off data about the players that is not supposed to be seen
  by non-system clients, is referred to as "anonymization". It
  is implemented in system server, so no system data is ever
  sent to playback activity clients without system permission.
More information about the AudioPlaybackConfiguration is
  available in the SystemApi (uid, pid, player type, player state).

Test: run cts -m CtsMediaTestCases -t android.media.cts.AudioPlaybackConfigurationTest
Bug: 30955183

Change-Id: I85997594c0378216419f5f0fdaa0714996fd3573
2016-12-21 13:58:08 -08:00