2011-11-16 25 views
10

Phát triển ứng dụng iOS sử dụng khung CoreAudio, tôi đang xử lý hành vi vô nghĩa IMHO của SDL reg. phát âm thanh. SDL phát âm thanh trong vòng lặp và cách duy nhất để kích hoạt phát lại là gọi SDL_PauseAudio(0) và cách duy nhất để ngăn chặn (không có các tác dụng phụ khác mà tôi không nói đến) là gọi SDL_PauseAudio(1). Theo như tôi biết.SDL: cách dừng âm thanh - không tiếp tục, SDL_PauseAudio (1) nào thực sự?

Sự cố với tôi trong SDL ở đây là gì? Đơn giản - cuộc gọi tiếp theo tới SDL_PauseAudio(1) thực sự Khôi phục phát lại, khiến cho khung chơi một số mess * trước khi yêu cầu mới dữ liệu âm thanh *. Điều này là do cách SDL_CoreAudio.c triển khai vòng lặp phát lại.

Điều đó có nghĩa là SDL không thực hiện STOP, nó chỉ thực hiện PAUSE/RESUME và quản lý không đúng cách xử lý âm thanh. Nó có nghĩa là, nếu bạn chơi sampleA, và muốn chơi sampleB sau này, bạn sẽ nghe thấy các mảnh của sampleA trong khi chờ đợi chỉ để nghe phát lại của sampleB.

Nếu sai, vui lòng sửa tôi.

Nếu không, đây là sự khác biệt của tôi, mà tôi đã sử dụng để thực hiện cũng STOP hành vi: ngay sau khi tôi kết thúc chơi sampleA, tôi gọi SDL_PauseAudio(2) để phát lại vòng lặp và cuộc gọi tiếp theo để SDL_PauseAudio (0) bắt đầu lại, lần này bằng cách chơi không có lộn xộn từ mẫuA, nhưng chỉ chơi chính xác dữ liệu từ 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; 
    } 

Tôi xấu hổ rằng tôi đã chỉnh sửa mã SDL, nhưng tôi không có kết nối với tác giả và không tìm thấy bất kỳ trợ giúp nào. Vâng, nó là lạ đối với tôi, mà không ai có vẻ cần hành vi STOP trong SDL?

Trả lời

0

Một cách xung quanh vấn đề của bạn là ví dụ để quản lý tốt hơn thiết bị âm thanh của bạn với SDL. Dưới đây là những gì tôi đề xuất:

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); 
} 

Điều này làm việc cho tôi, gọi lại không được gọi sau khi ngừng() và không có rác thải được gửi đến loa.

Các vấn đề liên quan