mirror of
https://github.com/id-Software/Wolf3D-iOS.git
synced 2026-03-20 00:49:35 +01:00
145 lines
3.6 KiB
C
145 lines
3.6 KiB
C
/*
|
|
|
|
Copyright (C) 2004 Michael Liebscher
|
|
|
|
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; either version 2
|
|
of the License, or (at your option) any later version.
|
|
|
|
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 for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
|
|
|
/*
|
|
* wav.c: Handles wav files.
|
|
*
|
|
* Author: Michael Liebscher <johnnycanuck@users.sourceforge.net>
|
|
* Date: 2004
|
|
*
|
|
*/
|
|
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
|
|
#include "../../../common/arch.h"
|
|
|
|
typedef struct
|
|
{
|
|
W8 riff[ 4 ];
|
|
W32 TotalLength;
|
|
W8 wave[ 8 ];
|
|
W32 LengthFORMAT;
|
|
W16 DataType;
|
|
W16 ChannelNumbers;
|
|
W32 SampleRate;
|
|
W32 BytesPerSecond;
|
|
W16 BytesPerSample;
|
|
W16 BitsPerSample;
|
|
W8 data[ 4 ];
|
|
W32 LengthData;
|
|
|
|
} wavheader_t;
|
|
|
|
|
|
/*
|
|
-----------------------------------------------------------------------------
|
|
Function: write_wav() -Writes a wav file.
|
|
|
|
Parameters: filename -[in] Pointer to a null-terminated string that
|
|
specifies the name of the file to save as.
|
|
data -[in] Pointer to audio data.
|
|
size -[in] Length of audio data.
|
|
channels -[in] Number of Channels (0x01 = Mono, 0x02 = Stereo).
|
|
sample_rate -[in] Sample Rate in Hz
|
|
sample_size -[in] Bytes Per Sample:
|
|
1 = 8 bit Mono,
|
|
2 = 8 bit Stereo or 16 bit Mono,
|
|
4 = 16 bit Stereo
|
|
|
|
Returns: Nothing.
|
|
|
|
Notes:
|
|
|
|
-----------------------------------------------------------------------------
|
|
*/
|
|
void
|
|
write_wav( const char *filename, void *data, W32 size,
|
|
W16 channels, W32 sample_rate,
|
|
W16 sample_size )
|
|
{
|
|
wavheader_t header;
|
|
FILE *handle;
|
|
|
|
handle = fopen( filename, "wb" );
|
|
if( handle == NULL )
|
|
{
|
|
printf( "unable to write wav file\n" );
|
|
return;
|
|
}
|
|
|
|
// RIFF Chunk
|
|
header.riff[ 0 ] = 'R';
|
|
header.riff[ 1 ] = 'I';
|
|
header.riff[ 2 ] = 'F';
|
|
header.riff[ 3 ] = 'F';
|
|
|
|
// Total Length Of Package To Follow
|
|
header.TotalLength = size + 36;
|
|
|
|
// Format Chunk
|
|
header.wave[ 0 ] = 'W';
|
|
header.wave[ 1 ] = 'A';
|
|
header.wave[ 2 ] = 'V';
|
|
header.wave[ 3 ] = 'E';
|
|
header.wave[ 4 ] = 'f';
|
|
header.wave[ 5 ] = 'm';
|
|
header.wave[ 6 ] = 't';
|
|
header.wave[ 7 ] = ' ';
|
|
|
|
header.LengthFORMAT = 0x10; // Length Of FORMAT Chunk (always 0x10)
|
|
header.DataType = 0x01; // Always 0x01
|
|
|
|
// Channel Numbers (always 0x01 = Mono, 0x02 = Stereo)
|
|
header.ChannelNumbers = channels;
|
|
|
|
|
|
header.SampleRate = sample_rate; // Sample Rate in Hz
|
|
|
|
|
|
header.BytesPerSecond = sample_rate * sample_size * channels;
|
|
|
|
|
|
header.BytesPerSample = sample_size; // Bytes Per Sample: 1 = 8 bit Mono,
|
|
// 2 = 8 bit Stereo or 16 bit Mono,
|
|
// 4 = 16 bit Stereo
|
|
|
|
|
|
header.BitsPerSample = sample_size * 8;
|
|
|
|
// DATA Chunk
|
|
header.data[ 0 ] = 'd';
|
|
header.data[ 1 ] = 'a';
|
|
header.data[ 2 ] = 't';
|
|
header.data[ 3 ] = 'a';
|
|
|
|
// Length Of Data To Follow
|
|
header.LengthData = size;
|
|
|
|
|
|
|
|
fwrite( &header, sizeof( W8 ), sizeof( wavheader_t ), handle );
|
|
|
|
fwrite( data, sizeof( W8 ), size, handle );
|
|
|
|
fclose( handle );
|
|
}
|