Почему звуки искажаются при их многократном воспроизведении? - PullRequest
1 голос
/ 14 июня 2019

При воспроизведении одного и того же звука несколько раз, он звучит нормально в первый раз, но искажается (приглушается, как если бы он был далеко) в следующий раз. Я играю из того же буфера (инициализируется один раз из WAV-файла при запуске) с использованием openAL. Как ни странно, то же самое происходит при воспроизведении звука в приложениях Apple (Xcode, Quicktime Player, Safari), но не во многих сторонних приложениях (VLC, Chrome, ...). Тот же код прекрасно работает на iOS, и тот же звуковой файл также корректно воспроизводится в старой версии приложения Carbon на MacOS.

Один из звуков, который демонстрирует проблему: http://www.colibricks.com/Sound131.wav. Вы можете услышать это сами, открыв эту ссылку в Safari и нажав кнопку Play. В первый раз это звучит нормально, в следующий раз - как будто это очень далеко. Перезагрузите страницу, и она звучит нормально снова при первой попытке, а затем снова далеко. Тем не менее, откройте ту же страницу в Chrome, и она звучит нормально каждый раз.

Странно, но старая скомпилированная 32-битная версия Carbon, которую я больше не могу компилировать в текущих версиях XCode, но которая использует те же звуковые файлы, звучит отлично!

Я попытался открыть файл в Audacity, экспортировать его в различные форматы (wav, aiff, 16 или 32-битный, ...) и воспроизвести эти файлы в Quicktime Player. Результат всегда один и тот же: сначала играй ОК, потом искажай.

Это код, который я использую для воспроизведения звуков (после стандартной настройки всех источников и буферов)

alSourcef(source[i], AL_GAIN, volume * (1.f/256.f));
alSourcei(source[i], AL_BUFFER, 0);
alSourcei(source[i], AL_BUFFER, bufID[which-128]);
alSourcePlay(source[i]);

Кажется, в openAL или в какой-то другой части аудиосистемы есть какая-то ошибка, которая искажает звуки, когда они воспроизводятся повторно, не только в моем приложении, но и в других приложениях Apple.

Я хотел бы попробовать другие решения для воспроизведения звуков (в любом случае openAL устарела), но мне трудно найти простой пример кода для CoreAudio или AudioAVEngine, который просто воспроизводит звуки с различной громкостью слева и справа (или очень простое панорамирование ). Мои потребности очень просты: загрузите кучу очень коротких звуков в буферы, а затем воспроизводите их на разных уровнях громкости влево / вправо во время игры. Никаких специальных 3D-эффектов, ревербераторов и прочего. Я боюсь пройти всю работу по внедрению AudioAVEngine только для того, чтобы выяснить, что проблема остается. А CoreAudio выглядит немного устрашающе, разве кто-то может подсказать мне какой-нибудь хороший для этого код? И это исправит искаженный звук?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...