SDL: как остановить звук, а не возобновить, что на самом деле делает SDL_PauseAudio (1)?

Разрабатывая приложение для iOS, использующее структуру CoreAudio, я имею дело с бессмысленным поведением SDL reg. воспроизведение аудио. SDL воспроизводит звук в цикле, и единственный способ запустить воспроизведение - это вызвать SDL_PauseAudio (0) , и единственный способ, как его остановить (без других побочных эффектов, о которых я не буду говорить здесь) вызвать SDL_PauseAudio (1) . Насколько мне известно.

В чем для меня проблема в SDL? Проще говоря - следующий вызов SDL_PauseAudio (1) фактически ВОЗОБНОВЛЯЕТ воспроизведение, в результате чего фреймворк воспроизводит некоторую беспорядок * перед запросом новых звуковых данных *. Это связано с тем, как SDL_CoreAudio.c реализует цикл воспроизведения.

Это означает, что SDL не реализует STOP, он реализует только PAUSE / RESUME и неправильно управляет обработкой звука. Это означает, что если вы проиграете сэмпл A и захотите воспроизвести сэмпл B позже, вы также услышите фрагменты сэмпла A, ожидая, что вы просто услышите воспроизведение сэмпла B.

Если ошибаюсь, поправьте меня.

Если нет, то вот мой diff, который я использовал для реализации также поведения STOP: как только я заканчиваю воспроизведение sampleA, я вызываю SDL_PauseAudio (2) , чтобы завершить цикл воспроизведения и следующий вызов SDL_PauseAudio ( 0) запускает его снова, на этот раз проигрывая no mess из 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, но я не связан с авторами и не нашел никакой помощи. Что ж, для меня странно, что никому не нужно поведение STOP в SDL?

11
задан macfij 3 July 2014 в 12:17
поделиться