Страница 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; - его конец.
|