如何在iOS中播放自定义铃声?

问题描述:

我试图找到一些方法来播放动态创建的iOS中的音调。能够播放音频文件不会为我削减它。我需要更多更好的控制。我知道有一些方法可以在单个数据包级别处理音频流,如果我有办法创建音频数据包,这对我来说很有用。如果任何人甚至有一些好的指针或地方去获得更多的信息,我会很感激。如何在iOS中播放自定义铃声?

+0

那么你应该看看苹果的示例应用程序。 – 2011-05-10 14:09:42

+0

@尼克韦弗,我在想同样的事情,但是(不是直接从他的问题中提取出来的),我认为他需要更复杂的方式(或者至少希望这样做)。 – Jake 2011-05-10 14:35:32

+0

我看到没有可接受的答案 - 如果可能,请告诉我们您是否以及如何自己解决问题。 – 2011-09-21 08:14:39

你可能想要的是使用AudioQueue。这是一个API在音频堆栈中有点下降,但允许你生成你想要的任何音频。我已经在应用程序SC68 Player中使用它来生成Atari ST声音芯片仿真器的音频流,以播放来自80年代的游戏和场景演示中的旧音乐。

的基本思路是:

  1. 产生一个后台线程,你生成一个CFRunLoop接收按需回调填补了音频队列缓冲区。使用AudioQueueNewOutput()
  2. 从任何线程开始/暂停音频队列。使用AudioQueueStart()/AudioQueueStart()暂停。
  3. 执行回调来填充音频缓冲区。

的回调将是这个样子:

static void AudioQueueCallback(void* inUserData, 
           AudioQueueRef inAQ, 
           AudioQueueBufferRef inBuffer) 
{ 
    [soundGenerator fillNextFrameBuffer:inBuffer->mAudioData 
            size:inBuffer->mAudioDataBytesCapacity]; 
    inBuffer->mAudioDataByteSize = inBuffer->mAudioDataBytesCapacity; 
    AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL); 
} 
+0

谢谢!任何有关如何创建声音发生器的指针?我不确定这些格式是什么样子。如果我知道在哪里粘贴它,我可以用LPCM数据填充它,以及它需要在AudioQueue中播放的格式。 – 2011-05-10 15:29:01

+0

您可以从http://www.peylow.se/sc68player.html下载SC68播放器的源代码 - 它包含您想在CS68PlayerAudioQueuePlayer.m文件中查看的代码。您可以设置PCM音频数据,几乎不管你喜欢什么。 – PeyloW 2011-05-10 15:33:09

当然马特·加拉格尔已经使用RemoteIO音频单元写入一个音调发生器。

http://cocoawithlove.com/2010/10/ios-tone-generator-introduction-to.html