m4n71k0r

Untitled

Oct 20th, 2011
215
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <fstream>
  2. #include <string>
  3. #include <iostream>
  4. #include <vector>
  5. #include <cstring>
  6. #include <sstream>
  7.  
  8. struct WaveHeader
  9. {
  10.     char ChunkID_ [4];
  11.     int ChunkDataSize_;
  12.     char Format_ [4];
  13.     char SubChunk1ID_ [4];
  14.     int SubChunk1Size_;
  15.     short int AudioFormat_;
  16.     short int NumChannels_;
  17.     int SampleRate_;
  18.     int ByteRate_;
  19.     short int BlockAlign_;
  20.     short int BitsPerSample_;
  21.     char SubChank2ID_ [4];
  22.     int SubChank2Size_;
  23. };
  24.  
  25. bool headers_are_same_type(const WaveHeader& header1, const WaveHeader& header2)
  26. {
  27.     return memcmp(&header1, &header2, sizeof(WaveHeader) - sizeof(int)) == 0;
  28. }
  29.  
  30. void load_wav_headers(const std::vector<std::string>& file_names, std::vector<WaveHeader>* wave_headers)
  31. {
  32.     if (wave_headers && file_names.size() > 0)
  33.     {
  34.         wave_headers->clear();
  35.         for (auto file_name : file_names)
  36.         {
  37.             std::ifstream input_file;
  38.             int length = 0;
  39.  
  40.             input_file.open(file_name, std::fstream::binary);
  41.             input_file.seekg (0, std::ios::end);
  42.             length = input_file.tellg();
  43.             if (length > sizeof(WaveHeader))
  44.             {
  45.                 WaveHeader header;
  46.  
  47.                 input_file.seekg (0, std::ios::beg);
  48.                 input_file.read(reinterpret_cast<char*>(&header), sizeof(WaveHeader));
  49.                 wave_headers->push_back(header);
  50.             }
  51.             input_file.close();
  52.         }
  53.     }
  54. }
  55.  
  56. bool headers_are_same_type(const std::vector<std::string>& file_names, std::vector<WaveHeader>* wave_headers)
  57. {
  58.     if (wave_headers && file_names.size() > 0)
  59.     {
  60.         load_wav_headers(file_names, wave_headers);
  61.         if (wave_headers->size() == 1) return true;
  62.         for (auto current_wave_header = wave_headers->begin() + 1; current_wave_header != wave_headers->end(); ++current_wave_header)
  63.             if (!headers_are_same_type(*(wave_headers->begin()), *current_wave_header)) return false;
  64.         return true;
  65.     }
  66.     return false;
  67. }
  68.  
  69. void fill_file_names(std::vector<std::string>* file_names)
  70. {
  71.     if (file_names)
  72.     {
  73.         file_names->clear();
  74.         for (int i = 0; i < 36; ++i)
  75.         {
  76.             std::ostringstream file_name;
  77.  
  78.             file_name << "c:\\!!!test\\" << (i + 1) << ".wav";
  79.             file_names->push_back(file_name.str());
  80.         }
  81.     }
  82. }
  83.  
  84. int calculate_length(const std::vector<WaveHeader>& wave_headers)
  85. {
  86.     int length = 0;
  87.  
  88.     for (auto wave_header : wave_headers)
  89.         length += wave_header.SubChank2Size_;
  90.     return length;
  91. }
  92.  
  93. int main(int argc, char *argv[])
  94. {
  95.     std::vector<std::string> file_names;
  96.     std::vector<WaveHeader> wave_headers;
  97.  
  98.     fill_file_names(&file_names);
  99.     if (headers_are_same_type(file_names, &wave_headers))
  100.     {
  101.         std::cout << "All wav headers are same" << std::endl;
  102.  
  103.         int total_length = calculate_length(wave_headers);
  104.         std::cout << "Total length = " << total_length << "B" << std::endl;
  105.  
  106.         WaveHeader result_header = wave_headers[0];
  107.         result_header.SubChank2Size_ = total_length;
  108.  
  109.         std::ofstream output_file;
  110.         output_file.open("c:\\!!!test\\result.wav", std::fstream::binary);
  111.  
  112.         output_file.write(reinterpret_cast<char*>(&result_header), sizeof(WaveHeader));
  113.  
  114.         for (size_t current_file_index = 0; current_file_index < file_names.size(); ++current_file_index)
  115.         {
  116.             char *input_buffer = new char[wave_headers[current_file_index].SubChank2Size_];
  117.             std::ifstream input_file;
  118.             int read_length;
  119.  
  120.             input_file.open(file_names[current_file_index], std::fstream::binary);
  121.             input_file.seekg(sizeof(WaveHeader), std::ios::beg);
  122.             input_file.read(input_buffer, wave_headers[current_file_index].SubChank2Size_);
  123.             read_length = input_file.gcount();
  124.             std::cout << "\"" << file_names[current_file_index] << "\":" << wave_headers[current_file_index].SubChank2Size_ << ":" << read_length << std::endl;
  125.             output_file.write(input_buffer, read_length);
  126.             input_file.close();
  127.             delete[] input_buffer;
  128.         }
  129.         output_file.close();
  130.     }
  131.     else
  132.         std::cerr << "Where are different types of wav headers!" << std::endl;
  133.     std::cin.get();
  134. }
Advertisement
Add Comment
Please, Sign In to add comment