SfxDump.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include <boost/filesystem.hpp>
  2. #include <boost/test/unit_test.hpp>
  3. #include <cstdint>
  4. #include <cstring>
  5. #include <fstream>
  6. #include <iterator>
  7. #include <string>
  8. #include <vector>
  9. #include "SfxDump.h"
  10. #include "SfxDumpStructures.h"
  11. BOOST_AUTO_TEST_CASE(SfxDumpWritesLoopedWaveFile){
  12. const boost::filesystem::path temp_dir = boost::filesystem::temp_directory_path()
  13. / boost::filesystem::unique_path("vgears-sfxdump-%%%%-%%%%");
  14. boost::filesystem::create_directories(temp_dir);
  15. const boost::filesystem::path fmt_path = temp_dir / "audio.fmt";
  16. const boost::filesystem::path data_path = temp_dir / "audio.dat";
  17. const boost::filesystem::path sound_dir = temp_dir / "sounds";
  18. boost::filesystem::create_directories(sound_dir);
  19. {
  20. std::ofstream fmt_file(fmt_path.string().c_str(), std::ios::binary);
  21. FfWav_header empty_header = {0};
  22. WAVEFORMATEX empty_format = {0};
  23. FfWav_header sound_header = {4, 0, 1, 0, 2, 3};
  24. ADPCMWAVEFORMAT adpcm_format = {0};
  25. fmt_file.write(reinterpret_cast<const char*>(&empty_header), sizeof empty_header);
  26. fmt_file.write(reinterpret_cast<const char*>(&empty_format), sizeof empty_format);
  27. fmt_file.write(reinterpret_cast<const char*>(&sound_header), sizeof sound_header);
  28. fmt_file.write(reinterpret_cast<const char*>(&adpcm_format), sizeof adpcm_format);
  29. BOOST_REQUIRE(fmt_file.good());
  30. }
  31. {
  32. std::ofstream data_file(data_path.string().c_str(), std::ios::binary);
  33. const unsigned char sample_data[] = {0x10, 0x20, 0x30, 0x40};
  34. data_file.write(reinterpret_cast<const char*>(sample_data), sizeof sample_data);
  35. BOOST_REQUIRE(data_file.good());
  36. }
  37. BOOST_REQUIRE_EQUAL(
  38. SfxDumpConvert(fmt_path.string().c_str(), data_path.string().c_str(), sound_dir.string().c_str()),
  39. 0
  40. );
  41. const boost::filesystem::path wav_path = sound_dir / "1.wav";
  42. BOOST_REQUIRE(boost::filesystem::exists(wav_path));
  43. BOOST_CHECK(!boost::filesystem::exists(sound_dir / "0.wav"));
  44. std::ifstream wav_file(wav_path.string().c_str(), std::ios::binary);
  45. std::vector<char> wav_bytes(
  46. (std::istreambuf_iterator<char>(wav_file)), std::istreambuf_iterator<char>()
  47. );
  48. const size_t expected_size = sizeof(Riff_header) + sizeof(Fmt_chunk)
  49. + sizeof(Data_chunk) + 4 + sizeof(Loop_chunk);
  50. BOOST_REQUIRE_EQUAL(wav_bytes.size(), expected_size);
  51. BOOST_CHECK_EQUAL(std::string(wav_bytes.data(), 4), "RIFF");
  52. BOOST_CHECK_EQUAL(std::string(wav_bytes.data() + 8, 4), "WAVE");
  53. BOOST_CHECK_EQUAL(std::string(wav_bytes.data() + 70, 4), "data");
  54. BOOST_CHECK_EQUAL(std::string(wav_bytes.data() + 82, 4), "fflp");
  55. uint32_t riff_size = 0;
  56. std::memcpy(&riff_size, wav_bytes.data() + 4, sizeof riff_size);
  57. BOOST_CHECK_EQUAL(riff_size, expected_size - 8);
  58. boost::filesystem::remove_all(temp_dir);
  59. }