NotificationPlayer: fix error listener, sync in playback thread

The error and completion listeners should be set before
  MediaPlayer.prepare() is called, in case of an error
  during prepare.
Move the sleep to synchronize the playback of the notification
  and the ducking from the MediaPlayer to the playback thread.

Test: play a notification during media playback
Bug: 35855841
Change-Id: I42f01f485f533c1cc84b9d927f0dc594cdb7ec8f
This commit is contained in:
Jean-Michel Trivi
2017-03-16 18:38:50 -07:00
parent 538d5a3d07
commit 5cd7d7f7a4

View File

@@ -91,6 +91,8 @@ public class NotificationPlayer implements OnCompletionListener, OnErrorListener
player.setAudioAttributes(mCmd.attributes);
player.setDataSource(mCmd.context, mCmd.uri);
player.setLooping(mCmd.looping);
player.setOnCompletionListener(NotificationPlayer.this);
player.setOnErrorListener(NotificationPlayer.this);
player.prepare();
if ((mCmd.uri != null) && (mCmd.uri.getEncodedPath() != null)
&& (mCmd.uri.getEncodedPath().length() > 0)) {
@@ -118,12 +120,15 @@ public class NotificationPlayer implements OnCompletionListener, OnErrorListener
// can lead to AudioFocus being released too early, before the second sound is
// done playing. This class should be modified to use a single thread, on which
// command are issued, and on which it receives the completion callbacks.
player.setOnCompletionListener(NotificationPlayer.this);
player.setOnErrorListener(NotificationPlayer.this);
if (DEBUG) { Log.d(mTag, "notification will be delayed by "
+ mNotificationRampTimeMs + "ms"); }
player.setStartDelayMs(mNotificationRampTimeMs);
player.start();
try {
Thread.sleep(mNotificationRampTimeMs);
player.start();
} catch (InterruptedException e) {
Log.e(mTag, "Exception while sleeping to sync notification playback "
+ " with ducking", e);
}
if (mPlayer != null) {
mPlayer.release();
}