Advertisement
Guest User

Untitled

a guest
May 3rd, 2016
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.39 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <Mmreg.h>
  3. #include "stdafx.h"
  4. #include <Windows.h>
  5. #include <mmsystem.h>
  6.  
  7.  
  8. #pragma comment(lib, "winmm.lib")
  9.  
  10. using namespace std;
  11.  
  12. typedef struct _WAVEHEAD {
  13. struct {
  14. char RIFF[4];
  15. unsigned long Size;
  16. char WAVE[4]; //okresla format pliku
  17. } RIFF;
  18. struct {
  19. char fmt[4];
  20. unsigned long BlockSize;
  21. struct {
  22. unsigned short AudioFormat;
  23. unsigned short NumChannels;
  24. unsigned long SampleRate;
  25. unsigned long ByteRate;
  26. unsigned short BlockAlign;
  27. unsigned short BitsPerSample;
  28. } Format;
  29. } fmt;
  30. struct {
  31. char data[4];
  32. unsigned long DataSize;
  33. } data;
  34. } WAVEHEAD;
  35.  
  36. WAVEFORMATEX WaveFormat; // (1
  37. HWAVEIN WaveHandle; // (2
  38. WAVEHDR WaveHeader; // (3
  39. char* Buffer = NULL; // (4
  40. unsigned int BufferSize = 0; // (5
  41.  
  42.  
  43. int _tmain(int argc, _TCHAR* argv[])
  44. {
  45. unsigned short Channels = 1; //kanałów: 1-mono, 2-stereo
  46. unsigned long SamplesPerSecond = 22050; //iloc probek na sekunde
  47. unsigned short BitsPerSample = 8; //rozmar probki
  48. unsigned long RecordSeconds = 10; //dlugosc nagrania
  49.  
  50. WaveFormat.wFormatTag = WAVE_FORMAT_PCM;
  51. WaveFormat.nChannels = Channels;
  52. WaveFormat.nSamplesPerSec = SamplesPerSecond;
  53. WaveFormat.wBitsPerSample = BitsPerSample;
  54. WaveFormat.nAvgBytesPerSec = SamplesPerSecond * Channels;
  55. WaveFormat.nBlockAlign = (Channels*BitsPerSample) / 8;
  56. WaveFormat.cbSize = 0;
  57.  
  58. //sprawdzamy, czy sprzęt obsługuje taki format
  59. int Res = waveInOpen(&WaveHandle, WAVE_MAPPER, &WaveFormat, 0, 0, WAVE_FORMAT_QUERY);
  60. if (Res == WAVERR_BADFORMAT) return 0;
  61.  
  62. //przygotowujemy bufor na nagranie
  63. BufferSize = RecordSeconds * (BitsPerSample / 8) * SamplesPerSecond * Channels;
  64. Buffer = new char[BufferSize];
  65.  
  66. //przygotowujemy klase WAVEHDR zawierajaca informacje potrzebne windowsowi... [m.in. rozmiar i pointer do buforu]
  67. WaveHeader.dwBufferLength = BufferSize;
  68. WaveHeader.dwFlags = 0;
  69. WaveHeader.lpData = Buffer;
  70. //przygotowujemy nagłówek:
  71. Res = waveInPrepareHeader(WaveHandle, &WaveHeader, sizeof(WAVEHDR));
  72. if (Res){/*komunikat o błędzie*/; if (Buffer) delete Buffer; return 0; }
  73.  
  74. Res = waveInAddBuffer(WaveHandle, &WaveHeader, sizeof(WAVEHDR));
  75.  
  76. //zaczynamy nagrywanie dzwieku
  77. Res = waveInStart(WaveHandle);
  78. if (Res){/*komunikat o niepowodzeniu*/; if (Buffer) delete Buffer; return 0; }
  79.  
  80.  
  81. return 0;
  82. }
  83.  
  84. void TForm1::OnWaveMessage(TMessage& msg)
  85. {
  86. if(msg.Msg == MM_WIM_DATA)
  87. {
  88. //zamykamy sprzęt
  89. waveInClose(WaveHandle);
  90. //zapisujemy plik
  91. SaveWaveFile("c:\\plik.wav");
  92. //no i... zwalniamy pamiec
  93. WaveHeader.lpData = NULL;
  94. delete[] Buffer;
  95. Buffer = NULL;
  96. }
  97. }
  98.  
  99. #include <stdio.h>
  100. void TForm1::SaveWaveFile(char* FileName)
  101. {
  102. //operacja w sumie podobna do odczytu dźwieku, ino w drugą stronę...
  103. WAVEHEAD WaveHead; //nagłówek pliku
  104. WaveHead.RIFF.Size = 36 + BufferSize;
  105. WaveHead.fmt.BlockSize = 16;
  106. WaveHead.data.DataSize = BufferSize;
  107. memcpy(&(WaveHead.fmt.Format),&WaveFormat,sizeof(WAVEFORMATEX));
  108. four(WaveHead.RIFF.RIFF,"RIFF");
  109. four(WaveHead.RIFF.WAVE,"WAVE");
  110. four(WaveHead.fmt.fmt ,"fmt ");
  111. four(WaveHead.data.data,"data");
  112.  
  113. //i do pliku z tym
  114. FILE *plik = fopen(FileName,"w"); //nadpisujemy plik, jesli istnial
  115. fwrite(&WaveHead,sizeof(WAVEHEAD),1,plik);
  116. fwrite(Buffer,BufferSize,1,plik);
  117. fclose(plik);
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement