summaryrefslogtreecommitdiff
path: root/os2eindopdracht/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'os2eindopdracht/main.cpp')
-rw-r--r--os2eindopdracht/main.cpp19
1 files changed, 15 insertions, 4 deletions
diff --git a/os2eindopdracht/main.cpp b/os2eindopdracht/main.cpp
index bc7ce17..b451652 100644
--- a/os2eindopdracht/main.cpp
+++ b/os2eindopdracht/main.cpp
@@ -14,37 +14,48 @@
using std::vector;
using std::counting_semaphore;
using std::thread;
+using std::ref;
#define SAMPLE_BLOCK_SIZE 1024
int main(int argc, char** argv) {
+ // parse arguments
Arguments args(argc, argv);
+ // read input file to std::string
std::fstream file_input(args.file_input, std::ios::in | std::ios::binary);
std::stringstream file_input_content;
file_input_content << file_input.rdbuf();
file_input.close();
+ // convert std::string to vector<int16_t>
SampleStream input(file_input_content.str());
+ // split into 1024-sample blocks
vector<SampleBlock> input_blocks = input.split(SAMPLE_BLOCK_SIZE);
+ // do the same for output stream (input stream is later used as reference but not mutated)
SampleStream output(file_input_content.str());
vector<SampleBlock> output_blocks = output.split(SAMPLE_BLOCK_SIZE);
+ // c++20 semaphore for limiting active thread count
counting_semaphore semaphore(args.max_threads);
+ // thread array
vector<thread> threads;
for (size_t i = 0; i < input_blocks.size(); i++) {
- semaphore.acquire();
+ semaphore.acquire(); // wait until less than args.max_threads threads are running
+ // create thread
threads.push_back(thread([&args, &semaphore](SampleBlock& input, SampleBlock& output) {
+ // apply filter to output
FilterWorker(input, output).filter(args.bass, args.treble);
+ // allow new thread to be created
semaphore.release();
- }, std::ref(input_blocks[i]), std::ref(output_blocks[i])));
+ }, ref(input_blocks[i]), ref(output_blocks[i])));
}
+ // make sure all threads are done
for (thread& t : threads) t.join();
- output.align(SAMPLE_BLOCK_SIZE);
-
+ // write pcm stream to output file
std::fstream file_output(args.file_output, std::ios::out | std::ios::binary);
std::string edited_stream = output.save();
file_output.write(edited_stream.c_str(), edited_stream.size());