zynaddsubfx

ZynAddSubFX open source synthesizer
Log | Files | Refs | Submodules | LICENSE

commit b5e3ac99f4fd7b29d14adc6f0ddacead0fb2b75e
parent be6389ad95bda3c412f30adf2772b4ae93992169
Author: fundamental <mark.d.mccurry@gmail.com>
Date:   Tue, 29 Dec 2009 17:10:56 -0500

Nio: Exposing buffering of Outputs

Diffstat:
Msrc/Nio/AudioOut.cpp | 15++++++++++++---
Msrc/Nio/AudioOut.h | 8++++++++
Msrc/UI/NioUI.cpp | 24+++++++++++++++++++++++-
Msrc/UI/NioUI.h | 9+++++++--
4 files changed, 50 insertions(+), 6 deletions(-)

diff --git a/src/Nio/AudioOut.cpp b/src/Nio/AudioOut.cpp @@ -27,7 +27,7 @@ using namespace std; AudioOut::AudioOut(OutMgr *out) :samplerate(SAMPLE_RATE),bufferSize(SOUND_BUFFER_SIZE), - usePartial(false),manager(out),enabled(false) + usePartial(false),buffering(6),manager(out),enabled(false) { pthread_mutex_init(&outBuf_mutex, NULL); pthread_cond_init (&outBuf_cv, NULL); @@ -95,10 +95,19 @@ void AudioOut::setBufferSize(int _bufferSize) pthread_mutex_unlock(&outBuf_mutex); }; +void AudioOut::bufferingSize(int nBuffering) +{ + buffering = nBuffering; +} + +int AudioOut::bufferingSize() +{ + return buffering; +} const Stereo<Sample> AudioOut::getNext() { - const unsigned int BUFF_SIZE = 6; + const unsigned int BUFF_SIZE = buffering; Stereo<Sample> ans; pthread_mutex_lock(&outBuf_mutex); bool isEmpty = outBuf.empty(); @@ -106,7 +115,7 @@ const Stereo<Sample> AudioOut::getNext() if(isEmpty)//fetch samples if possible { - if(manager->getRunning() < BUFF_SIZE) + if((unsigned int)manager->getRunning() < BUFF_SIZE) manager->requestSamples(BUFF_SIZE-manager->getRunning()); if(true) cout << "-----------------Starvation------------------"<< endl; diff --git a/src/Nio/AudioOut.h b/src/Nio/AudioOut.h @@ -57,6 +57,9 @@ class AudioOut : public virtual Engine * (used for getNext()).*/ void setBufferSize(int _bufferSize); + void bufferingSize(int nBuffering); + int bufferingSize(); + protected: void putBack(const Stereo<Sample> smp); @@ -75,6 +78,11 @@ class AudioOut : public virtual Engine bool usePartial; Stereo<Sample> current;/**<used for xrun defence*/ + //The number of Samples that are used to buffer + //Note: there is some undetermined behavior when: + //sampleRate != SAMPLE_RATE || bufferSize != SOUND_BUFFER_SIZE + unsigned int buffering; + OutMgr *manager; //thread resources pthread_t pThread; diff --git a/src/UI/NioUI.cpp b/src/UI/NioUI.cpp @@ -1,5 +1,6 @@ #include "NioUI.h" #include "../Nio/EngineMgr.h" +#include "../Nio/OutMgr.h" #include "../Nio/AudioOut.h" #include <cstdio> #include <FL/Fl_Tabs.H> @@ -69,12 +70,32 @@ void NioTab::nioToggle(Fl_Widget *wid, void *arg) p->refresh(); } +void NioTab::nioBuffer(Fl_Widget *wid, void *arg) +{ + Fl_Spinner *w = static_cast<Fl_Spinner *>(wid); + char *str = static_cast<char *>(arg); + int val = (int) w->value(); + + cout << "Chaning Buffer Size For " << str << endl; + AudioOut *out = sysOut->getOut(str); + if(out) { + cout << "Chaning Buffer Size To " << val << endl; + out->bufferingSize(val); + } +} + NioTab::NioTab(string name) :Fl_Group(10, 40, 400, 400-35, strdup(name.c_str())), - outEnable(20 ,30 ,100, 25, "Enable"), + outEnable(20, 30, 100, 25, "Enable"), + buffer(70, 60, 50, 25, "Buffer:"),//in SOUND_BUFFER_SIZE units name(name) { outEnable.callback(nioToggle, (void *)this); + buffer.callback(nioBuffer, (void *)name.c_str()); + //this is a COMPLETELY arbitrary max + //I just assume that users do not want an overly long buffer + buffer.range(1, 100); + buffer.type(FL_INT_INPUT); end(); } @@ -83,6 +104,7 @@ void NioTab::refresh() //getOut should only be called with present Engines bool state = sysOut->getOut(name)->isEnabled(); outEnable.value(state); + buffer.value(sysOut->getOut(name)->bufferingSize()); this->labelcolor(fl_rgb_color(0,255*state,0)); this->redraw(); diff --git a/src/UI/NioUI.h b/src/UI/NioUI.h @@ -5,6 +5,7 @@ #include <FL/Fl_Light_Button.H> #include <FL/Fl_Window.H> #include <FL/Fl_Pack.H> +#include <FL/Fl_Spinner.H> #include <FL/Enumerations.H> #include <list> #include <string> @@ -12,9 +13,13 @@ struct NioTab : public Fl_Group { NioTab(std::string name); - Fl_Light_Button outEnable; - static void nioToggle(Fl_Widget *w, void *arg); + void refresh(); + static void nioToggle(Fl_Widget *w, void *arg); + static void nioBuffer(Fl_Widget *w, void *arg); + + Fl_Light_Button outEnable; + Fl_Spinner buffer; const std::string name; };