Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cbc302a8 authored by Eric Laurent's avatar Eric Laurent
Browse files

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
Squashed commit of:
  a82281f6
  1a668976

Change-Id: Ib973e22a5f1bd43facca1ed8c282fe444a739249
Merged-In: Ie367b9dda6f9e4f3079f5afe2ac92fc98cf8bced
parent bae844a1
Loading
Loading
Loading
Loading
+21 −24
Original line number Diff line number Diff line
@@ -1284,32 +1284,25 @@ public class SoundTriggerService extends SystemService {
         * @return The initialized AudioRecord
         */
        private @NonNull AudioRecord createAudioRecordForEvent(
                @NonNull SoundTrigger.GenericRecognitionEvent event) {
                @NonNull SoundTrigger.GenericRecognitionEvent event)
                throws IllegalArgumentException, UnsupportedOperationException {
            AudioAttributes.Builder attributesBuilder = new AudioAttributes.Builder();
            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())

            sEventLogger.log(new SoundTriggerLogger.StringEvent("createAudioRecordForEvent"));

            return (new AudioRecord.Builder())
                        .setAudioAttributes(attributes)
                        .setAudioFormat((new AudioFormat.Builder())
                            .setChannelMask(originalFormat.getChannelMask())
                            .setEncoding(originalFormat.getEncoding())
                            .setSampleRate(originalFormat.getSampleRate())
                            .build())
                        .setSessionId(event.getCaptureSession())
                        .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());
        }

        @Override
@@ -1335,12 +1328,16 @@ public class SoundTriggerService extends SystemService {
                    // execute if throttled:
                    () -> {
                        if (event.isCaptureAvailable()) {
                            AudioRecord capturedData = createAudioRecordForEvent(event);

                            try {
                                // Currently we need to start and release the audio record to reset
                            // the DSP even if we don't want to process the event
                                // the DSP even if we don't want to process the eve
                                AudioRecord capturedData = createAudioRecordForEvent(event);
                                capturedData.startRecording();
                                capturedData.release();
                            } catch (IllegalArgumentException | UnsupportedOperationException e) {
                                Slog.w(TAG, mPuuid + ": createAudioRecordForEvent(" + event
                                        + "), failed to create AudioRecord");
                            }
                        }
                    }));
        }