diff options
| author | nakeee <nakeee@gmail.com> | 2009-03-25 19:03:32 +0000 |
|---|---|---|
| committer | nakeee <nakeee@gmail.com> | 2009-03-25 19:03:32 +0000 |
| commit | 8cfc83259909ee3b64f7062ce23d4e513a36bafe (patch) | |
| tree | 3fb62d0a9906cf2cc6cb0c4b1eaca9f4c6e19243 /Source/Core/AudioCommon/Src/WaveFile.cpp | |
| parent | fd3ca6789503e7bbb085d311c9743bae5de83cb7 (diff) | |
moved wavefile to audiocommon, you might need to add audiocommon include/lib paths to DSP-LLE on windows
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@2753 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/AudioCommon/Src/WaveFile.cpp')
| -rw-r--r-- | Source/Core/AudioCommon/Src/WaveFile.cpp | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/Source/Core/AudioCommon/Src/WaveFile.cpp b/Source/Core/AudioCommon/Src/WaveFile.cpp new file mode 100644 index 0000000000..500cce8fbc --- /dev/null +++ b/Source/Core/AudioCommon/Src/WaveFile.cpp @@ -0,0 +1,134 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Common.h" +#include "WaveFile.h" + +enum {BUF_SIZE = 32*1024}; + +WaveFileWriter::WaveFileWriter() +{ + conv_buffer = 0; + skip_silence = false; +} + +WaveFileWriter::~WaveFileWriter() +{ + delete [] conv_buffer; + Stop(); +} + +bool WaveFileWriter::Start(const char *filename) +{ + if (!conv_buffer) + conv_buffer = new short[BUF_SIZE]; + + // Check if the file is already open + if (file) + { + PanicAlert("The file %s was alrady open, the file header will not be written.", filename); + return false; + } + + file = fopen(filename, "wb"); + if (!file) + { + PanicAlert("The file %s could not be opened for writing. Please check if it's already opened by another program.", filename); + return false; + } + + // --------------------------------------------------------- + // Write file header + // --------------- + Write4("RIFF"); + Write(100 * 1000 * 1000); // write big value in case the file gets truncated + Write4("WAVE"); + Write4("fmt "); + Write(16); // size of fmt block + Write(0x00020001); //two channels, uncompressed + //const u32 sample_rate = 32000; + const u32 sample_rate = 48000; + Write(sample_rate); + Write(sample_rate * 2 * 2); //two channels, 16bit + Write(0x00100004); + Write4("data"); + Write(100 * 1000 * 1000 - 32); + // We are now at offset 44 + if (ftell(file) != 44) + PanicAlert("wrong offset: %i", ftell(file)); + // --------------------------- + + return true; +} + +void WaveFileWriter::Stop() +{ + if (!file) + return; + // u32 file_size = (u32)ftell(file); + fseek(file, 4, SEEK_SET); + Write(audio_size + 36); + fseek(file, 40, SEEK_SET); + Write(audio_size); + fclose(file); + file = 0; +} + +void WaveFileWriter::Write(u32 value) +{ + fwrite(&value, 4, 1, file); +} + +void WaveFileWriter::Write4(const char *ptr) +{ + fwrite(ptr, 4, 1, file); +} + +void WaveFileWriter::AddStereoSamples(const short *sample_data, int count) +{ + if (!file) + PanicAlert("WaveFileWriter - file not open."); + if (skip_silence) { + bool all_zero = true; + for (int i = 0; i < count * 2; i++) + if (sample_data[i]) all_zero = false; + if (all_zero) return; + } + fwrite(sample_data, count * 4, 1, file); + audio_size += count * 4; +} + +void WaveFileWriter::AddStereoSamplesBE(const short *sample_data, int count) +{ + if (!file) + PanicAlert("WaveFileWriter - file not open."); + if (count > BUF_SIZE * 2) + PanicAlert("WaveFileWriter - buffer too small (count = %i).", count); + if (skip_silence) { + bool all_zero = true; + for (int i = 0; i < count * 2; i++) + if (sample_data[i]) + all_zero = false; + if (all_zero) + return; + } + for (int i = 0; i < count * 2; i++) { + conv_buffer[i] = Common::swap16((u16)sample_data[i]); + } + fwrite(conv_buffer, count * 4, 1, file); + audio_size += count * 4; +} |
