Lines Matching +full:- +full:- +full:file
4 This file is part of the Sonic Library.
6 This file is licensed under the Apache 2.0 license.
10 This file supports read/write wave files.
22 FILE* soundFile;
28 /* Write a string to a file. */
29 static void writeBytes(waveFile file, void* bytes, int length) { in writeBytes() argument
32 if (file->failed) { in writeBytes()
35 bytesWritten = fwrite(bytes, sizeof(char), length, file->soundFile); in writeBytes()
37 fprintf(stderr, "Unable to write to output file"); in writeBytes()
38 file->failed = 1; in writeBytes()
40 file->bytesWritten += bytesWritten; in writeBytes()
43 /* Write a string to a file. */
44 static void writeString(waveFile file, char* string) { in writeString() argument
45 writeBytes(file, string, strlen(string)); in writeString()
48 /* Write an integer to a file in little endian order. */
49 static void writeInt(waveFile file, int value) { in writeInt() argument
57 writeBytes(file, bytes, 4); in writeInt()
60 /* Write a short integer to a file in little endian order. */
61 static void writeShort(waveFile file, short value) { in writeShort() argument
69 writeBytes(file, bytes, 2); in writeShort()
72 /* Read bytes from the input file. Return the number of bytes actually read. */
73 static int readBytes(waveFile file, void* bytes, int length) { in readBytes() argument
74 if (file->failed) { in readBytes()
77 return fread(bytes, sizeof(char), length, file->soundFile); in readBytes()
80 /* Read an exact number of bytes from the input file. */
81 static void readExactBytes(waveFile file, void* bytes, int length) { in readExactBytes() argument
84 if (file->failed) { in readExactBytes()
87 numRead = fread(bytes, sizeof(char), length, file->soundFile); in readExactBytes()
89 fprintf(stderr, "Failed to read requested bytes from input file\n"); in readExactBytes()
90 file->failed = 1; in readExactBytes()
94 /* Read an integer from the input file */
95 static int readInt(waveFile file) { in readInt() argument
99 readExactBytes(file, bytes, 4); in readInt()
100 for (i = 3; i >= 0; i--) { in readInt()
107 /* Read a short from the input file */
108 static int readShort(waveFile file) { in readShort() argument
112 readExactBytes(file, bytes, 2); in readShort()
113 for (i = 1; i >= 0; i--) { in readShort()
121 static void expectString(waveFile file, char* expectedString) { in expectString() argument
127 file->failed = 1; in expectString()
129 readExactBytes(file, buf, length); in expectString()
132 fprintf(stderr, "Unsupported wave file format: Expected '%s', got '%s;\n", in expectString()
134 file->failed = 1; in expectString()
139 /* Write the header of the wave file. */
140 static void writeHeader(waveFile file, int sampleRate, int numChannels) { in writeHeader() argument
141 /* write the wav file per the wav file format */ in writeHeader()
142 writeString(file, "RIFF"); /* 00 - RIFF */ in writeHeader()
143 /* We have to fseek and overwrite this later when we close the file because */ in writeHeader()
145 writeInt(file, in writeHeader()
146 36 /* + dataLength */); /* 04 - how big is the rest of this file? */ in writeHeader()
147 writeString(file, "WAVE"); /* 08 - WAVE */ in writeHeader()
148 writeString(file, "fmt "); /* 12 - fmt */ in writeHeader()
149 writeInt(file, 16); /* 16 - size of this chunk */ in writeHeader()
151 file, in writeHeader()
152 1); /* 20 - what is the audio format? 1 for PCM = Pulse Code Modulation */ in writeHeader()
153 writeShort(file, in writeHeader()
154 numChannels); /* 22 - mono or stereo? 1 or 2? (or 5 or ???) */ in writeHeader()
155 writeInt(file, sampleRate); /* 24 - samples per second (numbers per second) */ in writeHeader()
156 writeInt(file, sampleRate * 2); /* 28 - bytes per second */ in writeHeader()
157 writeShort(file, 2); /* 32 - # of bytes in one sample, for all channels */ in writeHeader()
159 file, 16); /* 34 - how many bits in a sample(number)? usually 16 or 24 */ in writeHeader()
160 writeString(file, "data"); /* 36 - data */ in writeHeader()
161 writeInt(file, 0); /* 40 - how big is this data chunk */ in writeHeader()
164 /* Read the header of the wave file. */
165 static int readHeader(waveFile file) { in readHeader() argument
168 expectString(file, "RIFF"); in readHeader()
169 data = readInt(file); /* 04 - how big is the rest of this file? */ in readHeader()
170 expectString(file, "WAVE"); /* 08 - WAVE */ in readHeader()
171 expectString(file, "fmt "); /* 12 - fmt */ in readHeader()
172 int chunkSize = readInt(file); /* 16 or 18 - size of this chunk */ in readHeader()
177 data = readShort(file); /* 20 - what is the audio format? 1 for PCM = Pulse in readHeader()
183 file->numChannels = in readHeader()
184 readShort(file); /* 22 - mono or stereo? 1 or 2? (or 5 or ???) */ in readHeader()
185 file->sampleRate = in readHeader()
186 readInt(file); /* 24 - samples per second (numbers per second) */ in readHeader()
187 readInt(file); /* 28 - bytes per second */ in readHeader()
188 readShort(file); /* 32 - # of bytes in one sample, for all channels */ in readHeader()
190 file); /* 34 - how many bits in a sample(number)? usually 16 or 24 */ in readHeader()
196 data = readShort(file); in readHeader()
204 readExactBytes(file, chunk, 4); /* chunk id */ in readHeader()
205 int size = readInt(file); /* how big is this data chunk */ in readHeader()
209 if (fseek(file->soundFile, size, SEEK_CUR) != 0) { in readHeader()
210 fprintf(stderr, "Failed to seek on input file.\n"); in readHeader()
216 /* Close the input or output file and free the waveFile. */
217 static void closeFile(waveFile file) { in closeFile() argument
218 FILE* soundFile = file->soundFile; in closeFile()
222 file->soundFile = NULL; in closeFile()
224 free(file); in closeFile()
227 /* Open a 16-bit little-endian wav file for reading. It may be mono or stereo.
230 waveFile file; in openInputWaveFile() local
231 FILE* soundFile = fopen(fileName, "rb"); in openInputWaveFile()
234 fprintf(stderr, "Unable to open wave file %s for reading\n", fileName); in openInputWaveFile()
237 file = (waveFile)calloc(1, sizeof(struct waveFileStruct)); in openInputWaveFile()
238 file->soundFile = soundFile; in openInputWaveFile()
239 file->isInput = 1; in openInputWaveFile()
240 if (!readHeader(file)) { in openInputWaveFile()
241 closeFile(file); in openInputWaveFile()
244 *sampleRate = file->sampleRate; in openInputWaveFile()
245 *numChannels = file->numChannels; in openInputWaveFile()
246 return file; in openInputWaveFile()
249 /* Open a 16-bit little-endian wav file for writing. It may be mono or stereo.
252 waveFile file; in openOutputWaveFile() local
253 FILE* soundFile = fopen(fileName, "wb"); in openOutputWaveFile()
256 fprintf(stderr, "Unable to open wave file %s for writing\n", fileName); in openOutputWaveFile()
259 file = (waveFile)calloc(1, sizeof(struct waveFileStruct)); in openOutputWaveFile()
260 file->soundFile = soundFile; in openOutputWaveFile()
261 file->sampleRate = sampleRate; in openOutputWaveFile()
262 file->numChannels = numChannels; in openOutputWaveFile()
263 writeHeader(file, sampleRate, numChannels); in openOutputWaveFile()
264 if (file->failed) { in openOutputWaveFile()
265 closeFile(file); in openOutputWaveFile()
268 return file; in openOutputWaveFile()
271 /* Close the sound file. */
272 int closeWaveFile(waveFile file) { in closeWaveFile() argument
273 FILE* soundFile = file->soundFile; in closeWaveFile()
276 if (!file->isInput) { in closeWaveFile()
278 fprintf(stderr, "Failed to seek on input file.\n"); in closeWaveFile()
281 /* Now update the file to have the correct size. */ in closeWaveFile()
282 writeInt(file, file->bytesWritten - 8); in closeWaveFile()
283 if (file->failed) { in closeWaveFile()
284 fprintf(stderr, "Failed to write wave file size.\n"); in closeWaveFile()
288 fprintf(stderr, "Failed to seek on input file.\n"); in closeWaveFile()
291 /* Now update the file to have the correct size. */ in closeWaveFile()
292 writeInt(file, file->bytesWritten - 48); in closeWaveFile()
293 if (file->failed) { in closeWaveFile()
294 fprintf(stderr, "Failed to write wave file size.\n"); in closeWaveFile()
300 closeFile(file); in closeWaveFile()
304 /* Read from the wave file. Return the number of samples read.
305 numSamples and maxSamples are the number of **multi-channel** samples */
306 int readFromWaveFile(waveFile file, short* buffer, int maxSamples) { in readFromWaveFile() argument
312 if (maxSamples * file->numChannels * 2 > WAVE_BUF_LEN) { in readFromWaveFile()
313 maxSamples = WAVE_BUF_LEN / (file->numChannels * 2); in readFromWaveFile()
315 bytesRead = readBytes(file, bytes, maxSamples * file->numChannels * 2); in readFromWaveFile()
316 samplesRead = bytesRead / (file->numChannels * 2); in readFromWaveFile()
317 for (i = 0; i < samplesRead * file->numChannels; i++) { in readFromWaveFile()
325 /* Write to the wave file. */
326 int writeToWaveFile(waveFile file, short* buffer, int numSamples) { in writeToWaveFile() argument
331 int total = numSamples * file->numChannels; in writeToWaveFile()
335 writeBytes(file, bytes, bytePos); in writeToWaveFile()
343 writeBytes(file, bytes, bytePos); in writeToWaveFile()
345 return file->failed; in writeToWaveFile()