AkUInt32 CAkFilePackageLUT::StringMap::GetID( const AkOSChar* in_pszString ) { // Make string lower case. size_t uStrLen = AKPLATFORM::OsStrLen(in_pszString)+1; AkOSChar * pszLowerCaseString = (AkOSChar*)AkAlloca(uStrLen*sizeof(AkOSChar)); AKASSERT( pszLowerCaseString ); AKPLATFORM::SafeStrCpy(pszLowerCaseString, in_pszString, uStrLen ); _MakeLower( pszLowerCaseString ); // 'this' is m_uNumStrings. +1 points to the beginning of the StringEntry array. StringEntry * pTable = (StringEntry*)((AkUInt32*)this + 1); // Binary search: strings are sorted (case sensitive). AkInt32 uTop = 0, uBottom = m_uNumStrings-1; do { AkInt32 uThis = ( uBottom - uTop ) / 2 + uTop; AkOSChar * pString = (AkOSChar*)((AkUInt8*)this + pTable[ uThis ].uOffset); int iCmp = AKPLATFORM::OsStrCmp( pString, pszLowerCaseString ); if ( 0 == iCmp ) return pTable[uThis].uID; else if ( iCmp > 0 ) //in_pTable[ uThis ].pString > pszLowerCaseString uBottom = uThis - 1; else //in_pTable[ uThis ].pString < pszLowerCaseString uTop = uThis + 1; } while ( uTop <= uBottom ); // ID not found. return AK_INVALID_UNIQUE_ID; }
// Find a soundbank ID by its name. // Returns AK_INVALID_FILE_ID if no soundbank LUT is loaded. AkFileID CAkFilePackageLUT::GetSoundBankID( const AkOSChar *in_pszBankName // Soundbank name. ) { // Remove the file extension if it was used. AkUInt32 stringSize = (AkUInt32)AKPLATFORM::OsStrLen( in_pszBankName ) + 1; AkOSChar *pStringWithoutExtension = (AkOSChar *)AkAlloca( (stringSize) * sizeof( AkOSChar ) ); AKPLATFORM::SafeStrCpy( pStringWithoutExtension, in_pszBankName, stringSize ); RemoveFileExtension( pStringWithoutExtension ); // Hash return AK::SoundEngine::GetIDFromString( pStringWithoutExtension ); }