MCI: управление проигрыванием MIDI
От: dIcEmAN  
Дата: 08.05.05 14:41
Оценка:
Взял код проигрывания MIDI файла из MSDN здесь

Срабатывает ветка с условием "if (LOWORD(mciStatusParms.dwReturn) != MIDI_MAPPER)" но файл потом воспроизводится нормально.
Проблема в том что когда я во время воспроизведения пытаюсь послать устройству команды MCI_SEEK, MCI_STOP и др. mciSendCommand возвращает код ошибки 12F "Выполнение данной команды для автоматически открываемого устройства невозможно. Дождитесь закрытия устройства и повторите попытку."

Подозреваю что дело в железе и драйверах.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>

10.05.05 19:18: Перенесено модератором из 'WIN API' — Odi$$ey
Re: управление проигрыванием MIDI
От: Stanky  
Дата: 09.05.05 17:05
Оценка:
> Подозреваю что дело в железе и драйверах.
>
А не лучше ли забыть про старый MCI?
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[2]: управление проигрыванием MIDI
От: dIcEmAN  
Дата: 10.05.05 08:11
Оценка:
Здравствуйте, Stanky, Вы писали:

>> Подозреваю что дело в железе и драйверах.

>>
S>А не лучше ли забыть про старый MCI?

Я искал сравнительно простой способ воспроизвести MIDI файл. Это нужно для звукового оформления программы. Подскажите, как это можно сделать по-другому? Желательно средствами WinAPI.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[3]: управление проигрыванием MIDI
От: Stanky  
Дата: 10.05.05 09:07
Оценка: +1
> Подскажите, как это можно сделать по-другому?
>
DirectShow!!!
Для простого воспроизведения достаточно такого:
IGraphBuilder *pGraph;
IMediaControl *pControl;
IMediaEvent *pEvent;

CoInitialize(NULL);
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**) &pGraph);

pGraph->QueryInterface(IID_IMediaControl, (void**) &pControl);
pGraph->QueryInterface(IID_IMediaEvent, (void**) &pEvent);
pGraph->RenderFile(L"*.mid", NULL);
pControl->Run();

long evCode;
pEvent->WaitForCompletion(INFINITE, &evCode);

pControl->Release();
pEvent->Release();
pGraph->Release();
CoUninitialize();
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[4]: управление проигрыванием MIDI
От: dIcEmAN  
Дата: 10.05.05 12:37
Оценка:
Здравствуйте, Stanky, Вы писали:

>> Подскажите, как это можно сделать по-другому?

>>
S>DirectShow!!!
S>Для простого воспроизведения достаточно такого:
S>
S>IGraphBuilder *pGraph;
S>IMediaControl *pControl;
S>IMediaEvent *pEvent;

S>CoInitialize(NULL);
S>CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**) &pGraph);

S>pGraph->QueryInterface(IID_IMediaControl, (void**) &pControl);
S>pGraph->QueryInterface(IID_IMediaEvent, (void**) &pEvent);
S>pGraph->RenderFile(L"*.mid", NULL);
S>pControl->Run();

S>long evCode;
S>pEvent->WaitForCompletion(INFINITE, &evCode);

S>pControl->Release();
S>pEvent->Release();
S>pGraph->Release();
S>CoUninitialize();
S>


Спасибо за пример, все работает. Теперь копаю в сторону DirectMusic.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[5]: управление проигрыванием MIDI
От: Stanky  
Дата: 10.05.05 12:57
Оценка:
> Теперь копаю в сторону DirectMusic.
>
А это-то для чего?
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[6]: управление проигрыванием MIDI
От: dIcEmAN  
Дата: 10.05.05 13:55
Оценка:
Здравствуйте, Stanky, Вы писали:

>> Теперь копаю в сторону DirectMusic.

>>
S>А это-то для чего?

DirectMusic, как я понял, специализируется на проигрывании midi и wav. Это именно то что мне надо. Если использовать объект по прямому назначению возможно удастся затратить меньше ресурсов чем с использованием DirectShow (во время запуска лихо бегут строчки подгружаемых dll в окне отладчика). В любом случае DirectX я не знаю совсем поэтому хотя бы попробую другую реализацию.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[4]: управление проигрыванием MIDI
От: dIcEmAN  
Дата: 10.05.05 14:18
Оценка:
Здравствуйте, Stanky, Вы писали:

>> Подскажите, как это можно сделать по-другому?

>>
S>DirectShow!!!
S>Для простого воспроизведения достаточно такого:
S>
S>IGraphBuilder *pGraph;
S>IMediaControl *pControl;
S>IMediaEvent *pEvent;

S>CoInitialize(NULL);
S>CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**) &pGraph);

S>pGraph->QueryInterface(IID_IMediaControl, (void**) &pControl);
S>pGraph->QueryInterface(IID_IMediaEvent, (void**) &pEvent);
S>pGraph->RenderFile(L"*.mid", NULL);
S>pControl->Run();

S>long evCode;
S>pEvent->WaitForCompletion(INFINITE, &evCode);

S>pControl->Release();
S>pEvent->Release();
S>pGraph->Release();
S>CoUninitialize();
S>


А как можно сделать то же самое с файлом который находится в ресурсах. Как достать файл из ресурсов я знаю, а как его потом воспризвести без временного сохранения на диск?
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[7]: управление проигрыванием MIDI
От: Stanky  
Дата: 10.05.05 14:39
Оценка:
> Если использовать объект по прямому назначению возможно удастся затратить
> меньше ресурсов чем с использованием DirectShow
>
Но будет больше гемороя, так как ты сам говоришь, что DirectX не знаешь!!!

> В любом случае DirectX я не знаю совсем поэтому хотя бы попробую другую

> реализацию.
>
Не понял!!!
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[5]: управление проигрыванием MIDI
От: Stanky  
Дата: 10.05.05 14:39
Оценка:
> Как достать файл из ресурсов я знаю, а как его потом воспризвести без
> временного сохранения на диск?
>
С DirectShow наверное никак, а вот с DirectMusic скорее всего способ есть, так как DirectShow — это обёртка над DirectDraw, DirectMusic!!!


P. S. Тебе лучше обратиться в форум мультимедиа — там такие вещи разбираются!!!
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[6]: управление проигрыванием MIDI
От: Stanky  
Дата: 10.05.05 14:47
Оценка:
> С DirectShow наверное никак
>
Хотя вообще-то можно написать свой SourceFilter и файл не потребуется!!!
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[6]: управление проигрыванием MIDI
От: dIcEmAN  
Дата: 10.05.05 15:14
Оценка:
Здравствуйте, Stanky, Вы писали:

>> Как достать файл из ресурсов я знаю, а как его потом воспризвести без

>> временного сохранения на диск?
>>
S>С DirectShow наверное никак, а вот с DirectMusic скорее всего способ есть, так как DirectShow — это обёртка над DirectDraw, DirectMusic!!!

Интересно. Взял код проигрывания midi-файлов с помощью DirectMusic здесь. Вопреки моим ожиданиям он воспроизводит музыку совершенно по-другому. Иначе звучат инструмены и даже мелодия немного поменялась! Твой пример играет мидяшку вточности как Winamp и на слух это ИМХО лучший вариант.

S>P. S. Тебе лучше обратиться в форум мультимедиа — там такие вещи разбираются!!!


Так и сделаю.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.