New sound system & removed miles
This commit is contained in:
138
src/AudioLib/Type.cpp
Normal file
138
src/AudioLib/Type.cpp
Normal file
@@ -0,0 +1,138 @@
|
||||
#include "StdAfx.h"
|
||||
#include "Type.h"
|
||||
#include "../EterLib/TextFileLoader.h"
|
||||
|
||||
std::string NSound::strResult;
|
||||
|
||||
const char* NSound::GetResultString()
|
||||
{
|
||||
return strResult.c_str();
|
||||
}
|
||||
|
||||
void NSound::SetResultString(const char* c_pszStr)
|
||||
{
|
||||
strResult.assign(c_pszStr);
|
||||
}
|
||||
|
||||
bool NSound::LoadSoundInformationPiece(const char* c_szFileName, NSound::TSoundDataVector& rSoundDataVector, const char* c_szPathHeader)
|
||||
{
|
||||
std::string strResult;
|
||||
strResult = c_szFileName;
|
||||
|
||||
CTextFileLoader* pkTextFileLoader = CTextFileLoader::Cache(c_szFileName);
|
||||
if (!pkTextFileLoader)
|
||||
return false;
|
||||
|
||||
CTextFileLoader& rkTextFileLoader = *pkTextFileLoader;
|
||||
if (rkTextFileLoader.IsEmpty())
|
||||
{
|
||||
SetResultString((strResult + " Can not open file for reading").c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
rkTextFileLoader.SetTop();
|
||||
|
||||
int iCount;
|
||||
if (!rkTextFileLoader.GetTokenInteger("sounddatacount", &iCount))
|
||||
{
|
||||
SetResultString((strResult + " File format error, SoundDataCount Unable to find.").c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
rSoundDataVector.clear();
|
||||
rSoundDataVector.resize(iCount);
|
||||
|
||||
char szSoundDataHeader[32 + 1];
|
||||
for (uint32_t i = 0; i < rSoundDataVector.size(); ++i)
|
||||
{
|
||||
_snprintf_s(szSoundDataHeader, sizeof(szSoundDataHeader), "sounddata%02d", i);
|
||||
CTokenVector* pTokenVector;
|
||||
if (!rkTextFileLoader.GetTokenVector(szSoundDataHeader, &pTokenVector))
|
||||
{
|
||||
SetResultString((strResult + " File format error: " + szSoundDataHeader + " Unable to find").c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
if (2 != pTokenVector->size())
|
||||
{
|
||||
SetResultString((strResult + " File format error: The size of the vector is not 2").c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
rSoundDataVector[i].fTime = (float)atof(pTokenVector->at(0).c_str());
|
||||
if (c_szPathHeader)
|
||||
{
|
||||
rSoundDataVector[i].strSoundFileName = c_szPathHeader;
|
||||
rSoundDataVector[i].strSoundFileName += pTokenVector->at(1).c_str();
|
||||
}
|
||||
else
|
||||
{
|
||||
rSoundDataVector[i].strSoundFileName = pTokenVector->at(1).c_str();
|
||||
}
|
||||
|
||||
//TraceError("LoadSoundInformation %s -- %f -- %s", c_szFileName, rSoundDataVector[i].fTime, rSoundDataVector[i].strSoundFileName.c_str());
|
||||
}
|
||||
|
||||
SetResultString((strResult + " Loaded").c_str());
|
||||
return true;
|
||||
}
|
||||
|
||||
bool NSound::SaveSoundInformationPiece(const char* c_szFileName, NSound::TSoundDataVector& rSoundDataVector)
|
||||
{
|
||||
if (rSoundDataVector.empty()) // If no data is considered success
|
||||
{
|
||||
if (IsFile(c_szFileName)) // If the data is empty but there is a file
|
||||
{
|
||||
_unlink(c_szFileName); // erase.
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string strResult;
|
||||
strResult = c_szFileName;
|
||||
|
||||
FILE* File = fopen(c_szFileName, "wt");
|
||||
|
||||
if (!File)
|
||||
{
|
||||
char szErrorText[256 + 1];
|
||||
_snprintf_s(szErrorText, sizeof(szErrorText), "Failed to save file (%s).\nPlease check if it is read-only or you have no space on the disk.\n", c_szFileName);
|
||||
LogBox(szErrorText, "Error");
|
||||
SetResultString((strResult + " Cannot open file for writing").c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
fprintf(File, "ScriptType CharacterSoundInformation\n");
|
||||
fprintf(File, "\n");
|
||||
|
||||
fprintf(File, "SoundDataCount %llu\n", rSoundDataVector.size());
|
||||
|
||||
for (uint32_t i = 0; i < rSoundDataVector.size(); ++i)
|
||||
{
|
||||
NSound::TSoundData& rSoundData = rSoundDataVector[i];
|
||||
fprintf(File, "SoundData%02d %f \"%s\"\n", i, rSoundData.fTime, rSoundData.strSoundFileName.c_str());
|
||||
}
|
||||
|
||||
fclose(File);
|
||||
return true;
|
||||
}
|
||||
|
||||
void NSound::DataToInstance(const TSoundDataVector& c_rSoundDataVector, TSoundInstanceVector* pSoundInstanceVector)
|
||||
{
|
||||
if (c_rSoundDataVector.empty())
|
||||
return;
|
||||
|
||||
uint32_t dwFPS = 60;
|
||||
const float c_fFrameTime = 1.0f / float(dwFPS);
|
||||
|
||||
pSoundInstanceVector->clear();
|
||||
pSoundInstanceVector->resize(c_rSoundDataVector.size());
|
||||
for (uint32_t i = 0; i < c_rSoundDataVector.size(); ++i)
|
||||
{
|
||||
const TSoundData& c_rSoundData = c_rSoundDataVector[i];
|
||||
TSoundInstance& rSoundInstance = pSoundInstanceVector->at(i);
|
||||
|
||||
rSoundInstance.dwFrame = (uint32_t)(c_rSoundData.fTime / c_fFrameTime);
|
||||
rSoundInstance.strSoundFileName = c_rSoundData.strSoundFileName;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user