Untitled
unknown
c_cpp
2 years ago
1.9 kB
20
Indexable
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include "wav.h"
int check_format(WAVHEADER header);
int get_block_size(WAVHEADER header);
int main(int argc, char *argv[])
{
// Ensure proper usage
if (argc != 3)
{
printf("Usage: ./reverse input.wav output.wav\n");
return 1;
}
// Open input file for reading
FILE *input = fopen(argv[1], "r");
if (input == NULL)
{
printf("Could not open %s.\n", argv[1]);
return 1;
}
// Read header
WAVHEADER header;
fread(&header, sizeof(WAVHEADER), 1, input);
// Use check_format to ensure WAV format
if (check_format(header) != 1)
{
printf("Incorrect file format");
return 1;
}
// Open output file for writing
FILE *output = fopen(argv[2], "w");
if (output == NULL)
{
printf("Could not open %s.\n", argv[2]);
return 1;
}
// Write header to file
fwrite(&header, sizeof(WAVHEADER), 1, output);
// Use get_block_size to calculate size of block
int blockSize = get_block_size(header);
// Write reversed audio to file
BYTE buffer[blockSize];
fseek(input, 0, SEEK_END);
long audioLength = ftell(input) - sizeof(WAVHEADER);
int audioBlock = audioLength / blockSize;
for (int i = audioBlock - 1; i >= 0; i--)
{
fseek(input, sizeof(WAVHEADER) + i * blockSize, SEEK_SET);
fread(buffer, blockSize, 1, input);
fwrite(buffer, blockSize, 1, output);
}
fclose(input);
fclose(output);
}
int check_format(WAVHEADER header)
{
if (header.format[0] == 'W' && header.format[1] == 'A'
&& header.format[2] == 'V' && header.format[3] == 'E')
{
return 1;
}
return 0;
}
int get_block_size(WAVHEADER header)
{
int blockSize = header.numChannels * (header.bitsPerSample / 8);
return blockSize;
}Editor is loading...