static void ShowFormat(WaveFile& wave, bool details = true) { cout << "Format: " << wave.GetFormatType() << (wave.IsCompressed()? " (compressed)" : " (PCM)") << endl << "Channels: " << wave.GetNumChannels() << endl << "Sample rate: " << wave.GetSampleRate() << endl << "Bytes per second: " << wave.GetBytesPerSecond() << endl << "Bytes per sample: " << wave.GetBytesPerSample() << endl << "Bits per channel: " << wave.GetBitsPerChannel() << endl << "Bytes: " << wave.GetDataLength() << endl << "Samples: " << wave.GetNumSamples() << endl << "Seconds: " << wave.GetNumSeconds() << endl; if(wave.GetFile()) cout << "File pointer: " << ftell(wave.GetFile()) << endl; else cout << "File pointer: null" << endl; if (details) { string type, value; if (wave.GetFirstExtraItem(type, value)) { cout << "Extra data:" << endl; do { cout << " " << type << ": " << value << endl; } while (wave.GetNextExtraItem(type, value)); } wave.ResetToStart(); } pause(); }
bool WaveFile::CopyFrom(WaveFile& other) { const size_t transferBufSize = 4096; if (!writeFile) { error = "Copy to an unopened file"; return false; } else if (!other.readFile) { error = "Copy from an unopened file"; return false; } try { // allocate the transfer buffer char* transferBuffer = new char[transferBufSize]; unsigned long bytesRead = 0; try { if (!other.ResetToStart()) throw error = "Couldn't reset input file to start"; while (bytesRead < other.dataLength) { // calculate the size of the next buffer size_t bytesToRead = (size_t) min(transferBufSize, size_t(other.dataLength - bytesRead)); // read the buffer if (fread(transferBuffer, 1, bytesToRead, other.readFile->filep()) != bytesToRead) throw error = "Error reading samples from input file"; bytesRead += bytesToRead; // write the buffer if (fwrite(transferBuffer, 1, bytesToRead, writeFile) != bytesToRead) throw error = "Error writing samples to output file"; dataLength += bytesToRead; changed = true; } // delete the transfer buffer delete[] transferBuffer; } catch (...) { delete[] transferBuffer; throw error; } } catch (...) { return false; } return true; }