[SDL][IOS] Audio fix - applies stream to sound data when resampling or reformatting is required.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
diff --git a/Xcode-iOS/SDL/SDL.xcodeproj/project.pbxproj b/Xcode-iOS/SDL/SDL.xcodeproj/project.pbxproj
old mode 100644
new mode 100755
diff --git a/src/audio/coreaudio/SDL_coreaudio.m b/src/audio/coreaudio/SDL_coreaudio.m
index e1f56ae..b6c49ab 100644
--- a/src/audio/coreaudio/SDL_coreaudio.m
+++ b/src/audio/coreaudio/SDL_coreaudio.m
@@ -417,7 +417,35 @@ outputCallback(void *inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffe
if (!SDL_AtomicGet(&this->enabled) || SDL_AtomicGet(&this->paused)) {
/* Supply silence if audio is not enabled or paused */
SDL_memset(inBuffer->mAudioData, this->spec.silence, inBuffer->mAudioDataBytesCapacity);
- } else {
+ } else if (this->stream ) {
+ UInt32 remaining = inBuffer->mAudioDataBytesCapacity;
+ Uint8 *ptr = (Uint8 *) inBuffer->mAudioData;
+
+ while (remaining > 0) {
+ if ( SDL_AudioStreamAvailable(this->stream) == 0 ) {
+ /* Generate the data */
+ SDL_LockMutex(this->mixer_lock);
+ (*this->callbackspec.callback)(this->callbackspec.userdata,
+ this->hidden->buffer, this->hidden->bufferSize);
+ SDL_UnlockMutex(this->mixer_lock);
+ this->hidden->bufferOffset = 0;
+ SDL_AudioStreamPut(this->stream, this->hidden->buffer, this->hidden->bufferSize);
+ }
+ if ( SDL_AudioStreamAvailable(this->stream) > 0 ) {
+ int got;
+ UInt32 len = SDL_AudioStreamAvailable(this->stream);
+ if ( len > remaining )
+ len = remaining;
+ got = SDL_AudioStreamGet(this->stream, ptr, len);
+ SDL_assert((got < 0) || (got == len));
+ if (got != len) {
+ SDL_memset(ptr, this->spec.silence, len);
+ }
+ ptr = ptr + len;
+ remaining -= len;
+ }
+ }
+ } else {
UInt32 remaining = inBuffer->mAudioDataBytesCapacity;
Uint8 *ptr = (Uint8 *) inBuffer->mAudioData;