2011-05-10 66 views
2

我試圖找到一些方法來播放動態創建的iOS中的音調。能夠播放音頻文件不會爲我削減它。我需要更多更好的控制。我知道有一些方法可以在單個數據包級別處理音頻流,如果我有辦法創建音頻數據包,這對我來說很有用。如果任何人甚至有一些好的指針或地方去獲得更多的信息,我會很感激。如何在iOS中播放自定義鈴聲?

+0

那麼你應該看看蘋果的示例應用程序。 – 2011-05-10 14:09:42

+0

@尼克韋弗,我在想同樣的事情,但是(不是直接從他的問題中提取出來的),我認爲他需要更復雜的方式(或者至少希望這樣做)。 – Jake 2011-05-10 14:35:32

+0

我看到沒有可接受的答案 - 如果可能,請告訴我們您是否以及如何自己解決問題。 – 2011-09-21 08:14:39

回答

2

你可能想要的是使用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