生成要由iPhone播放的DTMF音调

时间:2010-07-22 07:04:52

标签: iphone objective-c xcode avaudioplayer

我想为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 个答案:

答案 0 :(得分:1)

传递给AVAudioPlayer实例方法的数据initWithData:error:必须具有有效的音频文件头。您可以使用WAVE文件头,AIFF文件头或CAF文件头。由于您的数据格式是固定的,因此您只需在您生成的音频的持续时间内创建一个静态标头。

另一种方法是降低级别并使用AudioQueue直接播放音频缓冲区。这可能最终会变得更容易,具体取决于您希望在播放时控制多少,或者您希望无限期地播放。

答案 1 :(得分:0)

我不知道它是否可以帮助你,但是我创建了一个与ALSA一起使用的DTMF生成器,你可以检查它是否适用于你,这个代码是在C中,但包括一个使用Z变换的正弦生成器。检查here

您可以检查生成正弦曲调的最佳计算方法here