Генерация тонов DTMF для воспроизведения на iPhone - PullRequest
0 голосов
/ 22 июля 2010

Я хочу разработать приложение для iPhone, которое генерирует пользовательские тоны DTMF.Я предполагаю, что чистый тон будет воспроизводиться из буфера памяти, а не из загруженного файла, и я думаю, что я должен использовать класс AVAudioPlayer и метод "initWithData: error:", но как мне его реализовать?Что бы я ни делал, я не могу заставить его работать!

Я видел этот код на форуме, который необходим для вычисления синусоиды:

const int PLAYBACKFREQ = 44100;
const float PI2 = 3.14159265359f * 2;

void generateDTMF(short *buffer, int length, float freq1, float freq2) {
  int i;
  short *dest = buffer;
  for(i=0; i<length; i++) *(dest++) = (sin(i*(PI2*(PLAYBACKFREQ/freq1))) + sin(i(PI2(PLAYBACKFREQ/freq2)))) * 16383;
}

Но где я должен разместитьэтот код?Как это помогает мне заполнить указанный буфер памяти?

Любая помощь будет признательна!

Sagiftw

Ответы [ 2 ]

1 голос
/ 22 июля 2010

Данные, передаваемые методу экземпляра AVAudioPlayer initWithData: error: должны иметь действительный заголовок аудиофайла. Вы можете использовать заголовок файла WAVE, заголовок файла AIFF или заголовок файла CAF. Поскольку ваш формат данных фиксирован, вы можете просто создать статический заголовок на время создаваемого вами звука.

Альтернатива - перейти на более низкий уровень и использовать AudioQueue для непосредственного воспроизведения аудиобуферов. Это может оказаться проще в зависимости от того, какой контроль вы хотите над воспроизведением или если вы хотите, чтобы воспроизведение происходило бесконечно.

0 голосов
/ 24 сентября 2014

Нет, если это может вам помочь, но я создал один генератор DTMF, который работает с ALSA, вы можете проверить, относится ли он к вам, этот код написан на C, но есть генератор синусоид, который использует Z-преобразование.отметьте здесь

Вы можете проверить лучший способ вычисления тонов синусоид здесь .

...