Files
reman3/Rayman_X/cpa/tempgrp/SND/src/Win95/sndfile.c
2024-09-18 02:33:44 +08:00

473 lines
13 KiB
C

#include "SND\snddef.H"
#include "SNDinc.h"
#include "SND.h"
#include <io.h>
#include <fcntl.h>
#include "sndlst2.h"
typedef struct SOUNDDATA_DIRECTORY_ {
char szDirectory[256];
} SOUNDDATA_DIRECTORY;
#define NB_DIRECTORY_MAX 16
static SOUNDDATA_DIRECTORY g_SoundDataDirectoryTab[NB_DIRECTORY_MAX];
static int g_NbSoundDataDirectory=0;
static char g_SoundSoftDirectory[256]=".";
//---------------------------------------------------------------
// SetSoftDirectory:mémorise une chaine décrivant le repértoire des DLL
// Entrée:czDir=chaine à mémoriser
// Sortie:néant
//---------------------------------------------------------------
void SND_CALL SND_fn_vSetSoftDirectory(char* czDir)
{
strcpy(g_SoundSoftDirectory,czDir);
}
//---------------------------------------------------------------
// SetDataDirectory:mémorise une chaine décrivant le repértoire des données sons
// Entrée:czDir=chaine à mémoriser
// Sortie:néant
//---------------------------------------------------------------
char* SND_CALL SND_fn_szGetSoftDirectory(void)
{
return g_SoundSoftDirectory;
}
//---------------------------------------------------------------
// SetDataDirectory:mémorise une chaine décrivant le repértoire des données sons
// Entrée:czDir=chaine à mémoriser
// Sortie:néant
//---------------------------------------------------------------
void SND_CALL SND_fn_vAddDataDirectory(const char* czDir)
{
#ifndef NO_ACP_SOUND
/* version 1:liste dynamic
pSOUNDDATA_DIRECTORY pDir;
pDir=SND_fn_pvMallocSnd(sizeof(SOUNDDATA_DIRECTORY));
strcpy(pDir->szDirectory,czDir);
SNDLST2_M_DynamicInitElement(pDir);
if (!g_bSoundDataDirectoryListInitialized)
{
g_bSoundDataDirectoryListInitialized=TRUE;
SNDLST2_M_DynamicInitAnchor(&g_SoundDataDirectoryList.pList);
}
SNDLST2_M_DynamicAddTail(&g_SoundDataDirectoryList.pList,pDir);
*/
/* version 2:tableau dynamic
if (g_NbSoundDataDirectory)
{
g_SoundDataDirectoryList=(SOUNDDATA_DIRECTORY*)SND_fn_pvReAllocSnd(g_SoundDataDirectoryList,sizeof(SOUNDDATA_DIRECTORY)*(g_NbSoundDataDirectory+1));
}
else
{
g_SoundDataDirectoryList=(SOUNDDATA_DIRECTORY*)SND_fn_pvMallocSnd(sizeof(SOUNDDATA_DIRECTORY)*1);
}
strcpy(g_SoundDataDirectoryList[g_NbSoundDataDirectory].szDirectory,czDir);
*/
if (!SND_fn_bIsDataDirectory(czDir))
{
if (g_NbSoundDataDirectory<NB_DIRECTORY_MAX)
{
strcpy(g_SoundDataDirectoryTab[g_NbSoundDataDirectory].szDirectory,czDir);
g_NbSoundDataDirectory++;
}
else
SND_fn_vDisplayError(E_uwSndMemoryAllocError,"Too many SoundData directories");
}
#endif
}
void SND_CALL SND_fn_vRemoveDataDirectory(const char* czDir)
{
int i;
for (i=0;i<g_NbSoundDataDirectory;i++)
{
if (!stricmp(g_SoundDataDirectoryTab[i].szDirectory,czDir))
break;
}
if (i!=g_NbSoundDataDirectory)
{
if (g_NbSoundDataDirectory)
{
g_NbSoundDataDirectory--;
memcpy(&g_SoundDataDirectoryTab[i],&g_SoundDataDirectoryTab[g_NbSoundDataDirectory],sizeof(SOUNDDATA_DIRECTORY));
//g_SoundDataDirectoryList=SND_fn_pvReAllocSnd(g_SoundDataDirectoryList,sizeof(SOUNDDATA_DIRECTORY)*g_NbSoundDataDirectory);
}
}
}
void SND_CALL SND_fn_vPurgeDataDirectory()
{
/*
if (g_NbSoundDataDirectory)
SND_fn_vFreeSnd(g_SoundDataDirectoryList);
*/
g_NbSoundDataDirectory=0;
}
//---------------------------------------------------------------
// GetOneDataDirectory:copie dans une chaine le n° repértoire des données sons memorisé plus tôt
// Entrée:n=indice du répertoire
// czDir=chaine à mémoriser
// iMaxChar=taille de czDir
// Sortie:FALSE si n invalide; TRUE si OK
//---------------------------------------------------------------
SndBool SND_CALL SND_fn_bGetOneDataDirectory(int id,char* czDir,int iMaxChar)
{
/*
pSOUNDDATA_DIRECTORY pDir;
int i;
SNDLST2_M_DynamicGetElementNumber(&g_SoundDataDirectoryList.pList,pDir,id,i);
if (pDir!=NULL)
{
strncpy(czDir,pDir->szDirectory,iMaxChar);
return TRUE;
}
else
return FALSE;
*/
if (id<g_NbSoundDataDirectory)
{
strncpy(czDir,g_SoundDataDirectoryTab[id].szDirectory,iMaxChar);
return TRUE;
}
else
return FALSE;
}
//---------------------------------------------------------------
// GetNumberOfDataDirectory:donne le nb de directiry de la liste
// Entrée:néant
// Sortie:nb d'élément
//---------------------------------------------------------------
int SND_CALL SND_fn_iGetNumberOfDataDirectory(void)
{
/*return SNDLST2_M_DynamicGetNumberOfElements(&g_SoundDataDirectoryList.pList);*/
return g_NbSoundDataDirectory;
}
//---------------------------------------------------------------
// GetIdDataDirectory:retourne l'id d'un répertoire dans la liste (si il y est)
// Entrée:répertoire
// Sortie:id du repértoire dans la liste (-1 si non présent dans la liste)
//---------------------------------------------------------------
int SND_CALL SND_fn_iGetIdDataDirectory(const char* szDir)
{
/*
pSOUNDDATA_DIRECTORY pDir;
int i;
SNDLST2_M_DynamicForEachElementOf(&g_SoundDataDirectoryList.pList,pDir,i)
{
if (!_stricmp(pDir->szDirectory,szDir))
return i;
}
return -1;
*/
int i;
for (i=0;i<g_NbSoundDataDirectory;i++)
{
if (!_stricmp(g_SoundDataDirectoryTab[i].szDirectory,szDir))
return i;
}
return -1;
}
//---------------------------------------------------------------
// IsDataDirectory:indique si un répertoire fait partie de la liste
// Entrée:répertoire
// Sortie:TRUE si répertoire présent dans la liste, FALSE sinon
//---------------------------------------------------------------
SndBool SND_CALL SND_fn_bIsDataDirectory(const char* szDir)
{
if (SND_fn_iGetIdDataDirectory(szDir)!=-1)
return TRUE;
else
return FALSE;
}
//---------------------------------------------------------------
// Resolve FileName:convertit un nom relatif en nom absolu en cherchant dans la liste
// Entrée:RelativeName=nom court
// Sortie:Absolute=nom complet (avec chemin résolu)
//---------------------------------------------------------------
void SND_CALL SND_fn_vResolveFileName(char* RelativeName,char* AbsoluteName)
{
#ifndef NO_ACP_SOUND
int i;
char name[256];
tdhSndFile hFile;
char texte[256];
/*
pSOUNDDATA_DIRECTORY pDir;
SNDLST2_M_DynamicForEachElementOf(&g_SoundDataDirectoryList.pList,pDir,i)
{
strcpy(name,pDir->szDirectory);
strcat(name,RelativeName);
if ((hFile=SND_fn_hOpenFileReadSnd(name))!=OPENFILESND_FAILED)
{
SND_fn_vCloseFileSnd(hFile);
strcpy(AbsoluteName,name);
return;
}
}
*/
for (i=0;i<g_NbSoundDataDirectory;i++)
{
strcpy(name,g_SoundDataDirectoryTab[i].szDirectory);
strcat(name,RelativeName);
if ((hFile=SND_fn_hOpenFileReadSnd(name))!=OPENFILESND_FAILED)
{
SND_fn_vCloseFileSnd(hFile);
strncpy(AbsoluteName,name,256);
return;
}
}
sprintf(texte,"File %s cannot be found in any DataDirectory",RelativeName);
SND_fn_vDisplayError(E_uwSndCannotOpenFile,texte);
strncpy(AbsoluteName,RelativeName,256);
#endif
}
//----------- Fonctions privées
//---------------------------------------------------------------
// SetCurrentDirectory:modifie le répertoire courant
// Entrée:czDir=nouveau repértoire
// Sortie:TRUE si OK
//---------------------------------------------------------------
SndBool SND_CALL SND_fn_bSetCurrentDirectory(char* czDir)
{
return SetCurrentDirectory(czDir);
}
//---------------------------------------------------------------
// SetDataDirectory:mémorise une chaine décrivant le repértoire des données sons
// Entrée:czDir=chaine à mémoriser
// Sortie:néant
//---------------------------------------------------------------
SndBool SND_CALL SND_fn_bGetCurrentDirectory(char* czDir,int iMaxChar)
{
return GetCurrentDirectory(iMaxChar,czDir);
}
//----------------------------------------------------------------------
// LoadDataInMemAndSwap;charge n octets d'une fichier
// Entrées:
// adr = cible de données à charger
// nb_bytes = nb d'octets à charger
// name = nom absolu du fichier (ou dans répertoire courant)
// offset = offset des données dans le fichier
// swap = TRUE s'il faut byte swappé chaque WORD
// Sortie : True, False suivant la reussite ou non
//---------------------------------------------------------------------
SndBool SND_CALL SND_fn_bLoadDataInMemAndSwap(void* adr,unsigned long ulNbBytes,char* czFileName,unsigned long ulOffset,SndBool bSwap)
{
tdhSndFile hSndFile;
unsigned long ulNbReadBytes = 0;
WORD *pWord;
char Char;
int i;
if ((hSndFile = SND_fn_hOpenFileReadSnd(czFileName))!=OPENFILESND_FAILED)
{
SND_fn_dwSeekFileSnd(hSndFile,ulOffset,FILE_BEGIN);
ulNbReadBytes = SND_fn_dwReadFileSnd(hSndFile,ulNbBytes,adr);
SND_fn_vCloseFileSnd(hSndFile);
}
else
{
return FALSE;
}
//--byte swap
if (bSwap)
{
for (pWord=adr,i=ulNbBytes/2;i>0;pWord++,i--)
{
Char=*(char*)pWord;
*(char*)pWord=*((char*)pWord+1);
*((char*)pWord+1)=Char;
}
}
if (ulNbReadBytes != ulNbBytes)
return FALSE;
else
return TRUE;
}
SndBool SND_CALL SND_fn_bLoadDataInMem(void* adr,unsigned long ulNbBytes,char* czFileName,unsigned long ulOffset)
{
return SND_fn_bLoadDataInMemAndSwap(adr,ulNbBytes,czFileName,ulOffset,FALSE);
}
#ifdef FILE_MODE_C_STANDARD
unsigned long SND_fn_dwFileSndLength(tdhSndFile hSndFile)
{
return (_filelength(hSndFile));
}
tdhSndFile SND_fn_hOpenFileReadSnd(char * czFileName)
{
//tdhSndFile h = 0;
return (_open(czFileName,_O_RDONLY))
/*
if (h = _open(czFileName,dwOpenMode) == -1)
return (OPENFILESND_FAILED);
else
return h;
*/
}
unsigned long SND_fn_dwReadFileSnd(tdhSndFile hSndFile,unsigned long dwNbBytes,void * ptr)
{
return (_read(hSndFile,ptr,dwNbBytes));
}
unsigned long SND_fn_dwWriteFileSnd(tdhSndFile hSndFile,unsigned long dwNbBytes,void * ptr)
{
return (_write(hSndFile,ptr,dwNbBytes));
}
unsigned long SND_fn_dwSeekFileSnd(tdhSndFile hSndFile,unsigned long dwOffset,unsigned long dwOrigin)
{
return (_lseek(hSndFile,dwOffset,dwOrigin));
}
void SND_fn_vCloseFileSnd(tdhSndFile hSndFile)
{
_close(hSndFile);
}
#endif
#ifdef FILE_MODE_C_WIN95
unsigned long SND_CALL SND_fn_dwFileSndLength(tdhSndFile hSndFile)
{
return ((unsigned long)GetFileSize(hSndFile,NULL));
}
//-----------------------------------------------------------------------------
// Ouvre un fichier
// Entrées:csFileName=nom du fichier
// dwOpenMode=OPENFILESND_READ ou OPENFILESND_WRITE
// Retour:handle sur un fichier (OPENFILESND_FAILED si échec)
//-----------------------------------------------------------------------------
tdhSndFile SND_CALL SND_fn_hOpenFileReadSnd(char * czFilename)
{
tdhSndFile h;
LPVOID lpMsgBuf;
char texte[256],texte2[80];
DWORD err;
h = CreateFile(
(LPCTSTR)czFilename, // pointer to name of the file
GENERIC_READ, // access (read-write) mode
FILE_SHARE_READ, // share mode
NULL, // pointer to security descriptor
OPEN_EXISTING, // how to create
0,//FILE_ATTRIBUTE_ARCHIVE, // file attributes
NULL); // handle to file with attributes to copy
if (h==INVALID_HANDLE_VALUE)
{
GetCurrentDirectory(sizeof(texte2),texte2);
err=GetLastError();
if (err!=ERROR_FILE_NOT_FOUND)
{//strange message
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
err,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
// Display the string.
strcpy(texte,czFilename);strcat(texte," -> ");strncat(texte,lpMsgBuf,sizeof(texte)-strlen(texte)-1);
//no more error: caller must display in own warning
//SND_fn_vDisplayError(E_uwSndCannotOpenFile,texte);
// Free the buffer.
LocalFree( lpMsgBuf );
}
}
return h;
}
unsigned long SND_CALL SND_fn_dwReadFileSnd(tdhSndFile hSndFile,unsigned long dwNbBytes,void * ptr)
{
SndBool bResult;
DWORD dwNbBytesRead = 0,err;
bResult = ReadFile(
hSndFile, // handle of file to read
ptr, // address of buffer that receives data
dwNbBytes, // number of bytes to read
&dwNbBytesRead, // address of number of bytes read
NULL); // address of structure for data
if (!bResult)
err=GetLastError();
return (dwNbBytesRead);
}
unsigned long SND_CALL SND_fn_dwWriteFileSnd(tdhSndFile hSndFile,unsigned long dwNbBytes,void * ptr)
{
SndBool bResult;
DWORD dwNbBytesWritten = 0;
bResult = WriteFile(
hSndFile, // handle of file to read
ptr, // address of buffer that receives data
dwNbBytes, // number of bytes to read
&dwNbBytesWritten, // address of number of bytes read
NULL); // address of structure for data
return (dwNbBytesWritten);
}
unsigned long SND_CALL SND_fn_dwSeekFileSnd(tdhSndFile hSndFile,unsigned long dwOffset,unsigned long dwOrigin)
{
return (SetFilePointer(hSndFile, dwOffset, NULL, dwOrigin));
}
void SND_CALL SND_fn_vCloseFileSnd(tdhSndFile hSndFile)
{
CloseHandle(hSndFile);
}
#endif