2011-11-16 13 views
10

CoreAudioフレームワークを使用するiOSアプリケーションを開発するにあたり、私はSDH regのIMHOナンセンス動作を扱っています。オーディオを再生します。 SDLはループでオーディオを再生しますが、再生をトリガする方法はSDL_PauseAudio(0)に電話するだけです(他の副作用はありませんが、ここでは触れません)SDL_PauseAudio(1)に電話するのが唯一の方法です。私の知る限りでは。SDL:オーディオを停止する方法 - 再開しない、SDL_PauseAudio(1)は実際には何ですか?

ここでSDLの問題は何ですか?単にSDL_PauseAudio(1)への次回の呼び出しで実際に再生が再開され、新しいサウンドデータ*を要求する前に、フレームワークにmess *を再生させます。これは、SDL_CoreAudio.cが再生ループをどのように実装するかによるものです。

つまり、SDLはSTOPを実装せず、PAUSE/RESUMEだけを実装し、オーディオ処理を誤って管理しています。つまり、sampleAを再生し、後でsampleBを再生したい場合、sampleBの再生を聞くだけでsampleAの断片も聞こえることになります。

間違っている場合は、私を修正してください。

私がsampleAの再生を終了するとすぐに再生ループが終了し、次回のSDL_PauseAudio(0)の呼び出しが再び開始されるようにSDL_PauseAudio(2)を呼び出しますを再生すると、サンプルAのは表示されませんが、正しく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後に呼び出されていない)とまったくゴミがどちらかのスピーカーに送信されません。

関連する問題