aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Input/in_wave/extensions.cpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Plugins/Input/in_wave/extensions.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-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.cpp183
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;
+}