#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;