C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 8 - Проигрывание WAV файла из памяти / MCI / Visual C++

Шаг 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");
	}
}

Где:

  • "sound38.wav" - звуковой файл
  • mciPlayParms.dwFrom = 300; - начало проигрываемого участка (в миллисекундах)
  • mciPlayParms.dwTo = 600; - его конец.

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


|
Автор Владимир Потапов.
[AD]