Skip to content

Commit 3c8ad44

Browse files
committed
read vocals
1 parent 6f29119 commit 3c8ad44

17 files changed

+5866
-28
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,17 @@ bin/Setup
33
bin/Test
44
bin/Tuner
55
bin/*.exe
6+
bin/*.dll
67
bin/*.lib
78
bin/*.iobj
89
bin/*.ipdb
910
bin/*.a
11+
bin/*.exp
1012
resources/dlc
1113
resources/dlc/*
1214
resources/temp.*
1315
resources/settings
16+
tinyxml2/Debug-Dll/*
1417

1518
## Ignore Visual Studio temporary files, build results, and
1619
## files generated by popular Visual Studio add-ons.

PsarcReader/PSARC.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,9 @@ PSARC::PSARC(char const* fileName):
105105
delete *Entries.begin();
106106
Entries.erase(Entries.begin());
107107
}
108+
109+
entry_audio = NULL;
110+
entry_vocals = NULL;
108111
}
109112

110113
PSARC::~PSARC()
@@ -115,6 +118,23 @@ PSARC::~PSARC()
115118
}
116119
}
117120

121+
void PSARC::DetectEntries()
122+
{
123+
uint64_t entryAudioLength = 0;
124+
for (size_t i = 0; i < Entries.size(); i++)
125+
{
126+
auto e = Entries[i];
127+
if (e->name.find(".wem") != std::string::npos)
128+
if (e->Length > entryAudioLength)
129+
{
130+
entryAudioLength = e->Length; // HACK: pick the largest
131+
entry_audio = e;
132+
}
133+
if (e->name.find("vocals.xml") != std::string::npos)
134+
entry_vocals = e;
135+
}
136+
}
137+
118138
void PSARC::blockXor(char* out, char const* buf, int blockSize)
119139
{
120140
for (int i = 0; i < blockSize; i++)

PsarcReader/PSARC.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ class PSARC
5353
std::vector<Entry*> Entries;
5454
std::vector<uint32_t> zLengths;
5555

56+
void DetectEntries();
57+
58+
Entry* entry_audio;
59+
Entry* entry_vocals;
60+
5661
private:
5762
const int headerSize = 32;
5863

Readme.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ Dependencies:
1111
* [ogg](https://xiph.org/ogg/) - song container
1212
* [vorbis](https://xiph.org/vorbis/) - song codec
1313
* [dirent](https://github.com/tronkko/dirent) - filesystem api
14+
* [tinyxml2]( https://github.com/leethomason/tinyxml2) - song XML parsing
1415

1516
Building:
1617
VS 2019 solution and prebuilt dependencies included.

Test/Test.vcxproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@
8383
<AdditionalIncludeDirectories>..;../include</AdditionalIncludeDirectories>
8484
</ClCompile>
8585
<Link>
86-
<AdditionalDependencies>Audiod.lib;Wemd.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
86+
<AdditionalDependencies>Audiod.lib;tinyxml2d.lib;Vocalsd.lib;Wemd.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
8787
<AdditionalLibraryDirectories>..\bin</AdditionalLibraryDirectories>
8888
</Link>
8989
</ItemDefinitionGroup>
@@ -106,7 +106,7 @@
106106
<Link>
107107
<EnableCOMDATFolding>true</EnableCOMDATFolding>
108108
<OptimizeReferences>true</OptimizeReferences>
109-
<AdditionalDependencies>Audio.lib;Wem.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
109+
<AdditionalDependencies>Audio.lib;tinyxml2.lib;Vocals.lib;Wem.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
110110
<AdditionalLibraryDirectories>..\bin</AdditionalLibraryDirectories>
111111
</Link>
112112
</ItemDefinitionGroup>

Test/test.cpp

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
#include "PsarcReader/PSARC.h"
66
#include "PsarcReader/Sng.h"
77
#include "Audio/VorbisDecoder.h"
8+
#include "Vocals/Vocals.h"
9+
#include <cassert>
810

911
// test if end of file is handled correctly
1012
bool testDecoderEof(const char* fileName)
@@ -138,24 +140,35 @@ void testWemMPerformance(const char* fileName)
138140
}
139141
}
140142

143+
void test_read_vocals(char* songname, size_t expected_entry_count)
144+
{
145+
PSARC* psarc = new PSARC(songname);
146+
std::vector<char> vocalsEntryStorage;
147+
psarc->entry_vocals->Data->readTo(vocalsEntryStorage);
148+
Vocals v(vocalsEntryStorage);
149+
assert(v.Count() == expected_entry_count);
150+
}
151+
141152
int main()
142153
{
143154
//std::cout << testDecoderEof("../resources/temp.wem") << std::endl;
144155

145-
//std::cout << testPsarc("../../../rhcp_p.psarc", 24) << std::endl;
146-
//std::cout << testPsarc("../../../rhcp_m.psarc", 24) << std::endl;
147-
//std::cout << testSng("../resources/temp_p.sng") << std::endl;
148-
//std::cout << testSng("../resources/temp.sng") << std::endl;
156+
/*std::cout << testPsarc("../../../rhcp_p.psarc", 24) << std::endl;
157+
std::cout << testPsarc("../../../rhcp_m.psarc", 24) << std::endl;
158+
std::cout << testSng("../resources/temp_p.sng") << std::endl;
159+
std::cout << testSng("../resources/temp.sng") << std::endl;*/
149160

150161
//std::cout << testPsarcWemStream("../../../rhcp_p.psarc", 0) << std::endl;
151162

152-
auto t1 = std::chrono::high_resolution_clock::now();
163+
/*auto t1 = std::chrono::high_resolution_clock::now();
153164
testWemPerformance("../resources/temp.wem");
154165
auto t2 = std::chrono::high_resolution_clock::now();
155166
std::cout << std::chrono::duration_cast<std::chrono::duration<double>>(t2 - t1).count() << std::endl;
156167
testWemMPerformance("../resources/temp.wem");
157168
auto t3 = std::chrono::high_resolution_clock::now();
158-
std::cout << std::chrono::duration_cast<std::chrono::duration<double>>(t3 - t2).count() << std::endl;
169+
std::cout << std::chrono::duration_cast<std::chrono::duration<double>>(t3 - t2).count() << std::endl;*/
170+
171+
test_read_vocals("../resources/dlc/Lamb-Of-God_512_v2_0_DD_p.psarc", 344);
159172

160173
std::cin.get();
161174
}

Vocals/Vocals.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include <iostream>
2+
#include "Vocals.h"
3+
#include "../tinyxml2/tinyxml2.h"
4+
5+
6+
Vocals::Vocals(std::vector<char> vocalsEntryStorage)
7+
{
8+
tinyxml2::XMLDocument doc;
9+
doc.Parse((const char*)vocalsEntryStorage.data(), vocalsEntryStorage.size());
10+
std::cout << doc.Error() << std::endl;
11+
tinyxml2::XMLElement* vocals = doc.FirstChildElement("vocals");
12+
13+
VocalsEntry entry;
14+
for (tinyxml2::XMLElement* e = vocals->FirstChildElement(); e != NULL; e = e->NextSiblingElement())
15+
{
16+
entry.time = e->FloatAttribute("time");
17+
entry.tlen = e->FloatAttribute("length");
18+
entry.text = e->Attribute("lyric");
19+
records.push_back(entry);
20+
std::cout << entry.time << " / " << entry.tlen << " / " << entry.text << std::endl;
21+
}
22+
}
23+
24+
size_t Vocals::Count()
25+
{
26+
return records.size();
27+
}

Vocals/Vocals.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#pragma once
2+
#include <vector>
3+
4+
struct VocalsEntry
5+
{
6+
float time;
7+
float tlen;
8+
const char* text;
9+
};
10+
11+
class Vocals
12+
{
13+
public:
14+
Vocals(std::vector<char> vocalsEntryStorage);
15+
size_t Count();
16+
private:
17+
std::vector<VocalsEntry> records;
18+
};

Vocals/Vocals.vcxproj

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+
<ItemGroup Label="ProjectConfigurations">
4+
<ProjectConfiguration Include="Debug|Win32">
5+
<Configuration>Debug</Configuration>
6+
<Platform>Win32</Platform>
7+
</ProjectConfiguration>
8+
<ProjectConfiguration Include="Release|Win32">
9+
<Configuration>Release</Configuration>
10+
<Platform>Win32</Platform>
11+
</ProjectConfiguration>
12+
<ProjectConfiguration Include="Debug|x64">
13+
<Configuration>Debug</Configuration>
14+
<Platform>x64</Platform>
15+
</ProjectConfiguration>
16+
<ProjectConfiguration Include="Release|x64">
17+
<Configuration>Release</Configuration>
18+
<Platform>x64</Platform>
19+
</ProjectConfiguration>
20+
</ItemGroup>
21+
<PropertyGroup Label="Globals">
22+
<VCProjectVersion>16.0</VCProjectVersion>
23+
<ProjectGuid>{F76B4B5E-19F9-4D67-811E-1082CCDDF932}</ProjectGuid>
24+
<Keyword>Win32Proj</Keyword>
25+
<RootNamespace>Vocals</RootNamespace>
26+
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
27+
</PropertyGroup>
28+
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
29+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
30+
<ConfigurationType>StaticLibrary</ConfigurationType>
31+
<UseDebugLibraries>true</UseDebugLibraries>
32+
<PlatformToolset>v142</PlatformToolset>
33+
<CharacterSet>Unicode</CharacterSet>
34+
</PropertyGroup>
35+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
36+
<ConfigurationType>StaticLibrary</ConfigurationType>
37+
<UseDebugLibraries>false</UseDebugLibraries>
38+
<PlatformToolset>v142</PlatformToolset>
39+
<WholeProgramOptimization>true</WholeProgramOptimization>
40+
<CharacterSet>Unicode</CharacterSet>
41+
</PropertyGroup>
42+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
43+
<ConfigurationType>StaticLibrary</ConfigurationType>
44+
<UseDebugLibraries>true</UseDebugLibraries>
45+
<PlatformToolset>v142</PlatformToolset>
46+
<CharacterSet>Unicode</CharacterSet>
47+
</PropertyGroup>
48+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
49+
<ConfigurationType>StaticLibrary</ConfigurationType>
50+
<UseDebugLibraries>false</UseDebugLibraries>
51+
<PlatformToolset>v142</PlatformToolset>
52+
<WholeProgramOptimization>true</WholeProgramOptimization>
53+
<CharacterSet>Unicode</CharacterSet>
54+
</PropertyGroup>
55+
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
56+
<ImportGroup Label="ExtensionSettings">
57+
</ImportGroup>
58+
<ImportGroup Label="Shared">
59+
</ImportGroup>
60+
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
61+
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
62+
</ImportGroup>
63+
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
64+
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
65+
</ImportGroup>
66+
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
67+
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
68+
</ImportGroup>
69+
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
70+
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
71+
</ImportGroup>
72+
<PropertyGroup Label="UserMacros" />
73+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
74+
<LinkIncremental>true</LinkIncremental>
75+
<OutDir>$(SolutionDir)bin\</OutDir>
76+
<TargetName>$(ProjectName)d</TargetName>
77+
</PropertyGroup>
78+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
79+
<LinkIncremental>true</LinkIncremental>
80+
</PropertyGroup>
81+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
82+
<LinkIncremental>false</LinkIncremental>
83+
<OutDir>$(SolutionDir)bin\</OutDir>
84+
</PropertyGroup>
85+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
86+
<LinkIncremental>false</LinkIncremental>
87+
</PropertyGroup>
88+
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
89+
<ClCompile>
90+
<PrecompiledHeader>NotUsing</PrecompiledHeader>
91+
<WarningLevel>Level3</WarningLevel>
92+
<SDLCheck>true</SDLCheck>
93+
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
94+
<ConformanceMode>true</ConformanceMode>
95+
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
96+
</ClCompile>
97+
<Link>
98+
<SubSystem>Windows</SubSystem>
99+
<GenerateDebugInformation>true</GenerateDebugInformation>
100+
</Link>
101+
</ItemDefinitionGroup>
102+
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
103+
<ClCompile>
104+
<PrecompiledHeader>Use</PrecompiledHeader>
105+
<WarningLevel>Level3</WarningLevel>
106+
<SDLCheck>true</SDLCheck>
107+
<PreprocessorDefinitions>_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
108+
<ConformanceMode>true</ConformanceMode>
109+
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
110+
</ClCompile>
111+
<Link>
112+
<SubSystem>Windows</SubSystem>
113+
<GenerateDebugInformation>true</GenerateDebugInformation>
114+
</Link>
115+
</ItemDefinitionGroup>
116+
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
117+
<ClCompile>
118+
<PrecompiledHeader>NotUsing</PrecompiledHeader>
119+
<WarningLevel>Level3</WarningLevel>
120+
<FunctionLevelLinking>true</FunctionLevelLinking>
121+
<IntrinsicFunctions>true</IntrinsicFunctions>
122+
<SDLCheck>true</SDLCheck>
123+
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
124+
<ConformanceMode>true</ConformanceMode>
125+
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
126+
</ClCompile>
127+
<Link>
128+
<SubSystem>Windows</SubSystem>
129+
<EnableCOMDATFolding>true</EnableCOMDATFolding>
130+
<OptimizeReferences>true</OptimizeReferences>
131+
<GenerateDebugInformation>true</GenerateDebugInformation>
132+
</Link>
133+
</ItemDefinitionGroup>
134+
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
135+
<ClCompile>
136+
<PrecompiledHeader>Use</PrecompiledHeader>
137+
<WarningLevel>Level3</WarningLevel>
138+
<FunctionLevelLinking>true</FunctionLevelLinking>
139+
<IntrinsicFunctions>true</IntrinsicFunctions>
140+
<SDLCheck>true</SDLCheck>
141+
<PreprocessorDefinitions>NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
142+
<ConformanceMode>true</ConformanceMode>
143+
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
144+
</ClCompile>
145+
<Link>
146+
<SubSystem>Windows</SubSystem>
147+
<EnableCOMDATFolding>true</EnableCOMDATFolding>
148+
<OptimizeReferences>true</OptimizeReferences>
149+
<GenerateDebugInformation>true</GenerateDebugInformation>
150+
</Link>
151+
</ItemDefinitionGroup>
152+
<ItemGroup>
153+
<ClCompile Include="Vocals.cpp" />
154+
</ItemGroup>
155+
<ItemGroup>
156+
<ClInclude Include="Vocals.h" />
157+
</ItemGroup>
158+
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
159+
<ImportGroup Label="ExtensionTargets">
160+
</ImportGroup>
161+
</Project>

Vocals/Vocals.vcxproj.filters

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+
<ItemGroup>
4+
<ClCompile Include="Vocals.cpp" />
5+
</ItemGroup>
6+
<ItemGroup>
7+
<ClInclude Include="Vocals.h" />
8+
</ItemGroup>
9+
</Project>

0 commit comments

Comments
 (0)