mirror of https://github.com/PCSX2/pcsx2.git
GregMiscellaneous: spu2x:
* Copy wavfile back to spu2x directory. Note I shrink the file to only usefull feature to keep it small. Rationale: Wavfile is not delivered by the soundtouch library (it is an example). git-svn-id: http://pcsx2.googlecode.com/svn/branches/GregMiscellaneous@3948 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
f4584d3c9c
commit
9b987a959b
|
@ -39,7 +39,7 @@ set(SoundTouchSources
|
||||||
RateTransposer.cpp
|
RateTransposer.cpp
|
||||||
SoundTouch.cpp
|
SoundTouch.cpp
|
||||||
TDStretch.cpp
|
TDStretch.cpp
|
||||||
WavFile.cpp
|
# WavFile.cpp # directly include in spu2x
|
||||||
cpu_detect_x86_gcc.cpp
|
cpu_detect_x86_gcc.cpp
|
||||||
mmx_optimized.cpp
|
mmx_optimized.cpp
|
||||||
sse_optimized.cpp)
|
sse_optimized.cpp)
|
||||||
|
@ -55,7 +55,7 @@ set(SoundTouchHeaders
|
||||||
STTypes.h
|
STTypes.h
|
||||||
SoundTouch.h
|
SoundTouch.h
|
||||||
TDStretch.h
|
TDStretch.h
|
||||||
WavFile.h
|
# WavFile.h # directly include in spu2x
|
||||||
cpu_detect.h)
|
cpu_detect.h)
|
||||||
|
|
||||||
# add library
|
# add library
|
||||||
|
|
|
@ -57,8 +57,9 @@ set(spu2xSources
|
||||||
Spu2replay.cpp
|
Spu2replay.cpp
|
||||||
spu2sys.cpp
|
spu2sys.cpp
|
||||||
Timestretcher.cpp
|
Timestretcher.cpp
|
||||||
#utf8.cpp
|
Wavedump_wav.cpp
|
||||||
Wavedump_wav.cpp)
|
WavFile.cpp
|
||||||
|
)
|
||||||
|
|
||||||
# spu2x headers
|
# spu2x headers
|
||||||
set(spu2xHeaders
|
set(spu2xHeaders
|
||||||
|
@ -75,7 +76,7 @@ set(spu2xHeaders
|
||||||
SndOut.h
|
SndOut.h
|
||||||
spdif.h
|
spdif.h
|
||||||
Spu2replay.h
|
Spu2replay.h
|
||||||
#utf8.h
|
WavFile.h
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,149 @@
|
||||||
|
/* SPU2-X, A plugin for Emulating the Sound Processing Unit of the Playstation 2
|
||||||
|
* Developed and maintained by the Pcsx2 Development Team.
|
||||||
|
*
|
||||||
|
* The file is based on WavFile.h from SoundTouch library.
|
||||||
|
* Original portions are (c) 2009 by Olli Parviainen (oparviai 'at' iki.fi)
|
||||||
|
*
|
||||||
|
* SPU2-X is free software: you can redistribute it and/or modify it under the terms
|
||||||
|
* of the GNU Lesser General Public License as published by the Free Software Found-
|
||||||
|
* ation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* SPU2-X 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 Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with SPU2-X. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Note the file is mostly a copy paste of the WavFile.h from SoundTouch library. It was
|
||||||
|
// shrunken to support only output 16 bits wav files
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <string>
|
||||||
|
#include <cstring>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
#include "WavFile.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
static const char riffStr[] = "RIFF";
|
||||||
|
static const char waveStr[] = "WAVE";
|
||||||
|
static const char fmtStr[] = "fmt ";
|
||||||
|
static const char dataStr[] = "data";
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Class WavOutFile
|
||||||
|
//
|
||||||
|
|
||||||
|
WavOutFile::WavOutFile(const char *fileName, int sampleRate, int bits, int channels)
|
||||||
|
{
|
||||||
|
bytesWritten = 0;
|
||||||
|
fptr = fopen(fileName, "wb");
|
||||||
|
if (fptr == NULL)
|
||||||
|
{
|
||||||
|
string msg = "Error : Unable to open file \"";
|
||||||
|
msg += fileName;
|
||||||
|
msg += "\" for writing.";
|
||||||
|
//pmsg = msg.c_str;
|
||||||
|
throw runtime_error(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
fillInHeader(sampleRate, bits, channels);
|
||||||
|
writeHeader();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
WavOutFile::~WavOutFile()
|
||||||
|
{
|
||||||
|
finishHeader();
|
||||||
|
if (fptr) fclose(fptr);
|
||||||
|
fptr = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void WavOutFile::fillInHeader(uint sampleRate, uint bits, uint channels)
|
||||||
|
{
|
||||||
|
// fill in the 'riff' part..
|
||||||
|
|
||||||
|
// copy string 'RIFF' to riff_char
|
||||||
|
memcpy(&(header.riff.riff_char), riffStr, 4);
|
||||||
|
// package_len unknown so far
|
||||||
|
header.riff.package_len = 0;
|
||||||
|
// copy string 'WAVE' to wave
|
||||||
|
memcpy(&(header.riff.wave), waveStr, 4);
|
||||||
|
|
||||||
|
|
||||||
|
// fill in the 'format' part..
|
||||||
|
|
||||||
|
// copy string 'fmt ' to fmt
|
||||||
|
memcpy(&(header.format.fmt), fmtStr, 4);
|
||||||
|
|
||||||
|
header.format.format_len = 0x10;
|
||||||
|
header.format.fixed = 1;
|
||||||
|
header.format.channel_number = (short)channels;
|
||||||
|
header.format.sample_rate = (int)sampleRate;
|
||||||
|
header.format.bits_per_sample = (short)bits;
|
||||||
|
header.format.byte_per_sample = (short)(bits * channels / 8);
|
||||||
|
header.format.byte_rate = header.format.byte_per_sample * (int)sampleRate;
|
||||||
|
header.format.sample_rate = (int)sampleRate;
|
||||||
|
|
||||||
|
// fill in the 'data' part..
|
||||||
|
|
||||||
|
// copy string 'data' to data_field
|
||||||
|
memcpy(&(header.data.data_field), dataStr, 4);
|
||||||
|
// data_len unknown so far
|
||||||
|
header.data.data_len = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void WavOutFile::finishHeader()
|
||||||
|
{
|
||||||
|
// supplement the file length into the header structure
|
||||||
|
header.riff.package_len = bytesWritten + 36;
|
||||||
|
header.data.data_len = bytesWritten;
|
||||||
|
|
||||||
|
writeHeader();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void WavOutFile::writeHeader()
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
|
||||||
|
// write the supplemented header in the beginning of the file
|
||||||
|
fseek(fptr, 0, SEEK_SET);
|
||||||
|
res = fwrite(&header, sizeof(header), 1, fptr);
|
||||||
|
if (res != 1)
|
||||||
|
{
|
||||||
|
throw runtime_error("Error while writing to a wav file.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// jump back to the end of the file
|
||||||
|
fseek(fptr, 0, SEEK_END);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void WavOutFile::write(const short *buffer, int numElems)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
|
||||||
|
// 16bit format & 16 bit samples
|
||||||
|
|
||||||
|
assert(header.format.bits_per_sample == 16);
|
||||||
|
if (numElems < 1) return; // nothing to do
|
||||||
|
|
||||||
|
res = fwrite(buffer, 2, numElems, fptr);
|
||||||
|
|
||||||
|
if (res != numElems)
|
||||||
|
{
|
||||||
|
throw runtime_error("Error while writing to a wav file.");
|
||||||
|
}
|
||||||
|
bytesWritten += 2 * numElems;
|
||||||
|
}
|
|
@ -0,0 +1,113 @@
|
||||||
|
/* SPU2-X, A plugin for Emulating the Sound Processing Unit of the Playstation 2
|
||||||
|
* Developed and maintained by the Pcsx2 Development Team.
|
||||||
|
*
|
||||||
|
* The file is based on WavFile.h from SoundTouch library.
|
||||||
|
* Original portions are (c) 2009 by Olli Parviainen (oparviai 'at' iki.fi)
|
||||||
|
*
|
||||||
|
* SPU2-X is free software: you can redistribute it and/or modify it under the terms
|
||||||
|
* of the GNU Lesser General Public License as published by the Free Software Found-
|
||||||
|
* ation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* SPU2-X 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 Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with SPU2-X. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Note the file is mostly a copy paste of the WavFile.h from SoundTouch library. It was
|
||||||
|
// shrunken to support only output 16 bits wav files
|
||||||
|
|
||||||
|
#ifndef WAVFILE_H
|
||||||
|
#define WAVFILE_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#ifndef uint
|
||||||
|
typedef unsigned int uint;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/// WAV audio file 'riff' section header
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char riff_char[4];
|
||||||
|
int package_len;
|
||||||
|
char wave[4];
|
||||||
|
} WavRiff;
|
||||||
|
|
||||||
|
/// WAV audio file 'format' section header
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char fmt[4];
|
||||||
|
int format_len;
|
||||||
|
short fixed;
|
||||||
|
short channel_number;
|
||||||
|
int sample_rate;
|
||||||
|
int byte_rate;
|
||||||
|
short byte_per_sample;
|
||||||
|
short bits_per_sample;
|
||||||
|
} WavFormat;
|
||||||
|
|
||||||
|
/// WAV audio file 'data' section header
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char data_field[4];
|
||||||
|
uint data_len;
|
||||||
|
} WavData;
|
||||||
|
|
||||||
|
|
||||||
|
/// WAV audio file header
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
WavRiff riff;
|
||||||
|
WavFormat format;
|
||||||
|
WavData data;
|
||||||
|
} WavHeader;
|
||||||
|
|
||||||
|
|
||||||
|
/// Class for writing WAV audio files.
|
||||||
|
class WavOutFile
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
/// Pointer to the WAV file
|
||||||
|
FILE *fptr;
|
||||||
|
|
||||||
|
/// WAV file header data.
|
||||||
|
WavHeader header;
|
||||||
|
|
||||||
|
/// Counter of how many bytes have been written to the file so far.
|
||||||
|
int bytesWritten;
|
||||||
|
|
||||||
|
/// Fills in WAV file header information.
|
||||||
|
void fillInHeader(const uint sampleRate, const uint bits, const uint channels);
|
||||||
|
|
||||||
|
/// Finishes the WAV file header by supplementing information of amount of
|
||||||
|
/// data written to file etc
|
||||||
|
void finishHeader();
|
||||||
|
|
||||||
|
/// Writes the WAV file header.
|
||||||
|
void writeHeader();
|
||||||
|
|
||||||
|
public:
|
||||||
|
/// Constructor: Creates a new WAV file. Throws a 'runtime_error' exception
|
||||||
|
/// if file creation fails.
|
||||||
|
WavOutFile(const char *fileName, ///< Filename
|
||||||
|
int sampleRate, ///< Sample rate (e.g. 44100 etc)
|
||||||
|
int bits, ///< Bits per sample (8 or 16 bits)
|
||||||
|
int channels ///< Number of channels (1=mono, 2=stereo)
|
||||||
|
);
|
||||||
|
|
||||||
|
/// Destructor: Finalizes & closes the WAV file.
|
||||||
|
~WavOutFile();
|
||||||
|
|
||||||
|
/// Write data to WAV file. Throws a 'runtime_error' exception if writing to
|
||||||
|
/// file fails.
|
||||||
|
void write(const short *buffer, ///< Pointer to sample data buffer.
|
||||||
|
int numElems ///< How many array items are to be written to file.
|
||||||
|
);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -16,7 +16,11 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "Global.h"
|
#include "Global.h"
|
||||||
|
#ifdef __LINUX__
|
||||||
|
#include "WavFile.h"
|
||||||
|
#else
|
||||||
#include "soundtouch/WavFile.h"
|
#include "soundtouch/WavFile.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
static WavOutFile* _new_WavOutFile( const char* destfile )
|
static WavOutFile* _new_WavOutFile( const char* destfile )
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue