// SYSTEM BUS RADIO // https://github.com/fulldecent/system-bus-radio // Copyright 2016 William Entriken // C++11 port by Ryou Ezoe #include #include #include #include #include #include #include std::mutex m ; std::condition_variable cv ; std::chrono::high_resolution_clock::time_point mid ; std::chrono::high_resolution_clock::time_point reset ; void boost_song() { using namespace std::chrono ; while( true ) { std::unique_lock lk{m} ; cv.wait( lk ) ; std::atomic x{0} ; while( high_resolution_clock::now() < mid ) { ++x ; } std::this_thread::sleep_until( reset ) ; } } void square_am_signal(float time, float frequency) { using namespace std::chrono ; std::cout << "Playing / " << time << " seconds / " << frequency << " Hz\n" ; seconds const sec{1} ; nanoseconds const nsec{ sec } ; using rep = nanoseconds::rep ; auto nsec_per_sec = nsec.count() ; nanoseconds const period( static_cast( nsec_per_sec / frequency) ) ; auto start = high_resolution_clock::now() ; auto const end = start + nanoseconds( static_cast(time * nsec_per_sec) ) ; while (high_resolution_clock::now() < end) { mid = start + period / 2 ; reset = start + period ; cv.notify_all() ; std::this_thread::sleep_until( reset ) ; start = reset; } } int main() { for ( unsigned i = 0 ; i < std::thread::hardware_concurrency() ; ++i ) { std::thread t( boost_song ) ; t.detach() ; } while (1) { square_am_signal(0.400, 2673); square_am_signal(0.400, 2349); square_am_signal(0.400, 2093); square_am_signal(0.400, 2349); square_am_signal(0.400, 2673); square_am_signal(0.400, 2673); square_am_signal(0.790, 2673); square_am_signal(0.400, 2349); square_am_signal(0.400, 2349); square_am_signal(0.790, 2349); square_am_signal(0.400, 2673); square_am_signal(0.400, 3136); square_am_signal(0.790, 3136); square_am_signal(0.400, 2673); square_am_signal(0.400, 2349); square_am_signal(0.400, 2093); square_am_signal(0.400, 2349); square_am_signal(0.400, 2673); square_am_signal(0.400, 2673); square_am_signal(0.400, 2673); square_am_signal(0.400, 2673); square_am_signal(0.400, 2349); square_am_signal(0.400, 2349); square_am_signal(0.400, 2673); square_am_signal(0.400, 2349); square_am_signal(0.790, 2093); } }