// Modifies the volume of an audio file
#include <stdint.h> #include <stdio.h> #include <stdlib.h>
// Number of bytes in .wav header const int HEADER_SIZE = 44;
int main(int argc, char *argv[]) { // Check command-line arguments if (argc != 4) { printf("Usage: ./volume input.wav output.wav factor\n"); return 1; }
// Open files and determine scaling factor FILE *input = fopen(argv[1], "r"); if (input == NULL) { printf("Could not open file.\n"); return 1; } FILE *output = fopen(argv[2], "w"); if (output == NULL) { printf("Could not open file.\n"); return 1; } float factor = atof(argv[3]); // TODO: Copy header from input file to output file uint8_t buffer_header[HEADER_SIZE]; fread(buffer_header,sizeof(uint8_t),HEADER_SIZE,input); fwrite(buffer_header,sizeof(uint8_t),HEADER_SIZE,output); // writes the header to the output file // TODO: Read samples from input file and write updated data to output file fseek(input,0,SEEK_END); // moving the cursor in the file to the end to determine the total size of the file using ftell
int len= ftell(input);
int samplelen= len - HEADER_SIZE; // we find the size of the samples by subtracting the total size by the header size
fseek(input,0,SEEK_SET); fseek(input,HEADER_SIZE,SEEK_SET); // we move the cursor at the header size
int16_t buffer_samples[samplelen]; fread(buffer_samples,sizeof(int16_t),samplelen,input); // read the samples and store them in buffer for (int i=0;i<samplelen;i++) { buffer_samples[i]=buffer_samples[i]*factor; //iterate over the buffer array and multipy it by the factor } fseek(output,HEADER_SIZE,SEEK_SET); // set the cursor in the output file to the header size fwrite(buffer_samples,sizeof(int16_t),samplelen,output); // write the samples into the output file // Close files fclose(input); fclose(output); }