Захотелось воспроизвести миди из памяти, а не из файла на диске. Полазил по папке MASM32\EXAMPLES, но в примерах которые там нашёл сделано также коряво как и у меня: временный файл=>воспроизводим=>удалям файл ... Нашёл процедурку на С++, но дело в том что я ВООБЩЕ не понимаю С, и соответственно не могу даже скомпилировать ASM-листинг... Код (Text): { /* variable for IOProc */ PMMIOPROC pIOProc; HMODULE hModMidiio; /* variables for memory file */ MMIOINFO mmioInfo; CHAR UserBuffer[SIZE_OF_BUFFER]; HMMIO hmmio; /* variables for MCI commands */ MCI_OPEN_PARMS mop; MCI_PLAY_PARMS mpp; /* Open memory file. Provide midi-filled data buffer to MMIO, so * data buffer becomes file image in memory. Also specify that * the data will need to be translated. */ mmioInfo.pchBuffer = UserBuffer; /* Filled with untranslated midi data */ mmioInfo.cchBuffer = SIZE_OF_BUFFER; /* User-defined */ mmioInfo.ulTranslate = MMIO_TRANSLATEDATA | MMIO_TRANSLATEHEADER; /* Need to translate data */ mmioInfo.fccIOProc = mmioFOURCC( 'M', 'I', 'D', 'I');/* Data format */ mmioMemInfo.fccChildIOProc = FOURCC_MEM; /* Storage type */ hmmio = mmioOpen ( NULL, mmioInfo, MMIO_READWRITE ); /* open midi device */ mop.pszElementName = (PSZ) hmmiomem; mciSendCommand( 0, /* We don't know the device yet. */ MCI_OPEN, /* MCI message */ MCI_WAIT | MCI_OPEN_MMIO | MCI_OPEN_TYPE_ID | MCI_OPEN_SHAREABLE (DWORD) mop, /* Parameters for the message */ 0 ); /* Parameter for notify message */ /* play midi memory file for 1 second */ mpp.ulFrom=0; mpp.ulTo=3000; /* default is MMTIME units (1/3000 second) */ mciSendCommand( mop.usDeviceID, /* Device to play the data */ MCI_PLAY, /* MCI message */ MCI_WAIT | MCI_FROM | MCI_TO, /* Flags for the MCI message */ (ULONG) &mpp, /* Parameters for the message */ 0 ); /* No parm necessary */ /* close device */ mciSendCommand( mop.usDeviceID, /* Device to play this */ MCI_CLOSE, /* MCI message */ MCI_WAIT, /* Flags for the MCI message */ (ULONG) NULL, /* Parameters for the message */ (ULONG) NULL ); /* Parameter for notify message */ } Начал "переводить", но застрял на 3 строчке: mmioInfo.ulTranslate = MMIO_TRANSLATEDATA | MMIO_TRANSLATEHEADER в файле windows.inc в структуре MMIOINFO поля ulTranslate нет. Также не понял, что это за константа такая MCI_OPEN_MMIO ??? Вообщем полная попа... Может кто-нибудь переведёт этот кусочек на MASM, здесь вроде не много... Или киньте примерчик воспроизведения миди из памяти на ASM'e.
В инклюдах VC++ .NET тоже нет ulTranslate и MCI_OPEN_MMIO, так что непонятно, что это вообще за функция и для какой ОСи она написана. Я тоже делал через временный файл; согласен, что это коряво и тормозно. Если у кого-то есть работающий пример воспроизведения из памяти, покажите, пожалуйста.
Спасибо за ответы. To Asterix: был я на sources.ru, ничего не нашел.... Если не очень трудно пошурши хардом и кинь сюда примерчик.
Исходник от CBP(я естественно не тестил работоспособность): Код (Text): #define WIN32_LEAN_AND_MEAN #include <dmusici.h> #define IDR_RCDATA_MID 12345 #pragma comment(lib, "dxguid") #pragma comment(lib, "ole32") #pragma comment(lib, "user32") IDirectMusicLoader* g_pLoader = NULL; IDirectMusicPerformance* g_pPerformance = NULL; IDirectMusicSegment* g_pSegment = NULL; int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { CoInitialize(NULL); CoCreateInstance(CLSID_DirectMusicLoader, NULL, CLSCTX_INPROC, IID_IDirectMusicLoader, (void**)&g_pLoader); CoCreateInstance(CLSID_DirectMusicPerformance, NULL, CLSCTX_INPROC, IID_IDirectMusicPerformance, (void**)&g_pPerformance); g_pPerformance->Init(NULL, NULL, NULL); g_pPerformance->AddPort(NULL); HMODULE hModule = GetModuleHandle(NULL); HRSRC hResource = FindResource(hModule, MAKEINTRESOURCE(IDR_RCDATA_MID), RT_RCDATA); HGLOBAL hData = LoadResource(hModule, hResource); DMUS_OBJECTDESC desc = {sizeof(DMUS_OBJECTDESC)}; desc.pbMemData = (BYTE*)LockResource(hData); desc.llMemLength = SizeofResource(hModule, hResource); desc.guidClass = CLSID_DirectMusicSegment; desc.dwValidData = DMUS_OBJ_CLASS | DMUS_OBJ_MEMORY; g_pLoader->GetObject(&desc, IID_IDirectMusicSegment, (void**)&g_pSegment); g_pSegment->SetParam(GUID_Enable_Auto_Download, -1, 0, 0,(void *)g_pPerformance); g_pPerformance->PlaySegment(g_pSegment, 0, 0, NULL); MessageBox(NULL, "Click OK to Stop.", "Playing MIDI...", MB_OK); g_pPerformance->Stop(g_pSegment, NULL, 0, 0); g_pPerformance->CloseDown(); g_pLoader->Release(); g_pPerformance->Release(); g_pSegment->Release(); CoUninitialize(); return 0; } .rc Код (Text): 12345 RCDATA "GIMN2.MID"
Во-первых: Спасибо Asterix !!! Извини что благодарю поздно, но ведь лучше поздно, чем никогда Во-вторых: в архиве лежит пример воспроизведения MIDI-файла из памяти на MASM'e, может кому-нибудь пригодится. _178252655__MIDImemoryPlay.rar