Открываю MP3 файл, проигрываю. При попытке сделать MCI_STOP или MCI_SEEK получаю ошибку: MCIERR_ILLEGAL_FOR_AUTO_OPEN "Cannot carry out the specified command on an auto-opened device. Wait until the device is closed, and then try again.". Что не так?
MCI_OPEN_PARMS op;
memset(&op, 0, sizeof(MCI_OPEN_PARMS));
op.dwCallback = NULL;
op.lpstrDeviceType = reinterpret_cast<wchar_t*>(MCI_ALL_DEVICE_ID);
op.lpstrElementName = L"c:\myfile.mp3"
op.lpstrAlias = NULL;
mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT|MCI_WAIT,(DWORD)&op);
pDevice=op.wDeviceID;
MCI_SET_PARMS msp;
memset(&msp, 0, sizeof(MCI_SET_PARMS));
msp.dwTimeFormat = MCI_FORMAT_MILLISECONDS;
mciSendCommand(pDevice, MCI_SET,MCI_SET_TIME_FORMAT, reinterpret_cast<DWORD>(&msp);
MCI_PLAY_PARMS pp;
pp.dwCallback = (DWORD_PTR)wnd;//это моё окно
mciSendCommand(pDevice, MCI_PLAY, MCI_NOTIFY, (DWORD)&pp);
//когда проигрывание заканчивается:
if((int)wParam==MCI_NOTIFY_SUCCESSFUL)
{
MCI_SEEK_PARMS params;
params.dwCallback = 0;
mciSendCommand(pDevice, MCI_SEEK, MCI_WAIT|MCI_SEEK_TO_START,(DWORD)¶ms);//вот здесь получаю MCIERR_ILLEGAL_FOR_AUTO_OPEN
//если попытаться перед MCI_SEEK сделать MCI_STOP, то MCI_STOP вернёт ту же ошибку
}
Разобрался.
Причина была в многопоточности. MCI_OPEN и MCI_PLAY делались в одном потоке (поток TAPI-сообщений), а MCI_SEEK в другом (поток главного окна приложения).
Исправил, теперь все действия делаются в оконном потоке. Если нужно что-то сделать в другом потоке, то я делаю так:
#define MYWM_PLAY=WM_USER+1
...
PostMessage(hwndMain, MYWM_PLAY,0,0)
...
//нужные действия делаю в главном потоке в обработчике MYWM_PLAY