Звуки микшера SDL не воспроизводятся с помощью PlayChannel() ⇐ C++
Звуки микшера SDL не воспроизводятся с помощью PlayChannel()
Я создаю класс для взаимодействия с SDL Mixer на C++, чтобы я мог воспроизводить звуки в своем приложении. Однако, похоже, мои звуки не доигрались и я их вообще не слышу.
Вот как выглядит мой класс:
//Используемые стандартные библиотеки #include #include //Подключаем классы для библиотеки #include "classes/s_soundData.h" #include "classes/s_soundController.h" #include "classes/s_soundPlaylist.h" //SDL #include #include класс мойSoundClass { публика: /*** Переменные-члены ***/ unordered_map звуки; //Контейнер всех звуков unordered_map плейлисты; //Содержит все плейлисты, созданные с помощью библиотеки stevensSound. unordered_map soundControllers; //Контейнер всех звуковых контроллеров. Управляет громкостью и настройками воспроизведения звуков. /*** Конструкторы ***/ //Конструктор по умолчанию мойSoundClass() { //Инициализируем SDL если ( SDL_Init ( SDL_INIT_VIDEO | SDL_INIT_AUDIO ) < 0 ) { printf( "SDL не удалось инициализировать! Ошибка SDL: %s\n", SDL_GetError() ); } //Инициализируем SDL_mixer если ( Mix_OpenAudio ( 44100, MIX_DEFAULT_FORMAT, 2, 2048 ) < 0 ) { printf( "SDL_mixer не удалось инициализировать! Ошибка SDL_mixer: %s\n", Mix_GetError() ); } //Создаем музыку, звуковые эффекты и звуковые контроллеры по умолчанию soundControllers = { {"музыка", s_soundController("музыка",1)}, {"sfx", s_soundController("sfx",1)}, {"по умолчанию", s_soundController()} }; //Без параметров мы просто инициализируем наш звуковой контейнер как пустой звуки = {}; //Также инициализируем наш контейнер плейлистов, чтобы он был пустым плейлисты = {}; } /*** Деструктор ***/ ~ мойSoundClass() { //Выход из подсистем SDL при уничтожении Микс_Выход(); SDL_Выход(); } /*** Методы ***/ void playSound( std::string soundName, std::string категория) /* Воспроизводит звуковой эффект, используя функции библиотеки SDL. */ { //Получаем данные звука и его контроллер s_soundData soundData = звуки[категория][имя звука]; s_soundController soundController = soundControllers[soundData.controllerId]; //Загружаем звуковой файл в память Mix_Chunk* звук = NULL; звук = Mix_LoadWAV (soundData.filePath); //Управляем воспроизведением Mix_VolumeChunk(sound, (int)round(128 * soundController.volume)); //Воспроизведение звука Mix_PlayChannel(-1, звук, 0); } }; Я использовал это руководство, чтобы научиться настраивать SDL: https://lazyfoo.net/tutorials/SDL/21_so ... /index.php
Я вызываю метод playSound() из моего файла main.cpp. Я убедился, что звук загружен правильно и что громкость установлена на максимум, выведя переменные-члены MixChunk в стандартный вывод.
В других сообщениях здесь говорится, что нужно запускать usleep() или SDL_Delay() до тех пор, пока звук не завершится в функции, чтобы звук действительно воспроизводился полностью, но Я попробовал это, и, похоже, результат каждый раз один и тот же: звук не воспроизводится.
Однако я заметил одну вещь: SDL появляется в моем аудиомикшере как приложение на долю секунды всякий раз, когда я пытаюсь вызвать playSound().
Кроме того, более ранняя версия этой программы работала, но тогда все функции были определены в глобальной области, а не в области только этого отдельного класса.
Я создаю класс для взаимодействия с SDL Mixer на C++, чтобы я мог воспроизводить звуки в своем приложении. Однако, похоже, мои звуки не доигрались и я их вообще не слышу.
Вот как выглядит мой класс:
//Используемые стандартные библиотеки #include #include //Подключаем классы для библиотеки #include "classes/s_soundData.h" #include "classes/s_soundController.h" #include "classes/s_soundPlaylist.h" //SDL #include #include класс мойSoundClass { публика: /*** Переменные-члены ***/ unordered_map звуки; //Контейнер всех звуков unordered_map плейлисты; //Содержит все плейлисты, созданные с помощью библиотеки stevensSound. unordered_map soundControllers; //Контейнер всех звуковых контроллеров. Управляет громкостью и настройками воспроизведения звуков. /*** Конструкторы ***/ //Конструктор по умолчанию мойSoundClass() { //Инициализируем SDL если ( SDL_Init ( SDL_INIT_VIDEO | SDL_INIT_AUDIO ) < 0 ) { printf( "SDL не удалось инициализировать! Ошибка SDL: %s\n", SDL_GetError() ); } //Инициализируем SDL_mixer если ( Mix_OpenAudio ( 44100, MIX_DEFAULT_FORMAT, 2, 2048 ) < 0 ) { printf( "SDL_mixer не удалось инициализировать! Ошибка SDL_mixer: %s\n", Mix_GetError() ); } //Создаем музыку, звуковые эффекты и звуковые контроллеры по умолчанию soundControllers = { {"музыка", s_soundController("музыка",1)}, {"sfx", s_soundController("sfx",1)}, {"по умолчанию", s_soundController()} }; //Без параметров мы просто инициализируем наш звуковой контейнер как пустой звуки = {}; //Также инициализируем наш контейнер плейлистов, чтобы он был пустым плейлисты = {}; } /*** Деструктор ***/ ~ мойSoundClass() { //Выход из подсистем SDL при уничтожении Микс_Выход(); SDL_Выход(); } /*** Методы ***/ void playSound( std::string soundName, std::string категория) /* Воспроизводит звуковой эффект, используя функции библиотеки SDL. */ { //Получаем данные звука и его контроллер s_soundData soundData = звуки[категория][имя звука]; s_soundController soundController = soundControllers[soundData.controllerId]; //Загружаем звуковой файл в память Mix_Chunk* звук = NULL; звук = Mix_LoadWAV (soundData.filePath); //Управляем воспроизведением Mix_VolumeChunk(sound, (int)round(128 * soundController.volume)); //Воспроизведение звука Mix_PlayChannel(-1, звук, 0); } }; Я использовал это руководство, чтобы научиться настраивать SDL: https://lazyfoo.net/tutorials/SDL/21_so ... /index.php
Я вызываю метод playSound() из моего файла main.cpp. Я убедился, что звук загружен правильно и что громкость установлена на максимум, выведя переменные-члены MixChunk в стандартный вывод.
В других сообщениях здесь говорится, что нужно запускать usleep() или SDL_Delay() до тех пор, пока звук не завершится в функции, чтобы звук действительно воспроизводился полностью, но Я попробовал это, и, похоже, результат каждый раз один и тот же: звук не воспроизводится.
Однако я заметил одну вещь: SDL появляется в моем аудиомикшере как приложение на долю секунды всякий раз, когда я пытаюсь вызвать playSound().
Кроме того, более ранняя версия этой программы работала, но тогда все функции были определены в глобальной области, а не в области только этого отдельного класса.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение