summaryrefslogtreecommitdiff
path: root/Source/Core/AudioCommon/Src/WaveFile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/AudioCommon/Src/WaveFile.cpp')
-rw-r--r--Source/Core/AudioCommon/Src/WaveFile.cpp134
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;
+}