Интерфейс управления устройствами MCI (Media Control Interface)
Страница 7. Проигрывание WAV файла из памяти


 

Проигрывание 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; - его конец.
 
« Предыдущая статья   Следующая статья »