76 lines
2.0 KiB
C++
76 lines
2.0 KiB
C++
// Copyright (c) 2023 Dominic Masters
|
|
//
|
|
// This software is released under the MIT License.
|
|
// https://opensource.org/licenses/MIT
|
|
|
|
#include "../../utils/common.hpp"
|
|
#include "../../utils/file.hpp"
|
|
#include "AudioFile.h"
|
|
|
|
int main(int argc, char *argv[]) {
|
|
FILE *fileOut;
|
|
char buffer[FILENAME_MAX];
|
|
size_t bufferLength = 0;
|
|
|
|
if(argc != 3) {
|
|
printf("Invalid number of arguments\n");
|
|
return 1;
|
|
}
|
|
|
|
fileNormalizeSlashes(argv[1]);
|
|
fileNormalizeSlashes(argv[2]);
|
|
std::string strFileIn = std::string(argv[1]);
|
|
std::string strFileOut = std::string(argv[2]);
|
|
|
|
buffer[0] = '\0';
|
|
sprintf(buffer, "%s.audio", strFileOut.c_str());
|
|
fileOut = fopen(buffer, "rb");
|
|
if(fileOut != NULL) {
|
|
fclose(fileOut);
|
|
return 0;
|
|
}
|
|
|
|
// Load input file
|
|
AudioFile<double> audioFile;
|
|
if(!audioFile.load(strFileIn)) {
|
|
printf("Failed to load audio file.\n");
|
|
return 1;
|
|
}
|
|
|
|
// Open Output File
|
|
fileMkdirp(buffer);
|
|
fileOut = fopen(buffer, "wb");
|
|
if(fileOut == NULL) {
|
|
printf("Failed to create output file\n");
|
|
return 1;
|
|
}
|
|
|
|
// Write header
|
|
buffer[0] = '\0';
|
|
sprintf(buffer, "%i|%i|%i|%i|",
|
|
audioFile.getNumChannels(),
|
|
audioFile.getSampleRate(),
|
|
audioFile.getNumSamplesPerChannel(),
|
|
audioFile.getNumSamplesPerChannel() * audioFile.getNumChannels()*(
|
|
sizeof(int16_t) / sizeof(uint8_t)
|
|
)
|
|
);
|
|
bufferLength = strlen(buffer);
|
|
fwrite(buffer, sizeof(char), bufferLength, fileOut);
|
|
|
|
// Convert Data to 16 bit audio
|
|
for (int32_t i = 0; i < audioFile.getNumSamplesPerChannel(); i++) {
|
|
for(int32_t y = 0; y < audioFile.getNumChannels(); y++) {
|
|
double sample = audioFile.samples[y][i];
|
|
sample = sample < -1 ? -1 : sample > 1 ? 1 : sample;
|
|
auto q = static_cast<int16_t> (sample * 32767.);
|
|
|
|
buffer[0] = (q >> 8) & 0xFF;
|
|
buffer[1] = q & 0xFF;
|
|
fwrite(buffer, sizeof(uint8_t), 2, fileOut);
|
|
}
|
|
}
|
|
|
|
fclose(fileOut);
|
|
return 0;
|
|
} |