2011-11-16 191 views
10

開發使用CoreAudio框架的iOS應用程序,我正在處理SDL reg的恕我直言無稽之談。播放音頻。 SDL在循環播放音頻,而唯一的方法是如何觸發播放,請撥打SDL_PauseAudio(0),如何停止播放(沒有其他副作用,我不會在此討論)的唯一方法是致電SDL_PauseAudio(1)。我所知道的。SDL:如何停止音頻 - 不是恢復,哪個SDL_PauseAudio(1)實際上執行?

SDL在這裏對我有什麼問題?簡單地說 - 下一次調用SDL_PauseAudio(1)實際上會恢復播放,導致框架播放一些混亂 *之前詢問新的聲音數據*。這是因爲SDL_CoreAudio.c如何實現播放循環。

這意味着,SDL不執行STOP,它只實現PAUSE/RESUME並錯誤地管理音頻處理。這意味着,如果您播放sampleA,並且稍後想要播放sampleB,您還會聽到sampleA的片斷,同時希望聽到sampleB的播放。

如果我錯了,請糾正我。

如果不是,這是我的差異,我也用於執行停止行爲:只要我完成播放sampleA,我打電話SDL_PauseAudio(2),以便回放循環退出,下次調用SDL_PauseAudio(0)再次啓動它,這次通過從sampleA播放沒有混亂,但正確播放smapleB的數據。

Index: src/audio/coreaudio/SDL_coreaudio.c 
=================================================================== 
--- src/audio/coreaudio/SDL_coreaudio.c 
+++ src/audio/coreaudio/SDL_coreaudio.c 
@@ -250,6 +250,12 @@ 
      abuf = &ioData->mBuffers[i]; 
      SDL_memset(abuf->mData, this->spec.silence, abuf->mDataByteSize); 
     } 
+  if (2 == this->paused) 
+  { 
+   // this changes 'pause' behavior to 'stop' behavior - next 
+   // plyaing starts from beginning, i.e. it won't resume 
+   this->hidden->bufferOffset = this->hidden->bufferSize; 
+  } 
     return 0; 
    } 

我感到羞恥,我編輯了SDL代碼,但是我沒有與作者有關​​聯,也沒有找到任何幫助。那麼,對我來說,奇怪的是,沒有人似乎需要SDL中的STOP行爲?

回答

0

解決您的問題的一個方法是,例如,通過SDL更好地管理您的音頻設備。以下是我建議:

void myAudioCallback(void *userdata, Uint8 *stream, int len) { ... } 
SDL_AudioDeviceID audioDevice; 

void startAudio() 
{ 
    // prepare the device 
    static SDL_AudioSpec audioSpec; 
    SDL_zero(audioSpec); 
    audioSpec.channels = 2; 
    audioSpec.freq  = 44100; 
    audioSpec.format = AUDIO_S16SYS; 
    audioSpec.userdata = (void*)myDataLocation; 
    audioSpec.callback = myAudioCallback; 
    audioDevice = SDL_OpenAudioDevice(NULL, 0, &audioSpec, &audioSpec, 0); 
    // actually start playback 
    SDL_PauseAudioDevice(audioDevice, 0); 
} 

void stopAudio() 
{ 
    SDL_CloseAudioDevice(audioDevice); 
} 

這個工作對我來說,回調不stopAudio後稱爲()和無垃圾要麼傳送到揚聲器。