Создание определенного прямоугольного сигнала в разъеме для наушников Android

#android #signals #wave #audiotrack

#Android #сигналы #волна #аудиотрек

Вопрос:

Я впервые нахожусь на этом сайте. Я пробовал этот проект, но попытки использовать различные методы и смешивать разные методы для этого не помогли, и та или иная ошибка просто продолжает приводить к сбою приложения.

Мои требования к коду специфичны, мне нужно передать два массива из 0 и 1, чтобы создать прямоугольный сигнал на левом и правом каналах разъема для наушников с одинаковой частотой, и я хочу, чтобы массив воспроизводился только один раз, и чтобы он воспроизводился на разъеме для наушников (отдельный массив для левого и правого), даже если устройство (телефон Android) не обнаруживает подключенные наушники. Загруженный массив и выбор частоты должны быть изменены с помощью функции.

Я знаю, что прошу здесь многого, но я пытаюсь уже более месяца, и я просто заблокирован. Я бы выполнил эту работу, даже если бы получил конкретные рекомендации для каждой из вышеперечисленных функций.

Спасибо.

Ответ №1:

Я бы рекомендовал вам использовать AudioTrack для воспроизведения звука в PCM 16bit и в стерео (проверьте также спецификацию WAV), сигнал находится в диапазоне от -1 до 1. Вам также понадобится поток, который будет зацикливать и воспроизводить ваши массивы.

А для частоты f у вас есть тривиальная формула f = 1 / T где T — период, учитывающий частоту дискретизации.

 void setFreq(float f)
{
  x = 1.0f/(samplerate/f)
}
  

Приведенный ниже код будет непрерывно запускаться внутри цикла для генерации прямоугольного сигнала на определенной частоте, который будет обрабатываться AudioTrack через буфер массива (byte[] или short []):

 output = phase  < 0.5f ? 1.0f : -1.0f;
phase = phase   x;
if (phase > 1.0f)
   phase = 0.0f;