VIS : SoundTriggerService: fix fake AudioRecord creation

Make sure exceptions that can occur when creating the fake AudioRecord
instance in SoundTriggerService.createAudioRecordForEvent() are caught.

Bug: 161375011
Test: Manual sound trigger regression with OK Google and Now Playing
Change-Id: Ie367b9dda6f9e4f3079f5afe2ac92fc98cf8bced
This commit is contained in:
Eric Laurent
2020-07-16 10:08:25 -07:00
parent 5e75662fe4
commit a82281f6e7

View File

@@ -1289,27 +1289,25 @@ public class SoundTriggerService extends SystemService {
attributesBuilder.setInternalCapturePreset(MediaRecorder.AudioSource.HOTWORD);
AudioAttributes attributes = attributesBuilder.build();
// Use same AudioFormat processing as in RecognitionEvent.fromParcel
AudioFormat originalFormat = event.getCaptureFormat();
AudioFormat captureFormat = (new AudioFormat.Builder())
.setChannelMask(originalFormat.getChannelMask())
.setEncoding(originalFormat.getEncoding())
.setSampleRate(originalFormat.getSampleRate())
.build();
int bufferSize = AudioRecord.getMinBufferSize(
captureFormat.getSampleRate() == AudioFormat.SAMPLE_RATE_UNSPECIFIED
? AudioFormat.SAMPLE_RATE_HZ_MAX
: captureFormat.getSampleRate(),
captureFormat.getChannelCount() == 2
? AudioFormat.CHANNEL_IN_STEREO
: AudioFormat.CHANNEL_IN_MONO,
captureFormat.getEncoding());
sEventLogger.log(new SoundTriggerLogger.StringEvent("createAudioRecordForEvent"));
return new AudioRecord(attributes, captureFormat, bufferSize,
event.getCaptureSession());
try {
return (new AudioRecord.Builder())
.setAudioAttributes(attributes)
.setAudioFormat((new AudioFormat.Builder())
.setChannelMask(originalFormat.getChannelMask())
.setEncoding(originalFormat.getEncoding())
.setSampleRate(originalFormat.getSampleRate())
.build())
.setSessionId(event.getCaptureSession())
.build();
} catch (IllegalArgumentException | UnsupportedOperationException e) {
Slog.w(TAG, mPuuid + ": createAudioRecordForEvent(" + event
+ "), failed to create AudioRecord");
return null;
}
}
@Override
@@ -1339,8 +1337,10 @@ public class SoundTriggerService extends SystemService {
// Currently we need to start and release the audio record to reset
// the DSP even if we don't want to process the event
capturedData.startRecording();
capturedData.release();
if (capturedData != null) {
capturedData.startRecording();
capturedData.release();
}
}
}));
}