2016-06-28 12 views
0

私が使用しているオーディオファイルが何であっても、再生は常に4分の1になります。デコードされたオーディオをUint8*にキャストしていると感じていますが、そうでなければ、オーディオは本当に速く再生され、ファイルの半分しか再生されません。また、SDL_memcpyの代わりにSDL_MixAudioを使用すると、何らかの理由で音のコピーが互いに重複して再生されます。stb_vorbisとSDL2でオーディオを再生すると、再生が終了する

Uint8* audio_pos; 
Uint32 audio_len; 

void audioCallback(void* userdata, Uint8* stream, int len) { 
    if (audio_len == 0) return; 
    len = (len > audio_len ? audio_len : len); 
    SDL_memcpy(stream, audio_pos, len); 
    audio_pos += len; 
    audio_len -= len; 
} 

int main(int argc, char *argv[]) { 
    ... 
    short* decoded; 
    int channels, rate, len; 
    len = stb_vorbis_decode_filename(RealPath("music.ogg").c_str(), &channels, &rate, &decoded); 

    SDL_AudioSpec spec; 
    spec.freq = rate; 
    spec.format = AUDIO_S16; 
    spec.channels = channels; 
    spec.samples = 2048; 
    spec.callback = audioCallback; 
    spec.userdata = NULL; 

    audio_pos = (Uint8*)decoded; 
    audio_len = len; 

    if (SDL_OpenAudio(&spec, NULL) < 0) { 
     std::cout << "failed to open audio device: " << SDL_GetError() << '\n'; 
     SDL_GL_DeleteContext(context); 
     SDL_Quit(); 
     return -1; 
    } 

    SDL_PauseAudio(0); 

    SDL_Event windowEvt; 
    while (true) { 
     if (audio_len == 0) break; 
     if (SDL_PollEvent(&windowEvt)) { 
      if (windowEvt.type == SDL_QUIT) break; 
      if (windowEvt.type == SDL_KEYUP && windowEvt.key.keysym.sym == SDLK_ESCAPE) break; 
     } 
     SDL_GL_SwapWindow(window); 
    } 
    ... 
} 

答えて

0

stb_vorbis_decode_filenameint16に対してであり、そしてチャネル係数を含まない「デコードサンプル数を、」返します。あなたが探している :音の重なりのためSDL_MixAudioSDL_memcpyに関して

int32 length = stb_vorbis_decode_filename("thing.ogg", &channels, &rate, &decoded); 
int32 audio_length = length * channels * (sizeof(int16)/sizeof(uint8)); 

は、明示的に沈黙値でストリームをクリアする必要があります。たとえば、SDLオーディオコールバックを入力すると、SDL_memsetとなります。 SDL_OpenAudioDeviceを呼び出すときSDL_memsetに渡さ

void audioCallback(void* userdata, Uint8* stream, int len) 
{ 
    SDL_memset(stream, 0, len);// silence the stream 
    if (audio_len == 0) return; 
    len = (len > audio_len ? audio_len : len); 
    SDL_MixAudio(stream, audio_pos, len, SDL_MIX_MAXVOLUME);// this takes a volume argument 
    audio_pos += len; 
    audio_len -= len; 
} 

ゼロは、あなたがSDL_AudioSpecで作成したのと同じ沈黙値でなければなりません。

関連する問題