|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Сен 14, 2003 16:39:57 Ну, собственно, сабж. Интересует самый простой подход без использования сторонних библиотек. В MSDN все как-то сложно написано. Плюс там не поймешь, где речь идет о проигрывании миди, а где о миди-интерфейсе и всем что с ним связано:( |
|
|
Дата: Сен 14, 2003 16:49:37 · Поправил: Aquila Из Platform SDK (проигрывание midi через MCI):
DWORD playMIDIFile(HWND hWndNotify, LPSTR lpszMIDIFileName)
{
UINT wDeviceID;
DWORD dwReturn;
MCI_OPEN_PARMS mciOpenParms;
MCI_PLAY_PARMS mciPlayParms;
MCI_STATUS_PARMS mciStatusParms;
MCI_SEQ_SET_PARMS mciSeqSetParms;
// Open the device by specifying the device and filename.
// MCI will attempt to choose the MIDI mapper as the output port.
mciOpenParms.lpstrDeviceType = "sequencer";
mciOpenParms.lpstrElementName = lpszMIDIFileName;
if (dwReturn = mciSendCommand(NULL, MCI_OPEN,
MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,
(DWORD)(LPVOID) &mciOpenParms))
{
// Failed to open device. Don't close it; just return error.
return (dwReturn);
}
// The device opened successfully; get the device ID.
wDeviceID = mciOpenParms.wDeviceID;
// Check if the output port is the MIDI mapper.
mciStatusParms.dwItem = MCI_SEQ_STATUS_PORT;
if (dwReturn = mciSendCommand(wDeviceID, MCI_STATUS,
MCI_STATUS_ITEM, (DWORD)(LPVOID) &mciStatusParms))
{
mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);
return (dwReturn);
}
// The output port is not the MIDI mapper.
// Ask if the user wants to continue.
if (LOWORD(mciStatusParms.dwReturn) != MIDI_MAPPER)
{
if (MessageBox(hMainWnd,
"The MIDI mapper is not available. Continue?",
"", MB_YESNO) == IDNO)
{
// User does not want to continue. Not an error;
// just close the device and return.
mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);
return (0L);
}
}
// Begin playback. The window procedure function for the parent
// window will be notified with an MM_MCINOTIFY message when
// playback is complete. At this time, the window procedure closes
// the device.
mciPlayParms.dwCallback = (DWORD) hWndNotify;
if (dwReturn = mciSendCommand(wDeviceID, MCI_PLAY, MCI_NOTIFY,
(DWORD)(LPVOID) &mciPlayParms))
{
mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);
return (dwReturn);
}
return (0L);
} |
|
|
Дата: Сен 14, 2003 18:16:35 Спасибо большое! Будем пробовать:) |
|
|
Дата: Сен 14, 2003 20:54:18 Aquila Боже, что я вижу, а как же дZен, на asm нужно на asm ;-) |
|
|
Дата: Сен 14, 2003 21:25:25 Итак. Попробовал. Работает. На асм, кстати:) Еще раз спасибо. Но возник другой вопрос: а как можно проигрывать миди из памяти, а не из физического файла на диске? Т.е. меня интересует проигрывание миди из ресурса, например, хотя это и не важно откуда, главное, чтобы момжно было использовать буфер в памяти, а не имя файла (путь к файлу). MCI, насколько я смог разобраться за эти 3 часа, не позволяет ничего подобного, поэтому единственным выходом из ситуации я вижу создание файла на диске по данным ресурса, а потом его проигрывание... Нет ли более простого (и не такого кривого) способа? |
|
|
Дата: Сен 14, 2003 21:34:46 Asterix Боже, что я вижу, а как же дZен, на asm нужно на asm ;-) Надо написать в Микрософт, чтобы приводили примеры на более дзенском языке, чем C ;). |
|
|
Дата: Сен 14, 2003 21:39:30 Создание файла на диске из ресурсов - это как раз самый простой способ, но согласен, не изящный. Из памяти проигрывать файлы можно только с помощью fmod.dll и др. подобными. Но в принципе все эти библиотеки используют WINMM.DLL. |
|
|
Дата: Сен 15, 2003 00:46:09 |
|
|
Дата: Сен 15, 2003 00:58:05 Спасибо The Svin, интересный примерчик. |
|
|
Дата: Сен 15, 2003 18:40:13 Да-да. То самое решение:) Спасибо. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.050 |