fork download
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <string>
  5. #include <string_view>
  6. namespace Chanell
  7. {
  8. const unsigned short mono = 1;
  9. const unsigned short stereo = 2;
  10. };
  11.  
  12. struct WavHeader
  13. {
  14. // WAV-формат начинается с RIFF-заголовка:
  15.  
  16. // Содержит символы "RIFF" в ASCII кодировке
  17. // (0x52494646 в big-endian представлении)
  18. char chunkId[4];
  19.  
  20. // 36 + subchunk2Size, или более точно:
  21. // 4 + (8 + subchunk1Size) + (8 + subchunk2Size)
  22. // Это оставшийся размер цепочки, начиная с этой позиции.
  23. // Иначе говоря, это размер файла - 8, то есть,
  24. // исключены поля chunkId и chunkSize.
  25. unsigned long chunkSize;
  26.  
  27. // Содержит символы "WAVE"
  28. // (0x57415645 в big-endian представлении)
  29. char format[4];
  30.  
  31. // Формат "WAVE" состоит из двух подцепочек: "fmt " и "data":
  32. // Подцепочка "fmt " описывает формат звуковых данных:
  33.  
  34. // Содержит символы "fmt "
  35. // (0x666d7420 в big-endian представлении)
  36. char subchunk1Id[4];
  37.  
  38. // 16 для формата PCM.
  39. // Это оставшийся размер подцепочки, начиная с этой позиции.
  40. unsigned long subchunk1Size;
  41.  
  42. // Аудио формат, полный список можно получить здесь http://a...content-available-to-author-only...g.ru/wav_formats.txt
  43. // Для PCM = 1 (то есть, Линейное квантование).
  44. // Значения, отличающиеся от 1, обозначают некоторый формат сжатия.
  45. unsigned short audioFormat;
  46.  
  47. // Количество каналов. Моно = 1, Стерео = 2 и т.д.
  48. unsigned short numChannels;
  49.  
  50. // Частота дискретизации. 8000 Гц, 44100 Гц и т.д.
  51. unsigned long sampleRate;
  52.  
  53. // sampleRate * numChannels * bitsPerSample/8
  54. unsigned long byteRate;
  55.  
  56. // numChannels * bitsPerSample/8
  57. // Количество байт для одного сэмпла, включая все каналы.
  58. unsigned short blockAlign;
  59.  
  60. // Так называемая "глубиная" или точность звучания. 8 бит, 16 бит и т.д.
  61. unsigned short bitsPerSample;
  62.  
  63. // Подцепочка "data" содержит аудио-данные и их размер.
  64.  
  65. // Содержит символы "data"
  66. // (0x64617461 в big-endian представлении)
  67. char subchunk2Id[4];
  68.  
  69. // numSamples * numChannels * bitsPerSample/8
  70. // Количество байт в области данных.
  71. unsigned long subchunk2Size;
  72.  
  73. public:
  74. WavHeader(int channels, unsigned long frequency, unsigned short depth, unsigned long data)
  75. {
  76. memcpy(chunkId, "RIFF", 4);
  77. memcpy(format, "WAVE", 4);
  78. memcpy(subchunk1Id, "fmt ", 4);
  79. memcpy(subchunk2Id, "data", 4);
  80.  
  81. subchunk1Size = 16;
  82. audioFormat = 1;
  83.  
  84. numChannels = channels;
  85. sampleRate = frequency;
  86. bitsPerSample = depth;
  87.  
  88. byteRate = sampleRate * numChannels * bitsPerSample / 8;
  89. blockAlign = numChannels * bitsPerSample / 8;
  90. subchunk2Size = data * numChannels * bitsPerSample / 8;
  91. chunkSize = subchunk2Size + 36;
  92. }
  93.  
  94. // Далее следуют непосредственно Wav данные.
  95. };
  96.  
  97. class WavWriter
  98. {
  99. public:
  100. FILE* file;
  101. WavWriter(WavHeader& head, const char* path)
  102. {
  103. file = fopen(path, "w");
  104.  
  105. char* p = (char*)&head;
  106. for (int i = 0; i < sizeof(WavHeader); i++)
  107. {
  108. putc(*(p++), file);
  109. }
  110. }
  111.  
  112. void write(char* pointer, unsigned long size)
  113. {
  114. for (int i = 0; i < size; i++)
  115. {
  116. putc(*(pointer++), file);
  117. }
  118. }
  119.  
  120. void writeByte(char byte)
  121. {
  122. putc(byte, file);
  123. }
  124. };
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp:5:23: fatal error: string_view: No such file or directory
 #include <string_view>
                       ^
compilation terminated.
stdout
Standard output is empty