Аудио модуль libGDX фреймворка может предоставить прямой доступ к аудио аппаратуре для записи PCM семплов.
Звуковое оборудование абстрагировано через AudioDevice (исходный код) интерфейс.
Чтобы создать новый экземпляр AudioDevice
можно сделать следующее:
AudioDevice device = Gdx.audio.newAudioDevice(44100, true);
Метод newAudioDevice()
создает новый экземпляр AudioDevice
, который имеет частоту сэмплов 44.1 кГц и моно выход. Если устройство не может быть создано,
то libGDX фреймворком будет брошено GdxRuntimeException
исключение.
Мы можем писать на устройство либо 16-битные PCM или 32-битные PCM данных:
float[] floatPCM = ... полученные от синуса к примеру ... device.writeSamples(floatPCM, 0, floatPCM.length); short[] shortPCM = ... полученные от декодера ... device.writeSamples(shortPCM, 0, shortPCM.length);
Если используется стерео, то сэмплы левого и правого канала чередуются как обычно (первый float/short -> левый канал, второй float/short -> правый канал).
Для получения латентности, libGDX предоставляет специальный метод. Латентность в миллисекундах может быть получена с помощью вызова getLatency()
метода:
int latencyInSamples = device.getLatency();
Метод getLatency()
вернет размер аудио буфера в сэмплах и таким образом вы получите индикатор латентности. Чем больше возвращаемое значение, тем больше времени
требуется аудио, чтобы прийти к получателю после записи.
Латентность почти на всех Android телефонах высокая.
В режиме реального времени аудио приложениям очень трудно попасть в 10-30 мс рабочий диапазон. Обычно вы можете достичь латентности в 100 мс, многие телефоны будут иметь латентность до 400 мс. К сожалению, эта проблема связана с драйверами и операционной системой и не может быть как-то обойдена.
Удаление AudioDevice ресурса
AudioDevice
является нативным ресурсом и должен быть удален, если больше не используется в libGDX игре или приложении:
device.dispose();
Прямой PCM выход не поддерживается в JavaScript/WebGL бекэнде.