Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <Mmreg.h>
- #include "stdafx.h"
- #include <Windows.h>
- #include <mmsystem.h>
- #pragma comment(lib, "winmm.lib")
- using namespace std;
- typedef struct _WAVEHEAD {
- struct {
- char RIFF[4];
- unsigned long Size;
- char WAVE[4]; //okresla format pliku
- } RIFF;
- struct {
- char fmt[4];
- unsigned long BlockSize;
- struct {
- unsigned short AudioFormat;
- unsigned short NumChannels;
- unsigned long SampleRate;
- unsigned long ByteRate;
- unsigned short BlockAlign;
- unsigned short BitsPerSample;
- } Format;
- } fmt;
- struct {
- char data[4];
- unsigned long DataSize;
- } data;
- } WAVEHEAD;
- WAVEFORMATEX WaveFormat; // (1
- HWAVEIN WaveHandle; // (2
- WAVEHDR WaveHeader; // (3
- char* Buffer = NULL; // (4
- unsigned int BufferSize = 0; // (5
- int _tmain(int argc, _TCHAR* argv[])
- {
- unsigned short Channels = 1; //kanałów: 1-mono, 2-stereo
- unsigned long SamplesPerSecond = 22050; //iloc probek na sekunde
- unsigned short BitsPerSample = 8; //rozmar probki
- unsigned long RecordSeconds = 10; //dlugosc nagrania
- WaveFormat.wFormatTag = WAVE_FORMAT_PCM;
- WaveFormat.nChannels = Channels;
- WaveFormat.nSamplesPerSec = SamplesPerSecond;
- WaveFormat.wBitsPerSample = BitsPerSample;
- WaveFormat.nAvgBytesPerSec = SamplesPerSecond * Channels;
- WaveFormat.nBlockAlign = (Channels*BitsPerSample) / 8;
- WaveFormat.cbSize = 0;
- //sprawdzamy, czy sprzęt obsługuje taki format
- int Res = waveInOpen(&WaveHandle, WAVE_MAPPER, &WaveFormat, 0, 0, WAVE_FORMAT_QUERY);
- if (Res == WAVERR_BADFORMAT) return 0;
- //przygotowujemy bufor na nagranie
- BufferSize = RecordSeconds * (BitsPerSample / 8) * SamplesPerSecond * Channels;
- Buffer = new char[BufferSize];
- //przygotowujemy klase WAVEHDR zawierajaca informacje potrzebne windowsowi... [m.in. rozmiar i pointer do buforu]
- WaveHeader.dwBufferLength = BufferSize;
- WaveHeader.dwFlags = 0;
- WaveHeader.lpData = Buffer;
- //przygotowujemy nagłówek:
- Res = waveInPrepareHeader(WaveHandle, &WaveHeader, sizeof(WAVEHDR));
- if (Res){/*komunikat o błędzie*/; if (Buffer) delete Buffer; return 0; }
- Res = waveInAddBuffer(WaveHandle, &WaveHeader, sizeof(WAVEHDR));
- //zaczynamy nagrywanie dzwieku
- Res = waveInStart(WaveHandle);
- if (Res){/*komunikat o niepowodzeniu*/; if (Buffer) delete Buffer; return 0; }
- return 0;
- }
- void TForm1::OnWaveMessage(TMessage& msg)
- {
- if(msg.Msg == MM_WIM_DATA)
- {
- //zamykamy sprzęt
- waveInClose(WaveHandle);
- //zapisujemy plik
- SaveWaveFile("c:\\plik.wav");
- //no i... zwalniamy pamiec
- WaveHeader.lpData = NULL;
- delete[] Buffer;
- Buffer = NULL;
- }
- }
- #include <stdio.h>
- void TForm1::SaveWaveFile(char* FileName)
- {
- //operacja w sumie podobna do odczytu dźwieku, ino w drugą stronę...
- WAVEHEAD WaveHead; //nagłówek pliku
- WaveHead.RIFF.Size = 36 + BufferSize;
- WaveHead.fmt.BlockSize = 16;
- WaveHead.data.DataSize = BufferSize;
- memcpy(&(WaveHead.fmt.Format),&WaveFormat,sizeof(WAVEFORMATEX));
- four(WaveHead.RIFF.RIFF,"RIFF");
- four(WaveHead.RIFF.WAVE,"WAVE");
- four(WaveHead.fmt.fmt ,"fmt ");
- four(WaveHead.data.data,"data");
- //i do pliku z tym
- FILE *plik = fopen(FileName,"w"); //nadpisujemy plik, jesli istnial
- fwrite(&WaveHead,sizeof(WAVEHEAD),1,plik);
- fwrite(Buffer,BufferSize,1,plik);
- fclose(plik);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement