Russian Qt Forum
Ноябрь 24, 2024, 00:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: WinApi запись с микрофона в файл данных  (Прочитано 7035 раз)
Firefox
Гость
« : Январь 11, 2011, 14:08 »

Здравствуйте. пытаюсь записать звук с микрофона в файл. но не выходит, в буфер информация не поступает. помогите разобраться пожалуйста.
Код:
//*********
//.cpp
//********
#include "sound_2.h"
using namespace std;
int fact;
#define N2 44100
//WAVEFORMATEX  pcmWaveFormat;
DWORD r_buff[1024];
WAVEHDR  whdr;
HWAVEIN h_out;
HMMIO H_IN;
bool Param_record=0;
MMCKINFO       ckOutRIFF; 
MMCKINFO       ckOut;     
PCMWAVEFORMAT  pcmWaveFormat;
MMIOINFO       mmioinfoOut;   
long         lSamples;  // number of samples

sound_2::sound_2(QWidget *parent, Qt::WFlags flags)
: QWidget(parent, flags)
{
ui.setupUi(this);
CreateWaveFile();
Tim=new QTimer(this);
connect(Tim,SIGNAL(timeout()),SLOT(WriteDataToFile()));
Tim->start(200);

}

sound_2::~sound_2()
{

}
void sound_2::func(bool param)
{
MMRESULT MRez;
MRez=waveInOpen( (LPHWAVEIN)&h_out, WAVE_MAPPER,(LPCWAVEFORMATEX)&pcmWaveFormat, NULL,   NULL, CALLBACK_THREAD);
char* lpDst;
ZeroMemory(&whdr,sizeof(whdr));
lpDst=new char[1024];
whdr.lpData=(LPSTR)lpDst;
whdr.dwFlags= WHDR_BEGINLOOP;
for(int i=0;i<3;i++)
{
waveInPrepareHeader (h_out,&whdr,sizeof(whdr));// подготовка буферов в которые будет записываться информация с микрофона
waveInAddBuffer(h_out,&whdr,sizeof(whdr));
}
// H_IN=mmioOpen(L"Sound1.wav",NULL,MMIO_CREATE|MMIO_WRITE|MMIO_ALLOCBUF );
//mmioWrite(H_IN,lpDst,sizeof(lpDst));
//waveInUnprepareHeader(h_out,&whdr,sizeof(whdr));
// mmioClose(H_IN,NULL);
}
void sound_2::WriteDataToFile()// запись данных из буфера в файл
{
if (Param_record==1)
{
waveInUnprepareHeader(h_out,&whdr,sizeof(whdr)); // блокировка буфера - может не правильно выразилась
writeWaveFile();
waveInPrepareHeader (h_out,&whdr,sizeof(whdr));// подготовка буфера
waveInAddBuffer(h_out,&whdr,sizeof(whdr));
}
}
void sound_2::CreateWaveFile()// Создание структуры звукового файла
{
H_IN=mmioOpen(L"Sound1.wav",NULL,MMIO_CREATE|MMIO_WRITE|MMIO_ALLOCBUF );
// Write the PCMWAVEFORMAT structure
//----------------------------------------------
pcmWaveFormat.wf.wFormatTag=WAVE_FORMAT_PCM;
pcmWaveFormat.wf.nChannels=1;
pcmWaveFormat.wf.nBlockAlign=2;
pcmWaveFormat.wf.nSamplesPerSec=N2;
pcmWaveFormat.wf.nAvgBytesPerSec=N2*2;
pcmWaveFormat.wBitsPerSample=16;

//----------------------------------------------

if (H_IN == NULL)
cout<<"error opening out file "<<endl;

// Write the PCMWAVEFORMAT structure
ckOutRIFF.fccType = mmioFOURCC('W', 'A', 'V', 'E');
if (mmioCreateChunk(H_IN, &ckOutRIFF, MMIO_CREATERIFF) != 0)
cout<<"error creating out file wave "<<endl;

ckOut.ckid = mmioFOURCC('f', 'm', 't', ' ');
if (mmioCreateChunk(H_IN, &ckOut, 0) != 0)
cout<<"error creating out file fmt "<<endl;


if (mmioWrite(H_IN, (HPSTR) &pcmWaveFormat, sizeof(pcmWaveFormat))
!= sizeof(pcmWaveFormat))
cout<<"error writing size of fmt  "<<endl; // cannot write file, probably

if (mmioAscend(H_IN, &ckOut, 0) != 0)
cout<<"error writing size of fmt 2  "<<endl; // cannot write file, probably

ckOut.ckid = mmioFOURCC('d', 'a', 't', 'a');
if (mmioCreateChunk(H_IN, &ckOut, 0) != 0)
cout<<"error creating out file data "<<endl;
}
void sound_2::writeWaveFile()
{

mmioWrite(H_IN,whdr.lpData,sizeof(whdr.lpData));// запись информации в файл
/*for (int lSamples =2*N2; lSamples > 0; lSamples--)
{
if (mmioinfoOut.pchNext == mmioinfoOut.pchEndWrite)
{
mmioinfoOut.dwFlags |= MMIO_DIRTY;
if (mmioAdvance(hmmioOut, &mmioinfoOut, MMIO_WRITE) != 0)
cout<<"error write "<<endl;
}
*(mmioinfoOut.pchNext)++ =pDataEcho[2*N2-lSamples] ;
}*/

}
void sound_2::on_pushButton_clicked(bool nn)// Старт кнопка
{
if (nn==true)
{
func(true);
waveInStart(h_out);
Param_record=1;
}
}


void sound_2::on_pushButton_2_clicked()// Стоп кнопка
{
Param_record=0;
waveInReset(h_out);
if (mmioGetInfo(H_IN, &mmioinfoOut, 0) != 0)
cout<<"error writing data in file "<<endl;
ckOut.cksize = sizeof(pcmWaveFormat)*10; 
mmioinfoOut.dwFlags |= MMIO_DIRTY;
if (mmioSetInfo(H_IN, &mmioinfoOut, 0) != 0)
cout<<"error end "<<endl;

if (mmioAscend(H_IN, &ckOut, 0) != 0)
cout<<"error end "<<endl;

if (mmioAscend(H_IN, &ckOutRIFF, 0) != 0)
cout<<"error end "<<endl;

if (H_IN != NULL)
mmioClose(H_IN, 0);
waveInClose(h_out);
}


//****
//.h
//****
#ifndef SOUND_2_H
#define SOUND_2_H

#include <QtGui/QWidget>
#include "ui_sound_2.h"
#include "Windows.h"
#include "mmsystem.h"
#include <iostream>
#include <QFile>
#include <QTimer>

class sound_2 : public QWidget
{
Q_OBJECT

public:
sound_2(QWidget *parent = 0, Qt::WFlags flags = 0);
~sound_2();
QTimer *Tim;
void func(bool param);
void CreateWaveFile();
void writeWaveFile();

private:
Ui::sound_2Class ui;
WAVEFORMATEX wf;

private slots:
void on_pushButton_2_clicked();
void on_pushButton_clicked(bool nn);
void WriteDataToFile();
};

#endif // SOUND_2_H

Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #1 : Январь 11, 2011, 16:15 »

А обязательно winapi? QAudioInput/QAudioOutput заюзать нет возможности?
« Последнее редактирование: Январь 11, 2011, 17:01 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
Firefox
Гость
« Ответ #2 : Январь 12, 2011, 00:00 »

честно говоря не пробовала и никогда с ними не работала. просто с другими проблемами со звуком разбираюсь с WinApi.попробую завтра
« Последнее редактирование: Январь 12, 2011, 00:14 от Firefox » Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #3 : Январь 12, 2011, 05:10 »

Мне тут посоветовали ffmpeg
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Firefox
Гость
« Ответ #4 : Январь 14, 2011, 19:25 »

пользуюсь версией кт 4.3.3 там нет этих классов. они есть в фононе но не знаю как его интегрировать в студию 2003. подскажите или дайте ссылку на студию 2008 кт 4.5 ато не нашла в интернете чего-то и интегратор ко всему этому.
« Последнее редактирование: Январь 14, 2011, 23:55 от Firefox » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 23.