Advertisement
Guest User

Untitled

a guest
Apr 9th, 2021
30
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.98 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <fstream>
  4. #include <cmath>
  5. class Audio
  6. {
  7. private:
  8. struct RiffHeader
  9. {
  10. char chunkId[4];
  11. int32_t chunkSize;
  12. char format[4];
  13. };
  14. struct FirstSubchunk
  15. {
  16. char id[4];
  17. int32_t size;
  18. int16_t format,
  19. channelsNumber;
  20. int32_t sampleRate,
  21. byteRate;
  22. int16_t blockAlign,
  23. bitsPerSample;
  24. };
  25. struct SecondSubchunk
  26. {
  27. char id[4];
  28. int32_t size;
  29. int16_t *data;
  30. };
  31.  
  32. std::string fileName;
  33. FILE *audioFile;
  34. RiffHeader riffHeader;
  35. FirstSubchunk firstSubchunk;
  36. SecondSubchunk secondSubchunk;
  37.  
  38. public:
  39. Audio(char *fileName)
  40. {
  41. this->fileName = fileName;
  42. audioFile = fopen(fileName, "rb");
  43. if (!audioFile)
  44. {
  45. std::cout << "File error..." << std::endl;
  46. }
  47. else
  48. {
  49. std::fread(&riffHeader, sizeof(riffHeader), 1, audioFile);
  50. std::fread(&firstSubchunk, sizeof(firstSubchunk), 1, audioFile);
  51. std::fread(&secondSubchunk, sizeof(secondSubchunk), 1, audioFile);
  52. int samplesNumber = secondSubchunk.size / firstSubchunk.blockAlign;
  53. secondSubchunk.data = (int16_t *)(realloc(secondSubchunk.data, samplesNumber));
  54. for (size_t i = 0; i < samplesNumber; i++)
  55. {
  56. std::fread(&secondSubchunk.data[i], firstSubchunk.blockAlign, 1, audioFile);
  57. }
  58. }
  59. std::fclose(audioFile);
  60. }
  61.  
  62. void info()
  63. {
  64. std::cout << "Riff header: " << std::endl;
  65. std::cout << "Chunk id: " << riffHeader.chunkId << std::endl;
  66. std::cout << "Chunk size: " << riffHeader.chunkSize << std::endl;
  67. std::cout << "Format: " << riffHeader.format << std::endl;
  68. std::cout << std::endl;
  69.  
  70. std::cout << "First subchunk: " << std::endl;
  71. std::cout << "Id: " << firstSubchunk.id << std::endl;
  72. std::cout << "Size: " << firstSubchunk.size << std::endl;
  73. std::cout << "Format: " << firstSubchunk.format << std::endl;
  74. std::cout << "Channels number: " << firstSubchunk.channelsNumber << std::endl;
  75. std::cout << "Sample rate: " << firstSubchunk.sampleRate << std::endl;
  76. std::cout << "Byte rate: " << firstSubchunk.byteRate << std::endl;
  77. std::cout << "Block align: " << firstSubchunk.blockAlign << std::endl;
  78. std::cout << "Bits per sample: " << firstSubchunk.bitsPerSample << std::endl;
  79. std::cout << std::endl;
  80.  
  81. std::cout << "Second subchunk: " << std::endl;
  82. std::cout << "Id: " << secondSubchunk.id << std::endl;
  83. std::cout << "Size: " << secondSubchunk.size << std::endl;
  84. int answer;
  85. std::cout
  86. << "Print data? (1 - yes, 2 - no)" << std::endl;
  87. std::cin >> answer;
  88. if (answer == 1)
  89. {
  90. std::cout << "Data: " << std::endl;
  91. for (size_t i = 0; i < secondSubchunk.size / firstSubchunk.blockAlign; i++)
  92. {
  93. std::cout << std::setw(8) << secondSubchunk.data[i];
  94. }
  95. }
  96. }
  97.  
  98. void resize(int k)
  99. {
  100. int sampleNumber = secondSubchunk.size / firstSubchunk.blockAlign;
  101. int16_t newData[sampleNumber * k];
  102. for (size_t i = 0; i < sampleNumber; i++)
  103. {
  104. for (size_t j = 0; j < k; j++)
  105. {
  106. newData[k * i + j] = secondSubchunk.data[i];
  107. }
  108. }
  109. secondSubchunk.size *= k;
  110. riffHeader.chunkSize = 36 + secondSubchunk.size;
  111. delete[] secondSubchunk.data;
  112. secondSubchunk.data = newData;
  113. }
  114.  
  115. void save(char *fileName)
  116. {
  117. std::ofstream create(fileName, std::ios::binary);
  118. create.close();
  119. FILE *output = fopen(fileName, "w");
  120. std::fwrite(&riffHeader, sizeof(riffHeader), 1, output);
  121. std::fwrite(&firstSubchunk, sizeof(firstSubchunk), 1, output);
  122. std::fwrite(&secondSubchunk, sizeof(secondSubchunk), 1, output);
  123. for (size_t i = 0; i < secondSubchunk.size / firstSubchunk.blockAlign; i++)
  124. {
  125. std::fwrite(&secondSubchunk.data[i], firstSubchunk.blockAlign, 1, output);
  126. }
  127. std::fclose(output);
  128. }
  129. };
  130.  
  131. int main()
  132. {
  133. char *inputFileName,
  134. *outputFileName;
  135. std::string line;
  136.  
  137. std::cout << "Enter input file name: " << std::endl;
  138. std::getline(std::cin, line);
  139. std::cout << std::endl;
  140.  
  141. inputFileName = line.data();
  142. Audio audio(inputFileName);
  143. audio.info();
  144. std::cout << std::endl;
  145.  
  146. int fileScale = 2;
  147. std::cout << "Enter file scale: " << std::endl;
  148. std::cin >> fileScale;
  149. audio.resize(fileScale);
  150. std::cout << std::endl;
  151.  
  152. line.clear();
  153. std::cout << "Enter output file name: " << std::endl;
  154. std::getline(std::cin, line);
  155.  
  156. outputFileName = line.data();
  157. audio.save(outputFileName);
  158. }
  159.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement