Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.02.2015, 13:10   #1
WebbMan
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 168
По умолчанию Вывести график оцифрованной (WinApi WAVEFORMATEX) звуковой волны

Здравствуйте. Давайте сразу к делу.
Имеем такую структуру при подготовке к записи звука:
Код:
	WAVEFORMATEX WaveFormat;

	WaveFormat.wFormatTag = WAVE_FORMAT_PCM;
	WaveFormat.nChannels = 1;
	WaveFormat.nSamplesPerSec = 16000L;
	WaveFormat.nBlockAlign = 2;
	WaveFormat.nAvgBytesPerSec = WaveFormat.nSamplesPerSec*WaveFormat.nBlockAlign;
	WaveFormat.wBitsPerSample = 16;
	WaveFormat.cbSize = 0;
И структуру WAVEHDR WaveHdr, куда в поле lpData собственно пишется оцифрованный звук.
Код:
	ULONG BufferSize = WaveFormat.nBlockAlign*WaveFormat.nSamplesPerSec*5;
	
	WaveHdr.lpData = new CHAR[BufferSize];
	WaveHdr.dwBufferLength = BufferSize;
	WaveHdr.dwFlags = WHDR_PREPARED;
	WaveHdr.dwUser = 0;
Я хочу вывести график звука (пусть будет на 600 пикселей), вывожу так:
Код:
		MoveToEx(hdc, 200, 100, NULL); //сделать текущими координаты x1, y1
		for(int i = 0; i < 600; i++)
		{
			int sum = 0;
			for(int j = i*266; j < i*266+266; j++)
			{
				sum += WaveHdr.lpData[j];
			}
			sum /= 266;
			LineTo(hdc, 200+i, sum+100);
		}
Но что-то у меня возникают подозрения в правильности вывода графика, оттого, что мне не совсем ясно в какой последовательности лежат данные в WaveHdr.lpData
WebbMan вне форума Ответить с цитированием
Старый 05.02.2015, 13:54   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Начнем с того, что lpData - это указатель на char а данные - short.
Остается только выяснить, short или unsinged short.

Константу 266 наверно надо бы вычислять по ходу...
waleri вне форума Ответить с цитированием
Старый 05.02.2015, 14:13   #3
WebbMan
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 168
По умолчанию

Цитата:
Константу 266 наверно надо бы вычислять по ходу...
Да, это мне понятно, я набросал код за 5 минут чтобы проверить выведется ли то, что я хочу.
WebbMan вне форума Ответить с цитированием
Старый 05.02.2015, 14:32   #4
WebbMan
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 168
По умолчанию

Я записываю звук, при этом делая пять хлопков, получаю вот такой график

Вроде всё правдоподобно, но у меня всё равно возникают сомнения в правильности вывода графика.
WebbMan вне форума Ответить с цитированием
Старый 05.02.2015, 16:21   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Ну, если не брать во внимание направление хлопков, то похоже на правду

Поексперементируйте на тему знаковые/беззнаковые данные...
waleri вне форума Ответить с цитированием
Старый 06.02.2015, 11:20   #6
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Я вот так выводил:
Код:
         int i;
         SHORT j;
			WAVEHDR *Hdr = (WAVEHDR *)Msg.lParam;
         waveInUnprepareHeader (In, Hdr, sizeof (*Hdr));
         GetClientRect(DlgWin,&rc);
         PatBlt(wavedc,0,0,1000,500,WHITENESS);
			for(i=0;i<1000;i++)
         	{
            j=((SHORT)Hdr->lpData[i*2+1])<<8;
            MoveToEx(wavedc,i,250,NULL);
				LineTo(wavedc,i,j*250/32768+250);
            }
//         BitBlt(hdc,0,0,1000,500,wavedc,0,0,SRCCOPY);
         StretchBlt(hdc,rc.left,rc.top,rc.right,rc.bottom,wavedc,0,0,1000,500,SRCCOPY);
Давно это было, но насколько помню, это выводится один из каналов, рисунок 1000*500
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru

Последний раз редактировалось alexcoder; 06.02.2015 в 11:25.
alexcoder вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не получается вывести график xcripz Помощь студентам 1 18.10.2011 23:23
Вывести Bitmap на WinAPI apromix Win Api 5 21.08.2011 10:00
Как вывести звук с браузера на все каналы звуковой платы? 198JONNY Операционные системы общие вопросы 3 24.05.2011 16:35
Пример построения звуковой волны snake-as Мультимедиа в Delphi 2 19.10.2008 17:47
Не получается вывести график RECREATOR Общие вопросы Delphi 7 23.12.2007 01:23