mirror of
https://github.com/danog/system-bus-radio.git
synced 2024-12-13 00:27:21 +01:00
104 lines
2.7 KiB
C++
104 lines
2.7 KiB
C++
// SYSTEM BUS RADIO
|
|
// https://github.com/fulldecent/system-bus-radio
|
|
// Copyright 2016 William Entriken
|
|
// C++11 port by Ryou Ezoe
|
|
|
|
#include <iostream>
|
|
#include <iomanip>
|
|
#include <chrono>
|
|
#include <thread>
|
|
#include <atomic>
|
|
#include <mutex>
|
|
#include <condition_variable>
|
|
|
|
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<std::mutex> lk{m} ;
|
|
cv.wait( lk ) ;
|
|
|
|
std::atomic<unsigned> 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<rep>( nsec_per_sec / frequency) ) ;
|
|
|
|
auto start = high_resolution_clock::now() ;
|
|
auto const end = start + nanoseconds( static_cast<rep>(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);
|
|
}
|
|
}
|