Воспроизведение PCM аудио

Аудио модуль 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 бекэнде.