diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Plugins/Input/in_wave/extensions.cpp | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/Plugins/Input/in_wave/extensions.cpp')
-rw-r--r-- | Src/Plugins/Input/in_wave/extensions.cpp | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/Src/Plugins/Input/in_wave/extensions.cpp b/Src/Plugins/Input/in_wave/extensions.cpp new file mode 100644 index 00000000..998c734b --- /dev/null +++ b/Src/Plugins/Input/in_wave/extensions.cpp @@ -0,0 +1,183 @@ +#include "main.h" +#include "resource.h" +#include "config.h" +#include "assert.h" +#include "../Agave/Language/api_language.h" +#include "../nu/AutoWide.h" + +#include <strsafe.h> + +char defaultExtensions[1024] = {0}; +char fileExtensionsString[1200] = {0}; + +int SizeAvailableTypes() +{ + int size = 0; + int numTypes = 0; + + sf_command( 0, SFC_GET_FORMAT_MAJOR_COUNT, &numTypes, sizeof( numTypes ) ); + + SF_FORMAT_INFO info; + for ( int i = 0; i < numTypes; i++ ) + { + info.format = i; + sf_command( 0, SFC_GET_FORMAT_MAJOR, &info, sizeof( info ) ); + size += lstrlenA( info.extension ) + 1 /* ; or \0 */; + //size+=lstrlen(info.name) + 1 /* \0 */; + } + + return size; +} + +int ExtensionExists( const char *ext, const char *extensionList ) +{ + size_t len = lstrlenA( ext ); + char temp[ 20 ] = { 0 }; + const char *s = extensionList; + + while ( s && *s ) + { + lstrcpynA( temp, s, 20 ); + + char *scan = temp; + while ( scan && *scan && *scan != ';' ) + scan = CharNextA( scan ); + + *scan = 0; + + if ( !lstrcmpiA( temp, ext ) ) + return 1; + + s += lstrlenA( temp ); + if ( *s == ';' ) + s = CharNextA( s ); + } + + return 0; +} + +// TODO: sort default extension list +void BuildDefaultExtensions() +{ + // if we want a light extension list, here it is: lstrcpyn(defaultExtensions, "WAV;AIFF;VOC;AU;AIF;AIFC;SND"); + int size = SizeAvailableTypes() + 1; + assert( size < 1024 ); // TODO + + char *extPtr = defaultExtensions; + size_t extPtrCch = 1023; + extPtr[ 0 ] = 0; + + int numTypes = 0; + + sf_command( 0, SFC_GET_FORMAT_MAJOR_COUNT, &numTypes, sizeof( numTypes ) ); + + SF_FORMAT_INFO info = { 0 }; + + for ( int i = 0; i < numTypes; i++ ) + { + info.format = i; + + sf_command( 0, SFC_GET_FORMAT_MAJOR, &info, sizeof( info ) ); + if ( !_strcmpi( info.extension, "mpc" ) ) + continue; + + if ( ExtensionExists( info.extension, defaultExtensions ) ) + continue; + + if ( *CharPrevA( defaultExtensions, extPtr ) ) + StringCchCatExA( extPtr, extPtrCch, ";", &extPtr, &extPtrCch, 0 ); + + StringCchCatExA( extPtr, extPtrCch, info.extension, &extPtr, &extPtrCch, 0 ); + } +} + +void SetFileExtensions( const char *extList ) +{ + ZeroMemory( &fileExtensionsString, sizeof( fileExtensionsString ) ); + + char *end = 0; + + StringCchCopyExA( fileExtensionsString, 1200, extList, &end, 0, 0 ); + StringCchCopyExA( end + 1, 1200, WASABI_API_LNGSTRING( IDS_SOUND_FILES ), 0, 0, 0 ); + + plugin.FileExtensions = fileExtensionsString; +} + +static const wchar_t *pExtList[]={L"AIFF",L"AIF",L"AU",L"AVR",L"CAF",L"HTK",L"IFF",L"MAT",L"PAF",L"PVF",L"RAW",L"RF64",L"SD2",L"SDS",L"SF",L"VOC",L"W64",L"WAV",L"WVE",L"XI"}; +static const int pExtDescIdList[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}; +static const int pExtDescList[] = +{ + IDS_FAMILY_STRING_AAIF, + IDS_FAMILY_STRING_AAIF, + IDS_FAMILY_STRING_AU, + IDS_FAMILY_STRING_AVR, + IDS_FAMILY_STRING_ACA, + IDS_FAMILY_STRING_HMMTS, + IDS_FAMILY_STRING_AAIF, + IDS_FAMILY_STRING_MATLAB, + IDS_FAMILY_STRING_PARIS, + IDS_FAMILY_STRING_PVF, + IDS_FAMILY_STRING_HEADERLESS_RAW, + IDS_FAMILY_STRING_RF64, + IDS_FAMILY_STRING_SDII, + IDS_FAMILY_STRING_RAW_MIDI_SAMPLE_DUMP, + IDS_FAMILY_STRING_IRCAM, + IDS_FAMILY_STRING_CVOC, + IDS_FAMILY_STRING_SFWOW64, + IDS_FAMILY_STRING_MSWAV, + IDS_FAMILY_STRING_MSWAV, + IDS_FAMILY_STRING_FT2WAV, +}; + +BOOL GetExtensionName( LPCWSTR pszExt, LPWSTR pszDest, INT cchDest ) +{ + INT maxCount, index; + DWORD lcid; + SF_FORMAT_INFO info; + + lcid = MAKELCID( MAKELANGID( LANG_ENGLISH, SUBLANG_ENGLISH_US ), SORT_DEFAULT ); + // first scan our list if there is no entry ask libsnd. we do this cause libsnd format description sucks + + for ( index = sizeof( pExtList ) / sizeof( wchar_t * ) - 1; index >= 0 && CSTR_EQUAL != CompareStringW( lcid, NORM_IGNORECASE, pszExt, -1, pExtList[ index ], -1 ); index-- ); + if ( index >= 0 && S_OK == StringCchCopyW( pszDest, cchDest, WASABI_API_LNGSTRINGW( pExtDescList[ pExtDescIdList[ index ] ] ) ) ) return TRUE; + + sf_command( 0, SFC_GET_FORMAT_MAJOR_COUNT, &maxCount, sizeof( maxCount ) ); + for ( index = 0; index < maxCount; index++ ) + { + info.format = index; + sf_command( 0, SFC_GET_FORMAT_MAJOR, &info, sizeof( info ) ); + if ( CSTR_EQUAL == CompareStringW( lcid, NORM_IGNORECASE, pszExt, -1, AutoWide( info.extension ), -1 ) ) + { + INT len1, len2; + len1 = lstrlenA( info.extension ); + len2 = lstrlenA( info.name ); + if ( len2 > len1 ) + { + if ( CSTR_EQUAL == CompareStringA( lcid, NORM_IGNORECASE, info.extension, len1, info.name, len1 ) ) + { + info.name += len1; + len2 -= len1; + } + + if ( len2 > 0 && ' ' == *info.name ) + { + info.name++; + len2--; + } + + if ( len2 > 0 && '(' == *info.name ) + { + info.name++; + len2--; + } + + if ( len2 > 0 && ')' == info.name[ len2 - 1 ] ) + len2--; + } + + return ( S_OK == StringCchCopyNW( pszDest, cchDest, AutoWide( info.name ), len2 ) ); + } + } + + return FALSE; +} |