Шаг 8 - Проигрывание 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");
	}
}

Где:

Прислал Igor Galitsky (ig@ntvplus.com.).


Предыдущий Шаг | Оглавление
Автор Владимир Потапов - 28.06.2000