📄 tmman32.c
字号:
{
TMIF_STRUCT_DSPOPEN TMIF;
DWORD BytesReturned;
TMIF.ClientHandle = Global.dwClientHandle;
TMIF.DSPNumber = dwDSPNumber;
if ( DeviceIoControl ( Global.hDevice, (DWORD)(TMIF_DIOC_DSPOPEN),
(PVOID)&TMIF, sizeof( TMIF_STRUCT_DSPOPEN),
(PVOID)&TMIF, sizeof( TMIF_STRUCT_DSPOPEN),
&BytesReturned, NULL ) != TRUE )
{
return TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
}
*DSPHandle = TMIF.DSPHandle;
return TMIF.Status;
}
STATUS tmDSPClose ( DWORD dwHandle )
{
TMIF_STRUCT_DSPCLOSE TMIF;
DWORD BytesReturned;
TMIF.ClientHandle = Global.dwClientHandle;
TMIF.DSPHandle = dwHandle;
if ( DeviceIoControl ( Global.hDevice, (DWORD)(TMIF_DIOC_DSPCLOSE),
(PVOID)&TMIF, sizeof( TMIF_STRUCT_DSPCLOSE),
(PVOID)&TMIF, sizeof( TMIF_STRUCT_DSPCLOSE),
&BytesReturned, NULL ) != TRUE )
{
return TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
}
return TMIF.Status;
}
// Task Related API
STATUS tmTaskCreate ( DWORD dwDSPHandle, PTMMAN_TASK_CREATE pTaskAttrib,
PDWORD pdwHandle )
{
TMIF_STRUCT_TASKCREATE TMIF;
DWORD dwBytesReturned;
TMIF.ClientHandle = Global.dwClientHandle;
TMIF.DSPHandle = dwDSPHandle;
TMIF.dwFlags = pTaskAttrib->dwFlags;
TMIF.dwCallback = pTaskAttrib->dwCallback;
TMIF.pvContext = pTaskAttrib->pvContext;
TMIF.dwPriority = pTaskAttrib->dwPriority;
TMIF.dwStackSize = pTaskAttrib->dwStackSize;
strcpy ( TMIF.szTaskFile , pTaskAttrib->szTaskFile );
TMIF.dwArgumentCount = pTaskAttrib->dwArgumentCount;
TMIF.ppbArgumentVector = pTaskAttrib->ppbArgumentVector;
if ( DeviceIoControl ( Global.hDevice, (DWORD)(TMIF_DIOC_TASKCREATE),
(PVOID)&TMIF, sizeof (TMIF_STRUCT_TASKCREATE),
(PVOID)&TMIF, sizeof (TMIF_STRUCT_TASKCREATE),
&dwBytesReturned, NULL ) != TRUE )
{
return TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
}
*pdwHandle = TMIF.TaskHandle;
return TMIF.Status;
}
STATUS tmTaskStart ( DWORD dwHandle )
{
TMIF_STRUCT_TASKSTART TMIF;
DWORD dwBytesReturned;
TMIF.TaskHandle = dwHandle;
TMIF.ClientHandle = Global.dwClientHandle;
if ( DeviceIoControl ( Global.hDevice, (DWORD)(TMIF_DIOC_TASKSTART),
(PVOID)&TMIF, sizeof (TMIF_STRUCT_TASKSTART),
(PVOID)&TMIF, sizeof (TMIF_STRUCT_TASKSTART),
&dwBytesReturned, NULL ) != TRUE )
{
return TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
}
return TMIF.Status;
}
STATUS tmTaskStop ( DWORD dwHandle )
{
TMIF_STRUCT_TASKSTOP TMIF;
DWORD dwBytesReturned;
TMIF.TaskHandle = dwHandle;
TMIF.ClientHandle = Global.dwClientHandle;
if ( DeviceIoControl ( Global.hDevice, (DWORD)(TMIF_DIOC_TASKSTOP),
(PVOID)&TMIF, sizeof (TMIF_STRUCT_TASKSTOP),
(PVOID)&TMIF, sizeof (TMIF_STRUCT_TASKSTOP),
&dwBytesReturned, NULL ) != TRUE )
{
return TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
}
return TMIF.Status;
}
STATUS tmTaskSignal ( DWORD dwHandle, DWORD State )
{
TMIF_STRUCT_TASKSIGNAL TMIF;
DWORD dwBytesReturned;
TMIF.TaskHandle = dwHandle;
TMIF.ClientHandle = Global.dwClientHandle;
TMIF.State = State;
if ( DeviceIoControl ( Global.hDevice, (DWORD)(TMIF_DIOC_TASKSIGNAL),
(PVOID)&TMIF, sizeof (TMIF_STRUCT_TASKSIGNAL),
(PVOID)&TMIF, sizeof (TMIF_STRUCT_TASKSIGNAL),
&dwBytesReturned, NULL ) != TRUE )
{
return TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
}
return TMIF.Status;
}
STATUS tmTaskDestroy ( DWORD dwHandle )
{
TMIF_STRUCT_TASKDESTROY TMIF;
DWORD dwBytesReturned;
TMIF.TaskHandle = dwHandle;
TMIF.ClientHandle = Global.dwClientHandle;
if ( DeviceIoControl ( Global.hDevice, (DWORD)(TMIF_DIOC_TASKDESTROY),
(PVOID)&TMIF, sizeof (TMIF_STRUCT_TASKDESTROY),
(PVOID)&TMIF, sizeof (TMIF_STRUCT_TASKDESTROY),
&dwBytesReturned, NULL ) != TRUE )
{
return TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
}
return TMIF.Status;
}
// Message Interface
STATUS tmMsgCreate ( DWORD dwHandle, PTMMAN_MESSAGE_DESC pMessageAttrib,
PDWORD pdwMessageHandle )
{
TMIF_STRUCT_MSGCREATE TMIF;
DWORD dwBytesReturned;
TMIF.DSPHandle = dwHandle;
TMIF.ClientHandle = Global.dwClientHandle;
TMIF.CallbackFunction = pMessageAttrib->dwCallback;
TMIF.CallbackContext = (DWORD)pMessageAttrib->pvContext;
TMIF.Slots = pMessageAttrib->dwMessageSlots;
TMIF.ChannelID = pMessageAttrib->dwID;
if ( DeviceIoControl ( Global.hDevice, (DWORD)(TMIF_DIOC_MSGCREATE),
(PVOID)&TMIF, sizeof (TMIF_STRUCT_MSGCREATE),
(PVOID)&TMIF, sizeof (TMIF_STRUCT_MSGCREATE),
&dwBytesReturned, NULL ) != TRUE )
{
return TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
}
*pdwMessageHandle = TMIF.MsgHandle;
return TMIF.Status;
}
STATUS tmMsgDestroy ( DWORD dwHandle )
{
TMIF_STRUCT_MSGDESTROY TMIF;
DWORD dwBytesReturned;
TMIF.MsgHandle = dwHandle;
TMIF.ClientHandle = Global.dwClientHandle;
if ( DeviceIoControl ( Global.hDevice, (DWORD)(TMIF_DIOC_MSGDESTROY),
(PVOID)&TMIF, sizeof (TMIF_STRUCT_MSGDESTROY),
(PVOID)&TMIF, sizeof (TMIF_STRUCT_MSGDESTROY),
&dwBytesReturned, NULL ) != TRUE )
{
return TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
}
return TMIF.Status;
}
STATUS tmMsgSend ( DWORD dwHandle, PTMSTD_PACKET pPacket )
{
TMIF_STRUCT_MSGSEND TMIF;
DWORD dwBytesReturned;
TMIF.MsgHandle = dwHandle;
TMIF.Packet = *pPacket;
TMIF.ClientHandle = Global.dwClientHandle;
if ( DeviceIoControl ( Global.hDevice, (DWORD)(TMIF_DIOC_MSGSEND),
(PVOID)&TMIF, sizeof (TMIF_STRUCT_MSGSEND),
(PVOID)&TMIF, sizeof (TMIF_STRUCT_MSGSEND),
&dwBytesReturned, NULL ) != TRUE )
{
return TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
}
return TMIF.Status;
}
// SHARED MEMORY ALLOCAITON AND FREE FUNCTIONS
STATUS tmShmemAllocate ( DWORD DSPHandle, DWORD Flags, DWORD Length,
PVOID *ppLinear, PDWORD pPhysical )
{
TMIF_STRUCT_SHMEMALLOCATE TMIF;
DWORD dwBytesReturned;
TMIF.DSPHandle = DSPHandle;
TMIF.ClientHandle = Global.dwClientHandle;
TMIF.Flags = Flags;
TMIF.Size = Length;
if ( DeviceIoControl ( Global.hDevice, (DWORD)(TMIF_DIOC_SHMEMALLOCATE),
(PVOID)&TMIF, sizeof (TMIF_STRUCT_SHMEMALLOCATE),
(PVOID)&TMIF, sizeof (TMIF_STRUCT_SHMEMALLOCATE),
&dwBytesReturned, NULL ) != TRUE )
{
return TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
}
*ppLinear = TMIF.Linear;
*pPhysical = TMIF.Physical;
return TMIF.Status;
}
STATUS tmShmemFree ( DWORD DSPHandle, PVOID pLinear )
{
TMIF_STRUCT_SHMEMFREE TMIF;
DWORD dwBytesReturned;
TMIF.DSPHandle = DSPHandle;
TMIF.ClientHandle = Global.dwClientHandle;
TMIF.Linear = pLinear;
if ( DeviceIoControl ( Global.hDevice, (DWORD)(TMIF_DIOC_SHMEMFREE),
(PVOID)&TMIF, sizeof (TMIF_STRUCT_SHMEMFREE),
(PVOID)&TMIF, sizeof (TMIF_STRUCT_SHMEMFREE),
&dwBytesReturned, NULL ) != TRUE )
{
return TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
}
return TMIF.Status;
}
STATUS tmDSPExecutableLoad ( DWORD DSPHandle, DWORD dwLoadAddress,
PCHAR pszImagePath, DWORD dwArgCount, PCHAR pArgVector[] )
{
TMIF_STRUCT_DSPEXECUTABLELOAD TMIF;
PTMSTD_MEMORY_BLOCK pSDRAM;
TMMAN_DSP_CAPS DSPCaps;
TMMAN_DSP_INFO DSPInfo;
TMDwnLdr_Status LoaderStatus;
STATUS Status = TMOK;
DWORD ImageSize;
DWORD Alignment;
DWORD ClockSpeed = 0x5f5e100;
DWORD CacheOption = TMDwnLdr_LeaveCachingToDownloader;
PVOID pBuffer;
DWORD BytesXfered;
DWORD AlignedDownloadAddress;
TMDwnLdr_Object_Handle ObjectHandle;
Endian endian;
DWORD HostType = tmWin95Host;
DWORD TargetVersion;
CHAR szDeviceName[0x10];
/* TBD : put error cheking here */
tmDSPGetCaps ( DSPHandle , &DSPCaps );
/* TBD : put error checking here */
tmDSPGetMiscInfo ( DSPHandle , &DSPInfo );
pSDRAM = &DSPCaps.SDRAM;
if ( dwLoadAddress == TMMAN_DEFAULT )
{
dwLoadAddress = DSPCaps.SDRAM.dwPhysical;
}
if ( ( LoaderStatus = TMDwnLdr_load_object_from_file ( pszImagePath,
NULL, &ObjectHandle ) ) != TMDwnLdr_OK )
{
//Status = TM_STATUS ( TMERRTMMAN32_ERR_OPENIMAGEFILEFAIL );
OutputDebugString ( TMDwnLdr_get_last_error (LoaderStatus) );
Status = TM_STATUS ( TMERR(TM_STATUS_HCOMP_TMLD, LoaderStatus) );
goto tmDSPExecutableLoadExit1;
}
if ( ( LoaderStatus = TMDwnLdr_get_endian ( ObjectHandle, &endian ) ) != TMDwnLdr_OK )
{
OutputDebugString ( TMDwnLdr_get_last_error (LoaderStatus) );
Status = TM_STATUS ( TMERR(TM_STATUS_HCOMP_TMLD, LoaderStatus) );
goto tmDSPExecutableLoadExit2;
}
if ( endian != LittleEndian )
{
OutputDebugString( "tmman32:tmDSPExecutableLoad:WARNING:Executable:BIG ENDIAN\n" );
MessageBox ( NULL,
"Executable:BIG ENDIAN",
"TriMedia Manager : tmman32.dll : WARNING",
MB_OK | MB_ICONSTOP | MB_DEFBUTTON1 | MB_APPLMODAL );
}
if ( ( LoaderStatus = TMDwnLdr_resolve_symbol( ObjectHandle,
"_TMMANSharedPatch", DSPInfo.TMMANSharedPhys ) ) != TMDwnLdr_OK )
{
// for future reference store that this target image for this
// board doesn't have libtmman.a linked with it.
DSPInfo.Flags |= TMIF_DSPMISCINFO_SYMBOLNOTPATCHED;
tmDSPSetMiscInfo ( DSPHandle, &DSPInfo );
OutputDebugString( "tmman32:tmDSPExecutableLoad:WARNING:_TMMANSharedPatch:UNDEFINED\n" );
MessageBox ( NULL,
"_TMMANSharedPatch:Variable:UNDEFINED",
"TriMedia Manager : tmman32.dll : WARNING",
MB_OK | MB_ICONSTOP | MB_DEFBUTTON1 | MB_APPLMODAL );
HostType = tmNoHost;
// Status = TM_STATUS ( TMERR(TM_STATUS_HCOMP_TMLD, LoaderStatus) );
// goto tmDSPExecutableLoadExit2;
}
else
{
DSPInfo.Flags &= (~TMIF_DSPMISCINFO_SYMBOLNOTPATCHED);
tmDSPSetMiscInfo ( DSPHandle, &DSPInfo );
}
if ( ( LoaderStatus = TMDwnLdr_get_image_size ( ObjectHandle,
&ImageSize, &Alignment ) ) != TMDwnLdr_OK )
{
Status = TM_STATUS ( TMERR(TM_STATUS_HCOMP_TMLD, LoaderStatus) );
OutputDebugString ( TMDwnLdr_get_last_error (LoaderStatus) );
goto tmDSPExecutableLoadExit2;
}
AlignedDownloadAddress = ( (dwLoadAddress + Alignment -1 ) & ( ~( Alignment - 1 ) ) );
// read in clock speed here
wsprintf ( szDeviceName, "Device.%x", DSPCaps.DSPNumber );
ClockSpeed = GetPrivateProfileInt (
szDeviceName, "ClockSpeed", ClockSpeed, "tmman.ini" );
// read in Cache Option goes here
// the cache options are the same as the values defined in
// TMDownLoader.h this is kind of fucked up because
// TMDownloader enumerate TMDwnLdr_CacheingSupport changes
// the ini file values and hence documentatino will have to
// be update.
wsprintf ( szDeviceName, "Device.%x", DSPCaps.DSPNumber );
CacheOption = GetPrivateProfileInt (
szDeviceName, "CacheOption", CacheOption, "tmman.ini" );
if ( ( LoaderStatus = TMDwnLdr_relocate (
ObjectHandle,
HostType,
(Address)DSPCaps.MMIO.dwPhysical, // mmio base
ClockSpeed,
(Address)AlignedDownloadAddress,
DSPCaps.SDRAM.dwSize,
CacheOption ) ) != TMDwnLdr_OK )
{
OutputDebugString ( TMDwnLdr_get_last_error (LoaderStatus) );
Status = TM_STATUS ( TMERR(TM_STATUS_HCOMP_TMLD, LoaderStatus) );
goto tmDSPExecutableLoadExit2;
}
#ifdef USE_LOADERCOPY
if ( ( LoaderStatus = TMDwnLdr_get_memory_image ( ObjectHandle,
(Address)tmPhysToLin ( AlignedDownloadAddress, &DSPCaps.SDRAM ) ) ) != TMDwnLdr_OK )
{
OutputDebugString ( TMDwnLdr_get_last_error (LoaderStatus) );
Status = TM_STATUS ( TMERR(TM_STATUS_HCOMP_TMLD, LoaderStatus ) );
goto tmDSPExecutableLoadExit2;
}
TMIF.ImageAddr = (DWORD)NULL;
TMIF.ImageSize = 0;
#else
// allocate block of memory on PC for reading file
if ( ( pBuffer = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
ImageSize ) ) == NULL )
{
OutputDebugString( "tmman32:tmDSPExecutableLoad:ImageBufferAlloc:FAIL\n" );
Status = TM_STATUS ( TMMAN32_ERR_MEMALLOCFAIL );
goto tmDSPExecutableLoadExit2;
// maloc error
}
if ( ( LoaderStatus = TMDwnLdr_get_memory_image ( ObjectHandle,
pBuffer ) ) != TMDwnLdr_OK )
{
OutputDebugString ( TMDwnLdr_get_last_error (LoaderStatus) );
Status = TM_STATUS ( TMERR(TM_STATUS_HCOMP_TMLD, LoaderStatus ) );
goto tmDSPExecutableLoadExit2;
}
TMIF.ImageAddr = (DWORD)pBuffer;
TMIF.ImageSize = ImageSize;
#endif
TMIF.DSPHandle = DSPHandle;
TMIF.ClientHandle = Global.dwClientHandle;
TMIF.PhysLoadAddr = AlignedDownloadAddress;
TMIF.ArgC = dwArgCount;
TMIF.ArgV = (DWORD)pArgVector;
/* last known good target version that did not support TargetVersion */
TMIF.TargetMajorVersion = 4; //verGetFileMajorVersion();
TMIF.TargetMinorVersion = 7;//verGetFileMinorVersion();
if ( ( LoaderStatus = TMDwnLdr_get_contents (
ObjectHandle,
"__TMMan_Version",
&TargetVersion ) ) != TMDwnLdr_OK )
{
OutputDebugString ( TMDwnLdr_get_last_error (LoaderStatus) );
}
else
{
// major version = __TMMan_Version[31:16]
// minor version = __TMMan_Version[15:0]
TMIF.TargetMajorVersion = ( ( TargetVersion & 0xffff0000 ) >> 16 ) ;
TMIF.TargetMinorVersion = TargetVersion & ( 0x0000ffff );
}
if ( DeviceIoControl ( Global.hDevice,
(DWORD)(TMIF_DIOC_DSPEXECUTABLELOAD),
(PVOID)&TMIF, sizeof (TMIF_STRUCT_DSPEXECUTABLELOAD),
(PVOID)&TMIF, sizeof (TMIF_STRUCT_DSPEXECUTABLELOAD),
&BytesXfered, NULL ) != TRUE )
{
OutputDebugString( "tmman32:tmDSPExecutableLoad:DevIoCtl:FAIL\n" );
Status = TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
goto tmDSPExecutableLoadExit3;
}
Status = TMIF.Status;
tmDSPExecutableLoadExit3 :
#ifndef USE_LOADERCOPY
HeapFree ( GetProcessHeap() , 0, pBuffer );
#endif
tmDSPExecutableLoadExit2 :
TMDwnLdr_unload_object ( ObjectHandle );
tmDSPExecutableLoadExit1 :
return Status;
}
// DSP FUNCTIONS
STATUS tmDSPGetStatus ( DWORD dwDSPHandle, PDWORD pdwFlags )
{
TMIF_STRUCT_DSPGETSTATUS TMIF;
DWORD dwBytesReturned;
TMIF.DSPHandle = dwDSPHandle;
TMIF.ClientHandle = Global.dwClientHandle;
if ( DeviceIoControl ( Global.hDevice, (DWORD)(TMIF_DIOC_DSPGETSTATUS),
(PVOID)&TMIF, sizeof (TMIF_STRUCT_DSPGETSTATUS),
(PVOID)&TMIF, sizeof (TMIF_STRUCT_DSPGETSTATUS),
&dwBytesReturned, NULL ) != TRUE )
{
return TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
}
*pdwFlags = TMIF.DSPStatus;
return TMIF.Status;
}
STATUS tmDSPGetMiscInfo ( DWORD DSPHandle, PTMMAN_DSP_INFO pDSPInfo )
{
TMIF_STRUCT_DSPMISCINFO TMIF;
DWORD dwBytesReturned;
TMIF.DSPHandle = DSPHandle;
TMIF.ClientHandle = Global.dwClientHandle;
if ( DeviceIoControl ( Global.hDevice, (DWORD)(TMIF_DIOC_DSPGETMISCINFO),
(PVOID)&TMIF, sizeof (TMIF_STRUCT_DSPMISCINFO),
(PVOID)&TMIF, sizeof (TMIF_STRUCT_DSPMISCINFO),
&dwBytesReturned, NULL ) != TRUE )
{
return TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
}
*pDSPInfo = TMIF.Info;
return TMIF.Status;
}
STATUS tmDSPSetMiscInfo ( DWORD DSPHandle, PTMMAN_DSP_INFO pDSPInfo )
{
TMIF_STRUCT_DSPMISCINFO TMIF;
DWORD dwBytesReturned;
TMIF.DSPHandle = DSPHandle;
TMIF.ClientHandle = Global.dwClientHandle;
TMIF.Info = *pDSPInfo;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -