Android打开我的Audio HAL的输入流,然后立即将其关闭。
请帮助我找出丢失的内容。

背景

这是继续在previous question here中讨论的Nexus 7平板电脑上工作的延续
我能够将vloop音频hal成功地加载到Nexus 7中并对其进行读写。

有关当前问题的信息:

在启动时,或在连接内置麦克风(通过调用setDeviceConnectionState)时,我观察到输入流已打开,读取了一些参数,然后迅速关闭了输入流。

此后,Google / Youtube无法从我的HAL中读取音频。

以下是我的跟踪日志:

11-07 14:05:10.321 277-1263/? E/ATVAudioPolicyManager: setDeviceConnectionState 80000004 1 0
11-07 14:05:10.321 277-1263/? D/audio_vloop: adev_open_input_stream(): 1546
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_sample_rate(): 1008
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_sample_rate(): samprate: 48000
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_channels(): 1047
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_channels: 0x0000000C
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_format(): 1059
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_format: 0x00000001
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_format(): 1059
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_format: 0x00000001
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_channels(): 1047
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_channels: 0x0000000C
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_buffer_size(): 1035
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_buffer_size: 4800
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_buffer_size(): 1035
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_buffer_size: 4800
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_format(): 1059
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_format: 0x00000001
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_sample_rate(): 1008
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_sample_rate(): samprate: 48000
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_channels(): 1047
11-07 14:05:10.322 277-1263/? D/audio_vloop: in_get_channels: 0x0000000C
11-07 14:05:10.323 277-2820/? I/AudioFlinger: AudioFlinger's thread 0xf314f008 ready to run
11-07 14:05:10.323 277-2820/? D/audio_vloop: in_standby(): 1089
11-07 14:05:10.323 277-2819/? D/audio_vloop: looper_in_thread(): 218: Entered
11-07 14:05:10.324 277-2820/? D/audio_vloop: in_standby(): 1089
11-07 14:05:10.325 277-2820/? D/audio_vloop: in_set_parameters(): 1150: [0]
11-07 14:05:10.325 277-369/? D/audio_vloop: adev_set_parameters(): [0=;connect=-2147483644]
11-07 14:05:10.327 277-1263/? D/audio_vloop: adev_close_input_stream(): 1638
11-07 14:05:10.327 2781-2781/? D/AudioPlayer: ConnectLineIn(): 0

这些只是跟踪日志,它们告诉被称为什么,在某些情况下还告诉我什么。
我将所有这些功能的成功归还给Android。

在audio_policy.conf中,我添加了以下内容:
global_configuration {
  attached_output_devices AUDIO_DEVICE_OUT_SPEAKER
  default_output_device AUDIO_DEVICE_OUT_SPEAKER
  attached_input_devices AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_REMOTE_SUBMIX
}


  vloop {
    inputs {
      vloop {
        sampling_rates 48000
        channel_masks AUDIO_CHANNEL_IN_STEREO
        formats AUDIO_FORMAT_PCM_16_BIT
        devices AUDIO_DEVICE_IN_BUILTIN_MIC
      }
    }
    outputs {
      vloop {
        sampling_rates 48000
        channel_masks AUDIO_CHANNEL_OUT_STEREO
        formats AUDIO_FORMAT_PCM_16_BIT
        devices AUDIO_DEVICE_OUT_LINE
      }
    }
  }

最佳答案

我意识到这是我的代码/ conf之外的问题,所以主要的怀疑者是音频策略管理器(APM)。

我仔细阅读了APM代码,发现那里没有异常问题。.然后我意识到我实际上对fugu文件夹中USE_CUSTOM_AUDIO_POLICY中的device.mk标志感到困惑。该标志禁用默认APM并启用Qualcomm APM。 (搜索来源)

花了一些时间认识到fugu的APM不是高通APM,但它位于/device/asus/fugu/libaudio/

此处修改了ATVAudioPolicyManager.cpp以解决此问题。

修改如下:

在功能上
audio_devices_t ATVAudioPolicyManager::getDeviceForInputSource(audio_source_t inputSource)
在条件中添加以下内容:

else if (availableDeviceTypes & AUDIO_DEVICE_IN_BUILTIN_MIC) {
          ALOGV("Use Builtin mic input");
          device = AUDIO_DEVICE_IN_BUILTIN_MIC;
}

关于android - 新的音频HAL无法与Nexus播放器一起使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40460990/

10-10 04:36