Интерфейс управления устройствами MCI (Media Control Interface) - Проигрывание WAV файла из памяти
ОГЛАВЛЕНИЕ
Страница 7 из 7
Проигрывание WAV файла из памяти
> Hello ig,
> Помогите разобраться с таким вопросом
> необходимо проиграть фрагмент из .wav файла
> я прочитал его в буфер
> char pbuf[100];
> UINT nBytesRead = cfile.Read( pbuf, 100 );
> как я могу проиграть его с помощью PlaySound
>
> --
Увы, вынужден разочаровать, в таком виде ничего не получится. В принципе, PlaySound действительно может проигрывать wav-ы из памяти, но при этом подразумевается, что изображение звука в памяти имеет правильный формат (т.е. снабжено заголовком с указанием формата, затем следует собственно блок данных и т.д.). То-есть если ты прочитаешь wav-файл в память ЦЕЛИКОМ, то он честно проиграется командой:
PlaySound( pbuf, NULL, SND_MEMORY );
но если в буфере находится лишь часть файла, функция выдаст ошибку, поскольку эта часть имеет "неправильный" формат.
Одно из решений - использование MCI функций. В качестве примера приведу работающий кусок из программы (я его несколько упростил для примера):
MCIERROR mciError;
MCI_OPEN_PARMS mciOpenParms;
mciOpenParms.lpstrDeviceType = "waveaudio";
mciOpenParms.lpstrElementName = "sound38.wav";
if (mciError = mciSendCommand(0, MCI_OPEN,
MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,
(DWORD)(LPMCI_OPEN_PARMS)&mciOpenParms))
{
AfxMessageBox("Can't open");
} else {
MCIDEVICEID mciDeviceID;
mciDeviceID = mciOpenParms.wDeviceID;
MCI_PLAY_PARMS mciPlayParms;
mciPlayParms.dwFrom = 300;
mciPlayParms.dwTo = 600;
if (mciError = mciSendCommand(mciDeviceID, MCI_PLAY,
MCI_FROM | MCI_TO | MCI_WAIT, (DWORD)(LPMCI_PLAY_PARMS)&mciPlayParms))
{
AfxMessageBox("Can't play");
}
if (mciError = mciSendCommand(mciDeviceID, MCI_CLOSE, NULL, NULL))
{
AfxMessageBox("Can't close");
}
}
Где:
- "sound38.wav" - звуковой файл
- mciPlayParms.dwFrom = 300; - начало проигрываемого участка (в миллисекундах)
- mciPlayParms.dwTo = 600; - его конец.