mirror of
				https://github.com/MadeOfJelly/MushMachine.git
				synced 2025-11-03 23:36:51 +01:00 
			
		
		
		
	add sound sfxr loaders
This commit is contained in:
		@@ -19,21 +19,6 @@ target_link_libraries(sound_service
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
###############################
 | 
					###############################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
add_library(filesystem_soloud_file
 | 
					 | 
				
			||||||
	./src/mm/soloud_filesystem_file_impl.hpp
 | 
					 | 
				
			||||||
	./src/mm/soloud_filesystem_file_impl.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	./src/mm/sound_loader_wav.hpp
 | 
					 | 
				
			||||||
	./src/mm/sound_loader_wav.cpp
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
target_link_libraries(filesystem_soloud_file
 | 
					 | 
				
			||||||
	filesystem_service
 | 
					 | 
				
			||||||
	soloud
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
###############################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
add_library(soloud_json
 | 
					add_library(soloud_json
 | 
				
			||||||
	./src/mm/soloud_json.hpp
 | 
						./src/mm/soloud_json.hpp
 | 
				
			||||||
	./src/mm/soloud_json.cpp
 | 
						./src/mm/soloud_json.cpp
 | 
				
			||||||
@@ -46,6 +31,24 @@ target_link_libraries(soloud_json
 | 
				
			|||||||
	nlohmann_json::nlohmann_json
 | 
						nlohmann_json::nlohmann_json
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					###############################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					add_library(filesystem_soloud_file
 | 
				
			||||||
 | 
						./src/mm/soloud_filesystem_file_impl.hpp
 | 
				
			||||||
 | 
						./src/mm/soloud_filesystem_file_impl.cpp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						./src/mm/sound_loader_wav.hpp
 | 
				
			||||||
 | 
						./src/mm/sound_loader_wav.cpp
 | 
				
			||||||
 | 
						./src/mm/sound_loader_sfxr.hpp
 | 
				
			||||||
 | 
						./src/mm/sound_loader_sfxr.cpp
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					target_link_libraries(filesystem_soloud_file
 | 
				
			||||||
 | 
						filesystem_service
 | 
				
			||||||
 | 
						soloud
 | 
				
			||||||
 | 
						soloud_json
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if (BUILD_TESTING)
 | 
					if (BUILD_TESTING)
 | 
				
			||||||
	add_subdirectory(test)
 | 
						add_subdirectory(test)
 | 
				
			||||||
endif()
 | 
					endif()
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										38
									
								
								framework/sound/src/mm/sound_loader_sfxr.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								framework/sound/src/mm/sound_loader_sfxr.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
				
			|||||||
 | 
					#include "./sound_loader_sfxr.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <nlohmann/json.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "./soloud_json.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <mm/services/filesystem.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace MM {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::shared_ptr<::SoLoud::Sfxr> SoundLoaderSfxrPreset::load(const ::SoLoud::Sfxr::SFXR_PRESETS preset, const int seed) const {
 | 
				
			||||||
 | 
						auto sfxr = std::make_shared<::SoLoud::Sfxr>();
 | 
				
			||||||
 | 
						sfxr->loadPreset(preset, seed);
 | 
				
			||||||
 | 
						return sfxr;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::shared_ptr<::SoLoud::Sfxr> SoundLoaderSfxrJson::load(const nlohmann::json& j) const {
 | 
				
			||||||
 | 
						auto sfxr = std::make_shared<::SoLoud::Sfxr>();
 | 
				
			||||||
 | 
						*sfxr = j;
 | 
				
			||||||
 | 
						return sfxr;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::shared_ptr<::SoLoud::Sfxr> SoundLoaderSfxrFile::load(const std::string& path, MM::Engine& engine) const {
 | 
				
			||||||
 | 
						auto& fs = engine.getService<MM::Services::FilesystemService>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!fs.isFile(path.c_str())) {
 | 
				
			||||||
 | 
							// TODO: log error
 | 
				
			||||||
 | 
							return nullptr;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						auto j = fs.readJson(path.c_str());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return SoundLoaderSfxrJson{}.load(j);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} // MM
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										28
									
								
								framework/sound/src/mm/sound_loader_sfxr.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								framework/sound/src/mm/sound_loader_sfxr.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <memory>
 | 
				
			||||||
 | 
					#include <string>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <soloud_sfxr.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <nlohmann/json_fwd.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace MM {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// fwd
 | 
				
			||||||
 | 
						class Engine;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct SoundLoaderSfxrPreset {
 | 
				
			||||||
 | 
							std::shared_ptr<::SoLoud::Sfxr> load(const ::SoLoud::Sfxr::SFXR_PRESETS preset, const int seed) const;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct SoundLoaderSfxrJson {
 | 
				
			||||||
 | 
							std::shared_ptr<::SoLoud::Sfxr> load(const nlohmann::json& j) const;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct SoundLoaderSfxrFile {
 | 
				
			||||||
 | 
							std::shared_ptr<::SoLoud::Sfxr> load(const std::string& path, MM::Engine& engine) const;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} // MM
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -9,8 +9,10 @@ namespace MM {
 | 
				
			|||||||
std::shared_ptr<::SoLoud::Wav> SoundLoaderWavFile::load(const std::string& path, Engine& engine) const {
 | 
					std::shared_ptr<::SoLoud::Wav> SoundLoaderWavFile::load(const std::string& path, Engine& engine) const {
 | 
				
			||||||
	auto& fs = engine.getService<Services::FilesystemService>();
 | 
						auto& fs = engine.getService<Services::FilesystemService>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!fs.isFile(path.c_str()))
 | 
						if (!fs.isFile(path.c_str())) {
 | 
				
			||||||
 | 
							// TODO: log error
 | 
				
			||||||
		return nullptr;
 | 
							return nullptr;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	auto h = fs.open(path.c_str());
 | 
						auto h = fs.open(path.c_str());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -19,7 +21,7 @@ std::shared_ptr<::SoLoud::Wav> SoundLoaderWavFile::load(const std::string& path,
 | 
				
			|||||||
	auto ptr = std::make_shared<::SoLoud::Wav>();
 | 
						auto ptr = std::make_shared<::SoLoud::Wav>();
 | 
				
			||||||
	auto r = ptr->loadFile(&sl_f);
 | 
						auto r = ptr->loadFile(&sl_f);
 | 
				
			||||||
	if (r != ::SoLoud::SO_NO_ERROR) {
 | 
						if (r != ::SoLoud::SO_NO_ERROR) {
 | 
				
			||||||
		// log error
 | 
							// TODO: log error
 | 
				
			||||||
		return nullptr;
 | 
							return nullptr;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,9 +5,11 @@
 | 
				
			|||||||
#include <physfs.h>
 | 
					#include <physfs.h>
 | 
				
			||||||
#include <mm/soloud_filesystem_file_impl.hpp>
 | 
					#include <mm/soloud_filesystem_file_impl.hpp>
 | 
				
			||||||
#include <mm/sound_loader_wav.hpp>
 | 
					#include <mm/sound_loader_wav.hpp>
 | 
				
			||||||
 | 
					#include <mm/sound_loader_sfxr.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <mm/resource_manager.hpp>
 | 
					#include <mm/resource_manager.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <soloud_sfxr.h>
 | 
				
			||||||
#include <soloud_wav.h>
 | 
					#include <soloud_wav.h>
 | 
				
			||||||
#include <soloud_wavstream.h>
 | 
					#include <soloud_wavstream.h>
 | 
				
			||||||
#include <soloud_monotone.h>
 | 
					#include <soloud_monotone.h>
 | 
				
			||||||
@@ -21,7 +23,7 @@ using namespace entt::literals;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
extern char* argv0;
 | 
					extern char* argv0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TEST(soloud_fs_loader, basic) {
 | 
					TEST(soloud_fs_loader, wav) {
 | 
				
			||||||
	MM::Engine engine;
 | 
						MM::Engine engine;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// setup
 | 
						// setup
 | 
				
			||||||
@@ -59,3 +61,38 @@ TEST(soloud_fs_loader, basic) {
 | 
				
			|||||||
	rm.clear();
 | 
						rm.clear();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEST(soloud_fs_loader, sfxr) {
 | 
				
			||||||
 | 
						MM::Engine engine;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// setup
 | 
				
			||||||
 | 
						auto& sound = engine.addService<MM::Services::SoundService>();
 | 
				
			||||||
 | 
						ASSERT_TRUE(engine.enableService<MM::Services::SoundService>());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						engine.addService<MM::Services::FilesystemService>(argv0, "soloud_filesystem_loader_test");
 | 
				
			||||||
 | 
						ASSERT_TRUE(engine.enableService<MM::Services::FilesystemService>());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						auto& rm = MM::ResourceManager<SoLoud::Sfxr>::ref();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sound.engine.setGlobalVolume(0.4f);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ASSERT_FALSE(rm.contains("test_preset"_hs));
 | 
				
			||||||
 | 
						rm.load<MM::SoundLoaderSfxrPreset>("test_preset", ::SoLoud::Sfxr::SFXR_PRESETS::EXPLOSION, 0);
 | 
				
			||||||
 | 
						ASSERT_TRUE(rm.contains("test_preset"_hs));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// TODO: add load from json
 | 
				
			||||||
 | 
						// TODO: add load from json from file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							auto sh = rm.get("test_preset"_hs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							sound.engine.play(*sh);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							while (sound.engine.getActiveVoiceCount()) {
 | 
				
			||||||
 | 
								using namespace std::chrono_literals;
 | 
				
			||||||
 | 
								std::this_thread::sleep_for(5ms);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rm.clear();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user