mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2024-11-26 11:22:17 -05:00
Added mp3 support for samples
This commit is contained in:
parent
d6eb59d0af
commit
3a65119267
4826
libultraship/libultraship/Lib/dr_libs/mp3.h
Normal file
4826
libultraship/libultraship/Lib/dr_libs/mp3.h
Normal file
File diff suppressed because it is too large
Load Diff
8418
libultraship/libultraship/Lib/dr_libs/wav.h
Normal file
8418
libultraship/libultraship/Lib/dr_libs/wav.h
Normal file
File diff suppressed because it is too large
Load Diff
@ -352,6 +352,9 @@
|
||||
<ClInclude Include="GameOverlay.h" />
|
||||
<ClInclude Include="GameSettings.h" />
|
||||
<ClInclude Include="GameVersions.h" />
|
||||
<ClInclude Include="Lib\dr_libs\flac.h" />
|
||||
<ClInclude Include="Lib\dr_libs\mp3.h" />
|
||||
<ClInclude Include="Lib\dr_libs\wav.h" />
|
||||
<ClInclude Include="Lib\ImGui\backends\imgui_impl_dx11.h" />
|
||||
<ClInclude Include="Lib\ImGui\backends\imgui_impl_win32.h" />
|
||||
<ClInclude Include="Lib\stb\stb_image_write.h" />
|
||||
|
@ -91,6 +91,9 @@
|
||||
<Filter Include="Source Files\CustomImpl\Overlay">
|
||||
<UniqueIdentifier>{3285ab8a-06d8-4dac-9af9-efb2a9723ab1}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\Lib\dr_libs">
|
||||
<UniqueIdentifier>{db6e02cc-fc4c-4138-8219-1d281ad93ec2}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="Factories\MaterialFactory.cpp">
|
||||
@ -650,5 +653,14 @@
|
||||
<ClInclude Include="Factories\AudioFactory.h">
|
||||
<Filter>Header Files\Resources\Factories</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Lib\dr_libs\flac.h">
|
||||
<Filter>Source Files\Lib\dr_libs</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Lib\dr_libs\mp3.h">
|
||||
<Filter>Source Files\Lib\dr_libs</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Lib\dr_libs\wav.h">
|
||||
<Filter>Source Files\Lib\dr_libs</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
@ -93,7 +93,7 @@
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>$(ProjectDir)assets;$(ProjectDir)build;$(ProjectDir)include;$(ProjectDir)src;$(ProjectDir);$(ProjectDir)..\libultraship\libultraship\Lib\libjpeg\include;$(ProjectDir)..\libultraship\libultraship;$(ProjectDir)..\libultraship\libultraship\Lib\spdlog\include;$(ProjectDir)..\ZAPDTR\ZAPDUtils;$(ProjectDir)..\libultraship\libultraship\Lib\Fast3D\U64;$(ProjectDir)..\libultraship\libultraship\Lib\Fast3D\U64\PR;$(ProjectDir)..\libultraship\libultraship\Lib\SDL;$(IncludePath)</IncludePath>
|
||||
<IncludePath>$(ProjectDir)assets;$(ProjectDir)build;$(ProjectDir)include;$(ProjectDir)src;$(ProjectDir);$(ProjectDir)..\libultraship\libultraship\Lib\libjpeg\include;$(ProjectDir)..\libultraship\libultraship;$(ProjectDir)..\libultraship\libultraship\Lib\spdlog\include;$(ProjectDir)..\ZAPDTR\ZAPDUtils;$(ProjectDir)..\libultraship\libultraship\Lib\Fast3D\U64;$(ProjectDir)..\libultraship\libultraship\Lib\Fast3D\U64\PR;$(ProjectDir)..\libultraship\libultraship\Lib\SDL;$(ProjectDir)..\libultraship\libultraship\Lib\dr_libs;$(IncludePath)</IncludePath>
|
||||
<LibraryPath>$(OutDir);$(ProjectDir)..\libultraship\libultraship;$(ProjectDir)..\libultraship\libultraship\Lib\SDL\lib\x64;$(ProjectDir)..\libultraship\libultraship\Lib\GLEW\x64;$(ProjectDir)..\libultraship\libultraship\Lib\GLFW;$(ProjectDir)..\StormLib\bin\StormLib\x64\ReleaseUS\;$(LibraryPath)</LibraryPath>
|
||||
<IntDir>$(Platform)\$(Configuration)Obj\</IntDir>
|
||||
</PropertyGroup>
|
||||
|
@ -26,6 +26,10 @@
|
||||
#include <Cutscene.h>
|
||||
#include <Texture.h>
|
||||
#include "Lib/stb/stb_image.h"
|
||||
#define DRMP3_IMPLEMENTATION
|
||||
#include "Lib/dr_libs/mp3.h"
|
||||
#define DRWAV_IMPLEMENTATION
|
||||
#include "Lib/dr_libs/wav.h"
|
||||
#include "AudioPlayer.h"
|
||||
#include "Enhancements/debugconsole.h"
|
||||
#include "Enhancements/debugger/debugger.h"
|
||||
@ -50,6 +54,12 @@ OTRGlobals::OTRGlobals() {
|
||||
OTRGlobals::~OTRGlobals() {
|
||||
}
|
||||
|
||||
struct ExtensionEntry {
|
||||
std::string path;
|
||||
std::string raw;
|
||||
std::string ext;
|
||||
};
|
||||
|
||||
extern uintptr_t clearMtx;
|
||||
extern "C" Mtx gMtxClear;
|
||||
extern "C" MtxF gMtxFClear;
|
||||
@ -60,6 +70,7 @@ extern "C" int AudioPlayer_Buffered(void);
|
||||
extern "C" int AudioPlayer_GetDesiredBuffered(void);
|
||||
extern "C" void ResourceMgr_CacheDirectory(const char* resName);
|
||||
extern "C" SequenceData ResourceMgr_LoadSeqByName(const char* path);
|
||||
std::unordered_map<std::string, ExtensionEntry> ExtensionCache;
|
||||
|
||||
// C->C++ Bridge
|
||||
extern "C" void OTRAudio_Init()
|
||||
@ -68,6 +79,19 @@ extern "C" void OTRAudio_Init()
|
||||
ResourceMgr_CacheDirectory("audio");
|
||||
}
|
||||
|
||||
extern "C" void OTRExtScanner() {
|
||||
auto lst = *OTRGlobals::Instance->context->GetResourceManager()->ListFiles("*.*").get();
|
||||
|
||||
for (auto& rPath : lst) {
|
||||
std::vector<std::string> raw = StringHelper::Split(rPath, ".");
|
||||
std::string ext = raw[raw.size() - 1];
|
||||
std::string nPath = rPath.substr(0, rPath.size() - (ext.size() + 1));
|
||||
replace(nPath.begin(), nPath.end(), '\\', '/');
|
||||
|
||||
ExtensionCache[nPath] = { rPath, rPath, ext };
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" void InitOTR() {
|
||||
OTRGlobals::Instance = new OTRGlobals();
|
||||
auto t = OTRGlobals::Instance->context->GetResourceManager()->LoadFile("version");
|
||||
@ -84,6 +108,7 @@ extern "C" void InitOTR() {
|
||||
OTRAudio_Init();
|
||||
DebugConsole_Init();
|
||||
Debug_Init();
|
||||
OTRExtScanner();
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
@ -588,6 +613,62 @@ extern "C" SequenceData ResourceMgr_LoadSeqByName(const char* path)
|
||||
|
||||
std::map<std::string, SoundFontSample*> cachedCustomSFs;
|
||||
|
||||
extern "C" SoundFontSample* ReadCustomSample(ExtensionEntry entry) {
|
||||
|
||||
auto sampleRaw = OTRGlobals::Instance->context->GetResourceManager()->LoadFile(entry.path);
|
||||
uint32_t* strem = (uint32_t*)sampleRaw->buffer.get();
|
||||
uint8_t* strem2 = (uint8_t*)strem;
|
||||
|
||||
SoundFontSample* sampleC = new SoundFontSample;
|
||||
|
||||
if (entry.ext == "wav") {
|
||||
drwav wav;
|
||||
drwav_init_memory_with_metadata(&wav, strem2, sampleRaw->dwBufferSize, DRWAV_SEQUENTIAL, NULL);
|
||||
|
||||
drwav_uint32 channels;
|
||||
drwav_uint32 sampleRate;
|
||||
drwav_uint64 totalPcm;
|
||||
drmp3_int16* pcmData = drwav_open_memory_and_read_pcm_frames_s16(strem2, sampleRaw->dwBufferSize, &channels,
|
||||
&sampleRate, &totalPcm, NULL);
|
||||
|
||||
sampleC->size = totalPcm;
|
||||
sampleC->sampleAddr = (uint8_t*)pcmData;
|
||||
sampleC->codec = CODEC_S16;
|
||||
|
||||
sampleC->loop = (AdpcmLoop*)malloc(sizeof(AdpcmLoop));
|
||||
sampleC->loop->start = 0;
|
||||
sampleC->loop->end = sampleC->size - 1;
|
||||
sampleC->loop->count = 0;
|
||||
sampleC->sampleRateMagicValue = 'RIFF';
|
||||
sampleC->sampleRate = sampleRate;
|
||||
|
||||
cachedCustomSFs[entry.raw] = sampleC;
|
||||
return sampleC;
|
||||
} else if (entry.ext == "mp3") {
|
||||
|
||||
drmp3_config mp3Info;
|
||||
drmp3_uint64 totalPcm;
|
||||
drmp3_int16* pcmData =
|
||||
drmp3_open_memory_and_read_pcm_frames_s16(strem2, sampleRaw->dwBufferSize, &mp3Info, &totalPcm, NULL);
|
||||
|
||||
sampleC->size = totalPcm * mp3Info.channels * sizeof(short);
|
||||
sampleC->sampleAddr = (uint8_t*)pcmData;
|
||||
sampleC->codec = CODEC_S16;
|
||||
|
||||
sampleC->loop = (AdpcmLoop*)malloc(sizeof(AdpcmLoop));
|
||||
sampleC->loop->start = 0;
|
||||
sampleC->loop->end = sampleC->size;
|
||||
sampleC->loop->count = 0;
|
||||
sampleC->sampleRateMagicValue = 'RIFF';
|
||||
sampleC->sampleRate = mp3Info.sampleRate;
|
||||
|
||||
cachedCustomSFs[entry.raw] = sampleC;
|
||||
return sampleC;
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
extern "C" SoundFontSample* ResourceMgr_LoadAudioSample(const char* path)
|
||||
{
|
||||
if (std::string(path) == "")
|
||||
@ -596,40 +677,11 @@ extern "C" SoundFontSample* ResourceMgr_LoadAudioSample(const char* path)
|
||||
if (cachedCustomSFs.find(path) != cachedCustomSFs.end())
|
||||
return cachedCustomSFs[path];
|
||||
|
||||
// Check if our file is actually a wav...
|
||||
auto sampleRaw = OTRGlobals::Instance->context->GetResourceManager()->LoadFile(path);
|
||||
uint32_t* strem = (uint32_t*)sampleRaw->buffer.get();
|
||||
uint8_t* strem2 = (uint8_t*)strem;
|
||||
if (ExtensionCache.contains(path)) {
|
||||
SoundFontSample* sample = ReadCustomSample(ExtensionCache[path]);
|
||||
|
||||
if (strem2[0] == 'R' && strem2[1] == 'I' && strem2[2] == 'F' && strem2[3] == 'F')
|
||||
{
|
||||
SoundFontSample* sampleC = (SoundFontSample*)malloc(sizeof(SoundFontSample));
|
||||
|
||||
*strem++; // RIFF
|
||||
*strem++; // size
|
||||
*strem++; // WAVE
|
||||
|
||||
*strem++; // fmt
|
||||
int fmtChunkSize = *strem++;
|
||||
*strem++; // wFormatTag + wChannels
|
||||
int32_t sampleRate = *strem++; // dwSamplesPerSec
|
||||
// OTRTODO: Make sure wav format is what the audio driver wants!
|
||||
|
||||
strem = (uint32_t*)&strem2[0x0C + fmtChunkSize + 8 + 4];
|
||||
sampleC->size = *strem++;
|
||||
sampleC->sampleAddr = (uint8_t*)strem;
|
||||
sampleC->codec = CODEC_S16;
|
||||
|
||||
// OTRTODO: Grab loop data from wav
|
||||
sampleC->loop = (AdpcmLoop*)malloc(sizeof(AdpcmLoop));
|
||||
sampleC->loop->start = 0;
|
||||
sampleC->loop->end = sampleC->size / 2; // OTRTODO: This calculation is probably incorrect... Sometimes it goes past the sample, sometimes it stops too early...
|
||||
sampleC->loop->count = 0;
|
||||
sampleC->sampleRateMagicValue = 'RIFF';
|
||||
sampleC->sampleRate = sampleRate;
|
||||
|
||||
cachedCustomSFs[path] = sampleC;
|
||||
return sampleC;
|
||||
if (sample != nullptr)
|
||||
return sample;
|
||||
}
|
||||
|
||||
auto sample = std::static_pointer_cast<Ship::AudioSample>(
|
||||
|
Loading…
Reference in New Issue
Block a user