184 lines
4.7 KiB
C++
184 lines
4.7 KiB
C++
|
#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;
|
||
|
}
|