Registrazione audio

I profili audio Bluetooth basati su Bluetooth Low Energy (BLE) Audio consentono lo streaming bidirezionale di audio di alta qualità (ad esempio, audio stereo con una frequenza di campionamento di 32 kHz). Ciò è possibile grazie alla creazione del canale LE Isochronous (ISO). L'ISO è simile al link SCO (Synchronous Connection-Oriented) in quanto utilizza anch'esso una larghezza di banda wireless riservata, ma la prenotazione della larghezza di banda non è più limitata a 64 Kbps e può essere regolata dinamicamente.

L'input audio Bluetooth può utilizzare l'API AudioManager più recente per quasi tutti i casi d'uso, escluse le chiamate telefoniche. Questa guida spiega come registrare audio stereo da ascoltatori BLE Audio.

Configura la tua applicazione

Innanzitutto, configura l'applicazione in modo che abbia come target l'SDK corretto in build.gradle:

targetSdkVersion 31

Registra callback audio

Crea un elemento AudioDeviceCallback che informi l'applicazione di eventuali modifiche a AudioDevices connesso o disconnessa.

final AudioDeviceCallback audioDeviceCallback = new AudioDeviceCallback() {
  @Override
  public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {
    };
  @Override
  public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) {
    // Handle device removal
  };
};

audioManager.registerAudioDeviceCallback(audioDeviceCallback);

Trova dispositivo audio BLE

Ottieni un elenco di tutti i dispositivi audio connessi con input supportato, quindi utilizza getType() per vedere se il dispositivo è un dispositivo audio che utilizza AudioDeviceInfo.TYPE_BLE_HEADSET.

Kotlin

val allDeviceInfo = audioManager.getDevices(GET_DEVICES_INPUTS)
var bleInputDevice: AudioDeviceInfo? = null
  for (device in allDeviceInfo) {
    if (device.type == AudioDeviceInfo.TYPE_BLE_HEADSET) {
      bleInputDevice = device
      break
    }
  }

Java

AudioDeviceInfo[] allDeviceInfo = audioManager.getDevices(GET_DEVICES_INPUTS);
AudioDeviceInfo bleInputDevice = null;
for (AudioDeviceInfo device : allDeviceInfo) {
  if (device.getType() == AudioDeviceInfo.TYPE_BLE_HEADSET) {
    bleInputDevice = device;
    break;
  }
}

Supporto stereo

Per verificare se i microfoni stereo sono supportati sul dispositivo selezionato, controlla se quest'ultimo ha due o più canali. Se il dispositivo ha un solo canale, imposta la maschera del canale su mono.

Kotlin

var channelMask: Int = AudioFormat.CHANNEL_IN_MONO
if (audioDevice.channelCounts.size >= 2) {
  channelMask = AudioFormat.CHANNEL_IN_STEREO
}

Java

if (bleInputDevice.getChannelCounts() >= 2) {
  channelMask = AudioFormat.CHANNEL_IN_STEREO;
};

Configura il registratore audio

I registratori audio possono essere configurati utilizzando lo strumento per la creazione standard di AudioRecord. Utilizza la maschera del canale per selezionare la configurazione stereo o mono.

Kotlin

val recorder = AudioRecord.Builder()
  .setAudioSource(MediaRecorder.AudioSource.MIC)
  .setAudioFormat(AudioFormat.Builder()
    .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
    .setSampleRate(32000)
    .setChannelMask(channelMask)
    .build())
  .setBufferSizeInBytes(2 * minBuffSizeBytes)
  .build()

Java

AudioRecord recorder = new AudioRecord.Builder()
  .setAudioSource(MediaRecorder.AudioSource.MIC)
  .setAudioFormat(new AudioFormat.Builder()
    .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
    .setSampleRate(32000)
    .setChannelMask(channelMask)
    .build())
  .setBufferSizeInBytes(2*minBuffSizeBytes)
  .build();

Imposta dispositivo preferito

L'impostazione di un dispositivo preferito consente a recorder di conoscere il dispositivo audio con cui vuoi registrare.

Kotlin

recorder.preferredDevice = audioDevice

Java

recorder.setPreferredDevice(bleInputDevice);

Ora puoi registrare l'audio come descritto nella guida di MediaRecorder.