123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- #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;
- }
|