// Copyright (c) 2023 Dominic Masters // // This software is released under the MIT License. // https://opensource.org/licenses/MIT #include "AudioGen.hpp" using namespace Dawn; std::vector AudioGen::getRequiredFlags() { return std::vector{ "input", "output" }; } int32_t AudioGen::start() { // Finished with XML data, now we can write data out. File fileOut(flags["output"] + ".audio"); if(fileOut.exists()) return 0; // Load input file AudioFile audioFile; if(!audioFile.load(flags["input"])) { printf("Failed to load audio file.\n"); return 1; } // Open Output File fileOut.mkdirp(); if(!fileOut.open(FILE_MODE_WRITE)) { std::cout << "Failed to open " << fileOut.filename << " output for writing" << std::endl; return 1; } // Write Header char buffer[FILE_BUFFER_SIZE]; sprintf(buffer, "%i|%i|%i|%i|", audioFile.getNumChannels(), audioFile.getSampleRate(), audioFile.getNumSamplesPerChannel(), audioFile.getNumSamplesPerChannel() * audioFile.getNumChannels()*( sizeof(int16_t) / sizeof(uint8_t) ) ); auto bufferLength = strlen(buffer); fileOut.writeRaw(buffer, bufferLength); // 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 (sample * 32767.); buffer[0] = (q >> 8) & 0xFF; buffer[1] = q & 0xFF; fileOut.writeRaw(buffer, 2); } } return 0; }