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 | |
| 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')
| -rw-r--r-- | Source/Core/AudioCommon/AudioCommon.vcproj | 8 | ||||
| -rw-r--r-- | Source/Core/AudioCommon/Src/SConscript | 3 | ||||
| -rw-r--r-- | Source/Core/AudioCommon/Src/WaveFile.cpp | 134 | ||||
| -rw-r--r-- | Source/Core/AudioCommon/Src/WaveFile.h | 55 |
4 files changed, 199 insertions, 1 deletions
diff --git a/Source/Core/AudioCommon/AudioCommon.vcproj b/Source/Core/AudioCommon/AudioCommon.vcproj index 9ceae5f8d7..13bb8daed3 100644 --- a/Source/Core/AudioCommon/AudioCommon.vcproj +++ b/Source/Core/AudioCommon/AudioCommon.vcproj @@ -433,6 +433,14 @@ RelativePath=".\Src\SoundStream.h"
>
</File>
+ <File
+ RelativePath=".\Src\WaveFile.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\Src\WaveFile.h"
+ >
+ </File>
</Files>
<Globals>
</Globals>
diff --git a/Source/Core/AudioCommon/Src/SConscript b/Source/Core/AudioCommon/Src/SConscript index 2fb00f47b7..1d973c66ac 100644 --- a/Source/Core/AudioCommon/Src/SConscript +++ b/Source/Core/AudioCommon/Src/SConscript @@ -3,7 +3,8 @@ Import('env') files = [ - 'AOSoundStream.cpp', + 'AOSoundStream.cpp', + 'WaveFile.cpp', ] env_audiocommon = env.Clone() 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; +} diff --git a/Source/Core/AudioCommon/Src/WaveFile.h b/Source/Core/AudioCommon/Src/WaveFile.h new file mode 100644 index 0000000000..b9a6528155 --- /dev/null +++ b/Source/Core/AudioCommon/Src/WaveFile.h @@ -0,0 +1,55 @@ +// 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/ + +// WaveFileWriter + +// Simple utility class to make it easy to write long 16-bit stereo +// audio streams to disk. +// Use Start() to start recording to a file, and AddStereoSamples to add wave data. +// The float variant will convert from -1.0-1.0 range and clamp. +// Alternatively, AddSamplesBE for big endian wave data. +// If Stop is not called when it destructs, the destructor will call Stop(). + +#ifndef _WAVEFILE_H +#define _WAVEFILE_H + +#include <stdio.h> + +class WaveFileWriter +{ + FILE *file; + bool skip_silence; + u32 audio_size; + short *conv_buffer; + void Write(u32 value); + void Write4(const char *ptr); + +public: + WaveFileWriter(); + ~WaveFileWriter(); + + bool Start(const char *filename); + void Stop(); + + void SetSkipSilence(bool skip) { skip_silence = skip; } + + void AddStereoSamples(const short *sample_data, int count); + void AddStereoSamplesBE(const short *sample_data, int count); // big endian + u32 GetAudioSize() { return audio_size; } +}; + +#endif // _WAVEFILE_H |
