为什么 Java AudioEffect 不能与双簧管一起使用?

问题描述

Android 版本:10 Android 设备:OnePlus 6

我尝试使用来自 AudioManager 的 sessionID 来应用 Java AudioEffect 并从这个 LINK 获得帮助,但在使用 AcousticEchoCanceler.create(sessionId) 时我总是得到空指针异常;但是当我传递 Java AudioRecord getAudioSessionId() 的 sessionId 时,它可以工作。

我的代码是:

 val audioManager: AudioManager = context.getSystemService(Context.AUdio_SERVICE) as AudioManager
 val sessionId = audioManager.generateAudioSessionId()

C 代码

 recordingBuilder.setSessionId(static_cast<oboe::SessionId>(sessionId));
  oboe::Result recordStreamResult = recordingBuilder.openStream(&recordStream);

我已经在 OnePlus 6 和 Motorola one Macro 上试过这个代码

解决方法

我已经解决了以下问题:为什么我的 AcousticEchoCanceler.create(sessionId) 返回 null,即使它可用。

这是代码

  val audioManager: AudioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
  val sessionId = audioManager.generateAudioSessionId()
  //This is the line that enables AEC,when MODE is set
  audioManager.mode = AudioManager.MODE_IN_COMMUNICATION 

当模式明确设置为 MODE_IN_COMMUNICATION 时,AcousticEchoCancelation 开始工作。您可以在此处启用或禁用它。

val isAecAvailable = AcousticEchoCanceler.isAvailable()
val acousticEchoCanceler = AcousticEchoCanceler.create(sessionId)
acousticEchoCanceler.enabled = true //THIS ENABLED THE AEC

if (acousticEchoCanceler != null)
    Log.e(TAG,"AEC STATUS:  ${acousticEchoCanceler.enabled}")
else
Log.e(TAG,"AEC  IS NULL")

目前,我使用的是双簧管版本:1.5 稳定版