From fb8d607e2dc11a1d9cdef736938548ad887f4013 Mon Sep 17 00:00:00 2001 From: Dave Griffiths Date: Fri, 30 Sep 2022 21:08:53 +0100 Subject: [PATCH] started making samplerate and buffer size configurable for audio device selection --- app/audio_thread.cpp | 7 +- app/audio_thread.h | 10 ++- app/process_thread.cpp | 94 +++++++++++------------ brain/src/block.cpp | 8 +- brain/src/block.h | 2 +- brain/src/brain.cpp | 28 ------- brain/src/fft.cpp | 22 ++---- brain/src/fft.h | 3 +- brain/src/mfcc.cpp | 2 +- brain/src/mfcc.h | 8 +- brain/src/spiralcore/audio.cpp | 5 +- brain/src/spiralcore/audio.h | 12 +-- brain/src/spiralcore/portaudio_client.cpp | 18 ++++- brain/src/spiralcore/portaudio_client.h | 2 +- brain/src/status.cpp | 4 + brain/src/status.h | 11 +-- 16 files changed, 112 insertions(+), 124 deletions(-) diff --git a/app/audio_thread.cpp b/app/audio_thread.cpp index 8e87fe3..a6307b4 100644 --- a/app/audio_thread.cpp +++ b/app/audio_thread.cpp @@ -26,7 +26,9 @@ audio_thread::audio_thread(process_thread &p) : m_process_thread(p), m_brain_mutex(p.m_brain_mutex), m_stereo_mode(false), - m_mic_mode(false) + m_mic_mode(false), + m_bufsize(2048), + m_samplerate(44100) { start_audio(); pthread_mutex_lock(m_brain_mutex); @@ -48,8 +50,7 @@ audio_thread::~audio_thread() { void audio_thread::start_audio() { if (m_audio_device!=NULL) delete m_audio_device; - m_audio_device = new audio_device("samplebrain",48000,2048); - //m_audio_device = new audio_device("samplebrain",48000,2048*4); + m_audio_device = new audio_device("samplebrain",m_samplerate,m_bufsize); m_audio_device->m_client.set_callback(run_audio, this); } diff --git a/app/audio_thread.h b/app/audio_thread.h index dcb3b81..0c00911 100644 --- a/app/audio_thread.h +++ b/app/audio_thread.h @@ -24,8 +24,8 @@ namespace spiralcore { -class audio_thread { -public: + class audio_thread { + public: audio_thread(process_thread &p); ~audio_thread(); @@ -38,7 +38,7 @@ public: renderer *m_right_renderer; block_stream *m_block_stream; -private: + private: void start_audio(); OSC_server m_osc; @@ -46,6 +46,8 @@ private: pthread_mutex_t* m_brain_mutex; bool m_stereo_mode; bool m_mic_mode; -}; + u32 m_bufsize; + u32 m_samplerate; + }; } diff --git a/app/process_thread.cpp b/app/process_thread.cpp index 3687da8..fec26f2 100644 --- a/app/process_thread.cpp +++ b/app/process_thread.cpp @@ -63,82 +63,82 @@ void process_thread::process() { string name = cmd.m_name; //cerr<reset(); - m_right_renderer->reset(); - pthread_mutex_unlock(m_brain_mutex); + pthread_mutex_lock(m_brain_mutex); + m_source.init(m_source_block_size, m_source_overlap, m_window_type); + search_params p(1,0,0,100,0); + m_source.build_synapses_fixed(p); + m_left_renderer->reset(); + m_right_renderer->reset(); + pthread_mutex_unlock(m_brain_mutex); } if (name=="/load_target") { - pthread_mutex_lock(m_brain_mutex); - m_left_target.clear_sounds(); - m_left_target.load_sound(cmd.get_string(0),brain::LEFT); - m_right_target.clear_sounds(); - m_right_target.load_sound(cmd.get_string(0),brain::RIGHT); - pthread_mutex_unlock(m_brain_mutex); + pthread_mutex_lock(m_brain_mutex); + m_left_target.clear_sounds(); + m_left_target.load_sound(cmd.get_string(0),brain::LEFT); + m_right_target.clear_sounds(); + m_right_target.load_sound(cmd.get_string(0),brain::RIGHT); + pthread_mutex_unlock(m_brain_mutex); } if (name=="/target_block_size") { - m_target_block_size = cmd.get_int(0); - m_block_stream->init(m_target_block_size, m_target_overlap, m_target_window_type); + m_target_block_size = cmd.get_int(0); + m_block_stream->init(m_target_block_size, m_target_overlap, m_target_window_type); } if (name=="/target_overlap") { - m_target_overlap = m_target_block_size*cmd.get_float(0); - m_block_stream->init(m_target_block_size, m_target_overlap, m_target_window_type); + m_target_overlap = m_target_block_size*cmd.get_float(0); + m_block_stream->init(m_target_block_size, m_target_overlap, m_target_window_type); } if (name=="/generate_target") { - pthread_mutex_lock(m_brain_mutex); - m_left_target.init(m_target_block_size, m_target_overlap, m_target_window_type); - m_right_target.init(m_target_block_size, m_target_overlap, m_target_window_type); - // probably elsewhere - m_block_stream->init(m_target_block_size, m_target_overlap, m_target_window_type); - pthread_mutex_unlock(m_brain_mutex); + pthread_mutex_lock(m_brain_mutex); + m_left_target.init(m_target_block_size, m_target_overlap, m_target_window_type); + m_right_target.init(m_target_block_size, m_target_overlap, m_target_window_type); + // probably elsewhere + m_block_stream->init(m_target_block_size, m_target_overlap, m_target_window_type); + pthread_mutex_unlock(m_brain_mutex); } if (name=="/window_type") { - m_window_type=(window::type)cmd.get_int(0); + m_window_type=(window::type)cmd.get_int(0); } if (name=="/target_window_type") { - m_target_window_type=(window::type)cmd.get_int(0); - m_block_stream->init(m_target_block_size, m_target_overlap, m_target_window_type); + m_target_window_type=(window::type)cmd.get_int(0); + m_block_stream->init(m_target_block_size, m_target_overlap, m_target_window_type); } if (name=="/load_brain") { - load_source(cmd.get_string(0)); + load_source(cmd.get_string(0)); } if (name=="/save_brain") { - save_source(cmd.get_string(0)); + save_source(cmd.get_string(0)); } if (name=="/load_session") { - load_session(cmd.get_string(0)); + load_session(cmd.get_string(0)); } if (name=="/save_session") { - save_session(cmd.get_string(0)); + save_session(cmd.get_string(0)); } } #ifdef WIN32 @@ -181,9 +181,6 @@ void process_thread::load_session(const std::string &filename) { ifs||m_source_block_size||m_source_overlap; ifs||m_target_block_size||m_target_overlap; ifs||m_window_type||m_target_window_type; - - cerr<<"loading window type session "<m_length!=block_size) { if (m_fftw == NULL) delete m_fftw; - m_fftw = new FFT(block_size,100); + m_fftw = new FFT(block_size,rate,100); if (m_mfcc_proc == NULL) delete m_mfcc_proc; - m_mfcc_proc = new Aquila::Mfcc(block_size); + m_mfcc_proc = new Aquila::Mfcc(block_size,rate); } } diff --git a/brain/src/block.h b/brain/src/block.h index a10858f..3aae3a2 100644 --- a/brain/src/block.h +++ b/brain/src/block.h @@ -38,7 +38,7 @@ namespace spiralcore { // returns distance based on ratio of fft-mfcc values double compare(const block &other, const search_params ¶ms) const; - static void init_fft(u32 block_size); + static void init_fft(u32 block_size, u32 rate); static bool unit_test(); const sample &get_pcm() const { return m_pcm; } diff --git a/brain/src/brain.cpp b/brain/src/brain.cpp index b57db1b..6c63289 100644 --- a/brain/src/brain.cpp +++ b/brain/src/brain.cpp @@ -377,34 +377,6 @@ void brain::deplete_usage() { } } - -// take another brain and rebuild this brain from bits of that one -// (presumably this one is made from a single sample) -/*void brain::resynth(const string &filename, const brain &other, const search_params ¶ms){ - sample out((m_block_size-m_overlap)*m_blocks.size()); - out.zero(); - u32 pos = 0; - u32 count = 0; - cerr<::iterator i=m_blocks.begin(); i!=m_blocks.end(); ++i) { - cerr<<'\r'; - cerr<<"searching: "<fft(source); - Aquila::MelFilterBank bank(44100, m_inputSize); + Aquila::MelFilterBank bank(m_sampleRate, m_inputSize); auto filterOutput = bank.applyAll(spectrum); Aquila::Dct dct; diff --git a/brain/src/mfcc.h b/brain/src/mfcc.h index 03b2c4b..c203d5a 100644 --- a/brain/src/mfcc.h +++ b/brain/src/mfcc.h @@ -59,8 +59,9 @@ namespace Aquila * * @param inputSize input length (common to all inputs) */ - Mfcc(std::size_t inputSize): - m_inputSize(inputSize)//, m_fft(FftFactory::getFft(inputSize)) + Mfcc(std::size_t inputSize, unsigned int sampleRate): + m_inputSize(inputSize), // m_fft(FftFactory::getFft(inputSize)) + m_sampleRate(sampleRate) { } @@ -71,7 +72,8 @@ namespace Aquila * Number of samples in each processed input. */ const std::size_t m_inputSize; - + const unsigned int m_sampleRate; + /** * FFT calculator. */ diff --git a/brain/src/spiralcore/audio.cpp b/brain/src/spiralcore/audio.cpp index e108e31..74a64b7 100644 --- a/brain/src/spiralcore/audio.cpp +++ b/brain/src/spiralcore/audio.cpp @@ -27,7 +27,8 @@ audio_device::audio_device(const string &clientname, u32 samplerate, u32 buffer_ left_in(buffer_size), right_in(buffer_size), m_recording(false), - m_record_filename("") + m_record_filename(""), + m_samplerate(samplerate) { portaudio_client::device_options opt; opt.buffer_size = buffer_size; @@ -46,7 +47,7 @@ void audio_device::save_sample(const string &filename, const sample s) { SF_INFO sfinfo; sfinfo.format=SF_FORMAT_WAV | SF_FORMAT_FLOAT; sfinfo.frames=s.get_length(); - sfinfo.samplerate=44100; + sfinfo.samplerate=m_samplerate; sfinfo.channels=1; sfinfo.sections=1; sfinfo.seekable=0; diff --git a/brain/src/spiralcore/audio.h b/brain/src/spiralcore/audio.h index 9a73582..b3e0adf 100644 --- a/brain/src/spiralcore/audio.h +++ b/brain/src/spiralcore/audio.h @@ -24,8 +24,8 @@ class graph; namespace spiralcore { -class audio_device { -public: + class audio_device { + public: audio_device(const string &clientname, u32 samplerate, u32 buffer_size); void start_graph(graph *graph); @@ -42,15 +42,15 @@ public: portaudio_client m_client; - static void save_sample(const std::string &filename, const sample s); + void save_sample(const std::string &filename, const sample s); -private: + private: bool m_recording; std::string m_record_filename; sample m_record_buffer_left; sample m_record_buffer_right; u32 m_record_counter; - -}; + u32 m_samplerate; + }; } diff --git a/brain/src/spiralcore/portaudio_client.cpp b/brain/src/spiralcore/portaudio_client.cpp index a989474..ed59ebd 100644 --- a/brain/src/spiralcore/portaudio_client.cpp +++ b/brain/src/spiralcore/portaudio_client.cpp @@ -21,7 +21,6 @@ bool portaudio_client::m_attached = false; long unsigned int portaudio_client::m_buffer_size = 0; -long unsigned int portaudio_client::m_sample_rate = 44100; void (*portaudio_client::run_callback)(void*, unsigned int buf_size)=NULL; void *portaudio_client::run_context = NULL; const float *portaudio_client::m_right_data=NULL; @@ -42,6 +41,23 @@ portaudio_client::~portaudio_client() { ///////////////////////////////////////////////////////////////////////////////////////////// +vector portaudio_client::sniff_devices() { + vector ret; + int numDevices = Pa_GetDeviceCount(); + if(numDevices < 0) { + // this is an error I guess + return ret; + } + const PaDeviceInfo *deviceInfo; + for(int i=0; iname); + } + return ret; +} + +///////////////////////////////////////////////////////////////////////////////////////////// + bool portaudio_client::attach(const string &client_name, const device_options &dopt) { if (m_attached) return true; diff --git a/brain/src/spiralcore/portaudio_client.h b/brain/src/spiralcore/portaudio_client.h index 8093c4f..7fcc2c9 100644 --- a/brain/src/spiralcore/portaudio_client.h +++ b/brain/src/spiralcore/portaudio_client.h @@ -42,6 +42,7 @@ class portaudio_client unsigned int out_channels; }; + vector sniff_devices(); bool attach(const string &client_name, const device_options &dopt); void detach(); bool is_attached() { return m_attached; } @@ -60,7 +61,6 @@ class portaudio_client private: static long unsigned int m_buffer_size; - static long unsigned int m_sample_rate; static bool m_attached; static const float *m_right_data; diff --git a/brain/src/status.cpp b/brain/src/status.cpp index 4fc07ec..86c61b2 100644 --- a/brain/src/status.cpp +++ b/brain/src/status.cpp @@ -34,6 +34,10 @@ void status::sound_item_refresh() { lo_send(m_address,"/sound-item-refresh",""); } +void status::add_audio_device(const std::string &name) { + lo_send(m_address,"/add_audio_device",name.c_str()); +} + void status::update(const char *msg, ...) { va_list args; va_start(args, msg); diff --git a/brain/src/status.h b/brain/src/status.h index 4a78a1e..f3da884 100644 --- a/brain/src/status.h +++ b/brain/src/status.h @@ -24,11 +24,12 @@ namespace spiralcore { class status { public: - static void _update(const std::string &msg); - static void update(const char *msg, ...); - static void sound_item(const std::string &name, const std::string &colour); - static void sound_item_refresh(); - static lo_address m_address; + static void _update(const std::string &msg); + static void update(const char *msg, ...); + static void sound_item(const std::string &name, const std::string &colour); + static void sound_item_refresh(); + static void add_audio_device(const std::string &name); + static lo_address m_address; }; }